header

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