山本ワールド
MIDIによる簡単な音の発生(32/64bit)
概要
Visual C++のソースコードで簡単な音をMIDIを使って発生させます。音源はWindowsに標準でついているものです。
交響曲第5番 運命 (ベートーヴェン)の出だしとNHKの緊急地震速報の音を再生してみます。楽譜は以下の通りです。
NHKの緊急地震速報についてはNHK側に権利があると思われしかも周りに影響を多分に与える音ですのでくれぐれも扱いには気を付けましょう。当方は一切の責任を負うものではありません。
楽譜の表示はabcjsを使用してみました。
%%staffwidth 200\nX X: 1 T: 運命 M: 2/4 L: 1/8 Q:2/4=108 K:Cmin z GGG| E4 | z FFF | D4- | D4 |
%%staffwidth 200\nX X: 1 T: NHK緊急地震速報 M: 4/4 L: 1/4 %R: reel Q:1/4=120 K:C [_e_BECG,][_f_cF_D_A,]z2 [_e_BECG,][_f_cF_D_A,]z2
テスト環境
コンパイラ
Visual C++ 2008/2013 Express 32/64bit マルチバイト/UNICODE実行環境
Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)Windows 7 Enterprise Service Pack 1 64bit
プログラムソースの概要
miditest.cpp
_tmain
再生のために midiOutOpen APIによりMIDI 出力デバイスをオープンします。デバイスは引数MIDI_MAPPERによりディフォルトとしています。midiOutShortMsg APIにより音階や音の発生・停止を制御します。音階はノートで指定します。
midiOutShortMsg APIの引数はMIDIのショートメッセージそのものです。
次にこれらのメッセージのためのソースコードを作成用のJavascriptを作成してみました。
midiOutReset APIによりすべてのMIDIチャネルをオフします。
midiOutClose APIにより出力デバイスをクローズします。
鍵盤を押す
音階・オクターブ等を設定するとソースコードを表示します。鍵盤を離す場合は、ステータスバイトの0x90を0x80に変更します。
音色を変更(プログラム変更)
音色系統を選択し音色等を選択するとソースを表示します。フォームで作成したソース
ソースコード
miditest.cpp
// MIDIデモ
#include <windows.h>
#include <mmsystem.h>
#include <tchar.h>
#pragma comment(lib,"winmm.lib")
void _tmain(void){
HMIDIOUT h;
midiOutOpen(&h,MIDI_MAPPER,0,0,0);
#if 1 // 運命の出だし
midiOutShortMsg( h , 0x2ac0 ); // 音色を定義 チェロ0x2a(42)
midiOutShortMsg( h, 0x7f4390); // 鍵盤を押す G5 0x43(67) 127 チェンネル0
Sleep(277);
midiOutShortMsg( h, 0x7f4380); // 鍵盤を離す G5 0x43(67) 127 チェンネル0
midiOutShortMsg( h, 0x7f4390); // 鍵盤を押す G5 0x43(67) 127 チェンネル0
Sleep(277);
midiOutShortMsg( h, 0x7f4380); // 鍵盤を離す G5 0x43(67) 127 チェンネル0
midiOutShortMsg( h, 0x7f4390); // 鍵盤を押す G5 0x43(67) 127 チェンネル0
Sleep(277);
midiOutShortMsg( h, 0x7f4380); // 鍵盤を離す G5 0x43(67) 127 チェンネル0
midiOutShortMsg( h, 0x7f3f90); // 鍵盤を押す D+,E-5 0x3f(63) 127 チェンネル0
Sleep(554);
midiOutShortMsg( h, 0x7f3f80); // 鍵盤を離す D+,E-5 0x3f(63) 127 チェンネル0
Sleep(1108);
midiOutShortMsg( h, 0x7f4190); // 鍵盤を押す F5 0x41(65) 127 チェンネル0
Sleep(277);
midiOutShortMsg( h, 0x7f4180); // 鍵盤を離す F5 0x41(65) 127 チェンネル0
midiOutShortMsg( h, 0x7f4190); // 鍵盤を押す F5 0x41(65) 127 チェンネル0
Sleep(277);
midiOutShortMsg( h, 0x7f4180); // 鍵盤を離す F5 0x41(65) 127 チェンネル0
midiOutShortMsg( h, 0x7f4190); // 鍵盤を押す F5 0x41(65) 127 チェンネル0
Sleep(277);
midiOutShortMsg( h, 0x7f4180); // 鍵盤を離す F5 0x41(65) 127 チェンネル0
midiOutShortMsg( h, 0x7f3e90); // 鍵盤を押す D5 0x3e(62) 127 チェンネル0
Sleep(2216);
midiOutShortMsg( h, 0x7f3e80); // 鍵盤を離す D5 0x3e(62) 127 チェンネル0
Sleep(1108);
#endif
#if 1 // NHK緊急地震速報
midiOutShortMsg( h , 0xc0 ); // 音色を定義 アコースティックピアノ0x0(0)
for(int n=0;n<2;n++){
midiOutShortMsg( h , 0x7f4390 ); // 鍵盤を押す G5 0x43(67) 127 チェンネル0
midiOutShortMsg( h , 0x7f4891 ); // 鍵盤を押す C6 0x48(72) 127 チェンネル1
midiOutShortMsg( h , 0x7f4c92 ); // 鍵盤を押す E6 0x4c(76) 127 チェンネル2
midiOutShortMsg( h , 0x7f5293 ); // 鍵盤を押す A+,B-6 0x52(82) 127 チェンネル3
midiOutShortMsg( h , 0x7f5794 ); // 鍵盤を押す D+,E-7 0x57(87) 127 チェンネル4
Sleep(500);
midiOutShortMsg( h , 0x7f4380 ); // 鍵盤を離す G5 0x43(67) 127 チェンネル0
midiOutShortMsg( h , 0x7f4881 ); // 鍵盤を離す C6 0x48(72) 127 チェンネル1
midiOutShortMsg( h , 0x7f4c82 ); // 鍵盤を離す E6 0x4c(76) 127 チェンネル2
midiOutShortMsg( h , 0x7f5283 ); // 鍵盤を離す A+,B-6 0x52(82) 127 チェンネル3
midiOutShortMsg( h , 0x7f5784 ); // 鍵盤を離す D+,E-7 0x57(87) 127 チェンネル4
midiOutShortMsg( h , 0x7f4490 ); // 鍵盤を押す G+,A-5 0x44(68) 127 チェンネル0
midiOutShortMsg( h , 0x7f4991 ); // 鍵盤を押す C+,D-6 0x49(73) 127 チェンネル1
midiOutShortMsg( h , 0x7f4d92 ); // 鍵盤を押す F6 0x4d(77) 127 チェンネル2
midiOutShortMsg( h , 0x7f5393 ); // 鍵盤を押す B6 0x53(83) 127 チェンネル3
midiOutShortMsg( h , 0x7f5894 ); // 鍵盤を押す E7 0x58(88) 127 チェンネル4
Sleep(1000);
midiOutShortMsg( h , 0x7f4480 ); // 鍵盤を離す G+,A-5 0x44(68) 127 チェンネル0
midiOutShortMsg( h , 0x7f4981 ); // 鍵盤を離す C+,D-6 0x49(73) 127 チェンネル1
midiOutShortMsg( h , 0x7f4d82 ); // 鍵盤を離す F6 0x4d(77) 127 チェンネル2
midiOutShortMsg( h , 0x7f5383 ); // 鍵盤を離す B6 0x53(83) 127 チェンネル3
midiOutShortMsg( h , 0x7f5884 ); // 鍵盤を離す E7 0x58(88) 127 チェンネル4
}
#endif
midiOutReset(h);
midiOutClose(h);
}