我在去年买了一个 M-Audio 的 Midi 键盘,用来连接电脑或者 iPad 弹琴。但是由于琴摆放的位置没有办法拉充电线,所以我能弹琴多久很大程度上取决于设备还有多少电。前一阵子从朋友手里白嫖了个橘子派,我就考虑用这个板子给我的 Midi 键盘做个无线连接的接口,而且还安装了 FluidSynth 让设备可以直接发出声音让我带耳机练琴。

这篇文章中我首先会介绍 FluidSynth 的配置,再介绍如何通过 Midi over BLE 广播信号,最后介绍如何通过 Midi over Wifi 来广播信号。你可以选择性的看需要的部分。

系统配置

由于我使用的是橘子派而不是树莓派,我遇到了一些只有这边才会遇到的问题,其他开发板可以选择性掠过本节。

橘子派能安装的最新版本 Armbian 内核关闭了 Midi 功能,为了能够使用,我重新编译了内核。(在编译选项中开启:Device Drivers > Sound card support > Advanced Linux Sound Architecture > Sequencer Support )

橘子派还需要在系统中启用声音,使用自带的配置工具 sudo armbian-config,启用 System > Hardware > Toggle hardware configuration > analog-codec 。

由于橘子派会等待网络服务激活后才进入系统,导致开机时间非常长,使用下面的命令关闭它:

sudo systemctl disable NetworkManager-wait-online
复制代码

你还可以使用 systemd-analyze blame 命令查看服务的启动时间,关闭一些其他你不需要的服务。

FluidSynth

安装

Debian 源中自带的 FluidSynth 版本比较低,是 1.x 的。由于旧版本的 FluidSynth 并不能自动连接 Midi 设备,我们需要手动编译新版。

为了安装依赖,我们先要调整 apt 源,在文件中取消几个 deb-src 源前面的注释。

sudo nano /etc/apt/sources.list
sudo apt-get update
复制代码

安装所有需要的依赖包然后编译。

sudo apt-get build-dep fluidsynth --no-install-recommends
git clone https://github.com/FluidSynth/fluidsynth
cd fluidsynth/
mkdir build
cd build
cmake ..
sudo make install
复制代码

接下来在命令行中执行 fluidsynth 确认是否正常。如果出现了找不到库的情况的话,首先应该尝试更新链接库。

sudo ldconfig
复制代码

如果这样不行的话,可以添加环境变量。(下面的代码是临时的,永久修改可以自己 Google 一下。)

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
复制代码

确认可以正常运行之后就可以进入下一步骤了。

(本节参阅 Github)

获取 Sound Font

如果你尝试过直接用 apt 安装 FluidSynth 的话,你应该会看到它推荐的几个包:fluidr3mono-gm-soundfont、timgm6mb-soundfont、fluid-soundfont-gm。这些都是 Sound Font。但是他们可能不够好听,并不能达到你的要求,这时候你就可以去一些第三方网站下载,比如 SoundFont4U。

FluidSynth 支持 SF2/SF3 格式的音源文件,不支持 SFZ,请注意不要搞错。自己下载的音源可以存到一个叫 sound-fonts 的文件夹下备用,使用 apt 安装的上述几个音源则安装在 /usr/share/sounds/sf2 文件夹下。

测试声音

先运行一次测试是否能够正常出声,这里我使用了 GM 音源。

fluidsynth -is -a alsa -m alsa_seq -g 5 -o midi.autoconnect=1 /usr/share/sounds/sf2/FluidR3_GM.sf2
复制代码

解释一下参数:

  • a,m 输入输出使用的音频驱动。
  • is 作为服务静默运行。
  • g 力度阈值,这里设置的大一点,以防一些设备音量太小。
  • o 细节参数,这里设置了自动连接 Midi 设备 midi.autoconnect。

(本节参阅 Github)

运行之后弹一下连接的键盘,看看有没有声音,比较慢的设备可能需要等一段时间才会显示已连接。按照目前的设置,音量应该会蛮大的,如果声音特别小,可以打开 alsamixer 调整一下音量,并使用 sudo alsactl store 保存状态。确认可以正常演奏之后进行下一步。

启动服务

为了能够让 FluidSynth 开机启动我们需要自己写一个服务:sudo nano /etc/systemd/system/fluidsynth.service。在文件中输入:

[Unit]
Description=FluidSynth Daemon
After=sound.target[Service]
EnvironmentFile=/etc/fluidsynth
ExecStart=/usr/local/bin/fluidsynth -is -a alsa -m alsa_seq -z 64 -c 2 -g $GAIN -o synth.cpu-cores=4 -o midi.autoconnect=1 ${FONT_PATH}[Install]
WantedBy=multi-user.target
复制代码

