gpt4 book ai didi

c++ - midiOutShortMsg 和 midiOutSetVolume 以立体声输出

转载 作者:行者123 更新时间:2023-11-30 00:55:38 33 4
gpt4 key购买 nike

我正在编写 C++ 代码来输出 MIDI 消息。我需要它在立体声中工作,以便通过左声道/扬声器播放一些音符,通过右声道播放其他音符。如果我调用 midiOutSetVolume(midiOutHandle, 0xFFFF),然后多次调用 midiOutShortMsg,每次调用间隔几百毫秒,音符将通过左扬声器发出。同样,如果我在调用 midiOutShortMsg 之前先调用 midiOutSetVolume(midiOutHandle, 0xFFFF0000),一切都会从正确的扬声器中出来。但是,如果我尝试通过执行以下操作同时通过左扬声器输出一个音符并通过右扬声器输出一个音符:

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

两个音符都从正确的扬声器中发出。我想如果我可能有 2 个单独的设备 handle ,我可以设置一个播放左声道音符,另一个播放右声道。但是,如果我尝试通过对 midiOutOpen 的 2 次调用打开同一设备的 2 个句柄,我会在第二次调用时收到 MMSYSERR_ALLOCATED 错误。

非常感谢任何建议。

最佳答案

您应该使用两个 channel 并在每个 channel 上设置pan。然后在 channel 0 上为左扬声器播放您的音符,在 channel 1 上为右扬声器播放您的音符。

要设置音符的 channel ,您的Note On 事件有 4 位用于 channel :

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

因此,请为您的左扬声器使用声道 0,为您的右扬声器使用声道 1

要设置 channel 的声像,向该 channel 输出一个Control Change消息:

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)

设置 channel 0的声像为0, channel 1的声像为127。

参见 MIDI messages reference了解更多详情。另外,这是一个 short list控制更改编号。


更新:使用同步打击乐器组需要 MIDI 标准 XG 或 GM 级别 2。了解它们 here .您使用哪种方法取决于您设备的 MIDI 标准:

  • XG:发送值为 127 (0x7F) 的Bank Select Control Change 消息( Controller 编号0)。
  • GM 级别 2:为您的两个工具包使用 channel 1011(即,当您发送 Note On 时使用 channel 9 和 10)。

关于c++ - midiOutShortMsg 和 midiOutSetVolume 以立体声输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11946016/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com