1. Play us a tune

Published on 05 June 2016

This is a post about pi-zero, usb and explorations.

A series of posts exploring the possibilities of using the Pi Zero as a USB MIDI device. The previous post was the intro. The next post is Talk to me

Connect and ssh

After following Andrew's quick instructions to get the Pi Zero chatting over USB, I could use ssh to shell into pi@raspberry.local on my Mac.

This was great but the Pi Zero couldn't talk to the internet so downloading new software wasn't going to work. The fix was easy, just go to System Preferences β†’ Sharing β†’ Internet Sharing and make sure that the Pi Zero is ticked in the "To computers using:" list. The Pi Zero appears as "RNDIS/Ethernet Gadget".

I rebooted the Pi Zero and when I reconnected to it over ssh it could access the internet. Magic!

Internet sharing

MIDI magic

Now that ethernet over USB was working I wanted to try MIDI. I don't really know much about it, apart from that it's a standard for enabling music devices to communicate.

The USB Gagdet ID for MIDI is g_midi so, I changed the g_ether part of the Pi Zero SD card's boot/cmdline.txt to g_midi and restarted.

I dug up some WebMIDI example pages on the internet, as Chrome now allows you to access USB MIDI devices plugged into your computer.

This Web audio MIDI Synth demo listed the "MIDI gadget" in the UI which was exciting!

MIDI means no ethernet

Switching to the MIDI gadget means that you can no longer get access to the Pi Zero over the USB ethernet. So everything that follows is the result of making changes to the Pi Zero in ethernet mode and adding the changes to /etc/rc.local so they'd run on startup and then switching back to MIDI mode to see if they worked.

This is very time consuming and the next post has some ways to solve that. Which are also time consuming to set-up but ultimately enable more iterative development.

Playing MIDI

Now the Pi Zero was being recognised by the Mac as a MIDI input device, it was time figure out how to get the Pi Zero to actually output MIDI.

The gadget testing document is actually a treasure trove 🎁 of useful information for testing the various USB gadget drivers. There's a section called "Testing the MIDI function" which has various command examples. The aplaymidi command, part of the alsa-utils package is the key.

aplaymidi -l lists MIDI devices.

On the Pi Zero this gave me:

pi@raspberrypi:~ $ aplaymidi -l
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 16:0    f_midi                           f_midi

You can use the 16:0 to tell aplaymidi to play a MIDI file.

$ aplaymidi -p 16:0 filename.mid

So, off to the internet to find a MIDI file to play!

With the MIDI file found I wrote a quick shell script to play it on startup, since in MIDI gadget mode I can't be ssh'd in too.

The script is very simple:

while true; do
    aplaymidi --list
    echo "Playing"
    aplaymidi --port 16:0 /boot/test.mid
    echo "Finished"
done

I added it to /etc/rc.local:

date >> /home/pi/midi.log
/home/pi/midi.sh >> /home/pi/midi.log &

I restarted the Pi Zero in MIDI mode, opening the WebMIDI synth demo and… no music 🚫🎢🚫.

Which was really frustrating. But as I don't really know what kind of music a MIDI file contains I wasn't so sure the synth would be able to play it.

Apple GarageBand however sprung into life when I opened it and created an empty project. The MIDI file was coming through the USB, into Garage Band and was played by (I assume) Siri on a tiny piano under the keyboard - Success!

⚠️ '/projects/images/pi-zero-gadget/1-garage-band.gif' not found

Back to Web MIDI

I discovered later on that if you refresh the Web MIDI synth after the Pi Zero starts sending the MIDI messages then you get some aggressive distorted noise being played. Yes!

MIDI Monitor

But not being able to see which MIDI messages (if any) are being sent by the Pi Zero is quite annoying.

I found this great free app called MIDI Monitor that shows you all the messages being sent and received.

Internet sharing

I think this is going to come in handy when trying to get the Pi Zero to send custom messages rather than just playing an existing MIDI file.