Custom firmware · Hermetic Modular Alchemy Lab V2 · v0.1.0

Smackfor Alchemy Lab

Catch what you just played. Cut it up. Let a seed decide the rest.

Racked and heard. Not everything tried yet.

On 22 September 2026 it ran in a rack on a powered Alchemy Lab and made sound: audio in, a loop captured, audio out. On the same module the SD picker switched between Smack, Mark and Belt and back, and Smack's settings were still there when it came back. On the bench, before racking, its own load meter read 3.3% peak at idle pass-through.

Not yet tried on the module: the pattern stepping with a clock on J3, fast rates included; the CV inputs J4 to J8; and a cold power cycle keeping its settings. What this page says about those is what the code does and what the native tests show, not what has been heard.

12 HP · 6 pots · 3 buttons · 10 jacks · 102 LEDs · drawn at true scale

What it does

01 — The idea

Audio runs through the module continuously and is always being recorded. Hold CAPTURE and the last LENGTH steps of what you just played become a loop, cut into slices, with a seeded pattern of effects running across them. No arming, no deciding in advance that you wanted it.

Retro-capture

You never miss it

The good take is usually the one you weren't recording. The buffer is always rolling, 150 seconds of it, so CAPTURE reaches backwards instead of forwards.

Seeded

One number, whole arrangement

Which slices get re-ordered, which get an effect, and which effect all follow from a single SEED. Same seed, same result, every time. Tap CAPTURE to roll another.

Density, not editing

Steer the statistics

Six pots cannot edit slices one at a time, so they steer the probabilities instead: how much re-ordering, how many effects, how fine the slicing.

It is the same C engine as Smack for the Ableton Move and Smack Versio, recompiled for the Alchemy Lab: six pots on two pages, three buttons, six CV jacks that read independently of the pots, and 102 LEDs to say what is going on. It also brings something the engine never had a place for before: firmware swapping from the SD card, so this module can carry several firmwares and change between them in a settings page, each keeping its own settings.

The panel

02 — Drawn at true scale · click any control

Every hole sits where it sits on an Alchemy Lab. The coordinates come from the SDK's own KiCad front-panel template, not from a photo, and the drawing is generated from them. The pots do two jobs: the PLAY page is what you reach for while it runs, the SETUP page appears while B3 is held.

rings as the firmware draws them
Select a control

The panel

6 pots × 2 pages · 3 buttons · 10 jacks · 102 LEDs
Hover or click anything on the drawing. Audio in and out, the front USB-C and the light rings are fixed Alchemy Lab hardware; everything else is what this firmware makes of them.
plate 60.96 × 128.5 mm · 12 HP
pot pitch 35 mm across, 28 mm down · rings 16 LEDs, 13 in the arc
source KiCad template, parsed
J1/J2 sit under the IN legend, J9/J10 under OUT. The six CV jacks between them are numbered here in reading order, which the template does not state: the numbers printed on your panel are the authority.

Playing it

03 — Five steps to the first loop
1  Patch audio to J1 / J2 (IN). It passes through immediately —
   the module is not silent before you touch it.
2  Patch a clock to J3. No clock? It free-runs. That is fine.
3  Play something.
4  Hold B1 CAPTURE about a second. The last LENGTH steps become
   a loop and start playing.
5  Bring up FX and ORDER. Hold B3 and turn P1 for a new SEED.

Tap CAPTURE to re-roll: same loop, new pattern. Re-roll is on the tap because it is the gesture you use constantly while playing; grabbing a loop is deliberate and happens once, so it gets the hold. Hold past two seconds to drop the loop and return to dry pass-through.

LIVE mode — double-tap CAPTURE

The B1 light turns cyan. Instead of repeating one frozen take, the module re-captures itself once per loop pass, so the buffer keeps refilling with what you are playing now.

LENGTH sets how often that happens, and the wait is a full loop pass. At 120 BPM that is about a second at 8 steps and half a minute at 256, where it looks completely dead for thirty seconds. If you want LIVE to feel live, turn LENGTH down.

It records your dry input, never the effected output, so passes never compound and the loop cannot degrade into mush.

BLEND is a real dry/wet. It crossfades the loop against the live input in the audio callback, and it is bypassed until a loop exists, so the module is never silent before you have captured anything.

