例によって、ArduinoのMIDIキーボードシールド。
あれやこれや、過去のスケッチからフランケンを
作って、チョイチョイと手直しして、とりあえず
演奏出来る状態にはなった。(velocity対応)
/**********************************************/
/*** MIDI shield controller ***/
/*** for Arduino ***/
/*** version 0.1 ***/
/*** 2013. 9. 3 created by Nekoasn ***/
/*** ***/
/**********************************************/
/* declare constant values */
const int velocity_pin = 0; // potentiometer
const int pitch_bend_pin = 2; // vertical
const int modulation_pin = 1; // horizontal (cc#1)
const int note[13] = {60,61,62,63,64,65,66,67,68,69,70,71,72};
// 24::120
const int key[14] = {2,18,3,17,4,5,10,6,11,7,12,8,9 ,19};
// c c# d d# e f f# g g# a a# b c func
/* declare global variables */
int now_notes[14] = {1,1,1,1,1,1,1,1,1,1,1,1,1, 1};
int old_notes[14] = {1,1,1,1,1,1,1,1,1,1,1,1,1, 1};
/* active low */
int now_velocity;
int now_pitch_bend;
int now_modulation;
int old_pitch_bend;
int old_modulation;
/* active low */
/****************/
/* sub routines */
/****************/
void key_input(){
int i;
/* input keys */
for (i=0;idigitalRead(key[i]);
}
now_velocity = analogRead(velocity_pin) / 8;
now_pitch_bend = analogRead(pitch_bend_pin) / 8;
now_modulation = analogRead(modulation_pin) / 8;
}
void check_and_output(){
int i;
for (i=0;iif (now_notes[i] == old_notes[i]) {
/* note is not changed */
} else {
/* check note on or off */
if (now_notes[i] == LOW) { // active low
note_on(0 , note[i] , now_velocity);
} else {
note_off(0 , note[i]);
}
}
}
}
void store_old(){
int i;
for (i=0;ivoid note_on(int channel ,int note ,int velocity) {
midi_out(0x90+channel , note , velocity);
}
void note_off(int channel ,int note) {
midi_out(0x80+channel , note , 0);
}
void midi_out(int channel,int note,int velocity){
// Serial.println(channel); // 0::15
// Serial.println(note); // 24::120
// Serial.println(velocity); //0:127
Serial.write(channel); // 0::15
Serial.write(note); // 24::120
Serial.write(velocity); //0:127
}
void funtion_key(){
int i;
if (key[13] == LOW) {
/* */
}
}
/**************/
/* main logic */
/**************/
void setup() {
int i;
Serial.begin(38400); // connect to PC
//Serial.begin(31250); //connect to MIDI synth
for (i=0;ipinMode(key[i], INPUT);
}
old_pitch_bend = analogRead(pitch_bend_pin) / 8;
old_modulation = analogRead(modulation_pin) / 8;
}
void loop(){
/* input from keys and pots */
key_input();
/* function key */
funtion_key();
/* check push or release / output note on/off */
check_and_output();
/* store "old notes" */
store_old();
}
ちなみに、端子の接続はこんな感じ。(クリックで拡大)
D13以外は全部使用中。
今のところ、ドから1オクターブ上のドまでの音階
と、可変抵抗でvelocityも対応。当然、和音もOK。
まだオクターブシフトも、ファンクションキーも、
ピッチベンドも、モジュレーションも未搭載。
ここから色々作りこみして実験に使うのだ。フフフ。
こんな単純なものでも、手に取ってグリグリ弄れると、
なんか楽しい。
よく見ると、シグネチャが間違ってた。後で。
http://headlines.yahoo.co.jp/hl?a=20130903-00000058-mai-sctch
こうのとり、7日に再突入。地上に帰還できるように
なったらいいのにな。
イプシロンは、いつになるんだろう?
http://labaq.com/archives/51802223.html
アイザックアシモフの予想。なんか、すごいな。
http://gcluster.jp/games/
G-clasterって、どうなのよ?って思ってたんだけど、
PCエンジン関係とか、ファルコムのYsシリーズとか、
なんか色々ヨサゲなのがあるんだなぁ。
モトローダとか、ビクトリーランとか、大得意。
どっちかって言うと、フェルガナとか、Ysオリジン
とかじゃなく、その後のシリーズがやりたいんだ
けどな。移植されないのかな?
PCエンジンは、何だかんだで、面白いゲームが
いっぱいあったな。
そういえば、ヨドバシAkibaにデモ機があったなぁ。
触らなかったけど。月額定額だけじゃなくて、買取
っていうのもあるのか。悪くは無いかも。
(あまりゲーム機を家に置いておきたくないんだよな)
あと、ゲームソフトをダウンロードした媒体がぶっ壊れ
たりしたら、再ダウンロードとかもちゃんと出来るの
かな?できれば、Raspberry Piみたく、媒体丸ごと
バックアップできたりすればいいんだけど、さすがに
それは無いだろうしなぁ。
(追記)
アナログピン周りの配線が違ってました。正しくは、
こんな感じ。
詳しくは、
http://nekosan0.bake-neko.net/connection2_midi_master.html
こちら。