解释一下这里多出来的几个参数:

  • z 缓存大小,可以使用 64 128 256 等“整数”。
  • c 缓存个数,一般为 2 或 3。
  • o 多了一个设置 CPU 核心数的选项 synth.cpu-cores,你可以根据自己的开发板来设置。可以装一个 htop 数条条看几个核。

文件中还把音源文件名和力度放在了环境文件中方便设置。新建环境文件:sudo nano /etc/fluidsynth,在文件中输入:

FONT_PATH=/home/megabits/sound-fonts/SalC5Light2.sf2
GAIN=1.5
复制代码

这个应该就不用我太多解释了。这里将力度设置为 1.5 是我试出来在橘子派上比较合适的音量,你可以自己调。假如你的 Midi 键盘有音量滑杆那就更方便了。

激活服务:

sudo systemctl enable fluidsynth
sudo systemctl start fluidsynth
复制代码

之后理论上就应该能正常弹琴了。假如听不到声音,可以用 journalctl -u fluidsynth 来查看服务的日志,看看是出了什么问题。

参考文章:

  • Raspberry Pi Zero をMIDI音源ボックス化
  • Orange Pi USB MIDI Host

Midi over Bluetooth Low Energy

安装 BlueZ

首先要下载 BlueZ,由于 BlueZ 默认是没有开启 Midi 功能的,所以需要自己编译。这里使用的 BlueZ 是一个经过修改的版本,提供了 Midi Server 的功能。

git clone https://github.com/oxesoft/bluez
sudo apt-get install -y autotools-dev libtool autoconf
sudo apt-get install -y libasound2-dev
sudo apt-get install -y libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev
cd bluez
./bootstrap
./configure --enable-midi
sudo make install
复制代码

之后测试一下开启服务端并用其他支持 Bluetooth Midi 的软件来搜索,如 iOS 下的 Garageband。

sudo btmidi-server -v -n "Midi over BLE"
复制代码

如果出现了 MGMT_OP_SET_LE failed: Not Supported,就说明设备不支持 BLE。在确认一切正常后打开另外一个终端窗口,连接好 Midi 设备并扫描。注意在这之前要先用别的设备连接上 Bluetooth Midi,BlueZ 只有在有设备连接时才会创建 Midi 通道。

aconnect -l
复制代码

在列表中找到你自己的蓝牙设备和创建的 "Midi over BLE"。比如我的输出结果是:

client 0: 'System' [type=kernel]0 'Timer           '1 'Announce        '
client 14: 'Midi Through' [type=kernel]0 'Midi Through Port-0'
client 20: 'Keystation 88' [type=kernel,card=1]0 'Keystation 88 MIDI 1'1 'Keystation 88 MIDI 2'
client 128: 'Midi over BLE' [type=user,pid=2104]0 'Midi over BLE   '
复制代码

这里可以看到我的键盘 "Keystation 88" 编号是 20,"Midi over BLE" 默认编号是 128。

aconnect 20:0 128:0
复制代码

这样就可以把两个通道连接起来了。去键盘上按几个键,看看连接的设备会不会发出声音。一切正常就可以进行下一步了。

启动服务

新建一个服务:sudo nano /lib/systemd/system/btmidi.service,在文件中输入:

[Unit]
Description=MIDI Bluetooth connect
After=bluetooth.target
Requires=bluetooth.target[Service]
ExecStart=/usr/local/bin/btmidi-server -n "Midi over BLE"[Install]
WantedBy=multi-user.target
复制代码

激活服务:

sudo systemctl enable btmidi.service
sudo systemctl start btmidi.service
复制代码

接下来配置自动连接 Midi 通道,这里我们使用 udev 来在蓝牙设备发生变化时自动连接。首先来写一个连接脚本:

touch linkble.sh
chmod a+x linkble.sh
nano linkble.sh
复制代码

在文件中输入:

#!/bin/bash

sleep 1
/usr/bin/aconnect 'Keystation 88':0 'Midi over BLE':0
复制代码

注意这里要把键盘的名字改成自己的。之所以要用设备名来连接,是因为设备编号是不稳定的。接下来建立规则 sudo nano /etc/udev/rules.d/44-bt.rules,在文件中输入:

ACTION=="add|remove", SUBSYSTEM=="bluetooth", RUN+="/home/user-name/linkble.sh"
复制代码

刷新规则:

sudo udevadm control --reload-rules
复制代码

这样就可以在其他设备连接到 BLE 的时候自动连接通道了。

参考文章:

  • RASPBERRY PI 3B AS USB/BLUETOOTH MIDI HOST
  • BlueZ with MIDI over BLE Support

Midi over Wifi

安装 raveloxmidi

首先需要激活虚拟 Midi 设备模块,由于我们使用的工具 raveloxmidi 会以独占方式访问 Midi 设备,我们必须用一个虚拟设备来传递信号。

modprobe snd-virmidi
aconnect -l
复制代码

