Android MIDI APIについて
AndroidでMIDIを扱うために、android.media.midiを利用しています。
リンク先に書いてありますが、MIDI APIを扱う上でのポイントを記載します。
①API レベル23以上
②マニフェストに宣言の追加
③MIDI Managerの取得
④接続したMIDIデバイスの取得
MIDI Managerから接続しているMIDIデバイスの情報をリストとして取得できます。
※今回は、1つしか接続していないので、リストの0番目から取得しています。
⑤MIDIデバイスのオープン
⑥Input PortとOutput Portの取得
Input Portとは端末からMIDIデバイスでMidiデータを送る時の窓口でOutput PortはMIDIデバイスから端末でMIDIデータを受け取るときの窓口になります。
・Input Portのオープン
・Output Portのオープン
ここで、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データの送信
上記の構造になっていることが分ると思います。
このような実装で、Androidを扱う上で、MIDIデバイスと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())
);
@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());
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);
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メッセージの送受信を行うことができます。
コメント
コメントを投稿