ARP ‘n’ MIDI Multitool
USB MIDI Host, Hub, Looper, Router & Expressive Controller
Finally all your usb midi stuff can talk through this smart router thing without a computer.
Effortless live arps and time-locked loops by waving your hand.
- Global arpeggio and beat repeat combo
- Touch and distance expression controllers
- Change loop length in real-time to record a longer loop over a repeating shorter one.
- Auto glissando makes samplers sound like analog synth
- Force-in-key & screens to show fretboard notes to play along
- Round-Robin mode gives polyphony to mono instruments
- Channel routing and CC control
Plus it boots nearly instantly!
ARPnMIDI
🔗 GitHub Link
Open Source RP2040 Zero MIDI router / arpeggiator / looper / expression / key finder / multitool / and more! By Joseph Wozniak
with SSD1306 OLED display (2-color recommended, yellow on the bottom)
Connect multiple usb midi devices with a hub. Output din/trs or usb midi.
Control live parameters and the appegiator with:
- Optical distance sensor (VL53L0X)
- Push force pressure sensor (FSR402 sensor with LM393 module)
- Assignable CC controls
- 4 foot pedal inputs (optionally connected to a QIACHIP RX480E wireless module)
You can also add an additional RP2040 board as a usb midi device, for full usb-to-usb rounting to another usb host. Use this file for the secondary RP2040: rp2040_usb_din_midi_bridge.txt
Current Hardware Pin Map (RP2040 Zero board labels)
Use the pin numbers exactly as printed on the RP2040 Zero board:
0DIN MIDI OUT (TX to DIN/TRS out + Pro Micro RX pin)1DIN MIDI IN (RX from DIN/TRS with optocoupler or Pro Micro TX pin WITH RESISTORS. 10k from tx to rx pins, 20k from tx to gnd)2I2C SDA (SSD1306 + VL53L0X on same bus)3I2C SCL (SSD1306 + VL53L0X on same bus)6Rotary encoder A7Rotary encoder B8Rotary encoder push switch9, 10, 12, 13 Foot pedal 1-4 input (active high, uses pull-down)14USB host D+15USB host D-26Push/pressure analog sensor input (FSR402 sensor with LM393 module)
Pin 11 is intentionally unused, so we can put a screw there.
RP2040 / Arduino-Pico USB Host optional resistors for best performance:
USB MIDI host D+ to 22ohm resistor to GPIO pin 14USB MIDI host D- to 22ohm resistor to GPIO pin 15The 22ohm resistors go near the RP2040.USB MIDI host port requires 5V VBUS power, and two 15k resistorsOne from D+ to ground, and another from D- to ground.Use a ground wire to the usb host thicker than 30awg.Twist D+ and D-, try to keep them short.
Build Notes
BOARD SETUP
IMPORTANT set CPU Speed: "240 MHz (Overclock)"
- Board:
Waveshare RP2040 Zero - USB stack:
Adafruit TinyUSB - CPU:
240 MHzONLY - midi USB host uses PIO-USB on pins
14/15. Adafruit_NeoPixelmust stay disabled in this sketch while USB host is enabled (ARPNMIDI_ENABLE_RGB_LED 0), because it conflicts with PIO-USB state machines.Pico-PIO-USBis vendored invendor/Pico-PIO-USB(tag0.7.1) and must be available to Arduino.- TinyUSB host MIDI support in the installed Arduino-Pico core must define:
#define CFG_TUH_MIDI (CFG_TUH_DEVICE_MAX)(ignore this if it’s confusing)
Commercial Version Coming July 2026 (More Info Here)
Join the email waitlist for the first chance at the first batch! I won’t spam you.
Launch price may be around ~$200, so lock in your first-batch preorder now, at half off!
Preorder with confidence. I’ve released three live products over the past three years. The prototype works. This will be in your hands, and your preorders will put it there quicker. Hella thank you!
1. `BPM`
– Range: `20..300`.
– Sets arp tempo directly.
– Top screen: large BPM number.
2. `ARP MODE`
– Options:
– `OFF`
– `UP`
– `DOWN`
– `UP-DOWN 1`
– `UP-DOWN 2`
– `TRIGGER`
– `RANDOM`
– `UP 1-OCT`
– `RHYTHM`
– `OSTINATO`
– `OCT WALK`
– `FIFTH`
– `BASS+CHORD`
– `CHORD+RUN`
– Top screen: mode symbol for classic modes, pattern preview for pattern modes.
3. `DIVISION`
– Options: `1/1`, `1/2`, `1/2T`, `1/4`, `1/4T`, `1/8`, `1/8T`, `1/16`, `1/16T`, `1/32`, `1/32T`, `1/64`.
– Changing this gives you different trap high-hat rolls, among other tricks.
– Top screen: pie visualization + division text.
4. `VELOCITY`
– Range: `1..127`.
– Applies to arp note output velocity.
– `VEL DOWN` sensor/push mode can reduce this live while in range.
– Top screen: bar + numeric value.
5. `LENGTH`
– Range: `1..100` percent of step duration.
– Applies to arp gate length.
– `LEN DOWN` sensor/push mode can reduce this live while in range.
– Top screen: bar + percent.
6. `INPUT CH`
– Options: `CH 1..CH 16`.
– Main processing input channel for arp/thru/bass and mapped CC/PB/program routing.
7. `ARP CH`
– Options:
– `OFF`
– `CH 1..CH 16`
– `1+10`
– `1+10-A`
– `1-10 24`
– `1-10 36`
– `1-10 48`
– `1+10`: main arp on ch1 path plus drum-chord arp lane on ch10.
– `1+10-A`: same as `1+10`, plus ch10 channel aftertouch controls new ch10 drum-lane arp pulse velocity (33% minimum, `42..127`).
– `1-10 24/36/48`: same as `1+10`, plus 8-note split from input channel to ch10 drum lane:
– `1-10 24`: input notes `24..31` remap to ch10 `36..43`
– `1-10 36`: input notes `36..43` remap to ch10 `36..43`
– `1-10 48`: input notes `48..55` remap to ch10 `36..43`
– Drum lane velocity is forced to max (`127`) for `1+10` and `1-10 24/36/48`.
– The ch10 drum lane still pulses like an arp lane even when `ARP MODE` is `OFF`.
8. `BASS CH`
– Options: `OFF`, then channel groups for `CH1..CH12`.
– Per channel, octave offsets are: `-2`, `-1`, `0`, `+1` oct.
– Behavior: lowest-note-priority mono bass voice.
– If bass channel equals arp channel, bass output is suppressed.
9. `THRU OUT`
– Options: `OFF`, `CH 1..CH 16`.
– Thru path for notes from input channel.
– If thru channel equals bass channel while bass is enabled, thru is suppressed for that channel.
10. `RNDRBN` (Multiple monophonic synths can be used polyphonically, or use each channel for unexpected note timbres)
– Checkbox list for output channels `CH 1..CH 16`, `[ ]CH10-1+`, `[ ]CH10-2+`, plus `CLEAR` and `BACK`.
– Click a channel while editing to toggle its checkmark.
– Checked channels are used as the round-robin rotation for the arp output channel path.
– `[ ]CH10-1+` maps final routed ch10 notes 36..51 into full-velocity note 60 on channels 1..16 after ch10 arp routing is complete.
– `[ ]CH10-2+` maps final routed ch10 notes 36..49 into channels 2..15 (note 12 on CH2, note 48 on CH3, note 60 on others).
– In select mode, the top screen shows the checked channel list in small text.
– If no channels are checked, round-robin is off.
– Checking either `CH10-1+` or `CH10-2+` unchecks the other.
11. `ROUTER`
– List entries are formatted like `16>16+12` or `01>02=00`.
– Select an input channel row, choose its output channel, then choose note transpose in semitones.
– Transpose affects note and poly-aftertouch note numbers; other channel messages only change channel.
– `CLEAR` restores every channel to its default `CH n > CH n =00` mapping.
– When all mappings are default, the runtime router is bypassed with only a single active-mask check.
12. `DIV NOTE` (notes give you drum rolls, and other magic)
– Cursor options:
– Division slots: `1/4`, `1/4T`, `1/8`, `1/8T`, `1/16`, `1/16T`, `1/32`, `1/32T`, `1/64`
– `+NOTE`
– `RESET`
– `BACK`
– In edit mode:
– On a division slot, play a note (any channel) to map that note+channel to the division.
– When mapped note is held, arp temporarily switches to that division.
– If `+NOTE` is blank, mapped trigger note is swallowed.
– If `+NOTE` has a note value, mapped trigger note is replaced by `+NOTE` and then processed normally.
– `RESET` clears all division-note mappings and `+NOTE` when you exit edit mode on `RESET`.
– `BACK` exits edit mode without clearing mappings.
13. `MAP CC`
– Cursor options:
– Param slots: `BPM`, `ARP`, `DIV`, `VEL`, `LEN`, `IN`, `ACH`, `BCH`, `TCH`, `INCC`, `EYCH`, `EYMD`, `PSMD`, `KEY`, `SCL`, `LOOP`, `LOAD`
– `CLEAR`
– `CH:SET` / `CH:ALL`
– In edit mode on a param slot, send a CC to learn that CC number and channel for that slot.
– `EYMD` / `PSMD` changes the Eye mode and Push mode. Mapping excludes `CC 1..CC 19`, `CC103`, and Loop options.
– `CLEAR` clears all MAP CC assignments when you exit edit mode on `CLEAR`.
– `CH:SET`/`CH:ALL` toggles when you exit edit mode on that row:
– `CH:SET`: mapped CC must match both learned CC and learned channel.
– `CH:ALL`: mapped CC number works from any incoming channel.
– `LOAD` map target switches and loads preset immediately.
– `LOOP` map target changes loop length across `1 BAR`, `2 BAR`, `4 BAR`, `8 BAR`; mapped CC does not select `FREE`.
– Parameter changes from MAP CC are live and persist to the current preset (same autosave behavior as normal edits).
– MAP CC assignments are stored per preset and restore on boot/load with that preset.
– For stepped parameters, incoming CC is thresholded to target steps to avoid jitter.
– Display jumps to the changed parameter screen after movement settles, to avoid over-refreshing while CC is moving quickly.
14. `IN CC >`
– Options: `CH 1..CH 16`, `ALL3`.
– Routes your knobs. Destination for input-channel `CC`, `Pitch Bend`, `Program Change`, and `Channel Aftertouch`.
– `ALL3` fans these messages to arp/thru/bass channel outputs (de-duplicated).
15. `LEGATO` (A sampler can simulate the keyboard response of an analog synth)
– Options: `OFF`, `CH 1..CH 16`.
– Applies to note messages on the selected non-`INPUT CH` lane.
– Behavior: monophonic last-note priority with explicit handoff:
– newest pressed note becomes active output
– releasing that note re-activates the previous still-held note
– when no held notes remain, output note is released
16. `REMOTE`
– Options: `CH 1..CH 16`.
– Output channel used by both foot pedal remote actions (`REMOTE 1` and `REMOTE 2`).
17. `REMOTE 1`
– Action sent when pedal 1 goes low.
– Value mapping:
– `0..127` => note number pulse
– `128..254` => CC `1..127` pulse
– Pulse length uses project pedal pulse timing.
18. `REMOTE 2`
– Same action model as `REMOTE 1`, for pedal 2.
19. `USB HOST`
– Options: `OFF`, `IN ONLY`, `IN/OUT`.
– `IN/OUT` enables USB host TX fanout as well as input.
20. `SCRNSVR`
– Options: `OFF`, `AUTO`, `NOW`.
– `AUTO`: enters after idle timeout.
– `NOW`: immediate manual activation (not persisted as always-on).
– Redraws procedurally and refreshes on interval.
21. `EYE/PUSH`
– Options: `CH 1..CH 16`.
– Shared output channel for both `EYE MODE` and `PUSH` generated notes/cc/pitch/loop messages.
22. `EYE Distance Sensor`
– Modes:
– `OFF`
– `DIV +2`, `DIV -2`, `DIV +3`, `DIV -3`, `DIV FULL`, `DIV3`
– `VEL DOWN`, `LEN DOWN`
– `ARP LATCH`, `ARP LATCH+`
– `ARP FREEZE`, `ARP FREEZ+`
– `PITCH UP`, `PITCH DOWN`
– `NOTES C0..NOTES C7` (2-oct note ranges)
– `CC 1..CC 19`
– `CC103`
– `Loop Rec/ Play/Over`
– `Loop Stop/ Delete`
– `DIV3` profile: far zone most-slowing, middle less-slowing, close small zone speed-up.
– `ARP LATCH`: latch arp notes; wave over sensor to clear latch phrase.
– `ARP LATCH+`: latch arp plus thru/bass behavior.
– `ARP FREEZE`: wave over sensor to lock notes into frozen arp set.
– `ARP FREEZ+`: freeze mode with thru path freeze support as well.
– `NOTES Cx`: quantized note output with edge padding and range trims.
– `CC103`: sends a CC 103 pulse.
– `Loop Rec/ Play/Over`: if no loop exists, arms loop recording; recording starts on the first note played after the trigger. If a loop exists and is stopped, it starts playback immediately. If a loop is already playing, it toggles overdub on/off. Holding this trigger for more than 2 seconds cancels and deletes the loop.
– `Loop Stop/ Delete`: first trigger stops loop recording/playback; the next distinct trigger deletes the stored loop.
23. `PUSH Pressure Sensor`
– Same mode list and behavior family as `EYE MODE`.
– Uses calibrated thresholds and curved response so light press is less aggressive.
– Shares channel with `EYE/PUSH` setting.
24. `LOOP`
– Options: `1 BAR`, `2 BAR`, `4 BAR`, `8 BAR`, `FREE`.
– Sets the note-only loop length used by `Loop Rec/ Play/Over`.
– Change the length in real time to record a longer loop over a repeating shorter one.
– Fixed bar loops start playback automatically after the selected length is recorded.
– `FREE` records until `Loop Stop/ Delete` stops it.
– While editing this screen, pressing the push sensor toggles `Auto Overdub` on/off.
– Loop status icon in the upper-right: open circle = armed/recording/overdub, open play triangle = playing, pause bars = loop saved and stopped.
25. `KEY` (WARNING while on key/guitar screens like this, rapid incoming notes will slow the arp due to refreshing the display)
– Options:
– `OFF`
– standard key roots: `C..B` (an off-key note will trigger the next on-key one above it)
– alternate white-key mapper roots: `CKEY C..CKEY B` (these map the white keys to each scale note instead)
26. `SCALE`
– Options:
– `OFF`, `MAJOR`, `MINOR`, `MAJ+MIN`, `BLUES`, `MAJ BLUES`, `BLUES+BOTH`, `HARM MIN`, `MEL MIN`
– In `CKEY` mode, combo scales are skipped (`MAJ+MIN`, `BLUES+BOTH`).
27. `GIT/KEYS`
– Options: `GUITAR`, `PIANO`.
– Chooses visualization style for key/scale pages.
– Saved in preset and restored on boot/load.
– LIVE NOTES DISPLAY in real-time so you can see where to play along.
28. `LOAD`
– Select preset slot `1..16` in edit mode.
– Preset is actually loaded when you click back to select mode.
– Grid view shows slot location.
– NOTE all changed settings will AUTO SAVE to the slot you last loaded from.
29. `SAVE`
– Select destination slot `1..16` in edit mode.
– Slot is written when you click back to select mode.
– Grid view shows slot location.
– The next changed settings will AUTO SAVE to this slot.
30. `PANIC`
**WARNING if you stay on this screen, rapid incoming notes will slow the arp due to refreshing the display**
– device counts
– queue depth and drop counters
– overload risk flag
– last incoming channel/note and on/off state
– RX age timing
Stay tuned and subscribe to my socials for ongoing developments!












