Monday, January 11, 2010

Quick and Dirty Arduino Midi Over USB



A lot people use arduinos as a starting point for diy midi controllers. A perfectly reasonable assumption many of them make is that you can use the on board usb port to send midi data to your computer. While you can send serial data, it is not possible for your computer to recognize this as midi messages right out of the box.



One popular way around this is to have a piece of software running on the computer which listens for incoming serial data from the arduino and passes the midi data on to the appropriate places. Various methods exist ranging from running a Max patch listener to writing and installing custom drivers. There is a lengthy thread on the arduino forum explaining the issue in depth as well as what poeple have done to get thier projects to work.

I wanted my devices to be able to work on any machine without first having to install special drivers or running separate programs.. It seems cleaner and more straight forward that way.. plus I am lazy and installing drivers is boring.

While looking for options, I stumbled on this ridiculously cheap midi-usb converter cable and got the bright idea to just embed the whole thing in the controller.


The set up is pretty straight forward... you basically just need to bypass the cables and wire the arduino directly to the circuit board inside. The final product is plug and play, powers the arduino, and fits nicely inside your enclosure.


To begin, pry open the enclosure and disconnect the cables. You could make your life easier by leaving the usb cable connected and just have the cord sticking out of your project, or remove it and wire up a usb socket.  Either way, the important part is that little green board in the center. Midi data goes into one side and midi-over-usb magic comes out the other. The chip on board will be recognized as a usb midi device when its connected and use your computer's native midi support.  Neat-o.


As far as the arduino is concerned, it is just sending straight midi, so the circuit is the same as if you were just connecting a midi socket. Of course, instead of connecting to a socket, you connect to the midi side of the board like so:


The darker lines are all thats needed if you are going to leave the usb cable attached. Note the line from the usb side reaching over to the arduino Vin for power.  The rest are if you want a usb socket instead of the dangling cable (the rectangle on the right is a type b usb socket shown from the top).

Thats about it. This is set up just to provide midi out from the arduino, although midi-in would just involve another wire from the board to the Arduino's Rx pin.

To test everything out, load up the midi example that comes with the Arduino environment, plug in the usb and let it rip. If it doesn't work, you probably messed something up.. good luck.

