none
Midiデバイスのinputメッセージを別のMidiデバイスへ転送する際に、ブレスコントロールなどがうまく送信されない RRS feed

  • 質問

  • いつもお世話になっております。
    (今回は珍しくプライベートな開発なのですがw)

    Windows 7 SP1 + Visual Studio 2010 ProのVC++上でWin32 SDKで32bitアプリケーションを作っています。
    作ろうとしているプログラムは、AKAIのEWI USBというウインドシンセサイザーのMidi Inのデータを外部Midi音源(現在はRoland SC-8850でテスト中)へ出力するプログラムです。
    (付属ソフトの音だけではつまらないので、別の音源の音色で演奏したいと思ったので…)

    普通に音色を指定して音を出したり、ボリュームや音色を調整することはできたのですが、ブレスの強弱による音の強さがうまくコントロールできなく(というよりも、指定された音色でノートオン・ノートオフだけをしている状態にしかならなく)、書き込みをさせていただきました。

    実際にこのUSBデバイスは、演奏中にMidi Inメッセージを送信していて、中のメッセージを見ると、

    Status=0xb0 Data1=0x02 Data2=0x7f
    Status=0xd0 Data1=0x7f Data2=0x00
    Status=0xb0 Data1=0x02 Data2=0x09
    Status=0xd0 Data1=0x09 Data2=0x00
    Status=0xb0 Data1=0x02 Data2=0x00

    というようにチャンネルプレッシャーやブレスコントロールのメッセージが入ってきており、midiinProc関数内で

    void CALLBACK MidiInProc(HMIDIIN hMidiIn, UINT wMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
    {
        UINT l_uintLoop;
        MIDIHDR *l_pInMidiHdr = NULL;                                                                        //SysEx メッセージ受信用バッファ
        MIDIHDR l_OutMidiHdr;                                                                        //SysEx メッセージ送信用バッファ

        OutputMidiMsg(L"C:\\EWI_MSG.log", wMsg, dwParam1, dwParam2);


        switch (wMsg)
        {
            case MIM_OPEN:
                break;
            case MIM_CLOSE:
                break;
            case MIM_DATA:
                midiOutShortMsg(g_hMidiOut, (DWORD)(dwParam1));
                break;
            case MIM_LONGDATA:
                l_pInMidiHdr = (MIDIHDR *)dwParam1;
                ZeroMemory(&l_OutMidiHdr, sizeof(MIDIHDR));
                l_OutMidiHdr.lpData = (LPSTR)(l_pInMidiHdr->lpData);
                l_OutMidiHdr.dwBufferLength = l_pInMidiHdr->dwBytesRecorded;
                l_OutMidiHdr.dwFlags = 0;
                /* MIDIHDR 構造体を準備して送信*/
                midiOutPrepareHeader(g_hMidiOut, &l_OutMidiHdr, sizeof(MIDIHDR));
                midiOutLongMsg(g_hMidiOut, &l_OutMidiHdr, sizeof(MIDIHDR));
                Sleep(100);
                /* 再度入力用バッファを準備して登録*/
                midiInPrepareHeader(hMidiIn, l_pInMidiHdr, sizeof(MIDIHDR));
                midiInAddBuffer(hMidiIn, l_pInMidiHdr, sizeof(MIDIHDR));
                /* 出力用のMIDIHDR 構造体の準備を解除*/
                midiOutUnprepareHeader(g_hMidiOut, &l_OutMidiHdr, sizeof(MIDIHDR));
                break;
            case MIM_ERROR:
                break;
            case MIM_LONGERROR:
                break;
            case MIM_MOREDATA:
                break;
            default:
                break;
        }
    }

    このような感じで入ってきたメッセージを外部音源にmidiOutShortMsgなどで出力しています。
    midiOutShortMsg関数の戻り値も正常なのですが、ブレスによる音の強弱が全く表現できずにいます。

    このようなメッセージをMidi Outに出力する際には、何か特殊なことをしなければならないのでしょうか?
    参考になるサイトなどでも結構です、ご存知の方いらっしゃいましたらご教示いただきたく・・・^^;

    なお、Midi Outデバイスを開いた直後にGM2システムオンのメッセージ({0xf0, 0x7e, 0x7f, 0x09, 0x03, 0xf7})を送信してから出力しています。

    2011年10月24日 16:13

回答

  • すみません、自己解決しました。

    というよりも、SC-8850はブレスコントロールメッセージに対応していないようです。
    (Rolandに問い合わせをしてそのように回答が返ってきました)

    無理やりボリュームコントロールなどで調整できないかを試してみて、うまくいかなかったら他の音源を買うか、あきらめるかすることにします。

    お騒がせしました。

    • 回答としてマーク どらちん 2011年10月25日 14:42
    2011年10月25日 14:42