如何使用 pyPortMidi 或 pygame 发送 midi 控制更改消息 (CC)?
Posted
技术标签:
【中文标题】如何使用 pyPortMidi 或 pygame 发送 midi 控制更改消息 (CC)?【英文标题】:How do I send midi Control Change messages (CC's) using pyPortMidi or pygame? 【发布时间】:2010-10-25 02:21:48 【问题描述】:我正在使用 Python 和 Pygame,它使用 pyPortMidi 作为它的 midi 模块,我目前正在通过 Midi Yoke 向 Ableton live 发送 NoteOn 和 NoteOff 消息,效果很好。但我似乎无法弄清楚我如何发送 CC 消息..
有人吗?
(工薪阶层)基本上是这样的。
class MidiIO:
def __init__(self, device_id = None, inst=0):
pygame.midi.init()
pygame.fastevent.init()
if device_id is None:
self.output_id = pygame.midi.get_default_output_id()
else:
self.output_id = device_id
self._print_device_info()
port = self.output_id
print ("using output_id :%s:" % port)
self.midi_out = pygame.midi.Output(port, 0)
self.midi_out.set_instrument(inst)
self.pressed = False
def midiOut(self, btns, note=60, vel=100):
if btns == 1:
if not self.pressed:
self.midi_out.note_on(note, vel)
self.pressed = 1
elif btns == 0:
self.midi_out.note_off(note)
self.pressed = 0
【问题讨论】:
【参考方案1】:看起来您会使用write_short
方法来编写原始 MIDI 数据包,或者如果您想一次发送多个数据包,则使用write
方法。因此,例如,如果您想在控制器 17 上发送值 123,则如下所示:
self.midi_out.write_short(0xb0, 17, 123)
您可能在文档中没有注意到这一点的原因是,术语“状态”经常在 MIDI 协议中用于指代消息类型(即,音符开、音符关、控制更改等) .
【讨论】:
这就是我最终发现的。谢谢! @MarcusOttosson 如果您想出办法,您可以(并鼓励)回来并发布您自己问题的答案。 知道 pyPortMIDI JACK 或 ALSA 吗?【参考方案2】:如果您还需要发送 NRPN 以及 CC 的方法,请给我留言,我会将代码发送给您,因为我正在使用 pygame 制作一个与 MIDI CC 和 NRPN 通信的 midi 应用程序。
顺便说一下,注意那些注释打开和注释掉的消息。一些合成器/midi 控制器为音符关闭和音符关闭发送相同的状态消息,而另一些则发送不同的音符关闭和音符打开状态消息。您必须确保您的应用不会被状态消息弄糊涂。您还必须检查状态消息,以确保它是消息而不是 CC 消息,反之亦然,否则您可能会触发注释而不是发送 CC 消息。
我所做的是制作一个简单的 MIDI 接收 pygame 应用程序,该应用程序帮助我使用简单的打印语句研究 MIDI 消息包含的内容以及它们在触发音符和扭曲我的 Alesis Andromeda A6 合成器上的旋钮时是如何形成的。
顺便问一下,您正在制作什么类型的应用程序?我很感兴趣。
祝你好运!!!
【讨论】:
以上是关于如何使用 pyPortMidi 或 pygame 发送 midi 控制更改消息 (CC)?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Kivy 1.9.1 或 1.9.2 在 OSX 10.12.2 上使用 SDL2 而不是 pygame?