UnoSync is an Arduino-Uno based clock-sync-box.
It allows stopping the individual outputs, and at any time restarting them, "In Sync" with the other instruments. The main goal is for live performance and jamming. For example, older Roland units like the famous TB-303 do not allow the user to switch between "Play" and "Write" modes without stopping the sequencer. Using UnoSync this is made possible.
Another usecase is to allow a free-jamming environment where clock is sent continuously while people can add/remove instruments to the total setup without interupting the playback.
The project was made as a proof-of-concept, trying out some ideas before using it in other projects, but also because I needed such a simple box.
The design decisions are mostly based on what I had at home during construction, as I needed it finished urgently. Luckily the Arduino Uno, despite it's limitations, was perfect for the job.
Using the Arduino and 3rd party libraries, I could focus on the important parts: super tight sync and compatibility with a wide range of devices. For example, some simple tricks are implemented to make sure no clock-ticks are missed when starting older devices. This is a commonly forgotten issue that most newer machines don't take into account. Careful comparisons were done in order to achieve near perfect alignment of notes on most standard hardware. Special care has been taken to avoid common pitfalls seen in similar projects, like avoiding floating point calculations, keeping interupts clean and quick, not using sleep or unworkarble pulse widths to create the dinsync signal, etc.. If you see any fundamental flaws in my code, please let me know, this is my first Arduino project built from the ground up so all feedback is highly welcome.
It takes MIDI clock as input and has 5 outputs:
- 1x MIDI Clock output
- 4x DINSYNC Clock output
NOTE: Due to hardware limitations, only 1 MIDI output is possible.
Building UnoSync is quite simple. You can already start with an Arduino Uno, a Midi Shield, 2 leds, 2 resistors and a button (see dual setup pictured in appearances section), less than 20 euro in parts should get you started if you decide to use non-genuine parts.
I drew a schematic in Fritzing, but lost it somehow, if I find it back I will post it here. Basically the switches connect directly to the Arduino, the LEDs need a suitable resistor in between. The MIDI I/O is just the basic 6N138-opto based circuit you can find everywhere. Dinsync clock is shared among all 4 dinsync outputs.
The following table is based on the header layout of an Arduino Midi shield and shows the pin assignments:
EDIT: Sorry, I urgently need to fix my site layout.. Here's the Google sheets link.
- btng and ledg: global start button with blinking LED
- btnm and ledm: midi start button and LED. The LED will be "on" when it is playing, and blink while it is waiting to play. (same for other individual LEDs)
- btnd1..4 and ledd1..4: dinsync start button and LEDs 1..4
- btnshift: shift button, not used at the moment
- run1..4: run signal for dinsync outputs
- clock: shared clock signal for dinsync outputs
The source code is posted on my gitlab and all this information is free to use for non-commercial projects.
- 11-13/5/2022: Superbooth 22 at FEZ Berlin, Germany. first version of UnoSync (with some bugs) was used to Sync the gear on the tables of Analogue Renaissance & DinSync.
- 18/6/2022: Electronic Jam./ REEFTeeF - Synth & Sync at OHK Ostend, Belgium. 3x updated UnoSync were providing clock to 3x Emagic Unitor 8, giving a lotal of 24 midi outs in three groups to provide midi for the 10 setups on stage. Here a quick and dirty dual Midi-only version was created using an Arduino MIDI shield and some switches.
Fully functional MVP, but this project is far from finished, it works for what I use it for and a lot of people wanted to have one after seeing it in action.
I won't be able to continue development at the moment, but in no particular order, these things are still missing:
- Currently when not syncing to an external clock, the tempo is fixed to 120 BPM.
- The time signature is currently fixed to 4/4.
- The shift button currently does nothing. The idea is to implement a menu with the following functionality:
- M1, D1, D2 buttons respectively control the digits of the BPM. Their LEDs indicate the tempo, e.g. 125 would have M1 blinking once, D1 twice and D2 five times.. By clicking the buttons you can cycle between all digits (constrainted by min/max BPM).
- D3, D4 buttons are tempo up/down control
- Additional settings menu's could be made possible to set time signature and perhaps other features.
- The code could predict the tempo and continue when the external clock stops. Some experimentation was done for this using a cyclic buffer, but commented out to focus on the core mechanism first.
I am available to build custom solutions for modern sync problems. Please use the contact form and list your requirements and budget.
I do not sell UnoSync's at the moment, so don't bother asking me :)
Go ahead and make your own, it's gonna be fun!