MIDI演奏
0x9n,note,velocityです。0xは16進表記の意味です。n: はチャンネル番号で0..15がmidiのチャンネル1..16に対応します。midiチャンネルは楽器の音色に対応します。
#use RS232(BAUD=31250, xmit=PIN_B5, rcv=PIN_B2)31250はMIDIで規定の伝送速度です。
data[0] = 0x90; // 0x9n n=0..15チャンネル data[1] = 60; // note data[2] = 64; // velocity 0〜127これは、0x90はノートオン(発音)コマンドで、0チャンネル(GM音源ではピアノ音)に、ノート番号60(中央のド)を、強さ64で出力します。続けてノート音コマンドを出せば、音が重なって聞こえます。ここでは。ド、ミ、ソ の音を重ねます。0.5秒の休止後、強さ0のノートオンコマンドで発声を停止します。
//#include <16f88.h> #include <16f873A.h> //プログラミング:奥田 #fuses HS, NOWDT, NOPROTECT, NOBROWNOUT, NODEBUG, NOLVP #use delay(CLOCK=20000000) #use RS232(BAUD=31250, xmit=PIN_B5, rcv=PIN_B2) // BAUD=312501 ⇒ 1バイトを320usで送信 int data[3]; void SendData(); void main() { while(1) { // ドの音 data[0] = 0x90; // 0x9n n=0..15チャンネル data[1] = 60; // note data[2] = 64; // velocity 0〜127 SendData(); // レの音 data[0] = 0x90; // 0x9n n=0..15チャンネル data[1] = 64; // note data[2] = 64; // velocity 0〜127 SendData(); // ミの音 data[0] = 0x90; // 0x9n n=0..15チャンネル data[1] = 67; // note data[2] = 64; // velocity 0〜127 SendData(); delay_ms(500); data[0] = 0x90; // 0x9n n=0..15チャンネル data[1] = 60; // note data[2] = 0; // velocity 0〜127 SendData(); data[0] = 0x90; // 0x9n n=0..15チャンネル data[1] = 64; // note data[2] = 0; // velocity 0〜127 SendData(); data[0] = 0x90; // 0x9n n=0..15チャンネル data[1] = 67; // note data[2] = 0; // velocity 0〜127 SendData(); delay_ms(500); } } // データを送る void SendData() { int i; for(i=0; i<3; i++) putc(data[i]); }