Tuesday, May 19, 2015

Control Playback/Recording in Avid Pro Tools with an Arduino or Teensy

I would like my Ghz Warrior to be able to sync with Pro Tools. The way I envision this feature, is to be as little as possible in touch with the computer. So instead of using Pro Tools as a Master, and slave the sequencer to it, I would like the Ghz Warrior to be the Master clock and the computer coordinates with that. Since USB hubs are cheap while MIDI DIN hubs are expensive, this should be accomplished through MIDI over USB.

While Pro Tools can send MIDI Real Time Messages (MIDI Clock) and MIDI Time Code (MTC) messages, it can only receive the latter. A quick look at the MIDI reference sheets, and the wikipedia page for better readability, reveals that a full MTC consists of two so-called frames. The combination of both frames encodes the actual second, minute and hour of the song/video/you-name-it that is playing, as well as 2 bits to communicate how many frames will actually be sent per second (FPS). This information is split into eight quarter frames (how was ONE frame defined in the first place?), each consisting of the status byte 0xF1, a zero bit, and then 7 bits encoding the described information in the following way:

  #    Data Byte    Description
  0    0000 ffff    Frame number lsbits
  1    0001 000f    Frame number msbit
  2    0010 ssss    Second lsbits
  3    0011 00ss    Second msbits
  4    0100 mmmm    Minute lsbits
  5    0101 00mm    Minute msbits
  6    0110 hhhh    Hour lsbits
  7    0111 0rrh    Rate and hour msbit

The Digital Warrior, and therefore my Ghz Warrior, is built on the Teensy platform, and I am actually truly grateful to Paul Stofregen and Robin Coon for this great system. In particular MIDI functionalities are extremely easy to implement, and a library for MIDI over USB comes with the installer that well integrates the system into the Arduino IDE. Unfortunately, what is missing in that library are routines to send MTC messages (and Real Time Messages, but more about that in another post).

I quickly wrote two routines to implement sending MTC with the library. To use that functionality on your Teensy board, copy paste the following lines to the usb_midi.h file of the midi_usb library:

On Mac OSX and for the Teensy 3.x boards, you will find the usb_midi.h file by right-clicking on your Arduino application and then selecting Show Package Contents from the drop down menu. In the now opening folder structure, usb_midi.h is located in Contents/Java/hardware/teensy/avr/cores/teensy3/

For the Teensy 2.x platforms, the file is in Contents/Java/hardware/teensy/avr/cores/usb:midi/

Make sure to select the right folder according to the hardware you have (selected in the Arduino IDE).

A fully modified version of the file for the Teensy 3.x is also available on my GitHub page. Further, I have put there an example sketch that synchronises your board with Pro Tools (Arduino/Teensy = Master, Pro Tools = Slave) and have the play/record status of Pro Tools respond to button presses. As a bonus, the option to use a standard serial connection without the need to use above library tweaks are included. By that you can also sync out-of-the-box Arduinos with Pro Tools.

Presets in the examples are a button connected to pin 4, and MTCs with 25 FPS.
For this, in Pro Tools, go to Setup/Peripherals... and set the MTC Reader Port under Synchronization to any:

Then, open Setup/Session and select 25 as the Timecode Rate:

Finally, put Pro Tools online by activating the corresponding button in the Transport window:

When you compile the sketch for the Teensy, make sure to select USB Type: "MIDI" in the Tools menu of the IDE, and everything should work out of the box.


If you use an Arduino, or compile the Teensy with the USB Type: "Serial" option, you will need to use a serial to midi bridge. This converts the incoming serial commands to actual MIDI messages in your computer. I found the free Hairless quite useful for this.

In Hairless, select your Arduino/Teensy in the Serial Port section, and the IAC Driver as a MIDI Out. Activate the Bridge and you are also done on this route :)

Friday, May 1, 2015

Digital Warrior - SD Card Mod

The parts for my very own Digital Warriors have arrived - and they really look good.
However, as pointed out in my last post, there were a few things I was missing among the functionality:

The Digital Warriors are based on the Teensy microcontroller development system, and consequently, the original design makes use of the Teensy's internal 2kb EEPROM to store its data. Naturally this tremendously limits the amount of data that can be saved.

To be able to use the Digital Warrior most flexibly and efficiently as a stand-alone sequencer, I wanted to use an SD card instead of the EEPROM. This would allow me to implement longer

Unfortunately all through-hole pins on the Teensy are already used by the Digital Warrior's standard functions. To make things worse, we can not freely choose any pins for the SD card access. SD cards are typically connected through the SPI ports and these are on: pin 13 - SCK, pin 11 - MOSI, pin 12 - MISO. Alternatively also pins 14, 7 and 8 can be used respectively, but these are also occupied. The fourth SPI pin, SS, is less of a problem as it is freely assignable.

Looking at the Digital Warrior firmware, it it quickly became clear that the necessary pins are easily re-routable. Pin 11 is used by one of the encoder push buttons, pin 12 the sequencer button, and pin 13 the track button. Changing the pin assignments in the software is pretty easy, rerouting them in hardware is also not really a problem. I decided to use the pads, on the bottom of the Teensy, 31, 32 and 33 for the button pin reroutings and soldered small cables on them before attaching the Teensy to the PCB:

Then I removed the corresponding pins from the headers which I used to solder the Teensy to the pcb. And finally connected the cables to the corresponding spots on the board:

A quick test with my updated firmware confirmed that everything was working well.

Similarly, for the SD card, I decided to use pad 29 for the SS pin, and added a small cable here as well:

Afterwards I soldered the Teensy to the PCB and connect the remaining cables (the purple one was too much) to pins 11 (brown), 12 (red), 13 (grey) as well as GND (black) and 3.3V (white). The other side got soldered to the corresponding points on the micro SD adapter  as described here, and voilĂ  - done:

The first version of the Ghz Warrior firmware to start using the SD card instead of the EEPROM can be found on my GitHub page.