Very slow clocks shorten the longest LENGTH. A loop may take at most half the 150-second buffer, because the recorder has to keep writing a fresh loop alongside the one that is playing. Below about 51 BPM, which CLOCK RATIO at ×2 reaches from a 100 BPM clock, LENGTH 256 drops a notch rather than being trimmed off-grid. It stays dropped until the pot moves.

LENGTH, SLICE and SEED are stepped, and a stepped control parked exactly on a boundary would otherwise chatter between two values as noise, or CV, nudges it back and forth. Each has a deadband. SEED's is exactly one step wide, because a single step of SEED re-rolls the whole pattern and a wider band would make the pot skip most of the 128 seeds.

The second page, the punch, the filter

04 — What B3, B2 and the bottom-right pot buy back

The Versio had seven knobs, two switches and one button and still ran out of panel. Here the pots have a second page and the buttons have one job each, so everything the Versio hid behind a triple-tap is simply on the panel.

SETUP — hold B3

The set-once things, and the seed
PotParameterRangeRing
P1SEED0–127level
P2PITCH RANGE, how far the pitch effects may reach1–24 semitoneslevel
P3CLOCK RATIO, applied to what arrives at J3÷2 · =1 · ×23 dots
P4PUNCH FX, what B2 forces every slice throughClean + 26 effectslevel
P5MODE, one stereo loop or two independent mono onesStereo · Dual2 dots
P6TEMPO, used when nothing is clocking it50–200 BPMlevel

Opening the page to look cannot change anything. The SDK's pot catch runs on the way in and on the way out: a SETUP pot only takes effect once you turn it through the value it already holds, and letting go of B3 hands the pots back to the PLAY page without jumping anything. Both pages are saved to flash a few seconds after you stop moving a pot, and come back the next time Smack starts.

The PLAY page comes back where you left it, and the pots catch it. The six pots are shared by every firmware on the card, so after switching back from Mark or Belt they point wherever that firmware left them. Smack does not adopt those positions: each PLAY pot keeps its saved value and takes over only once you turn it through that value, the same catch the SETUP page uses. The one exception is the first boot after flashing, when nothing is saved yet and the PLAY page takes whatever the pots point at.

First boot after flashing seeds the SETUP page with SEED 0, a 12-semitone pitch range, ratio =1, punch RETRIG, stereo, 120 BPM.

PUNCH — hold B2

Hold it and every slice is forced through the effect chosen on SETUP's P4; release and the pattern snaps back. The B1 light goes white while it is held. Nothing else is on B2, so it can be played hard: a punch you have to think about is not a punch.

Punch CLEAN is the one to try first. It is the bottom of the P4 list, and instead of adding an effect it momentarily drops the glitch pattern, so a dense loop snaps back to unmangled for as long as you hold. Above it, in order: Retrig, Reverse, Pitch, Speed, Gate, Buzz, Crush, Repeat, Rev After, Tape Stop, Tape Start, Scratch, Env, Pan, Filter, Vowel, Tonal Delay, Freeze, Delay, Dist, Phaser, Verb, P-Shift, Ring Mod, Comb, Scatter.

One consequence of B2 also being half of the Settings chord: holding B2+B3 punches for the two seconds before Settings opens, then lets go. That is the price of keeping punch available on the SETUP page.

The DJ filter — P6 on the PLAY page

Left sweeps a lowpass down, right sweeps a highpass up, and the centre is a real bypass: a notch wide enough to find by feel on a pot with no detent. The ring shows it as blue to the left, orange to the right, and a single white LED at the top when you are in the notch.

It runs last, after BLEND, across the module's whole output, so it works on your dry input before you have captured anything at all, which nothing else on the panel does. Measured natively on the same filter code: −56 dB at 1 kHz fully left, −72 dB at 100 Hz fully right. At exactly zero the block is skipped altogether rather than run "open", because even open the filter shaved half a decibel off 8 kHz.

On the Versio this filter had to share a knob with PITCH RANGE. Here each has its own.

How a pattern is rolled

05 — FX density, ORDER density and the seed, run for real

