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を返します。