1

MIDI メッセージを出力する C++ コードを書いています。ステレオで動作させるには、これが必要です。これにより、一部の音は左チャンネル/スピーカーから再生され、他の音は右から再生されます。midiOutSetVolume(midiOutHandle, 0xFFFF) を呼び出し、続いて midiOutShortMsg を数百ミリ秒間隔で複数回呼び出すと、ノートは左側のスピーカーから聞こえます。同様に、midiOutShortMsg を呼び出す前に最初に midiOutSetVolume(midiOutHandle, 0xFFFF0000) を呼び出すと、すべてが正しいスピーカーから出力されます。ただし、次のようにして、左のスピーカーから 1 つのノートを出力し、右のスピーカーから 1 つのノートを同時に出力しようとすると、次のようになります。

midiOutSetVolume(midiOutHandle, 0xFFFF);
midiOutShortMsg(...);
midiOutSetVolume(midiOutHandle, 0xFFFF0000);
midiOutShortMsg(...);

どちらの音も右のスピーカーから出てきます。デバイスに 2 つの別個のハンドルがあれば、1 つを左チャンネルのノートを再生するように設定し、もう 1 つを右チャンネルのノートを再生するように設定できると考えました。ただし、midiOutOpen を 2 回呼び出して同じデバイスへの 2 つのハンドルを開こうとすると、2 回目の呼び出しで MMSYSERR_ALLOCATED エラーが発生します。

アドバイスをいただければ幸いです。

4

1 に答える 1

6

2 つのチャンネルを使用し、各チャンネルでパンを設定する必要があります。次に、チャンネル 0 で左スピーカーのノートを再生し、チャンネル 1 で右スピーカーのノートを再生します。

ノートのチャンネルを設定するには、ノートオンイベントにチャンネル用の 4 つのビットがあります。

1001nnnn (Note On)
nnnn = channel number (0..15)

したがって、左スピーカーにはチャンネル0を使用し、右スピーカーにはチャンネル1を使用します。

チャンネルのパンを設定するには、そのチャンネルにコントロール チェンジメッセージを出力します。

Status byte: 1011nnnn (Control Change)
nnnn = channel number (0..15)

First data byte - Controller number: 0ccccccc
Second data byte - Controller value: 0vvvvvvv
ccccccc = 10 (0x0A) for Pan
vvvvvvv = 0..127 (left = 0, right = 127)

チャンネル 0 のパンを 0 に、チャンネル 1 のパンを 127 に設定します。

詳細については、MIDI メッセージのリファレンスを参照してください。また、ここにコントロール チェンジ番号の短いリストがあります。


更新:同時パーカッション キットを使用するには、MIDI 標準 XG または GM レベル 2 が必要です。詳細については、こちら を参照してください。どの方法を使用するかは、デバイスの MIDI 規格によって異なります。

  • XG:値127 (0x7F)のBank Select Control Change メッセージ (コントローラー番号0 ) を送信します。
  • GM レベル 2: 2 つのキットにチャンネル1011を使用します (つまり、ノートオンを送信する場合は 9 と 10)。
于 2012-08-14T05:21:08.913 に答える