A pattern is two passes over the slices with one seeded random stream. ORDER goes first: each slice, in turn, has an ORDER-density chance of trading places with a random slice. Then FX: each slice has an FX-density chance of getting an effect, and if it does, which one is a uniform pick from all 26, followed by a roll of that effect's own setting. The densities decide how many; the seed decides which.

The grid below runs the engine's roll, ported line for line with its generator, so for a given SEED with no re-rolls it is the pattern the module will play. Cells with a colour have an effect; a dashed cell plays a different slice from the one that would be there in the original order, and the big number is the slice you hear.

Why ORDER changes FX

One stream, two passes

Both passes draw from the same generator, ORDER first. Move ORDER density and the FX pass sees different numbers, so the effects re-deal too. That is by design: a pattern is one roll, not two independent ones.

Density is a chance, not a count

50% is about half

Each slice rolls on its own, so 50% FX on 32 slices gives around 16 effected slices, not exactly 16. Short loops with big slices have few cells and swing the most.

Re-roll vs seed

Tap walks, turn jumps

Tapping CAPTURE advances a counter that is mixed into the seed: same seed, next pattern. Turning SEED resets that counter, so the pot always lands on a seed's own first pattern. The pot reaches 128 of the engine's four billion seeds.

LENGTH and SLICE set how many cells there are: steps in the loop times two, divided by half-steps per slice, from 2 up to 512. Changing either re-rolls everything, because the stream is walked once per slice. In Dual mode the second channel's lane is rolled straight after the first from the same stream, so one seed still fixes both.

The 26 effects, and the punch

Every one of these is a roll candidate and a PUNCH FX choice on SETUP P4

A rolled effect gets a setting from the roll, listed in the third column. Held from B2, the effect is applied to every slice in the original order with its canonical setting, in the last column. CLEAN, at the bottom of the SETUP list, punches the pattern out: original order, no effects, for as long as you hold.

#EffectWhat it does to a sliceRolled settingAs a punch

Pitch and P-Shift roll their semitones within PITCH RANGE on the SETUP page, up or down; every other setting has a fixed menu. The four newest effects, P-Shift, Ring Mod, Comb and Scatter, joined the roll pool in the engine's v0.11.0, which reshuffled what older seeds produce; nothing on this module predates that.

The clock

06 — J3, two jobs, one setting

This module wants two things from a jack: a tempo, and a "capture now" trigger. J3 is that jack, and by default it works out which is arriving.

Default · Settings CLOCK IN = Auto

Auto

Worked out from what arrives: a steady train reads as a clock, sporadic hits read as capture triggers with the tempo inferred from them. Nothing to set.

Settings CLOCK IN = Clock

Always a clock

For a deliberately uneven clock, swung or gated, that you still want read as a clock rather than as triggers.

SETUP P3

Ratio

÷2, =1 or ×2 on whatever arrives, so a 16th-note clock and a quarter-note clock both work.

With nothing patched it free-runs at the TEMPO pot on the SETUP page. When a clock locks, the locked tempo becomes the new free-run default and the TEMPO pot adopts it, with catch, so unpatching later carries on at the tempo you were just at, and it is remembered across power cycles.

Internally, gate edges become 24 ppqn MIDI clock, because that is what the engine already speaks, so the timing model that runs on the Move runs here untouched. It is the piece with the most design risk in the port and the most thoroughly tested: a synthetic gate train drives the real engine to capture a bar of 95,985 frames against a 96,000 target, an error of 0.02%.

J3 is read raw in the audio callback, not through the SDK's 20 Hz pot filter, which would smear a pulse. It fires on the magnitude of the swing away from the jack's calibrated zero, 1.5 V to assert and 0.5 V to release, so a pulse counts whichever way the front end signs it. This is the one part of the port that native tests cannot reach, and a clock on J3 has not yet been tried on the racked module. Use a pulse of 5 ms or longer: the jack is read once per 128-sample block, so a trigger under about 3 ms can fall between two reads and be missed.

Every knob under CV

07 — J4 to J8, independent of the pots

On the Versio a CV input is summed with its knob in analogue, so the module can never read the jack alone. The Alchemy Lab reads pots and jacks separately and the SDK adds them in software, per page and per pot, which means a jack can drive a value on the SETUP page while the PLAY page is showing.

