Skip to content

Install

snhirsch edited this page Jul 6, 2018 · 17 revisions

Recommended Platforms

The MIDI bridge will build and run on any recent Linux distribution on a variety of architectures. A desktop machine will serve well for testing and coding, while a small single-board system is most practical for live performance. Code is tested on Raspberry Pi (B) and Beaglebone Green. The USB subsystem on RPi appears to have some latency issues, so the Beaglebone would be the recommended choice.

Required Skills

At a minimum you must be able to:

  • Use an 'ssh' client to obtain a command line session on a remote machine

  • Use a text editor to make changes to a couple of configuration files.

  • Make use of Google to locate solutions for generic operating system problems that I may not cover in this document

This project is stable and functional, but may not be suitable for the non-technical or complete Linux newbies.

Singleboard Computer Setup

Write System to SD Card

Beaglebone:

Download:

https://debian.beagleboard.org/images/bone-debian-8.4-lxqt-4gb-armhf-2016-05-13-4gb.img.xz

Then follow directions here:

https://beagleboard.org/getting-started#update

The official instructions want you to boot the BBG by connecting as a USB slave device to a PC. I don't know anything about this approach and won't address it. The only sane way I can make these instructions generic is to treat the device as Just Another Linux Machine.

  • Plug an ethernet cable into the board

  • Insert the SD card

  • Hold down the 'reset' button while plugging a source of USB power into the small port (an old cell phone charger works fine). Release the reset button when you see the power LED (far side of the ethernet port from reset) light up.

  • Log in to your router and find the IP address for the Beaglebone (all home routers I'm aware of have the ability to show you IP addresses and names for DHCP clients like the BB).

  • From your PC or Mac, log in to the BB:

hirsch@z87:~$ ssh root@192.168.245.105
Debian GNU/Linux 8

BeagleBoard.org Debian Image 2016-05-13

Support/FAQ: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

default username:password is [debian:temppwd]

Last login: Thu Jun 23 15:47:53 2016 from 192.168.245.27
root@beaglebone:~# 

Take this opportunity to fix a couple of annoyances in the BB configuration.

  • Disable sshd reverse DNS to fix very slow login. Edit /etc/ssh/sshd_config and add these lines at the end.
UseDNS no
GSSAPIAuthentication no
  • Prevent logs from filling with error messages when running in a commandline only environment. Edit /etc/rsyslog.d and comment out these lines.
#daemon.*;mail.*;\
#       news.err;\
#       *.=debug;*.=info;\
#       *.=notice;*.=warn       |/dev/xconsole
  • Enable power-down on button push. The BB manual claims that you can safely power off by holding the on/off button on the computer. This does seem to work, but it immediately powers up after you release the button. Answer is to install acpid. A single momentary press will shutdown the system.
$ apt-get install acpid

Note: There will still be a couple of LEDs on after the system shuts off, but once the flashing stops it's safe to remove the power.

RaspberryPi

Go to this page and download Raspbian Jessie Lite:

https://www.raspberrypi.org/downloads/raspbian/

Then follow the instructions here to write to SD:

https://www.raspberrypi.org/documentation/installation/installing-images/README.md

  • Plug an ethernet cable into the board

  • Insert the SD card

  • Apply power to the board

  • Log in to your router and find the IP address (all home routers I'm aware of have the ability to show you IP addresses and names for DHCP clients like the BB).

  • From your PC or Mac, log in to the BB:

$ ssh pi@192.168.245.105
  passwd: raspberry
$ sudo su -
$ 
  • Force USB to "full" speed (aka USB 1.1). Edit the file /boot/cmdline.txt and add the text underlined below.
(some entries omitted)... rootwait dwc_otg.speed=1
                                   ---------------

IMPORTANT: If you are using the newer "Stretch" distribution, please locate and comment out these lines in /lib/systemd/system/systemd-udevd.service:

#KillMode=mixed
#WatchdogSec=3min
#TasksMax=infinity
#MountFlags=slave
#MemoryDenyWriteExecute=yes
#RestrictRealtime=yes
#RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6

A heartfelt "thanks" to Kurt Jensen for unearthing and testing this fix.

  • Reboot the computer and login in again as root:
$ reboot
...

Initial Setup

  • Setup a non-privileged account for yourself (repeat after me: "Running routinely as root will bite you in the butt sooner than later.."). While logged in as root per above:
$ useradd -m -s /bin/bash steven
$ passwd steven
  new password: xxxxxx
  enter again: xxxxxx
  • Install some required packages:
$ apt-get update
$ apt-get install libasound2 
$ apt-get install librtmidi-dev 
$ apt-get install libusb-1.0-0-dev 
$ apt-get install git 
$ apt-get install g++ 
$ apt-get install at  

$ apt-get install libjack0 (Debian Precise)
# or
$ apt-get install libjackQ (Debian Jessie)

$ apt-get install python2.7 python2.7-dev
$ apt-get install python-pip

# NOTE: Install of python-pip segfaults on rPi but the program seems
# functional.

# Now install Python USB support using pip:

$ pip install pyusb
  • Log out as root and back in under your new account name:
$ ssh steven@192.168.245.105

Build and Install MIDI Bridge

  • While logged as your new account, download and build the MIDI bridge (there should be no errors or warnings)
$ git clone https://github.com/snhirsch/mustang-midi-bridge.git
$ cd mustang-midi-bridge
$ make

If you see an error in this form you may have an older version of librtmidi installed:

g++ -O3 -DNDEBUG -c -o mustang_midi.o mustang_midi.cpp
mustang_midi.cpp: In function ‘int main(int, const char**)’:
mustang_midi.cpp:16:19: error: ‘RtMidiError’ does not name a type
 # define RT_ERROR RtMidiError
...

If you see such an error try the build again with this command:

$ make CPPFLAGS=-DRTMIDI_2_0

If you still encounter errors double-check to be sure you have all the required packages installed. You can do this by looking at the output of the dpkg command (example for libusb, but you should check for all of them by using only the first part of the name - e.g. just 'librtmidi' rather than 'librtmidi-dev-blah'):

$ dpkg -l | grep libusb
ii  libusb-0.1-4:armhf             2:0.1.12-25                     armhf        userspace USB programming library
ii  libusb-1.0-0:armhf             2:1.0.19-1                      armhf        userspace USB programming library
ii  libusb-1.0-0-dev:armhf         2:1.0.19-1                      armhf        userspace USB programminglibrary development files
    ----------------
ii  libusb-1.0-doc                 2:1.0.19-1                      all          documentation for userspace USB programming

If none of the above gets you anywhere, please open an issue on the GitHub page:

https://github.com/snhirsch/mustang-midi-bridge/issues

Be sure to provide complete details on the problem, preferably by pasting the failing step complete with the resulting error message (as I've shown above).

After a successful build, you need to customize two files for your environment.

  • Gather the id values for your controller by monitoring the system logs.
$ sudo tail -f /var/log/syslog
  • Plug your MIDI controller into one of the USB ports and watch the output. Note down what you see for 'idVendor' and 'idProduct' (this example is for my MidiSport 1x1. It will be different for other controllers):
Jun 25 16:14:12 beaglebone kernel: [  596.979234] usb 1-1.2: new full-speed USB device number 7 using musb-hdrc
Jun 25 16:14:12 beaglebone kernel: [  597.073151] usb 1-1.2: New USB device found, idVendor=0763, idProduct=0160
                                                                                            ----            ----
Jun 25 16:14:12 beaglebone kernel: [  597.080272] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=
Jun 25 16:14:12 beaglebone kernel: [  597.087828] usb 1-1.2: Product: USB MS1x1 MIDI Interface
Jun 25 16:14:12 beaglebone kernel: [  597.093299] usb 1-1.2: Manufacturer: M-Audio
  • Exit log monitoring with Ctrl-C. Leave the controller connected.

  • Edit the file 60-midi.rules and set these properties based on the id numbers in the log entry. Do not change anything else in this file!

ACTION=="add|change", SUBSYSTEM=="usb", ATTRS{idVendor}=="0763", ATTRS{idProduct}=="0160" (more..)
                                                          ----                      ----
ACTION=="remove", ENV{ID_VENDOR_ID}=="0763", ENV{ID_MODEL_ID}=="0160" (more...)
                                      ----                      ----
  • Find the MIDI device number (note underlined value):
$ amidi -l
Dir Device    Name
IO  hw:1,0,0  USB MS1x1 MIDI Interface MIDI 1
      --
  • Edit the file mustang_bridge_start as follows (do not change any other settings in the file):
####### Start User Edits #########

# Controller USB parms
control_vid = 0x0763 # <-- USB identifiers from above
control_pid = 0x0160

# Controller MIDI device
midi_device = 1      # <-- Controller device from above

# MIDI listen channel
midi_channel = 1     # <-- Your choice of MIDI channel to listen on.

######## End User Edits ##########
  • Install the application:
$ sudo install.sh

You now are ready to try running.

  • Connect your MIDI controller and the Mustang amplifier to the single-board computer (you will have to use a USB hub if running on a Beaglebone Green).

  • If everything has gone well, you should be able to see the mustang-midi bridge process running:

$ ps axu | grep mustang
mustang+ 14235  9.1  1.9  33860  3620 ?        SNl  13:46   0:00 mustang_midi 1 1
...
  • You should now be able to control the amplifier by sending the appropriate messages from your controller.

If either device is disconnected, the bridge program will be automatically shut down. It restarts when both devices are detected again. This should allow graceful recovery when a device disappears due to loss of power or a yanked cable.

Troubleshooting

  • Starting with both devices disconnected, plug the amp and controller in one at a time and see if they are being detected. You should see something like this (on a Raspberry Pi you won't see the hub device since it has two built-in ports):
Jun 25 16:14:12 beaglebone kernel: [  596.511271] usb 1-1: new full-speed USB device number 6 using musb-hdrc
Jun 25 16:14:12 beaglebone kernel: [  596.644669] usb 1-1: New USB device found, idVendor=058f, idProduct=9254
Jun 25 16:14:12 beaglebone kernel: [  596.651611] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Jun 25 16:14:12 beaglebone kernel: [  596.658963] usb 1-1: Product: Generic USB Hub
Jun 25 16:14:12 beaglebone kernel: [  596.663473] usb 1-1: Manufacturer: ALCOR
Jun 25 16:14:12 beaglebone kernel: [  596.681647] hub 1-1:1.0: USB hub found
Jun 25 16:14:12 beaglebone kernel: [  596.697589] hub 1-1:1.0: 4 ports detected
...
Jun 25 16:14:12 beaglebone kernel: [  596.979234] usb 1-1.2: new full-speed USB device number 7 using musb-hdrc
Jun 25 16:14:12 beaglebone kernel: [  597.073151] usb 1-1.2: New USB device found, idVendor=0763, idProduct=0160
Jun 25 16:14:12 beaglebone kernel: [  597.080272] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=
Jun 25 16:14:12 beaglebone kernel: [  597.087828] usb 1-1.2: Product: USB MS1x1 MIDI Interface
Jun 25 16:14:12 beaglebone kernel: [  597.093299] usb 1-1.2: Manufacturer: M-Audio
...
Jun 25 16:14:12 beaglebone kernel: [  597.203860] usb 1-1.3: new full-speed USB device number 8 using musb-hdrc
Jun 25 16:14:12 beaglebone kernel: [  597.309194] usb 1-1.3: New USB device found, idVendor=1ed8, idProduct=0005
Jun 25 16:14:12 beaglebone kernel: [  597.316379] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=
Jun 25 16:14:12 beaglebone kernel: [  597.323952] usb 1-1.3: Product: Mustang Amplifier
Jun 25 16:14:12 beaglebone kernel: [  597.328810] usb 1-1.3: Manufacturer: FMIC
Jun 25 16:14:12 beaglebone kernel: [  597.332956] usb 1-1.3: SerialNumber: C478FF393337483157208416

If you don't see both the MIDI controller interface and the Mustang amp, then something went wrong with device enumeration.

** STILL UNDER CONSTRUCTION **