如何使用 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?

如何在pygame中围绕精灵或图像绘制边框?

如何聚焦光线或如何仅在 pygame 中绘制窗口的某些圆形部分?

如何避免在 Linux/X11 上使用 pygame 撕裂

如何使pygame冲突起作用

Pygame和PyQt4如何集成?