Capicola — Versio
Capicola — Heavy Light Industries' keyframe time-stretcher, pitch-shifter and transient-driven granular auto-slicer — ported to the Noise Engineering Versio as custom Daisy firmware.
Capicola stretches incoming stereo audio while a transient detector watches the same input; when a transient passes threshold the lagging read head snaps to the present with a short crossfade and stretches on from there. That is why it stays rhythmically locked to material it is radically slowing down. It is the hardware form of the DAFx26 paper Keyframe Time Stretching via Extrema Sampling.
Status: builds, unheard. Every off-hardware test passes and the firmware links inside the internal-flash budget, but this has not yet been run on a Versio. Treat the panel mapping as a proposal until it has been played.
Install
The shipping build is BOOT_NONE — a plain internal-flash image, so Noise Engineering's own web uploader installs it with no bootloader and no toolchain.
git submodule update --init # NOT --recursive; the nested SDK is unused
make -C firmware APP_TYPE=BOOT_NONE # → firmware/build/capicola_versio.bin
| Region | Used | Size | % |
|---|---|---|---|
| FLASH | 73,568 B | 128 KB | 56.1% |
| SRAM | 54,768 B | 512 KB | 10.5% |
| SDRAM | 50,387,008 B | 64 MB | 75.1% |
That there is ~54 KB of flash headroom is worth a note, because
smack-versio reached the opposite
conclusion on identical silicon and had to ship BOOT_SRAM at ~137 KB: capicola's
entire DSP core and engine is 9.9 KB of .text at -Os, where smack_core
is 22.5 KB. SDRAM is the region actually under pressure, at 75% — the two
keyframe rings are 2²¹ frames × 12 B × 2 channels.
See FLASHING.md for the bootloader build.
Panel
K0 Stretch K1 Pitch K2 Threshold K3 Grain
K4 Quality K5 Feedback K6 Mix
Hold the button for the VOICE page (pickup-gated, so nothing jumps):
K0 Mod depth K1 Mod target K2 Drive K3 Character
K4 FB tone K5 Env smooth K6 Fade trim
SW_0 mod source off / input follower / output follower
SW_1 fade snap 10 ms · normal 20 ms · wash 120 ms
button press = force a splice · hold = VOICE page
gate in TRIG IN — external slice trigger
LEDs in-gate · out-gate · in-env (red = clip) · out-env
The Versio has no CV outputs, so capicola's ENV 1/2 and TRIG 1/2 jacks — the "self patching" half of the module — cannot exist here. Those four signals drive the four RGB LEDs instead. Offsetting that: every Versio knob is summed with its own CV input in analog before the ADC, which is upstream's Depth/Routing page for external CV, at full resolution and with no menu.
DESIGN.md has the full reasoning and two alternative mappings.
Testing
./scripts/test.sh
Three suites, all on a laptop, no board and no SDK:
- upstream's own DSP core (
upstream/lib, unmodified) — 220,158 checks - the port layer (
core/) — 36 checks, including that a long host block is chunked rather than truncated - fidelity — compiles upstream's
audio_engine.cppunmodified against a fake daisy header and asserts the port is sample-exact against it. 0 differing samples in 144,000. This is the only test that can catch a transcription error in a hand-port; it is the reason the port can be trusted before it has ever been heard.
Relationship to the Move port
The shared port layer in core/ is duplicated verbatim in
capicola-move — the two repos are
deliberately standalone so each can be cloned and flashed on its own. A change
to core/ belongs in both, and the fidelity test in each will catch drift
against upstream immediately.
License
Upstream capicola is AGPL-3.0, so this is AGPL-3.0. Shipping hardware
running a modified capicola obliges you to offer the corresponding source.
Structural shape of the firmware shim is borrowed from smack-versio (MIT,
© Tim Cox); MIT into AGPL is permitted, the reverse is not.
