楽器できないけど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の使い方覚えないとな。。。)