楽器できないけどmidi好きのta9marです。
android用USB-MIDI-Driver作った方がいたので、使わせてもらいました
kshojiさん / USB-MIDI-Driver
https://github.com/kshoji/USB-MIDI-Driver
物理接続構成
GalaxyNexus <-> microUSB-B USB-A変換 <-> USB-MIDI keyboard
ちっこいUSB-MIDI鍵盤引っ張り出してGNさんに接続。EVOLUTIONってかいてある。
(いつも使ってるIFのROLAND UA-20だとMIDIイベント全く取ってくれなかったので><)
サンプルアプリ繋いだらMIDI EVENTが表示されたのを確認。
これを音が出るように改造してみるテスト。
結果がこちら。
ド、レ、ミとか、音階ごとに単音のMIDIファイルを作っておいて、鍵盤押されたらMediaPlayerクラスで再生。
横音ハンドベルの時みたいに、pcmで録音するのはアプリ容量的にも、稼動的にも厳しいので今回はMIDIに。
以前作ったメモリ上にMIDIファイルイメージ作るクラス使おうと思ったら、MediaPlayerクラスはメモリから再生できないみたい。なので一度ファイルに書き出した。
1つ作って、コピーしてバイナリエディタで音階書き換える地道な作業。
(midiの音階は例えば38(0x26)だとオクターブ2のミ#(E+2)とか決まってます)

40個ほどmidiファイル作って、リソースとしてにつっこんで、ソースはべた書き。
@Override
public void onMidiNoteOn(int cable, int channel, int note, int velocity) {
if (velocity > 0) {
MediaPlayer mediaPlayer=null;
switch(note){
case 0x26: //38:E+2
mediaPlayer = MediaPlayer.create(this, R.raw.note26);
break;
case 0x27: //39:E2
mediaPlayer = MediaPlayer.create(this, R.raw.note27);
break;
case 0x28: //40:F2
mediaPlayer = MediaPlayer.create(this, R.raw.note28);
break;
case 0x29: //41:F+2
mediaPlayer = MediaPlayer.create(this, R.raw.note29);
break;
case 0x2a: //42:G2
mediaPlayer = MediaPlayer.create(this, R.raw.note2a);
break;
case 0x2b: //43:G+2
mediaPlayer = MediaPlayer.create(this, R.raw.note2b);
break;
:
<中略>
:
case 0x50: //80:F+5
mediaPlayer = MediaPlayer.create(this, R.raw.note50);
break;
default:
break;
}
if(mediaPlayer!=null){
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.start();
}
}
}
再生終了した音ファイルはonCompletionでリリース。
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
MIDI-INは取れて活用できたのでテストとしては満足だけど、ミニ鍵盤ではどうにも面白いネタが出来そうにない。
どうにかしてRoland UA-20認識させてRoland XP-60からイベント取りたい。
次はMIDI-OUTも試したいけど、やはりUA-20経由になるのでどうにかしないと。。。
(あとgithubの使い方覚えないとな。。。)