通过 MacOS 上的端口将 MIDI 数据发送到数码钢琴

Posted

技术标签:

【中文标题】通过 MacOS 上的端口将 MIDI 数据发送到数码钢琴【英文标题】:Send MIDI data via port on MacOS to Digital Piano 【发布时间】:2021-04-06 14:06:50 【问题描述】:

我想通过端口从我的计算机(运行 MacOS)将 MIDI 数据发送到我的数码钢琴。 我希望能够播放 MIDI 文件,在特定时长内播放特定音符,并可能更换乐器。

我完全不知道如何实现这一点,也无法在网上找到任何资源。 请提供您的解决方案的代码,因为这将有很大帮助。

我正在使用 USB-to-Host 来发送数据 --> 不确定这是否意味着什么。

【问题讨论】:

请使用tour、阅读what's on-topic here、How to Ask和question checklist,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。你必须诚实地尝试,然后就你的算法或技术提出一个具体问题 【参考方案1】:

不确定这是否是一个体面的堆栈溢出问题。互联网上有很多关于 MIDI 的资源。

搜索“Python MIDI”会显示此 repo python-midi。

如果您阅读自述文件,它似乎可以做您想做的事。

【讨论】:

不幸的是,这不是我想要的,因为它不能通过端口播放。【参考方案2】:

手动使用 Garageband:

    将数码钢琴连接到计算机 (MacOS) 并打开两者。 使用 Garageband 打开 MIDI 文件,MacOS 设备上通常提供该文件。 然后转到 Gargageband->Preferences->'Audio/Midi'->'Output Device' 下拉菜单 如果数码钢琴被电脑识别,它应该在下拉列表中列出。选择它。 单击 Garageband 上的“播放”图标。 MIDI 文件应使用来自数码钢琴的输出播放。

以编程方式使用 Mido:

    将数码钢琴连接到计算机(MacOS)并打开两者。

    安装 mido python 包pip install mido

    获取 mido 识别的 midi 端口列表:python -c "import mido; print(mido.get_output_names())"

    输出应该类似于:['Digital Keyboard', 'IAC Driver Bus 1']

    在本例中,“数字键盘”是您的键盘。 您的实际键盘可能有不同的名称。 注意:“IAC Driver Bus 1”是标准 MacOS MIDI 输出端口。

    通过将“数字键盘”更改为 mido 在 #3 中显示的键盘名称来更新以下 play-midi.py 脚本。将 *.mid 文件更新为 *.mid 文件的名称。

import mido

# This will list the available ports 
print(mido.get_output_names())

# Open the midi link to your keyboard
outport = mido.open_output('Digital Keyboard')

# Open the mid file to be played
mid = mido.MidiFile('my_midi_file.mid', clip=True)

# Play the file out to your keyboard
for msg in mid.play():
    outport.send(msg)
    运行脚本。声音应该会从您的键盘中播放出来。

Mido 参考资源:

https://github.com/mido/midohttps://mido.readthedocs.io/en/latest/midi_files.html

【讨论】:

鉴于这是一个以编程为中心的网站,我严重怀疑 OP 是否可以接受非编程方法

以上是关于通过 MacOS 上的端口将 MIDI 数据发送到数码钢琴的主要内容,如果未能解决你的问题,请参考以下文章

Android上的Midi事件路由

如何将midi从java程序发送到OSX上的IAC总线

通过虚拟输出使用 AKSequencer 发送 midi

使用 RtMIDI,MIDISendSysex 不向虚拟端口发送事件

使用 QT 通过 USB 发送 midi 消息

从停止的设备获取当前的 MIDI 时间码