MIDI ライブラリ for Arduino
このページは、Arduino用MIDI INライブラリ(Download)の 使用方法を紹介するページになる予定です。
とりあえず少しまとまった文書ができるまで、付属のREAD MEの内容を記載しておきます。
MIDI IN library
MIDI OUT library
MIDI IN Library
(08/10/29版)
@@@ 注意!!@@@
このライブラリはタイミング精度優先のため、ISR(USART_RX_vect)を使用します。
これはArduino & Wiring のSerialライブラリと競合するため、基本的に併用する
ことはできません。
また、このライブラリはGMidiin, GMidioutの二つのライブラリを組み合わせて
配布されています。プログラム領域節約のため、その都度必要な方のみインクルード
してご使用下さい。
■主な使用手順
MIDIメッセージは基本的に複数のバイト列から成ります。
RX入力(MIDI規格に準拠する31,250bpsに設定)に対して流れこむデータ列が意味を
成した場合、メッセージの種類に合わせて任意のコールバック関数を実行すること
ができます。
現在、認識できるMIDIメッセージは以下のとおり。これ以外のものは無視されます。
- Note On
- Note Off
- CC
- Program change
- Pitch bend
- Sysex
■リファレンス
+---------------------+
| void Midiin.begin() |
+---------------------+
MIDIメッセージの受信を開始します。
具体的には、USART RX完了時割込みを有効にします。
+--------------------+
| void Midiin.stop() |
+--------------------+
MIDIメッセージの受信を停止します。
具体的には、USART RX完了時割込みを無効にします。
+----------------------------------------------------------------------------+
|void |
|Midiin.setNoteOnFunc(void (*funcPtr)(int channel, int noteNo, int velocity))|
+----------------------------------------------------------------------------+
ノート・オン受信時にコールされる関数を設定します。
煩雑そうですが、要するに
void myNoteOnFunc(int channel, int noteNo, int velocity)
{
// Do something
}
といったように、指定の3つを引数にとる任意の関数を作成したのち、
Midiin.setNoteOnFunc(myNoteOnFunc);
を実行します。
以降、ノート・オンメッセージ受信毎にmyNoteOnFunc関数が呼ばれます。
+---------------------------------------------------------------------------+
|void setNoteOffFunc(void (*funcPtr)(int channel, int noteNo, int velocity))|
|void setCcFunc(void (*funcPtr)(int channel, int ccNo, int value)) |
|void setPrgChangeFunc(void (*funcPtr)(int channel, int prgNo)) |
|void setPitchBendFunc(void (*funcPtr)(int channel, int value)) |
+---------------------------------------------------------------------------+
Midiin.setNoteOnFunc()を参照。
+-----------------------------------------------------------------------+
| void |
| setSysexFunc(void (*funcPtr)(volatile unsigned char *sysex, |
| int len, |
| int overflow )) |
+-----------------------------------------------------------------------+
int overflow = SYSEX_NO_OVERFLOW | SYSEX_OVERFLOW
Sysex受信時に実行される関数を設定します。用法はMidiin.setNoteOnFunc()
を参照のこと。
最大8バイトからなるバイト列へのポインタが返されますので、調理法はユーザ
依存となります。
実際のメッセージ長を調べるには、引数をlenを参照するか、終了バイトである
0xF0をユーザが調べる必要があります。
終了バイト以降に入っているデータは未定義。
デフォルトの受信バッファ長は8バイトです。
これより長いメッセージを受信した場合、8バイト目以降はバッファの2バイト
目に書き込まれます。
例えば、
{0xF7, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xF0}
というバイト列を受信した場合、コールバックに送られるバッファは以下の
のようになります。
{0xF7, 0x08, 0x09, 0xF0} (len = 4);
また、このような受信バッファの不足(Overflow)が発生した場合、引数overflow
にintが、それ以外の場合はゼロが返ります。s
バッファ長を変更するには、GMidiin.h 中、
#define MESSAGE_BUFFER_SIZE 8
を任意に変更して下さい。
環境によっては、ライブラリのフォルダに作成されるGMidiin.oファイルを削除するまで
結果が反映されない場合があります。
+--------------------------------------+
| Midiin.sendByte(const unsigned char) |
+--------------------------------------+
MIDIメッセージ受信バッファに1バイトのデータを送信します。
通常直接アクセスする必要はありませんが、MIDIメッセージ受信を無効に
した状態で呼び出すことによりデバッグ等にご使用下さい。
■Todo
- MIDI OUTライブラリの追加
- Sysexコールバック関数の動作チェック(未検証)
- Pitch wheelデータの対応
MIDI OUT Library
Gyokimae MIDI out library (Document revised 08/10/29) **** 注意 **** このライブラリはタイミング精度優先のため、ISR(USART_TX_vect)を使用します。 これはArduino & Wiring のSerialライブラリと競合するため、基本的に併用する ことはできません。 また、このライブラリはGMidiin, GMidioutの二つのライブラリを組み合わせて 配布されています。プログラム領域節約のため、その都度必要な方のみインクルード してご使用下さい。 ********************* Overview ********************* A collection of functions to ease sending MIDI messages. ********************* Reference ********************* +----------------------+ | void Midiout.begin() | +----------------------+ MIDIメッセージの受信を開始します。 具体的には、USART TX完了時割込みを有効にします。 +--------------------------------------------------------------------------+ | void Midiout.noteOn( | | unsigned char channel, unsigned char noteNo, unsigned char velocity) | +--------------------------------------------------------------------------+ NOTE ON メッセージを送信します。 以下の関数は、Midiout.noteOn()とほぼ同じ働きをします。 +----------------------------------------------------------------------+ | void Midiout.noteOff | | (unsigned char , unsigned char noteNo, unsigned char velocity) | | | | void Midiout.cc | | (unsigned char channel, unsigned char ccNo, unsigned char value) | | | | void Midiout.prgChange | | (unsigned char channel, unsigned char prgNo) | +----------------------------------------------------------------------+ +----------------------------------------------------------+ | void Midiout.pitchBend(unsigned char channel, int value) | +----------------------------------------------------------+ ピッチベンド・メッセージを送信します。valueの値は 0 から 16,384となります。 8192 がベンド・ホイールを中央に置いた状態です。 +-------------------------------------------------------------+ | void Midiout.sysex(unsigned char *sysex, unsigned char len) | +-------------------------------------------------------------+ Sysexメッセージを送信します。 引数lenによりメッセージ長を指定して下さい。 +-----------------------------------------------------+ | unsigned char Midiout.setSendByte( | | unsigned char setSendByte, unsigned char onFull) | +-----------------------------------------------------+ onFull = ON_FULL_WAIT | ON_FULL_RETURN return = MIDIOUT_SEND_FULL | MIDIOUT_SEND_OK 送信バッファに直接1バイト送信します。 この関数はデバッグ時および、ライブラリでサポートされていないメッセージを 送信したい場合に使用して下さい。 引数onFullにより、送信バッファが既にいっぱいの場合の挙動を指定します。 ON_FULL_RETURNを指定した場合、送信バッファがいっぱいの場合、関数はバイトを バッファに加えるのを諦め、直ちに返ります。この場合、関数はMIDI_SEND_FULLを 返します。これ以外の場合、関数はMIDIOUT_SEND_OKを返します。