Cthulhinho is an Arduino based MIDI controller for multiple devices primarily for live performance. The idea was to create a device that would keep my hands off synthesizers' keyobards since that takes too much time and effort and I'm not good with keys anyway, I much rather fiddle with knobs and faders and I also don't have eight hands. It's in a prototype stage (rat's nest of wires enclosed in a homemade wooden box), but fully functional!

Some monsters from the Deep do have more than two hands and this little beast, Cthulhinho (hence the name, and I also can't go without mentioning the Duda dude) can control up to 5 synthesizers, but the most common setup is one lead, one bass and one chords unit. Chords (and their respective arps) can be changed via large arcade type buttons, so you can't miss them in the heat of the battle. One can switch to song mode, where chords can be chained into parts and those parts into a whole song.

Chords can be edited via GUI or recorded from an external MIDI keyboard. There are two tracks reserved for CC messages which can be addressed to any MIDI channel. Synth units are attached to the MIDI out through some splitter (I use the banana split from 64px). There's also an external sync 1/8" input jack to keep things synced with a drum machine for example (15ms +5V works). In essence, you can offload the melody part of your performance to Cthulhinho and focus on live sound sculpting and manupulation, adjusting effects, etc., rather than messing with keyboards.

Future plans include an eurorack CV implementation, more arp patterns like meandering, more tactile user interface with less menu diving, but that also means bigger board and more knobs and I'm not that much into soldering, really. On current specs but not implemented yet: some minor adjustments like 5-note chords, bass octave offset, improving features...


Chords and song parts are triggered with big arcade buttons [1-5].

One can switch between arpeggiator and song mode with shift [5] + button3 [3] and the result is signaled with the red LED.

All parameters can be browsed and edited with the big rotary encoder [8] under the 128x64 oled display [7] (and exited with the small red button [9] beside).

Parameters are grouped in four tabs. Let's begin with the CHORDS tab, which is the most straightforward one:

seq arp chrds glob
c1: 4d  5d  5f  5a
c2: 4c  5c  5e  5g
c3: 4g  5d  5g  5b
c4: 4a# 5d  5f  5a#
c5: 4a# 5c# 5f  5a#
c6: 4f  5c  5f  5a

You can set up six (c1 to c6) 4-note chords (don't have to be chords, just four arp notes) into memory either via rotary encoder [8] or an optional external MIDI keyboard, when the midi in switch [6] is "on".

Arpeggiator uses these notes to do its magic (next chapter) to control the lead synthesizer unit. One of the notes (which can be set in global, the last tab) is also forwarded to the bass unit and all of them are forwarded to the chords unit when the chord changes.

Chords 1-4 are triggered with buttons [1-4]. Chords 5 and 6 are triggered with shift button + buttons 1 and 2. Using shift + rotary transposes the chord in a sense that it takes the lowest note (or the highest if you turn it counter clockwise) and transposes it one octave higher, so you can do some funky transitions there. If cthulhinho is not in song mode, the selected chord arp plays indefinitely.

seq arp chrds glob

There are six independent tracks with up to 16 steps. If a step is empty it jumps to the next step (or to the first one if all to the right are empty). The example numbers are there only to show all the possible values. In a real world scenario there should be a lot less steps there...

[pos] - The first track selects which note within a current selected chord is sent to the lead synth. 1-4 means the position of a note, 5-6 means 1-4 plus one octave, "r" means small random between 1-4 and "R" means large random between 1-8. I'm considering placing another value to just do nothing that tick (pause).

[vol] - controls the velocity that is sent with the above note. "0" means silent, "F" means full (MIDI:128) numbers between are fixed intervals in between 0 and full. "r" means bottom random (0-50% / 0-64) and "R" means top random (50-100% / 64-128).

[gat] - controls when the note off message is sent (gate equivalent). "1" means 10% of tick time (at 120 BPM, tick time is quarter of the beat time [0.5 s], one eighth of a second), "F" means 100% gate: it sends noteOff just before the next noteOn and "-" means tie, the previous note noteOff message is sent AFTER the current note noteOn message and envelopes and lfo-s in the lead synth don't have to be retriggered (legato).

[oct] - adds or subtracts octaves from the current playing note. "<" means 2 octaves down, "(" means one octave down, "0" means nothing, ")" means one octave up, ">" means two octaves up, "r" means random between "(" and ")" and "R" means random between "<" and ">".

[cc1 and cc2] - tracks send respective CC messages ("0" means 0 and "F" means 128) to the selected (adjustable in global) synth channel. I'm considering swapping one of those tracks to the alternative pos2 track either to switch between them or put them in chain to get 32 note arp... TBD.

seq seq chrds glob



Song [SEQ] consists of three parts with chord sequences (up to 16 steps) and one track with part sequence (also 16 steps). The duration (number of arp ticks) of a sequencer tick can be adjusted in global menu (last tab). Usual numbers are 8, 16, maybe 4 or 32, but one can set a number that is not a power of 2 to get some whacky results...

In the above example (all params can be edited with rotary) the first part pA has chords 2 and 3 (from the first tab) in its chain and can be triggered and looped with button 1 when cthulhinho is set to SEQ mode (ARP/SEQ are toggled with shift + button 3).

part B has chord sequence 4,5,6,6 and part C consists only of chord 1. If you trigger a part of the song, that part is looped.

part B has a letter A at the end. This means it will proceed to part A when completed. Case scenario: you have a verse in A that repeats indefinitely. When you want, you can fire chorus or bridge stored in B and it automatically returns to the verse when completed. This only works if not in song mode (button 4), in song mode it is ignored and just advances to the next song part. You can assign A, B or C jump.

If you trigger the whole song by pressing button 4 (in sequencer mode), the parts play accordingly to the [SEQ] track. The song is looped when the last part is finished.

seq seq chrds glob
BPM:128  PITCH:  0
bss:14V ch:1 dly:0
cc1:72 ch:2
cc2:74 ch:2    S/L
pads ch:3
R:1 M:16 r:16 c:0

Global settings
All parameters can be edited with rotary encoder. The problem with current prototype is with display. It takes some CPU time to render and Arduino is not a desktop computer, so the tempo may glitch a bit when you edit parameters. I have some solutions in mind, but no plan to implement since it's not a show stopper really. There is also no setting for the lead synth midi channel, it is hardcoded to 1.

BPM means beats per minute. there are 4 arpeggiator ticks in each beat. If you set the arp to 16 steps and BPM to 120, the sequence cycle will be exactly 2 seconds long.

PITCH this is global transpose. It transposes every note in chord memory so one can adjust the saved progression to some other key if necessary.

bss are settings for bass synth unit. The first number shows which note of the chords is sent to the bass unit (1-4), "R" means random(1,4) and "S" means the current arp selected note. The second digit tells how many ticks should pass until the bass note is sent so you don't have two arps all of the sudden. The bass triggers should be more scarce and this is the way to set this density. The third digit ("V") I created for my volca bass unit so I can program the bass sequence in the volca itself and the note from cthulhinho is being sent in CC mode so the volca sequence gets detuned to fit the respective arp note. This can be toggled off, in that case a normal MIDI note is sent to the bass unit. Bass channel can be selected next and then also a delay so you can create some fuguesque type of music where bass is X (default:0) ticks behind.

cc1 and cc2 are the MIDI cc messages which are sent from cc tracks in arp (tab 1) to the respective channel, that can be any of the connected unit (leads, bass, pads, or synth 4 or 5). I think I'm gonna turn one of them into second row of arp (for 32 step length or 2 arps for 2 synths).

S/L: Save and load to / from Arduino EEPROM has 5 slots to save and load from: 1kb space on arduino nano EEPROM, about 200 byte size params per patch.

pads channel shows on what channel the chords are sent from cthulhinho.

R: I forgot what this is. Some old stub I presume. Marked in TODO list. I think it resets the tick counter or arp tracks on chord change if set to 1. I may as well ditch this and set this to control the screensaver time (now, after hardcoded 30 seconds of not fiddling with menus, screen goes black).

M: set how many arpeggiator ticks fit into one sequence measure (explained in chapter 3 - sequencer).

r: retrigger pad chord (e.g.: set to 3 to get dotted 8 pluck thingy)

c: (1 or 0) if chord should repeat on each start of a sequence measure or only when chord is changed.


- Arduino Nano (some cheap $2.xx alternative, TBH)
- 124x64 OLED I2C Display (cheap, $2.xx)
- 1 rotary encoder (with push function, 5 pins: CLK, DT, SW, +, GND)
- 5 big buttons (I used some cheap arcade ones from aliexpress)
- 1 small button (for escape)
- 2 LEDS (one for arp/seq toggle and one for MIDI IN armed)
- 2 midi DIN female jacks
- 1 two pole two way switch
- 6 x 220 ohm resistor
- 1 optocoupler (6N138 or alternative)
- 1 diode (1N914 or alternative)
- strip board (4 island, gnd and + line) and some wire
- some spare plywood, some screws, hot glue ;)

total: around 15 USD.

Had more work and wrecked nerves with the wooden enclosure, because I only own some rudimental woodworking tools (saw and drill). Also burnt one nano. So add $3 to the bill.


IMPORTANT UPDATE: Code is updated to support external tick sync. D2 from rotary push button was moved to D9 and D2 (since it's an interrupt pin) is used with external sync (tip, ring/sleeve to GND).

If you plan to set chord notes via menu, you don't need the messy midi-in part (half shorter parts list) and the picture looks even more simple. Sequencer LED is also optional.
(Arduino pins are colored red)


This is my first electronics project, I have some experience with woodworking, primarily preparing wood for my central heating and some larger carpentry. On top of that I'm also a lousy programmer so this device is literally a miracle and a product of sheer will.

The arduino code is written in a prototype manner, in one file, and since it works, I intend to keep it that way.

It includes the standard midi library found here:

And a modified display Ascii library here: https://github.com/greiman/SSD1306Ascii.
Where I modified some lines to achieve an inverted mode (selected gui items).
You can download the modified library here or modify the above one with my lines.

And the cthulhinho code is available here.

Youtube demos

First demo, didn't find enough midi cables to hook up pads and bass...
Just a monotribe thru HoF2 with volca beats support... This is version 1, the one without external sync. The clock drift (or some hickups due to lousy coding) can be heard and I had to make some corrections along the way.

How far can it go?
Apparently not very far, yet...

Still baby steps
Wide grasps, though...

A silly solo remake
This is sync out version, sync-in didn't register every tick as on the demo board (UNO). Recipe: too much intro and outro and something really extraoridnarilly spectacular in between

Photorealistychistenej lazer cewebwation
Part change should change and propagate other effects (cc change: filter, noise level, ext tick #2 for PO33 etc...). I swear there were some gremlins inside that microbrute sequencer!