MIDI Looper Sequencer

A powerful little machine to create music from scratch.

The idea for this MIDI looper/sequencer came when I was thinking about buying an Arturia Keystep… but I really didn’t like the tiny keys. So the goal was to build something that could behave like a Keystep, but in a box — without the small keyboard. This way, I can just use my own keyboard.
midiseq_schematic
Get the code!
Component List:
1x Arduino Nano
1x 6N138 optocoupler
1x 1N4148 diode
5x LED (4 for the channel buttons, and 1 green for the beat … it’s up to you!)
3x 10kΩ potentiometer (I think you can use 50k or 100k, it shouldn’t make any difference …)
8x 220Ω resistor
10x 10kΩ resistor
7x Toggle button
3x SPDT Switch
2x Jack socket
2x MIDI DIN female output
Here is the list arduino’s pin & their purposes :
D2 : LED channel 1
D3 : LED channel 2
D4 : LED channel 3
D5 : LED channel 4
D6 : CV gate output
D7 : CV sync output
D8 : channel 1 button
D9 : channel 2 button
D10 : channel 3 button
D11 : channel 4 button
D12 : LED beat
A0 : tempo potentiometer
A1 : bar count potentiometer
A2 : step count potentiometer
A3 : MIDI thru switch
A4 : transposition switch
A5 : start/stop button
A6 : erase button
A7 : shift button

/!\ – There’s a switch at the RX0 pin of the Arduino Nano. THIS IS SOMETHING REALLY IMPORTANT – when the switch is ON, it allows you to play normally with the device, but when the switch is OFF, it allows you to upload a new code inside the Arduino. Don’t forget to add this switch if you want to update the code inside the Arduino!
The MIDI looper/sequencer can handle up to 128 steps of MIDI notes across 4 channels. By connecting your MIDI keyboard to the input, pressing the “PLAY” button, and playing a note, you’ll record a sequence (or a loop, if you prefer) that will keep playing forever… until you erase it.

Of course, there are a few limitations. Maybe because of time constraints… or the limited memory of the Arduino Nano… or maybe just because I was too lazy. But honestly, limitations can be a good thing — they push you to get creative. Right?

– There are “only” 4 channels, which I think is plenty for any bleeps and bloops.
– Sequences are mono: each step can only record one note (per channel). If you play another note over one already recorded, it will replace it.
– There is no note length: every note equals one step, and that’s it! Personally, I manage note length with the ADSR on my synths.
– Velocity is not recorded: every note will always have a fixed velocity of 127.

When you record a note, it is automatically quantized to the next step. What you’ll hear is the note being played on that next step. It might feel odd at first, but it keeps everything perfectly in sync. Maybe a more “common” quantization method could be implemented in the future… I said “maybe”.

Here’s the explanation of each switch/knob/output/LED:

[SWITCH CHANNEL 1,2,3,4 / LED CHANNEL 1,2,3,4]
Choose the channel you want to record or tweak. The LED shows which channel is currently selected.

[PLAY/STOP BUTTON]
Starts and stops the sequence. While the sequence is running, press this button together with SHIFT to restart it from the first step — like a “cue” button.

[ERASE]
Press this button to erase the next notes played on the current channel — like an eraser. This way you can delete just a few notes instead of the entire sequence.
Press ERASE together with SHIFT to clear the entire sequence on the current channel. (Right now, there’s no way to erase all channels at once… but you can always POWER off and on!)

[TEMPO KNOB]
Changes the tempo. Minimum is around 40 BPM, maximum around 220 BPM. You can easily tweak these values in the code if you want to make some fast hardcore stuff.

[BAR COUNT & STEP COUNT KNOBS]
These knobs let you set the number of bars (1–8) and the number of steps per bar (1–16). When changing values, the channel LEDs display the number in inverted binary (since there’s no screen). For example: 1000 = 1, 0100 = 2, 1100 = 3… you get the idea. When the step count reaches 16, all LEDs turn off.

[MIDI THRU SWITCH]
When ON, MIDI passes through the box without being recorded. Handy if you want to play a solo over your freshly recorded sequence! Note: the MIDI channel will be that of your keyboard, not the sequencer.

[TRANSPOSITION SWITCH]
Transpose the sequence on the current channel by pressing a note on your keyboard. C4 is the middle note: pressing B3 transposes one semitone down, pressing D4 transposes two semitones up… you get the idea.

[SHIFT BUTTON]
As mentioned earlier, SHIFT extends the PLAY and ERASE functions. Also: press CHANNEL 1 + SHIFT to fill all 128 steps with your current sequence. For example, if you have 1 bar of 16 steps, this combo will repeat those 16 steps across the full sequence for all channels. Perfect for extending patterns quickly.

[MIDI IN & MIDI OUT]
You know what to do, right?

[SYNC OUT]
While the sequencer is running, it outputs a CV sync signal to synchronize other synths or sequencers.

[GATE OUT]
While the sequencer is running, it outputs a CV gate signal on each step. I needed this to sync my DIY modular synth — but it’s optional if you don’t need it.

[MIDI SYNC MESSAGES]
The MIDI looper/sequencer both sends and receives MIDI SYNC messages (START, STOP, and TEMPO). This way you can keep everything in sync with other gear.
midiseq1_1
This project is still in its first iteration! I want to make a new version with more features and an LCD screen to display useful information, like a “HELLO” message when you power on the device, or something practical, like showing the current number of bars or steps when you turn the knobs.

Adding some memory via an SD card to save your sequences would be very nice!

I also recently discovered (thanks to the amazing people from the LMNC forum) that I could get rid of all my PULL-DOWN resistors by tweaking the code a little. Additionally, adding op-amp buffers to the SYNC and GATE outputs wouldn’t be a bad idea to protect the Arduino’s pins.

If you have an idea for a cool feature to add, please drop me an email (see the contact page of this website).

I want to give a big thanks to Knopsl from Reddit, who helped me a lot by troubleshooting the first circuit I designed!
midiseq1_knopsl

Back to projects