树莓派 OSA MIDI 板

为 MIDI 设置 Raspberry Pi
本指南将展示如何使用新安装的 Raspberry Pi 并将其作为操作系统可发现的 MIDI I/O 设备运行。 它还将提供一些前amp使用各种 Python 库将 MIDI 数据输入和输出编程环境的文件。 更新 – 11 年 2021 月 XNUMX 日。:本指南已更新以修复最新 Raspberry Pi OS 版本的一些问题,您还可以下载带有预安装脚本并在此处完全配置的完整映像。
我们需要什么
- 树莓派 A+/B+/2/3B/3B+/4B
- 树莓派 MIDI 板
- 一张 MicroSD 卡•一套 4 颗尼龙 M2.5 螺丝
- 4 件套尼龙 M2.5*11mm 母对母支架
- 一套 4 个尼龙 M2.5*5mm 公对母支架
集会
使用尼龙螺丝和支架将 Raspberry Pi 与 MIDI 板组装在一起,如下图所示:

首次设置
我们测试了所有的前amp文件中使用 Rasperry Pi OS(4 年 2020 月版)的 Pi XNUMXB 上的文件)。 第一次,需要使用屏幕和键盘来设置 Pi。 此后,使用您选择的方法访问 Pi 的操作系统。 除非另有说明,否则所有步骤都是强制性的
安装
更新/升级
按照此处所述执行更新和升级: https://www.raspberrypi.org/documentation/raspbian/updating.md
网络配置(可选)
如果您从另一台机器通过 SSH 连接到 Pi,则值得为 Pi 提供一个固定的 IP 地址: https://www.modmypi.com/blog/how-to-give-your-raspberry-pi-a-static-ip-address-update 将网络安全设置添加到 Pi 以使其自动连接到网络也是一个好主意: https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md
将 Pi 设置为 USB OTG 小工具
在 Pi 上打开一个终端并按照以下步骤操作:
- 将USB驱动设置为dwc2
回声“dtoverlay=dwc2” | sudo tee -a /boot/config.txt - 启用 dwc2 驱动程序
回声“dwc2” | sudo tee -a /etc/modules - 启用 lib 复合驱动程序
回声“lib 复合”| sudo tee -a /etc/modules - 启用 MIDI 小工具
回声“g_midi” | sudo tee -a /etc/modules
创建配置脚本:
- 创建 file
须藤触摸 /usr/bin/midi_over_usb - 使其可执行
须藤 chmod +x /usr/bin/midi_over_usb - 用 Nano 编辑它
须藤纳米/usr/bin/midi_over_usb
将以下内容粘贴到 file,根据需要对产品和制造商字符串进行编辑。 cd /sys/kernel/config/usb_gadget/ mkdir -p midi_over_usb cd midi_over_usb echo 0x1d6b > idVendor #Linux Foundation echo 0x0104 > idProduct #多功能复合小工具 echo 0x0100 > bcdDevice # v1.0.0 echo 0x0200 > bcdUSB # USB2 mkdir -p strings/ 0x409 echo “fedcba9876543210” > strings/0x409/serialnumber echo “OSA Electronics” > strings/0x409/manufacturer echo “MIDI USB Device” > strings/0x409/product ls /sys/class/udc > UDC 退出 Nano 并保存 file (Ctrl+X,Y,返回)。 将脚本调用添加到 rc.local,以便它在每次启动时执行。 sudo nano /etc/rc.local 在“exit0”之前添加以下行 /usr/bin/midi_over_usb 退出 Nano 并保存 file 并重新启动 Pi。 sudo reboot 列出可用的 MIDI 端口。 amidi -l 如果 MIDI 配置正确,最后一个命令应该输出类似于: Dir Device Name IO hw:0,0 f_midi IO hw:0,0 f_midi
安装 Python 库
本节将解释如何为 Python 2.x 安装我们首选的库。
美度
Mido 是一个易于使用的库,用于处理 MIDI 数据。 它依赖于 rt-midi 后端、asound 库和 Jack。 依次输入以下命令: 输出应显示一个“Midi Through”端口和一个附加端口。 如果是这样,一切都很好。 *注意:在 Mido 中,端口名称是用单引号括起来的整个字符串,但可以将名称截断为冒号之前的字符串。 在这台机器上,字符串是:'f_midi:f_midi 16:0'。 例如ample,这两个命令是等价的
GPIO
我们使用 pigpio 库来连接 GPIO 引脚。 我们发现这个库比与 Pi 硬件 (RPi.GPIO) 连接的标准方法更稳定和灵活。 如果您想使用另一个库,请相应地编辑代码。 要安装 pigpio 库,请按照此处的说明进行操作: http://abyz.me.uk/rpi/pigpio/download.html 在运行所有前任之前amp下面的文件,如果没有完成,你应该启动 pigpio 服务:
蟒蛇amp莱斯
前任amples 还使用 numpy 库的 interp 函数作为在两个范围之间映射的简单方法。 我们使用 Reaper 来发送和接收数据。 Pi 在 Reaper 的首选项菜单中配置为硬件 MIDI 输出。
使用音符数据控制 GPIO(例如ample_1_key_press.py) 这个前ample 展示了如何:
- 使用简单的条件监听 3 个特定的音符开和音符关事件
- 捕获非音符数据发送到 Pi 时出现的异常(例如,从音序器传输数据)
- 将音符速度映射到输出引脚的 PWM
导入相关库,从 pigpio 库创建 pi 对象,并打开输出端口: try/catch 块用于捕获其他类型的 MIDI 数据发送(例如传输控制等)产生的错误。 while True: try: #这会过滤掉 port.iter_pending() 中 msg 的所有非笔记数据: # 如果有消息未决 if(msg.type == 'note_on'): # 如果是 Note On 消息输出= interp(msg.velocity, [0,127],[0,255]) # 缩放速度从 0-127 到 0-255 #按音符编号过滤数据 if(msg.note == 53): pi1.set_PWM_dutycycle(2, out ) elif(msg.note == 55): pi1.set_PWM_dutycycle(3, out) elif(msg.note == 57): pi1.set_PWM_dutycycle(4, out) else: # 如果消息不是 Note On(例如 Note关闭) if(msg.note == 53): pi1.set_PWM_dutycycle(2, 0) elif(msg.note == 55): pi1.set_PWM_dutycycle(3, 0) elif(msg.note == 57): pi1. set_PWM_dutycycle(4, 0) except AttributeError as error: print(“Error excepted”) pass
使用调制轮和音高轮控制 GPIO(例如ample_2_wheels.py)
这个前任ample 展示了如何:
- 监听音高和调制数据并按类型过滤它们
- 将数据映射到输出引脚的 PWM
这个前任ample 与上述类似,具有以下消息类型:
- 音高轮是类型音高轮,值为 msg.pitch
- Mod Wheel 是一个连续控制器类型 control_change,控制参数为 msg.control = 1(CC 编号),值为 msg.value
从 GPIO 事件输出 MIDI 数据 (gpio_event.py)
这个前任ample 展示了如何:
- 使用中断检测按钮按下
- 将 MIDI 数据从 Pi 发送到另一台设备
打开输出端口,创建两条消息并将 GPIO 引脚设置为输入。 这个前任ample 假设有一个按钮连接到引脚 21,因此当按下按钮时引脚变为高电平:以下是按下或释放按钮时调用的回调函数。 输出端口 send() 函数只是将消息发送到端口外:回调监听器在后台运行,不需要更多关注:
播放 MIDI File
这个前任ample 展示了如何:
- 加载 MIDI file 在编程环境中
- 播放 file .
这个前任amples 假设你有一个 MIDI file 叫 midi_file.mid 在与你的 python 脚本相同的目录中: import mido from mido import MidiFile 从 mido 导入 MetaMessage 端口 = mido.open_output('f_midi') mid = MidiFile('midi_file.mid') while True: 用于 Midi 中的 msgFile('midi_file.mid').play(): port.send(msg)
文件/资源
![]() |
树莓派 OSA MIDI 板 [pdf] 用户手册 OSA MIDI,板 |