JackDrivesPage
J3CLOCK / TRIGGER — see above—
J4FX densityPLAY P1
J5ORDER densityPLAY P2
J6BLENDPLAY P5
J7SLICE resolutionPLAY P4
J8SEEDSETUP P1

SEED under CV is the one to patch first: a slow LFO or a sequencer into J8 walks the pattern through the seed space, one arrangement per step, without touching the loop. FX and ORDER under CV is the thing this hardware does that the Move version cannot. None of J4 to J8 has been tried on the racked module yet.

The routing is fixed in v0.1.0. Two things the platform makes possible and this version does not yet do: choosing the routing from the Settings pages, and a CV output, a per-slice trigger out of one of these same jacks, which no other platform this engine runs on can offer.

Reading the rings

08 — 96 LEDs around the pots, 6 beside the buttons

The SDK draws every pot's value on its ring in the colour of the page you are on. On top of that the firmware adds a playhead, three button lights and a report at boot.

WhereShows
All six ringsThe pot's value: a bar for continuous ones, one dot per step for stepped ones with the current step bright, two arms from a white pivot for the DJ filter. SETUP colours appear while B3 is held.
LENGTH ringA white pip runs once around the arc per loop pass while a loop plays.
B1 · STATEdim blue idle · amber armed · red recording · green looping · cyan LIVE · white while a PUNCH is held
B2 · CLOCKblue external clock · purple inferred from triggers · grey free-running · red = the audio callback is above 80%
B3 · SETUPA dim violet tint while the PLAY page is up; the SDK lights it in the page colour while SETUP is held.
P1 ring, first 2.5 sLast session's worst CPU load, as a bar. See below.
All three buttons redThe engine could not allocate its buffer. It needs 27.6 MB of a 32 MB pool, so this should be impossible; it fails loudly rather than running silently broken.

The boot report

The one number this project needs

You cannot watch a status light while playing with both hands, so the module measures its own worst-case load while you play and shows it on the P1 ring for the first two and a half seconds of the next power-up, when you can actually look.

3%
measured on the bench, idle pass-through

A single dim blue LED means it has not measured anything yet. Green is under 75%, amber under 90%, red means it did not fit. Play hard, FX and ORDER up, half-step SLICE, long LENGTH, then power down and up. On the Versio the same engine read 50 to 75% on the same silicon; the SDK adds a 1 ms control poll and the LED driver on top, and the 3.3% read so far is idle pass-through, not a loop with effects. This number is still open.

Settings — hold B2 + B3 for two seconds

The SDK's own settings layer; B1 steps through its pages, B2 or B3 leaves
Page 1

Brightness · presets · clock in · USB

P1 ring brightness. P3 / P4 preset slot and action, sixteen slots. P5 CLOCK IN: Auto (the default) or Clock. P6 USB PORT: Mac, Launchpad or Audio, below.

Save your own presets to the first twelve slots. The last four hold the working state of Smack, Mark, Belt and Relay, one each, in that order; saving a preset into one of them by hand replaces that firmware's working state.

Page 2

Firmware

The SD card picker: P1 file, P2 flash, P3 DFU. The next section is about it.

Settings pages at a glance

Page · potControlChoices, range, default
1 · P1BRIGHTNESS5–100% · default 30% · changes as you turn
1 · P2—nothing
1 · P3PRESET SLOT16 slots, 0–15 · picks the slot for P4
1 · P4PRESET ACTIONfully left: save · fully right: load · hold 3 s
1 · P5CLOCK INAuto · Clock · default Auto
1 · P6USB PORTMac · Launchpad · Audio · default Mac
2 · Firmware · P1FILEthe .bin files in /alchemy · up to 16
2 · Firmware · P2FLASHdip below ~85 %, then past ~95 % · writes and reboots
2 · Firmware · P3DFUdip below ~85 %, then past ~95 % · reboots to the bootloader
2 · Firmware · P4—nothing
2 · Firmware · P5—nothing
2 · Firmware · P6—nothing

B1 steps to the next page when you let go of it and is lit orange while Settings is open; a press of B2 or B3 leaves. CLOCK IN applies when Settings closes; BRIGHTNESS as you turn; USB PORT at the next power-up. Every Settings value except the picker's three is saved in Smack's preset slot 12 about five seconds after Settings closes; USB PORT is also written to /alchemy/usb.cfg on the card, shared by every firmware on it. The panel drawing has both pages: pick Settings 1 or Settings 2 above it and tap any pot, button or jack.