33 comments:

  1. I'm going to give a go as soon as the cable arrives. I have been fiddling with a drivers and such (on linux) to do this with some success (ttymidi) but everything is still too finicky for me......if this just works then I will be a happy man.

    Thanks for the how to.

    Graham

    ReplyDelete
  2. I don't suppose you would be able to use the new midi cable as the programming cable for the arduino as well? I imagine that if possible it would require a little more trickery?

    ReplyDelete
    Replies
    1. you can use a spdt on on switch (thats the kind with 6 pins, its basically 2 switches in the same housing side by side)with the white and green data lines from the usb that goes out to the computer on the middle two pins of the switch so in one position they connect to the internalized midi board and in the other they connect to the arduino's usb port. and of course the power wires can be connected to both simultaneously no switch needed

      Delete
  3. Is the line from the USB to Vin used to power the Arduino?
    Thanks,
    Ben

    ReplyDelete
  4. Graham:
    I couldn't figure out a way to do that.

    Ben:
    Yea, the arduino is powered off the usb.

    ReplyDelete
  5. Thanks very much for this information. Tom.

    ReplyDelete
  6. dude, that's genius! I need to keep this article in some safe place for my next DIY project

    ReplyDelete
  7. very interesting!! but does it only work for "on/off" signals or can i build a midi potentiometer to control volume with it?
    bye!
    stefano
    minidex@hotmail.it

    ReplyDelete
  8. So what would happen if I did this with a Teensy and connected the power line to the Teensies 5v?

    ReplyDelete
  9. Why is the vin needed for power anyways? Would the 5v not work?
    Thanks for helping me out :)

    ReplyDelete
  10. this is so ridiculously straightforward....brilliant idea, thanks a lot!

    ReplyDelete
  11. Stefano,
    What data you choose to send is up to the hardware and your code.. Hooking a pot up to one of the arduino's analog ins and converting the 0-5v reading to a 0-127 value would do the trick.

    Ben,
    I'm not too familiar with Teensies, but I thought that they could do direct midi over usb without all this mess..
    The vin is used to power the arduino from the USB. You don't need to plug the arduino in.


    Thanks for the comments.. I have some more projects to share pretty soon..

    Nate

    ReplyDelete
  12. Hey, i'm trying to set up my arduino to use a photosensor as a Midi CC sending it using your contraption above to the computer, to hopefully use with Live. can anyone help me out with a sketch for this?? i suck at coding.

    any help would be awesome!
    cheers
    Bodie

    ReplyDelete
  13. Currently I'm trying just one potentiometer. And the code works great but when I turn my potentiometer all the way to the off position the whole board turns off. I was wondering if you have run into that problem?

    By the way I have the whole thing wired up how your diagram depicts it. My potentiometer has one terminal plugged into the 5V terminal on the arduino, the middle one is on the analog in pin, and the other one is connected to ground.

    Thanks

    ReplyDelete
  14. Can you please share you're code on this one? Cheers!

    ReplyDelete
  15. "midi-in would just involve another wire from the board to the Arduino's Rx pin"

    Which pin on the midi-usb converter gets connected to Rx?

    ReplyDelete
  16. This is great. I have seen other projects which involve re-flashing the USB controller on the Arduino to do class-compliant MIDI but this would allow the built-in USB to stay unaffected. I assume you could also wire a real MIDI IN/OUT connector and handle duplicating incoming MIDI messages to both the physical and this USB MIDI port. Nice possibilities.

    Is there an issue with wiring up a physical MIDI port in parallel to this adapter?

    ReplyDelete
  17. Thanks! Glad you liked it. A parallel midi port works fine as far as I could tell.

    ReplyDelete
  18. So cheap and simple! Thanks for the guide! I've gone and picked one up from ebay for $7AUD :D

    I've got my arduino controller sending midi notes via serial so your little trick should remove the need for the serial-midi software I've been using.

    Thanks again!

    Superevensteven

    ReplyDelete
  19. can u mail me the shemetric of the above circuit????

    harishaq@msn.com

    ReplyDelete
  20. Helped me a lot with my midi-controller! Thanks!

    ReplyDelete
  21. such a good idea, glad you posted this. Thanks!

    ReplyDelete
  22. hi,
    i am using this http://starfiretech.wordpress.com/2009/12/08/simple-arduino-midi-controler/

    and for midi transmission i am using your exemple, but when i do midi learn its not working very well, can you help me plz?

    ReplyDelete
  23. Awesome Awesome Awesome !!!

    The simplest solutions are usually the best

    Thanks for this :)

    ReplyDelete
  24. What is the clock speed for this type of setup? Are you limited to the standard midi speed of 31kbaud, or can you use the full speed of USB?

    ReplyDelete
    Replies
    1. Bottleneck is that the arduino-side of the usb-midi converter sends/expects data at 31250baud. If it's in some way possible to write your own firmware and upgrade the converter, it may be possible to use higher speed, but that will not be an easy task.

      Delete
  25. This works really well. I've done it with two different products now. I followed the information provided above exactly. Here are the two models I modified:

    http://m-audio.com/products/en_us/Uno.html

    http://www.amazon.ca/MIDI-Cable-Converter-Music-Keyboar/dp/B001LJUVO4

    Both work very well with no noticeable latency.

    The Teensy does do Midi directly. You can set it to show up in windows as a midi device using the Arduino IDE. Then, it has some Teensy specific commands to punch out out midi data directly over the usb. Here is some info that Teensy provides

    http://www.pjrc.com/teensy/td_midi.html

    And yes, you can do potentiometers, pushbuttons, touch strips, etc...

    ReplyDelete
  26. This comment has been removed by a blog administrator.

    ReplyDelete
  27. hello, nice work!
    I'm trying to do the same project but I have some problems.
    If i use a 330ohm resistor instead of a 220 what can happen?
    I connected to the Arduino with this code http://arduino.cc/en/Tutorial/Midi?action=sourceblock&num=1

    but it does not work.
    When I connect it to the computer the midi chip emits a steady red light.
    My computer recognizes it as "USB MIDI interface" and I tried to play sounds with fl studio 11 but does not work..
    what am I doing wrong?
    Thanks

    ReplyDelete
    Replies
    1. however the chip that i bought is a little bit different than your, i've 5 pins on midi-side which are called "in+ in- G O+ O-" i connect arduino Vin to the "in-", arduino GND on "G" and arduino TX on "in+". is that correct?

      Delete
  28. Be careful that (too) cheap midi usb interface just aren't supported on any of the three major OSs i've tried. I had to buy another (branded,m-audio) one.

    ReplyDelete
  29. My chip is a little different to the one on the pictures / schematic.
    The MIDI / Arduino side pins are labeled, there's only 5 and they might be in a different order:

    0-
    0+
    G
    in+
    in-

    Which connections do they correspond to?

    ReplyDelete