0

C次の呼び出しで、ピアノのキー、キーボード No 60を押すことをシミュレートする win32 アプリを作成しようとしています。midiOutShortMsg (hMidiOut, DWORD (0x090 | 0 | (60 << 8) | (64 << 16)));

キー no 60 を放すときは、次の呼び出しを行います。midiOutShortMsg (hMidiOut, DWORD (0x080 | 0 | (60 << 8) | (0 << 16)));

問題は、ボタンを押したときに音が 1 回しか聞こえないことです。プログラムを実行すると、1つのケースのみが機能します。

押している間だけ音が繰り返されるようにするにはどうすればよいですか。長いメロディーを作るにはどうすればいいですか?

case WM_KEYDOWN:
{
    switch (wParam) {

    case VK_LEFT:
        midiOutOpen(&hMidiOut, -1, 0, 0, 0);
        // Set instrument to 0 = Acoustic Grand Piano
        midiOutShortMsg(hMidiOut, DWORD(0x0C0 | 0 | (0 << 8) | (0 << 16)));
        midiOutShortMsg (hMidiOut, DWORD(0x090 | 0 | (65<<8 ) | (64 << 16)));
        break;

    case 'S':
        midiOutShortMsg (hMidiOut, DWORD(0x090 | 0 | (62<<8 ) | (64 << 16)));   
        break;

    case 'D':
        midiOutShortMsg (hMidiOut, DWORD(0x090 | 0 | (64<<8 ) | (64 << 16)));
        break;

    case 'F':
        midiOutShortMsg (hMidiOut, DWORD(0x090 | 0 | (65<<8 ) | (64 << 16)));
        break;

    case 'G':
        midiOutShortMsg (hMidiOut, DWORD(0x090 | 0 | (67<<8 ) | (64 << 16)));
        break;

    case 'H':
        midiOutShortMsg (hMidiOut, DWORD(0x090 | 0 | (69<<8 ) | (64 << 16)));
        break;

    case 'J':
        midiOutShortMsg (hMidiOut, DWORD(0x090 | 0 | (71<<8 ) | (64 << 16)));
        break;

    case 'K':
        midiOutShortMsg (hMidiOut, DWORD(0x090 | 0 | (72<<8 ) | (64 << 16)));
        break;
4

1 に答える 1

0

キーの状態を保存し (おそらく bool 配列を使用して)、メッセージ処理ループで再生できると思います。

于 2012-11-21T01:09:04.467 に答える