Firmware on the card

09 — Carry several firmwares, change between them from the panel

Hermetic's firmware treats the SD card as a place for presets and files. This one also reads .bin files from it, and can write one into the module's firmware slot, verify it, and reboot into it, from a settings page, with the module on and in the rack. Mark and Belt for the Alchemy Lab carry the same page, and each of the three keeps its working state in a preset slot of its own, so switching away and back finds Smack as you left it.

Prepare the card

FAT32, a folder named alchemy

32 GB or under, MBR partition table, FAT32. Make a folder called alchemy in the root and put firmware images in it: any .bin built for the Alchemy Lab bootloader, this one included. On a Mac, run dot_clean on the card before ejecting so the picker does not list resource forks.

Or over USB

Without pulling the card

Files reach the card over USB while the module runs: the web programmer's file panel, or the repository's tools/hostlink-fs.mjs, which makes the folder and puts the images in it from a terminal. Uploads are staged and renamed onto their final name only after the firmware has checked the CRC.

The gesture

Hold B2 + B3 two seconds · tap B1 to the Firmware page
PotDoesRing
P1 · FILEPicks a file. One dot per .bin in the folder, the chosen one bright; turn to move the choice. green dots · red: no card · orange: no folder, or no files
P2 · FLASHWrites the chosen file. Turn it down below 85%, then all the way up. The dip arms it, so a pot that happens to be parked at maximum cannot fire on entry. The arc shows the arming bar, dim until the dip has been seen. It compares before it erases: if the chosen file is the firmware already running, nothing is written and nothing reboots; turn down to go back to the list. teal comparing · solid green: already loaded, nothing to do · orange erasing · blue writing · green verifying · white, then reboot · blinking red: failed, nothing booted; turn down to try again
P3 · DFUSame gesture. Reboots into the bootloader's update mode and stays there for a USB flash: the escape hatch for a firmware that has no picker of its own. violet arming bar

What it refuses, and what it never touches

It checks the image's first eight bytes before erasing anything and refuses one that is not bootable from SRAM: a build for internal flash would leave the bootloader with nothing to boot. The largest file it will take is the app slot up to the calibration sector, so the board's calibration record and the preset store are never in the erase path.

If a write fails, the module blinks red and boots nothing; the bootloader is intact, and hold-B3-at-power-on still gets you a USB flash. What this cannot protect you from is a file that is valid, bootable and wrong for the hardware. Keep the Patch card's modules folder and this card's alchemy folder apart.

The erase runs one 64 KB sector per frame and the write one 4 KB chunk per frame, between LED frames; the verify compares the slot through the memory-mapped view, then hands over to the bootloader with the grace window skipped so the new firmware simply starts. Nothing this firmware runs lives in the slot it is rewriting, so audio is meant to keep passing, though a sector erase blocks for a good fraction of a second and the rings will stutter through it.

Before any of that, the picker reads the file against the slot through the same memory-mapped view. If every byte matches, it stops there: picking the firmware that is already running costs nothing, and a loop in progress keeps playing. The first byte that differs hands over to the erase, write and verify, from the top of the file.

What has run. On 22 September 2026, on a racked module, the picker listed the card's folder and switched between Smack, Mark and Belt, and Smack came back with its own settings; picking the one already loaded gave the solid green ring and no reboot. The failure paths, a refused image and a failed write, have been reasoned through against the memory map but not exercised.

USB and controllers

10 — One front port, three jobs: the Mac, controllers, or a sound card

The front USB-C does one thing per power-up. By default it talks to the Mac: the web programmer, presets, the card. Switched over, the Lab becomes the USB host for a Launchpad Mini MK3, a Launch Control XL and a Haute42 gamepad, or a two-in, two-out USB audio interface.

The USB port setting

Settings page 1 · P6, bottom right

Hold B2 + B3 for two seconds to open Settings, and turn P6, the bottom-right pot of Settings page 1. It is a three-way selector:

