如何使用pyPortMidi或pygame发送midi Control Change消息(CC)?

时间:2010-10-25 02:21:49

标签: python pygame midi

我正在使用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

2 个答案:

答案 0 :(得分:3)

看起来你会使用write_short方法来编写原始MIDI数据包,或者write方法,如果你想一次发送几个。因此,例如,如果要在控制器17上发送值123,则如下所示:

self.midi_out.write_short(0xb0, 17, 123)

你可能在文档中没有注意到这一点的原因是“状态”这个术语经常在MIDI协议中用来指代消息类型(即注释,音符关闭,控制变化等)

答案 1 :(得分:0)

如果你还需要一种方法来发送NRPN,除了CC之外,给我发一条消息,我会发给你我的代码,因为我正在制作一个带有pygame的midi应用程序,它与MIDI CC和NRPN进行通信。

顺便注意那些注释和注释消息。一些合成器/ midi控制器发送相同的状态消息以关闭音符和音符关闭,而其他合成器/ midi控制器发送不同的音符关闭并记录状态消息。您必须保护您的应用不会被状态消息混淆。您还必须检查状态消息,以确保它是消息而不是CC消息,反之亦然,否则您可能会触发注释而不是发送CC消息。

我做的是制作一个简单的MIDI接收pygame应用程序,帮助我研究midi消息包含的内容以及它们在我的Alesis Andromeda A6合成器上触发音符和旋转旋钮时的形成,使用简单的打印语句。

顺便说一下你在制作什么类型的应用程序?我很感兴趣。

祝你好运!!!