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 |
NHK地震速報を再生
%%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);
}

実行ファイルとソースファイルのダウンロード