ModeThe front USB-C is
MacHostLink, the default: the web programmer, presets and the card's files, with the module racked.
LaunchpadThe USB host for controllers. The Lab drives a Launchpad Mini MK3, a Launch Control XL and a Haute42, through a powered dongle; see below. No HostLink this boot.
AudioA class-compliant USB audio interface (USB Audio Class 1): 2 channels in from J1/J2, 2 out to J9/J10, 48 kHz, 24-bit, no driver needed on a Mac. Smack's engine is bypassed: what the computer plays comes out of J9/J10, what comes in on J1/J2 goes to the computer. There is no volume control in the path and J9/J10 are DC-coupled, so a DAW can send CV through them. No HostLink and no controllers this boot.

One setting for the whole card, from the next power-up

The mode is kept on the SD card in /alchemy/usb.cfg, shared by every firmware on it: each one adopts the card's value at boot and writes a change back, so switching firmware in the picker keeps the mode. A change takes effect the next time the module powers up.

Hold B1 while powering up for Mac mode for that one boot, whatever the setting says: the way back to the web programmer without opening Settings. The port has one USB role at a time, so Audio mode means no controllers, and neither Launchpad nor Audio mode has HostLink. The bootloader's DFU (hold B3 at power-on) is unaffected.

What B2 says about the port

B2 is borrowed while the USB side starts up
Launchpad mode

The host starting up

dim purpleThe first two seconds after power-up, before the host starts.
blueStarting the USB host.
cyanHost running, nothing on the wire: no dongle seen.
yellowA device is attached and enumerating, or the dongle's hub is up with no controller behind it yet.
redThe host gave up: an abort, an unsupported device, an error.
its usual colourA controller is up: B2 goes back to its CLOCK job.
whiteWhile any Haute42 button is held.
Audio mode

The interface

dim purpleNot started yet.
cyanWaiting for a computer.
yellowConnected, no stream open.
greenStreaming, at least one direction.

If the host does not come up, a report of what it saw is written to the card as /lpdiag.txt about 17 seconds after power-up, for reading back in Mac mode.

Hooking up controllers

A powered USB-C dongle with a hub inside · up to three controllers at once
Power

The front port has no 5 V

The Lab's USB-C gives no bus power, so a controller needs it from somewhere else: a powered USB-C dongle with a USB hub inside. Power the dongle, plug it into the Lab's front USB-C, and plug the controllers into the dongle. The one it was developed with carries a hub and an Ethernet chip; a device that is not a controller, like the Ethernet chip, is switched off and skipped.

Behind the hub

Three at once, one hub deep

Up to three controllers at a time, full speed. Free ports are rescanned every half second, so a controller can go in after power-up. Unplugging one mid-session is not handled tidily: the host sees errors and may reset, so power down to rearrange. The gamepad is only recognised behind a hub, never plugged straight in.

ControllerUSB IDSet-up
Launchpad Mini MK3Novation 1235:0113None: the Lab puts it in Programmer mode and paints its pads.
Launch Control XLNovation 1235:0061None: factory template 1 is selected automatically at connect, and again if the template is changed on the device. The MIDI channel is ignored.
Haute42045E:028EMust be in XInput mode (GP2040-CE), where it shows up as an Xbox 360 controller.

While Settings is open the controllers do nothing: the pads, buttons and knobs are ignored and any held effect lets go. Knobs and faders move the pages' stored values, so what they set is saved like a pot move, and the panel pot then has to catch the new value before it takes over again.

Launchpad Mini MK3

Rows count from the top · tap or click any pad to see what it does
Numbers are the effects in the order of the PUNCH FX list (0 = Clean). Shown with RETRIG as the PUNCH FX choice (bright) and the playhead on step 3. Colours approximate the Launchpad's palette.
PadDoesColour
Rows 1–4The 27 punch effects in order, Clean first: row 1 Clean · Retrig · Reverse · Pitch · Speed · Gate · Buzz · Crush; row 2 Repeat · Rev After · Tape Stop · Tape Start · Scratch · Env · Pan · Filter; row 3 Vowel · Tonal Delay · Freeze · Delay · Dist · Phaser · Verb · P-Shift; row 4 Ring Mod · Comb · Scatter. Hold a pad to punch that effect, release to let go. A held pad wins over B2.dim, one tint per row · bright: the effect B2 punches (SETUP P4) · green: held
Rows 5–7Unused.off
Row 8The loop's playhead, eight steps per pass, while a loop plays.green · cyan in LIVE
Top 1CAPTURE: grabs the last LENGTH steps, as a B1 hold does.red recording · yellow armed · dim red otherwise
Top 2RE-ROLL: a new pattern, same loop.dim yellow
Top 3LIVE on / off.cyan on · dim off
Top 4CLEAR: hold one second to drop the loop.red while held · dim red
Top 5–8, right columnUnused.off