如果输出中出现了虚拟 Midi 设备就说明设置成功了。为了能让模块永久启用,我们来建立一个配置文件 sudo nano /etc/modules-load.d/snd-virmidi.conf,在文件中输入:

snd-virmidi
复制代码

保存并重启。

接下来安装 raveloxmidi:

sudo apt-get install -y git pkg-config libasound2-dev libavahi-client-dev autoconf automake
sudo apt-get install avahi-daemon
git clone -b experimental https://github.com/ravelox/pimidi.git
cd pimidi/raveloxmidi/ && ./autogen.sh && ./configure && make -j2
sudo make install
复制代码

假如你的网络不支持 ipv6,则需要配置一下 avahi-daemon,打开文件:sudo nano /etc/avahi/avahi-daemon.conf,按照下面的值来设置,注意一些行需要取消注释。

use-ipv6=no
publish-addresses=yes
publish-aaaa-on-ipv4=no
复制代码

打开 aconnect -l 来看一下设备在其中的编号,看一下 Midi 键盘的编号和第一个虚拟设备的编号,我的是 28:0 24:0,把它们连接起来。注意这里的顺序,一定是把键盘通道发送给虚拟设备通道。

aconnect 28:0 24:0
复制代码

接下来查看硬件编号:

amidi -l
复制代码

我这里第一个虚拟 Midi 设备的编号是 hw:2,0,记住这个值。为 raveloxmidi 建立一个配置文件:/etc/raveloxmidi.conf,在文件中输入:

alsa.input_device = hw:2,0
network.bind_address = 0.0.0.0
logging.enabled = yes
logging.log_level = normal
复制代码

接下来启动测试:

sudo raveloxmidi -dN -c /etc/raveloxmidi.conf
复制代码

如果程序正常运行了你应该就可以在其他地方连接它。这里以 macOS 上的 Garageband 为例:

打开 “音频 Midi 音频设置” 并在菜单中打开显示 “Midi 音频工作室”。之后在 “Midi 音频工作室” 的菜单或者工具栏上打开 “Midi 网络设置”。启用 “会话1”。在目录中选择 raveloxmidi,点连接。

打开 Garageband 弹几个音试一试,如果正常出声就是成功了。

启动服务

新建一个服务:sudo nano /etc/systemd/system/raveloxmidi.service,在文件中输入:

[Unit]
After=local-fs.target network.target
Description=raveloxmidi RTP-MIDI network server[Install]
WantedBy=multi-user.target[Service]
User=root
ExecStartPre=/usr/bin/aconnect 'Keystation 88':0 24:0
ExecStart=/usr/local/bin/raveloxmidi -dN -c /etc/raveloxmidi.conf
复制代码

注意 Midi 设备的名称要改成自己的。激活服务:

sudo systemctl enable raveloxmidi.service
sudo systemctl start raveloxmidi.service
复制代码

服务没有启动成功也没关系,可能是因为我们之前已经手动连接过一次 Midi 设备了,重启试试就好。

(本节参阅:Github)

参考文章:

  • Using a Raspberry Pi as a RTP-MIDI Gateway for macOS

常见问题

FluidSynth 无法打开默认声卡

遇到这种情况可能是你开机的时候 Alsa 没有把第一个输出设备分给你的声卡,而是分给了虚拟 Midi 或 USB 设备。首先我们来看一下你的音频设备都有什么:

aplay -l
复制代码

列出的内容可能是这样的:

 0 snd_virmidi1 snd_usb_audio2 (null)
复制代码

这其中的 0 和 1 号卡都不是输出声音的设备,我们可以降低他们的优先级。打开 Alsa 的配置文件,为每一个设备设置 -2 的优先级:

sudo nano /etc/modprobe.d/alsa-base.conf
复制代码
options snd_virmidi index=-2
options snd_usb_audio index=-2
复制代码

重启之后应该就可以了,另外你还需要修改 Midi over Wifi 的配置文件,更新声卡编号。

参考文章:

  • ALSA - ArchWiki

破音

如果 FluidSynth 出现了破音的现象,你需要考虑两方面原因。

假如破音时和负载有关的,你可能需要增加使用多 CPU 核心选项。

假如是定时的,大概一秒一次这种的,可能是由于 schedutil 导致的,这个调整 CPU 频率的工具对音频应用非常不友好。你需要配置它锁住 CPU 频率或者采用比较保守的方案来调整频率才不会出问题。

后记

弄 Midi 这档子事坑还是挺多的,我折腾了一周左右遇到了各种各样的问题,现在给大家总结一下,假如后来有人要做类似的事情,就可以省点心了。

转载于:https://juejin.im/post/5d52e3aa5188255b0743ffe5

