如何强制MIDI设备报告控制状态?

时间:2019-05-11 19:38:55

标签: python midi

我正在使用python-rtmidi读取带有滑块和旋钮的MIDI设备。

每当滑块移动或旋转旋钮时,我都会收到CONTROL_CHANGE事件(效果很好)。

但是当程序启动时,如何查询MIDI设备以找出滑块和旋钮的初始位置?

用户没有移动任何东西,因此不会发送CONTROL_CHANGE消息。

(我没有MIDI设备的任何文档;它是“ WORLDE Easycontrol 9” ;我只是想使用标准的MIDI消息。)

-在引起您注意的同时-是否有标准命令来打开/关闭按钮LED?我尝试将CONTROL_CHANGE命令发送到按钮的控制器编号(值0和127),但是只有在手动按下按钮时,LED才会点亮。

我现有的代码:

import rtmidi

class Midi:

    CONTROL_CHANGE = 0xB0

    def __init__(self, port=0):
        self.midi_in = rtmidi.MidiIn() # gets BUT DOES NOT OPEN a midi input port
        self.midi_out = rtmidi.MidiOut()

        try:
            self.midi_in.open_port(port)
            self.midi_out.open_port(port)

            self.running = True

        except:
            self.running = False # in case there was no such MIDI port

    def read(self):

        if self.running:
            event = self.midi_in.get_message()

            if event:
                return event[0]

        return None

    def write(self, message):
        if self.running:
            self.midi_out.send_message(message)

2 个答案:

答案 0 :(得分:2)

官方MIDI规范未定义读取控件当前状态的机制。但是,许多设备都有特定于供应商的命令来启动批量参数转储。

是否可以从计算机更改控件是特定于设备的。

答案 1 :(得分:1)

这可能太晚了,但对于我正在使用的设备,按钮的 LED 是通过使用按下按钮时传输的相同键发送 noteOn 或 noteOff 数据包来控制的。我发现此文档很有帮助,即使它不适用于我的设备:

https://www.numark.com/images/product_downloads/dj2go___software_definition_and_midi_spec_v1.0.pdf