Launch Control XL

Factory template 1 · columns count from the left · tap any control
Three rows of knobs, eight faders, two rows of buttons under the faders. Lit = in use.
ControlDoesLED
Faders 1–6The PLAY knobs: FX · ORDER · LENGTH · SLICE · BLEND · DJ FILTER.—
Top knobs 1–6The SETUP knobs: SEED · PITCH RANGE · CLOCK RATIO · PUNCH FX · MODE · TEMPO.dim amber
Upper buttons 1–41 CAPTURE · 2 RE-ROLL · 3 LIVE on / off · 4 CLEAR (hold one second).1 red recording, amber armed · 2 dim amber · 3 green LIVE on · 4 red while held
Lower buttons 1–8Hold to punch effects 1–8: Retrig · Reverse · Pitch · Speed · Gate · Buzz · Crush · Repeat.dim amber · green while held
Faders 7–8, other knobsUnused.off

Haute42

Every button is hold-to-punch · tap any button

Hold a button and its effect plays; let go and it returns to the pattern. The last button pressed wins. Let it go while another is still held and that one takes over; with nothing held it is back to the pattern. The effects are Smack's own punch: every slice forced through that effect, the same as the Launchpad pads and B2. A held gamepad button wins over B2, and B1 goes white while any punch is held.

LeftGateDownScratchRightDistUpVerbXRetrigYRepeatRBReverseLBTape StopAFilterBCrushRTDelayLTFreezeL3PitchR3Phaser
Left hand: Left, Down, Right. Thumb: Up. Right hand: X Y RB LB on top, A B RT LT below. L3 and R3 are extra buttons; where they sit depends on the controller.
ButtonWhereEffect
Xright hand, top row, 1stRetrig
Yright hand, top row, 2ndRepeat
RBright hand, top row, 3rdReverse
LBright hand, top row, 4thTape Stop
Aright hand, bottom row, 1stFilter
Bright hand, bottom row, 2ndCrush
RTright hand, bottom row, 3rdDelay
LTright hand, bottom row, 4thFreeze
Leftleft hand, ring fingerGate
Downleft hand, middle fingerScratch
Rightleft hand, index fingerDist
UpthumbVerb
L3extra buttonPitch
R3extra buttonPhaser

These are the engine's own effects, described in the effects table. The Launchpad reaches all 27; the gamepad picks fourteen to play by hand.

Button positions

The positions here follow the standard GP2040-CE hitbox mapping. If the controller's button mapping has been changed, the same effects follow the XInput button names (X, Y, RB, LB, A, B, RT, LT, the directions, L3, R3), not the physical positions. Start, Back and Guide do nothing.

Download it

11 — The firmware file, or the source

For the Alchemy Lab V2 only. This is a beta: it has been played on one module, and the clock and CV inputs are still untried.

Download smack_alchemy.bin  All releases and notes

To build it yourself instead (a few minutes with the ARM toolchain installed):

git clone --recurse-submodules 
cd smack-alchemy
make libdaisy        # once
make                 # build/smack_alchemy.bin, ~357 KB
make test            # the native suites: clock, allocator, DJ filter, ring stall

Needs arm-none-eabi-gcc, make and dfu-util. libDaisy has nested submodules, so the clone must be recursive or the HAL is missing. make BENCH_USB=1 BUILD_DIR=build-bench builds a variant with HostLink on the Daisy Seed's own micro-USB, for a module out of its case on a bench bootloader; it is not the one to rack.

Installing

12 — Through the front USB-C, and getting back to stock

The Alchemy Lab's bootloader serves DFU on the front-panel USB-C, so the module stays in the rack. Once this firmware is on it, so does every update after.

First time

Hold B3 at power-on

During the two-second boot window the rings run a warm-white comet. Hold B3 through it and they switch to a slow breathe with the B3 lights on: update mode. Then flash the .bin with Hermetic's web programmer, or from the repository:

