Android MIDI APIについて

AndroidでMIDIを扱うために、android.media.midiを利用しています。

リンク先に書いてありますが、MIDI APIを扱う上でのポイントを記載します。

①API レベル23以上
②マニフェストに宣言の追加
 <uses-feature android:name="android.software.midi" android:required="true"/>

③MIDI Managerの取得
MidiManager m = (MidiManager)context.getSystemService(Context.MIDI_SERVICE);

④接続したMIDIデバイスの取得
MIDI Managerから接続しているMIDIデバイスの情報をリストとして取得できます。
※今回は、1つしか接続していないので、リストの0番目から取得しています。
MidiDeviceInfo[] infos = m.getDevices();

⑤MIDIデバイスのオープン
 m.openDevice(infos[0], new MidiManager.OnDeviceOpenedListener() {
     @Override
     public void onDeviceOpened(MidiDevice device) {
         if (device == null) {
             //MIDIデバイスのオープン失敗
         } else {
             //MIDIデバイスのオープン成功
             //ここでInput PortとOutput Portの取得処理を記述
         }
     }, new Handler(Looper.getMainLooper())
     );

⑥Input PortとOutput Portの取得
Input Portとは端末からMIDIデバイスでMidiデータを送る時の窓口でOutput PortはMIDIデバイスから端末でMIDIデータを受け取るときの窓口になります。

・Input Portのオープン
MidiInputPort inputPort = device.openInputPort(index);

・Output Portのオープン
class MyReceiver extends MidiReceiver {
     public void onSend(byte[] data, int offset,
             int count, long timestamp) throws IOException {
         // MIDIデータが送られてくる度に呼ばれます
     }
 }
 MidiOutputPort outputPort = device.openOutputPort(index);
 outputPort.connect(new MyReceiver());

ここで、MIDIを扱う上で、MIDIメッセージの構造を理解する必要があります。
参照:https://www.g200kg.com/jp/docs/tech/midi.html
MIDIメッセージは下記のようになっています。
1バイト目:ステータスバイト
2バイト目:データバイト(0-127で指定)
3バイト目:データバイト(0-127で指定)

鍵盤を押された場合のメッセージは特に下記のようになっています。
1バイト目:9n hex (16進数、nはチャンネル)
2バイト目:ノート番号(440HzのA4のラの場合は69)
3バイト目:ベロシティ(鍵盤を押した強さ)
MIDIノート番号参照:http://www.asahi-net.or.jp/~HB9T-KTD/music/Japan/Research/DTM/freq_map.html

⑦MIDIデータの送信
 byte[] buffer = new byte[32];
 int channel = 3; // チャンネル番号
 buffer[0] = (byte)(0x90 + (channel - 1)); // 鍵盤を押された場合のステータス
 buffer[1] = (byte)69; // ノート番号
 buffer[2] = (byte)127; // ベロシティ
 inputPort.send(buffer, 0, 3);


上記の構造になっていることが分ると思います。
このような実装で、Androidを扱う上で、MIDIデバイスとMIDIメッセージの送受信を行うことができます。

コメント

このブログの人気の投稿

JoyPianoについて、androidでMIDI電子ピアノの演奏データの記録•再生、ビジュアライザー、遠隔地の電子ピアノの遠隔操作でリモート演奏

『JoyPiano』のプライバシーポリシー