主にandroidとかのメモ

androidでMIDI-INテスト

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