make program-dfu
Every time after

Live

With Smack running, the module can be asked to reboot into update mode over HostLink and flashed in the same breath, no button held:

make program-live

Or put the new .bin on the card and use the picker.

Back to stock

Same door

Flashing any Alchemy Lab firmware, Hermetic's own included, the same way returns the module to it. Presets in the slots survive; this firmware's working state is in its own slot, the thirteenth of sixteen, and is schema-guarded, so another firmware will not read it as its own.

Before you flash it

It is custom firmware. Hermetic Modular did not write it, did not test it and cannot support it, so please do not contact them about it. It has been played on one module, its author's, and the clock and CV inputs have not yet been tried there. If you run it, the two things worth reporting are whether J3 locks to your clock and what the boot report reads after a hard session.

How it is built

13 — The parts worth knowing about

The engine was not touched. Everything below is the layer between it and the Alchemy SDK, and the handful of decisions that shaped that layer.

PieceWhat it is
Two pages, one layerThe SDK's Pager makes SETUP a held layer on B3 with pot catch on the way in and out. Nothing on the PLAY page can jump because you looked at the other one.
Working presetSmack's own slot, the thirteenth of sixteen (12 counting from zero; Mark, Belt and Relay have the three after it), holds the live state: both pages, the Settings and two extras, the free-run tempo and the CPU peak. It autosaves five seconds after the last change on either page with hands off the buttons and the picker idle, one 4 KB sector per save, behind epsilons so a drifting number cannot wear the flash. At boot the home slot wins; a module whose state was saved by an older build in the first slot carries it over once. Loops are never saved.
The pickerThree Custom slots on a Settings page: a file scanner, a state machine that compares, then erases, writes and verifies, one step per frame, and a DFU hand-off. Shared, by copy, with Mark and Belt. Its buffers live in AXI SRAM because the SD controller's DMA cannot reach the tightly-coupled memory the rest of the firmware's data uses.
Clock adapterGate edges become 24 ppqn MIDI clock, three tiers (external, inferred, free-run) with auto-detection. Seven native tests, unchanged from the Versio.
Ring recorder150 seconds, sized to hold two of the longest loop, so the loop that is playing is protected from the recorder.
SDRAM allocatorA bump pool in external RAM, 27.6 MB of 32 MB, so the engine's four callocs land there with no engine edits.
Engine at 48 kHz128-frame blocks, as the engine's clock regression requires; the SDK's default block is 24, so the firmware asks for 128 at init.
DJ filterTwo cascaded one-poles per channel, and a true bypass at the notch: at exactly zero the block is skipped and the filter state cleared, so re-engaging starts from silence.
HostLinkProduct "Smack", both pages, ten jacks, three buttons, a manual and the SD filesystem, over the front USB-C. Verified on the bench: the module identifies itself, serves its descriptor, and its slot table and live state read back correctly.
Budget~357 KB image. SRAM 74%, DTCM 61%, SDRAM 50%. CPU: 3.3% peak measured at idle pass-through; a loop with effects is not yet measured.

Found something, or want it to do something it doesn't? Open an issue. A report from someone playing it is worth more than anything measurable on a laptop.

Specifications

Appendix
Platform

Alchemy Lab V2

Daisy Seed2 DFM: STM32H750 at 480 MHz, 64 MB SDRAM. 12 HP. Hermetic Modular's Alchemy SDK, beta.

Audio

48 kHz · 128

Stereo in on J1/J2, stereo out on J9/J10. The 128-frame block is required by the engine.

Memory

150 s buffer

27.6 MB used of a 32 MB SDRAM pool, of 64 MB available.

Effects

26 + clean

One per slice at a time, not all at once, which is what makes the CPU question winnable.

Controls

6 × 2 · 3 · 6

Six pots on two pages, three buttons, six CV inputs independent of the pots, 102 LEDs.

Storage

16 slots + card

Sixteen preset slots in QSPI flash, the thirteenth Smack's working state; firmware images and files on a FAT32 microSD.

The rest of them

14 — The same engine, and its siblings

Smack started on the Ableton Move under Schwung. The Versio port came next; this is the third body for the same engine.

All of Tim's Alchemy Lab instruments, on one page →