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

Posted

技术标签:

【中文标题】如何强制 MIDI 设备报告控制状态?【英文标题】:How to force a MIDI device to report control status? 【发布时间】:2019-05-11 19:38:54 【问题描述】:

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

【问题讨论】:

这能回答你的问题吗? AudioKit - Midi - How do I determine the state of a know without events? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

迟到总比没有好 - 谢谢;下次我去更新那个项目时,我会研究这个。

以上是关于如何强制 MIDI 设备报告控制状态?的主要内容,如果未能解决你的问题,请参考以下文章

Midi 控制器设备名称

从 C# 控制台应用程序枚举 UWP MIDI API 设备?

在 C++ 中从 MIDI 设备获取 ID

如何强制 Crashlytics 上传报告并等待

如何在 Electron 上请求 MIDI 设备权限?

演奏世间所有乐器——Midi设备到底有多神奇?