draft: false
Name: NIBBLE-KO
short-description: A 12-voice synth/sample percussion looper for the Four Voltages module, with a browser sample manager
Language: C++ (Pico SDK + ComputerCard)
Creator: Andy Jenkinson (uglifruit)
Version: "1.2.1"
Status: Released
License: CC-BY-4.0
repository: https://github.com/uglifruit/Nibble-KO
Editor: web
date-created: 2026-08-09
date-updated: 2026-08-19
# The browser setup tool's visual design follows Johan Eklund's Resonator
# (https://johaneklund.io/resonator/), and its USB connection/upload logic is
# ported from WorkshopBio's web/index.html (also Andy Jenkinson). See
# README.md's Credits section and web/README.md for the fuller detail.
contact:
social:
github: https://github.com/uglifruit
uf2:
- path: UF2/nibbleko.uf2
name: NIBBLE-KO 1.2.1
tags:
- drums
- looper
- sample-player
- effect
- performance
- four-voltages
- web-midi
summary: |
NIBBLE-KO is the percussion half of NIBBLE (uglifruit/WorkshopNibble),
expanded into a dedicated twelve-voice drum machine: every voice
independently synthesised or sample-based, chosen and uploaded from a
browser WebUI.
Patch one output of the FOUR VOLTAGES module into CV In 1. The card learns
which voltage each button combination produces, the same ten-level
detector and SHIFT technique as NIBBLE's Percussion half: hold one button
as a bank select, tap another to play it repeatedly - twelve ordered
gestures from four buttons and six pairs.
CALIBRATION IS THE WHOLE GAME. Use output 1 of Four Voltages with its knob
near twelve o'clock, and give the card ten well-separated voltages. Levels
that sit close together do not fail cleanly - a pad plays the wrong drum,
fires twice or does nothing, differently each time. The card blinks LEDs 4
and 5 when two captures are too close; move the knob and run it again
rather than playing around it.
The momentary switch is a MODE SELECTOR rather than a trigger. Hold it and
press a button to choose - drums, mute groups, or twelve performance
effects - then Middle plays that mode and Up records it. Because the mode
latches, everything is recorded through one mechanism.
THE EFFECTS are four banks of three, the shift picking the family: filters,
destruction (crush, decimate, wavefold), rhythmic (stutter, flam, gate) and
transport (reverse, tape-stop, silence). Up to four layer at once, in
series. The transport bank means different things to different voices - a
sample plays backwards where a synthesised voice runs its ENVELOPE
backwards, a swell instead of a decay - so one press gives backwards kick
and hats over swelling toms at the same time. Each shift records two lanes,
the effect and its own parameter curve, so a sweep can be drawn once and
effects punched in and out over the top of it.
THREE PATTERN SLOTS sit on the fourth mode, where the SWITCH is the verb:
hold D and tap A, B or C to recall a slot instantly, or do the same with
the switch UP to store the live loop into it instead. That reuses what Up
already means everywhere else - commit this to the loop - so there is no
new gesture to learn. Recall does not move the playhead, so switching
mid-bar reads as the band changing part rather than a stop and start, and
it discards whatever you were playing, which is what makes it possible to
try something over a pattern and abandon it.
PATCHABLE. CV In 2 takes over the Main knob, Pulse In 2 fires a random
effect for as long as it is high, and Audio In 1 and 2 set that effect's
depth and a global CHAOS level. Chaos drives two glitch generators on the
CV outputs - one sparse and beat-anchored, one dense and syncopated, both
following the live quantise grid. Patch either back into Pulse In 2 and the
card glitches itself.
1.2.1. Drums, the looper, mute groups, the twelve effects, pattern slots,
sample playback, the browser sample manager, flash-saved calibration and the
CV expansion above are all played and working on hardware. Patterns can be
SAVED TO YOUR COMPUTER and loaded back from the browser tool, as plain JSON
files - the card keeps its three slots in RAM, so the file on disk is the
permanent copy. A pattern stores voice numbers rather than sounds, so one
saved against any kit plays against any other. New in this release: the LOOP
LENGTH is settable from 4 to 16 beats, so odd time signatures are playable -
the click is unstressed and nothing marks beat one, so fourteen beats is 7/4
twice, or 5/4 + 2/4 + 3/4 + 4/4, or whatever you hear in it. Shortening is
non-destructive: the card always records the full sixteen beats, so putting
the length back brings the hidden hits with it. The loop also keeps playing
while the browser tool is connected, so a voice can be re-pointed at a new
sound and judged by ear against the pattern it has to sit in. 1.2.1 fixes
the browser tool failing to find the card when the computer shows it under
another Workshop card's cached MIDI name - it now identifies the card by
asking rather than by matching the port name. That is a change to the web
page only: THE FIRMWARE IS UNCHANGED FROM 1.2.0 AND NEEDS NO REFLASHING -
the UF2 below is the same binary, so if you are already running 1.2.0 just
take the new browser page. See the repository's README for the fuller
detail.
panel:
inputs:
- id: CVIn1
name: Four Voltages
type: cv
description: "Patch one output of the Four Voltages module here - output 1 with its knob near twelve o'clock is the reliable setting. The card learns which voltage each button combination produces, so it works at any knob position; re-learn whenever you move it. WELL-SEPARATED VOLTAGES MATTER MORE THAN ANYTHING ELSE: the knob moves all four outputs at once, and towards either extreme several combinations collapse onto nearly the same voltage. Two levels sitting close together do not fail cleanly - a pad plays the wrong drum, fires twice or does nothing, differently each time, because a few millivolts of drift moves the reading across the boundary. The card flags it (LEDs 4 and 5 blink during calibration) rather than guessing, and the fix is to move the Four Voltages knob and calibrate again."
- id: CVIn2
name: Main override
type: cv
description: "Takes over the Main knob while patched, so whatever Main does in the current mode is under CV instead - the DJ filter in DRUMS and MUTE, the held effect's depth in FX. Overrides rather than offsets, the same way Pulse In 1 overrides the tempo knob: a cable wins. Bipolar, and full swing covers the knob's whole travel."
- id: PulseIn1
name: ClkIn
type: pulse
description: An external clock at one pulse per beat. Overrides the tempo knob for as long as pulses keep arriving and hands the tempo back a few seconds after they stop.
- id: PulseIn2
name: Random FX
type: pulse
description: "While HIGH, a randomly chosen effect is applied - one of the same twelve the buttons play. Level-sensitive rather than edge-triggered, so the incoming gate's WIDTH is how long the effect lasts; the effect is rolled once when the gate opens and held until it closes. It sits BELOW the hand and below anything recorded, so it colours the slots you are not using rather than fighting you for one. Patch CV Out 1 or 2 back into here and the card glitches itself."
- id: AudioIn1
name: FX depth
type: cv
description: "Sets the depth of the random effect fired by Pulse In 2. A control voltage is the intended use; feeding it actual audio makes the depth judder at signal rate, which is either a mistake or exactly what you wanted. With nothing patched the effect uses that slot's own parameter curve instead."
- id: AudioIn2
name: Chaos
type: cv
description: "How busy the two glitch outputs are, and how fine. Turning it up raises the odds of any division firing AND widens the pool - at the bottom only beats are candidates, at the top every half-division is, so more chaos is finer as well as denser. Above about two thirds the dense output starts producing ratchets, short bursts instead of single gates. Never reaches certainty: a stream that fires on every candidate is a pulse train, not a random one. With nothing patched it sits at about 5%, one beat in twenty, so the glitch outputs always do something."
outputs:
- id: CVOut1
name: Glitch (sparse)
type: cv
description: "Gates on random beat divisions, weighted hard toward the downbeat and with longer gates - musical enough to use as an accent track on its own. Divisions follow the live quantise grid (switch+A+C), so this always agrees with what the card is recording to. Density is set by chaos on Audio In 2; with nothing patched there it fires about one beat in twenty."
- id: CVOut2
name: Glitch (dense)
type: cv
description: "The same idea as CV Out 1 turned up: off-beats and finer subdivisions, short gates, and at high chaos occasional ratchets - short bursts rather than single hits. Deliberately skips the beat itself, which CV Out 1 already owns. This is the one to patch into Pulse In 2 when you want the card to fall apart."
- id: AudioOut1
name: Drums
type: audio
description: The mono drum bus, after the DJ filter. Audio Out 2 carries the same bus, not a stereo partner - patch either socket and you get the whole kit.
- id: AudioOut2
name: Drums
type: audio
description: The same mono drum bus as Audio Out 1.
- id: PulseOut1
name: Gate
type: pulse
description: Fires on every drum hit, live or looped.
- id: PulseOut2
name: Click
type: pulse
description: Fires once per beat.
controls:
switch:
up:
name: Record
description: Play the current mode AND record it. Drum hits, effects and knob movements are captured the same way. Mute toggles are deliberately NOT recorded - a mute is a mixer move rather than part of the music, so it stays live state and persists across pattern recalls, making it an arrangement layer above the patterns. The loop stores events rather than audio, so overdubbing never degrades what is already there.
middle:
name: Play
description: Play the current mode without recording.
down:
name: Mode select
description: "Hold DOWN and press a button to choose a mode; the choice lands when you RELEASE, and then LATCHES, so Down and Up never need to be held at once. A: drums. B: mute groups. C: twelve performance effects. D: three pattern slots, hold D and tap A/B/C to recall - or do the same with the switch UP to store. With a PAIR held it fires a one-shot instead - A+B undo (which covers RECORDING - hits, effects and knob curves - and deliberately not the pattern slots), A+C quantise (which cycles the grid new hits snap to - 16th, 12th, 8th - rather than re-timing anything already recorded, shown on LEDs 4 and 5: 4 alone is 16ths, both is 12ths, 5 alone is 8ths), C+D play/stop, B+D hands the card to the browser setup tool over USB. Commit-on-release exists because Four Voltages holds its last voltage: the CV may already be sitting on the button you want, so a press-driven select would never fire."
tap:
name: Capture (during calibration)
description: While calibrating, tap to capture the combination you are holding. Outside calibration a tap is just a short mode-select gesture and does nothing on its own.
knobs:
-
main:
name: DJ Filter / FX depth
description: "Overridden by CV In 2 while something is patched there. In DRUMS and MUTE it is a DJ filter - low-pass to the left, high-pass to the right, generous bypass at centre. In FX mode it becomes the held effect's depth instead, and the filter latches where it was, picking up again only when the knob is turned back through that value so leaving the mode never jumps it. Movements are recorded into the loop; in FX mode each shift has its own parameter curve, so holding a shift alone and turning Main draws that lane's automation."
x:
name: Tempo
description: 40 to 240 BPM, ignored while an external clock is running on Pulse In 1.
y:
name: Kit character
description: Reshapes the whole kit at once when a voice is struck - anticlockwise lower and longer, clockwise higher and shorter. On a synthesised voice that is pitch and decay; on a sampled one it is playback rate, which couples the two the way tape does. Applied at the moment of striking, so sweeping it never warps a sound already ringing.
leds:
-
display: list
items:
- id: LED0-3
name: Buttons A B / C D
description: Laid out in the same 2x2 as the Four Voltages buttons - shows which combination is currently held, flashes on each hit, and during calibration shows which combination to press next.
- id: LED4
name: Beat
description: Pulses on the beat. During calibration marks the four single-button steps.
- id: LED5
name: Record
description: Lit while recording. During calibration marks the six two-button steps.
host:
notes: |
NOT YET BUILDABLE. See the repository's CLAUDE.md for current status.