研究テーマ->メディアアート->メディアアートについて->Arduino Music Shield MIDIの発音プログラム
ArduinoとShieldについて紹介します。  
プロジェクトの作成


新規ファイルを作成し、midi_single_toneという名前で保存します。(以降、メニューのスケッチブックからこのプロジェクトが開けるようになります。)
ドキュメントフォルダの下の\Arduino\libraries\Music_Shield-masterというフォルダの中にあるMusicPlayer.hのファイルを編集します。
MusicPlayer.hというファイルを開いて編集します。 「//for Midi」 と書いてある上の行に「public:」と書き加えます。(もっと正しいやり方があるのかもしれませんが、これでこのコマンドにアクセスできるようになります。)
ソースコードの記述
 

#include <SD.h>
#include <SPI.h>
#include <arduino.h>
#include <MusicPlayer.h>

void setup()
{
    Serial.begin(9600);
    player.beginInMidiFmt();
    player.midiWriteData(0xB0, 0x07, 120);
}
void loop()
{
    player.midiWriteData(0x90, 0x40, 120);
    delay (1000);
    player.midiWriteData(0x80, 0x40, 120);
}

 
上図のように記述します。
「player.beginInMidiFmt();」は何か初期化のコマンドのようです。InMidiとなっていますから入力用かと思いきや、発音させるだけでも必要なようです。
MIDIメッセージ(MIDIに関するコマンドをこう呼ぶ)は、ほとんどmidiWriteDataで発行できます。 MIDIに関する説明を正確に書くとわかりにくくなるので、以降、多少、語弊があってもわかりやすくして書きます。(たとえば、MIDIはプロトコルの名称なので、「MIDIで 音がでません!」などの表現は間違いですが、ここではそのような表現も使います。)
3つ引数がありますが、MIDIメッセージは大きく分けて、「最初の2バイトで命令の種類を示し、3つ目がパラメータになっているもの」と、「最初の1バイトで命令の種類を示し、続く2バイトがパラメータになっているもの」の2種類があります。 どの場合もパラメータとして記述できる値の範囲は0〜127と決まっています。
「 player.midiWriteData(0xB0, 0x07, 120);」は、「0xB0, 0x07」の2バイトでボリューム操作の命令であることを示し、「120」が音量を示すパラメータになっています。この行を省略しても音はでるかもしれませんが、稀に音量のデフォルトがゼロになっているという意地悪なデバイスがありますので指定しておいたほうがいいかもしれません。1バイト目が0xB0の命令の一覧を参考にしてください。また、1バイト目に何がくるかの一覧も参考にしてください。
「player.midiWriteData(0x90, 0x40, 120); 」は、「0x90」が発音の命令、「0x40」が音の高さ、「120」が音の大きさを示しています。「player.midiWriteData(0x80, 0x40, 120);」の「0x80」は音を止める命令です。音の高さは、 2バイト目の0〜127までの数値がどの高さの音になるかの一覧を参考にしてください。3バイト目は値が大きいほど、音が大きくなります。
試していませんが、midiNoteOnやmidiNoteOffとう名前の関数がヘッダに入っていますから、こちらを使って発音させることもできると思います。