Ferraganchos & Pinchos

Or how to rip all this stuff out of my head…

Archive for the category “MIDI”

OpenPipe Breakout & Arduino Musical Shield

UPDATE (October, 1st 2012)!!! We’ve moved to www.openpipe.cc.

If you want to use OpenPipe Breakout as a MIDI controller you need some sort of synthesizer. You could use generic synths with custom sound samples (GarageBand, Reason) or specific synths like UniversalPiper, but all of them need a PC (or smartphone) to run.

If you want something “portable” you need to use a specific hardware synthesizer. The guys from Sparkfun designed an Arduino Shield based on VLSI VS1053b chip (Music Instrument Shield). This chip is a CODEC with support for several audio formats, and It can also play real-time MIDI. I was wondering how good the sound synth inside this chip is, so I bought one.

Connecting OpenPipe breakout board and Arduino UNO is quite simple:

  • OpenPipe GND: Arduino GND
  • OpenPipe VCC: Arduino 3.3V
  • OpenPipe I2C SDA: Arduino Analog 4
  • OpenPipe I2C SCL: Arduino Analog 5

OpenPipe & Arduino Shield connectios

Then connect a sound amplifier or headphones to the jack audio output.

OpenPipe, Arduino Musical Shield and Headphones

Here is the code I’ve used. It’s basically the same for OpenPipe MIDI, but with some changes in the MIDI command functions, because this shield uses SoftwareSerial library.

I’ve tested several instruments (Bagpipe, Oboe, Church Organ, Clarinet, Trumpet, …) and the sound is good, but It’s not amazing.

You can draw your own conclusions from the video: our lovely geek (me) making noise… again…

OpenPipe breakout MIDI over USB with Arduino

UPDATE (October, 1st 2012)!!! We’ve moved to www.openpipe.cc.

Playing OpenPipe with PWM sound is amazing 🙂 but I got tired too soon. So the next step was to send MIDI commands in order to connect to a more realistic sound sampler/synthsizer like Garageband, Reason, etc.

OpenPipe breakout connected to Arduino Mega

There are several ways to address “Arduino sending MIDI commands” issue:

  • Send MIDI commands using MIDI DIN connector (MIDI Shield, etc.). A bit outdated?
  • Send MIDI commands using USB serial port and translate It to MIDI commands using PC software app. You can search “serial to MIDI” in Google. It’s OK but cumbersome.
  • Implement USB MIDI compliant class in Arduino. “The USB-HID specification has a specific type for MIDI input and MIDI output, which nearly all commercial musical controllers on the market use for class-compliant (driverless!) MIDI I/O.” (source)

IMHO the last option is the one because you need no additional software nor drivers (at least for Linux and Mac). How does it works?

Traditionally, Arduino boards used FTDI chip in order to translate UART to USB virtual serial port. Recent Arduinos changed this FTDI chip for an Atmel IC (atmega8u2, atmega16u2) capable of running UART-USB firmware (default) but also some other cool firmwares (ladyada wrote a good FAQ on this point). Flashing different firmwares your Arduino could act as a mouse, a keyboard, a MIDI device, and so on… (darran is doing a good job compiling this LUFA based firmwares for Arduino). The only drawback is that you need to reflash the Atmel IC  again if you want to update the Arduino sketch (You can’t please everyone… so far).

So here is the spet-by-step guide sumarizing how I proceeded with my Arduino Mega.

Download USB-MIDI firmware (Mega and UNO), demo and source from here. You can upload demo sketch (.pde) to the Arduino board as usual. Then we need to update atmega8u2 firmware (.hex).

Here you can find detailed information about flashing atmega8u2. Basically you need to reset atmega8u2 in order to enter DFU mode and the use dfu-programmer (sudo apt-get install dfu-programmer). In order to reset atmega8u2 connect RESET and GND pins in ISP header. The Arduino Mega pins are located the same way as Arduino UNO (see picture).

You can check that atmega8u2 is in DFU mode executing ‘lsusb’ after and before reset. The USB ID should have changed. Then flash Arduino-usbmidi-0.2-mega2560.hex.

sudo dfu-programmer at90usb82 erase

sudo dfu-programmer at90usb82 flash Arduino-usbmidi-0.2-mega2560.hex

sudo dfu-programmer at90usb82 reset

Now you can check if everything is working fine. Disconnect the Arduino and connect it again in order to boot as a MIDI device. Executing lsusb you shoud see somethin similar to:

Bus 003 Device 002: ID 03eb:2048 Atmel Corp. LUFA MIDI Demo Application

At this moment you have demo firmware running on Arduino, sending notes using UART, and atmega8u2 running MIDI device firmware translating UART commands to MIDI over USB protocol. Connecting a MIDI sniffer  (I’ve used KMidimon) you should see NOTE ON and NOTE OFF MIDI events.

Everything looks fine, so we are ready to flash OpenPipe breakout firmware…. but we need to restore atmega8u2 default firmware (the usbserial) before. Default firmware is located at /usr/share/arduino/hardware/arduino/firmwares/arduino-usbserial. In order to reflash again, enter DFU mode and then execute:

sudo dfu-programmer at90usb82 erase

sudo dfu-programmer at90usb82 flash Arduino-usbserial-mega.hex

sudo dfu-programmer at90usb82 reset

Now we can upload OpenPipe breakout sketch. I’ve mixed darran demo and OpenPipe breakout PWM code here. Then change atmega8u2 firmware again…

So the development process is:

  1. With default atmega8u2 firmware upload Arduino sketch
  2. Reset and flash atmega8u2 with MIDI firmware
  3. Reset the board and use It as MIDI device
  4. Reflash default firmware to atmega8u2
  5. GOTO 1

I’m sure we will be able to have composite firmwares with SERIAL and MIDI soon 🙂

Here is a geek playing galician bagpipes themes with several MIDI instruments in GarageBand…

Post Navigation