2012-08-14 30 views
1

我正在編寫C++代碼來輸出MIDI消息。我需要這樣做以立體聲的方式工作,以便通過左聲道/揚聲器播放一些音符,其他音符則通過右聲道播放。如果我呼叫midiOutSetVolume(midiOutHandle,0xFFFF),然後幾次調用midiOutShortMsg,每次呼叫相隔幾百毫秒,音符就會通過左揚聲器。同樣,如果我在調用midiOutShortMsg之前首先調用midiOutSetVolume(midiOutHandle,0xFFFF0000),則所有內容都會發出正確的說話者。但是,如果我試圖同時輸出一個音符通過左揚聲器和一個通過正確執行以下操作:midiOutShortMsg和midiOutSetVolume輸出立體聲

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

兩個註釋簡單的問世右揚聲器。我想,如果我可能有兩個單獨的手柄,我可以設置一個播放左聲道音符,另一個是正確的。但是,如果我嘗試通過2次調用打開2個手柄到相同的設備midiOutOpen我第二次調用時收到MMSYSERR_ALLOCATED錯誤。

任何意見非常讚賞。

回答

6

您應該使用兩個通道並在每個通道上設置pan。然後發揮你的筆記左揚聲器上的通道0,是您在通道右側揚聲器1.

筆記要設置一個音符的通道,你注意在事件有通道4位:

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

所以使用通道您的左揚聲器和渠道你的右揚聲器。

要設置的信道的油鍋,輸出一個控制變更消息到信道:

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 messages reference瞭解更多詳情。另外,這裏是控制變更號碼的short list


UPDATE:使用同時打擊樂器音色需要對他們here MIDI標準XG或GM級別2.讀。哪種方法您使用取決於設備的MIDI標準:

  • XG:發送銀行選擇控制變更消息(控制數)與價值(0x7F的)。
  • GM等級2:使用渠道和您的兩個包(即9和10,當你發送音符開)。
+0

非常感謝您的回覆。我實際上使用的是打擊樂器,它們被設置爲頻道10,因此不能使用多個頻道。我試着設定音量,而不是設定音量,但結果是一樣的,一切都結束了。 – fhevol 2012-08-14 19:01:36

+0

是否可以設置另一個打擊樂器的頻道?您的方法可以使用標準的GM儀器完美工作如果我可以得到2個頻道打擊樂器我在那裏。 – fhevol 2012-08-14 19:30:26

+0

@AndrewKlinkhamer:可以,這取決於你的MIDI設備。答案已更新。 – Scotty 2012-08-16 02:55:48

相關問題