用树莓派(等)为 USB Midi 键盘增添连接方式相关推荐

  1. 用树莓派做MIDI HOST,给合成器外接MIDI键盘

    最近买了几台迷你合成器,包括KORG的volca系列和Roland的T-8.KORG的volca系列迷你合成器,都有midi输入接口,可以外接midi键盘.但midi输入接口是传统的5针midi接口, ...

  2. midi接口 stm32_万利的STM32板实现的USB MIDI键盘

    万利的STM32板实现的USB MIDI键盘 我是拿原来的USB摇杆的那个程序来改的,所以里面还有很多 原来的摇杆方面的东东,懒得去改它了,能用就行了. 源代码包下载: 地址1: 地址2:http:/ ...

  3. python编程midi键盘按键_用树莓派自制 MIDI 键盘

    MAKER:midiIdentifier/译:趣无尽 Cherry(转载请注明出处) 本教程将手把手教你从零开始自制属于你自己的 MIDI/钢琴/音乐/歌曲键盘.这是一个基于树莓派的开源项目,其中所需 ...

  4. comlx 牌计算机音乐怎么设置,最具性价比的全能型 MIDI 键盘:Nektar Impact LX+ 键盘视频教程...

    说到音乐制作设备,大家首先想到的肯定是电脑.音乐工作站软件(DAW).声卡以及MIDI键盘.其中,一款手感出色.功能强大的MIDI键盘是创作的核心工具之一,便捷的操控可以让编曲更加流畅,任何灵感和乐思 ...

  5. Live Source Address 2019最新的电视广播包_Arturia MiniLab MkII迷你MIDI键盘2019年换新装:反色纯黑版...

    MiniLab MkII是一款十分紧凑和便携的MIDI控制器,一直引领着迷你MIDI键盘的世界,今天Arturia正式宣布2019年发布MiniLab MkII的特别版本:Deep Black反色纯黑 ...

  6. java midi 解析_Java从MIDI键盘获取输入

    我已经用Java设计了自己的合成器,现在我想将其与Midi键盘连接.我在下面的课程搜索所有带有发射器的Midi设备.它成功找到了我的Midi键盘.我将自己的接收器添加到每个设备的每个发送器中,以便它可 ...

  7. 【智能无线小车系列七】在树莓派上使用USB网卡

    在这个腾"云"驾"物"(云:云计算,物:物联网)的时代,什么都可以没有,就是不能没有网络,树莓派也离不开它.本章节将详细介绍如何将树莓派接入互联网,因为有一些后 ...

  8. Android 手机的USB midi测试方法

    USB midi测试方法 注:如下介绍android 手机中usb midi的测试方法.文中提到的相关apk均可以在线下载获取. 1.测试机作为device模式,电脑为host端. 手机端安装Midi ...

  9. 8修改host_正点原子【STM32-F407探索者】第五十九章 USB 鼠标键盘(Host)实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 上一章我们向大家介绍了如何利用 STM32F4 的 US ...

最新文章

  1. 你不知道的车牌识别系统
  2. esp32原理图设计_第十一章 ESP32的PWM全彩LED灯显示
  3. 用原生js封装get方法
  4. python通用数据库连接_python 连接数据库pg
  5. In the interview, Clem revealed that his first
  6. Silverlight的诸多效果(小鸟飞,白云走,气球飘,图片展示)附源码
  7. 网站html静态化 教程,新云CMS网站内容管理系统生成HTML静态化教程
  8. 色板游戏(洛谷 1558)
  9. TSC条码打印机常见故障及解决方法
  10. 外挂的定义、分类及实现原理
  11. 同步软件UltraCompare 64位 软件及注册机
  12. ESX4 安装前的考虑
  13. linux开发板网口连接测试方法
  14. 美团动态线程池实践思路开源项目(DynamicTp),线程池源码解析及通知告警篇
  15. 网课必备·几款特色各异的pdf软件大全
  16. mysql开发收银_农银e管家收银台PC版收款语音播报插件开发实录(二)
  17. 计算机低配配置单,吃鸡需要什么配置|电脑玩绝地求生最低配置多少
  18. 微信小程序,一个有局限的类似 React Native 轮子
  19. 华为云FusionInsight MRS容灾:大数据两地三中心的容灾也可以如此省心
  20. 怎么看区块链正规项目与否,区块链投资前你应知道这三点

热门文章

  1. 想从事人工智能方面,需要自学什么?
  2. 中国可信计算机走向世界核心技术领
  3. 测试篇二:关于测试(mocha+karma)
  4. altium designer利用向导画封装库详解
  5. Redis的底层数据结构----快速列表_quicklist
  6. 判定覆盖 与 条件覆盖 的区别
  7. 用Python写个空课表生成器-Excel文件操作实例
  8. Java Redis操作实例
  9. 新秀学习51供应链管理的----模拟笔记本PC和51串行通讯1
  10. 如何在Visual Studio中自动格式化代码?