mi-alchemy · Alchemy Lab V2 firmware

Cloudstexture synthesizer · 32 kHz · saves to the card

Clouds records what you patch into J1 and J2 into a short buffer and plays it back as a cloud of tiny grains: smeared, pitched, frozen, stretched or turned into spectral mist. This is Mutable Instruments' DSP, unchanged, running on the Alchemy Lab's six pots and three buttons.

Built and native-tested. Not yet flashed or heard.
An illustration, silent: the granular mode's scheduler from granular_sample_player.h redrawn in the browser. Grain rate, regular versus random seeding, grain length (lut_grain_size), pitch (lut_quantized_pitch) and where each grain starts follow the firmware's code. The waveform is a stand-in for your input.

What it does

Four ways to take a recording apart

Everything Clouds plays comes out of a recording buffer that the input keeps writing into, about one second of 16-bit stereo. POSITION says where in that second to read, SIZE how long each piece is, PITCH how far to transpose it and DENSITY how many pieces play at once. TEXTURE shapes them and BLEND mixes the result with the dry input.

FREEZE stops the recording. The buffer holds what it has, and you play that snapshot for as long as you like. A gate on J3 does the same, so a sequencer can freeze and release it.

The original Clouds used one BLEND knob for four jobs: dry/wet, stereo spread, feedback and reverb, chosen with a button. Here each of those four has its own pot. That is why this firmware has a second page.

The panel

Drawn at true scale from the SDK's KiCad template · click any control

Every hole sits where it sits on an Alchemy Lab. The rings show what the firmware draws for the example values. Hold B3 and the pots become the Setup page; hold B2 and B3 together for two seconds and Settings opens.

Select a control

The panel

6 pots × 2 pages · 3 buttons · 10 jacks · 102 LEDs
Hover or click any pot, button or jack. 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
rings 16 LEDs, 13 in the arc
The six CV jacks between IN and OUT are numbered here in reading order (J3 J4 J5 on top, J6 J7 J8 below). The template does not say which is which: the numbers printed on your panel are the authority.
PotPlay pageSetup page (hold B3)
P1 · top leftPosition: where grains read from, now to oldestMode: Granular · Stretch · Looping delay · Spectral
P2 · top rightSize: grain size, loop length, FFT windowQuality: 16-bit stereo · 16-bit mono · 8-bit stereo · 8-bit mono
P3 · middle leftPitch: −24 to +24 semitones, detents near noon, plus J5Spread: how far grains scatter across the stereo field
P4 · middle rightDensity: noon silent, CCW regular, CW randomFeedback: output back into the buffer
P5 · bottom leftTexture: grain envelope; past 3 o'clock, a diffuserReverb: the built-in reverb
P6 · bottom rightBlend: dry / wetIn gain: −12 to +12 dB, 0 dB at noon
ButtonDoes
B1 · FreezeHold to freeze while held; tap (under 0.3 s) to latch freeze on or off. The J3 gate freezes too.
B2 · SeedFires a grain now, the same as a trigger on J4. Stands down while B3 is held, so B2 + B3 can open Settings.
B3 · SetupHold to show the Setup page. Each pot has to catch its stored value before it takes over, so nothing jumps.
B2 + B3 · 2 sOpens Settings: page 1 is brightness and presets, page 2 is the SD-card firmware picker. B1 steps between them; B2 or B3 leaves.

Modes and quality

Setup P1 and P2 · both saved with the working state
Mode 1

Granular

The classic cloud: up to 32 to 57 overlapping grains (more at lower quality). DENSITY sets how many; below noon they come at a steady rate, above noon at random. TEXTURE morphs each grain's envelope and, past 3 o'clock, adds a diffuser.

Mode 2

Stretch

A pitch-shifter and time-stretcher (WSOLA): two overlapping windows aligned by a correlation search, so pitch and speed come apart without the usual flutter. TEXTURE is a low-pass left of noon, high-pass right of it.

Mode 3

Looping delay

A delay line whose loop you can freeze and scan. SIZE sets the loop length and POSITION the delay time; FEEDBACK does what it does on a tape delay. TEXTURE filters as in Stretch.

Mode 4

Spectral

A phase vocoder. The sound is taken apart as frequency bins: TEXTURE quantizes them, DENSITY sets how often the spectrum refreshes, SIZE warps it. The FFT work runs in the main loop, like on the original.

QualityBufferGrainsSound
16-bit stereoabout 1 s32clean, the default
16-bit monoabout 2 s40clean, mono in
8-bit stereoabout 2 s46µ-law, the gritty lo-fi Clouds
8-bit monoabout 4 s57µ-law, longest memory

Grain counts are the firmware's own: 32 for stereo or 40 for mono, times 23/16 at 8 bits (granular_processor.cc). Changing mode or quality resets the buffer.

Jacks and CV

Two audio pairs, two gates, V/Oct and three CVs
JackSignalHow it is read
J1 · J2Audio in, left and rightCodec input. Use IN GAIN (Setup P6) if it records too hot or too quiet.
J3Freeze gateRead raw once per 1 ms audio block; high above 1.5 V, low below 0.5 V. ORs with B1.
J4Trigger: seed a grainSame reading. The edge is held one block, as upstream holds it for its ADC, so the grain lands with the CV that came with it.
J5V/Oct → pitchCalibrated volts × 12 semitones, added to the PITCH knob. Jumps over half a semitone land at once; smaller moves glide.
J6 · J7 · J8CV → Position · Size · DensityThrough the SDK's CV matrix, summed with the pot. Re-route them in the web programmer if you want Texture or Blend instead.
J9 · J10Audio out, left and rightCodec output.

Clouds had CV inputs for Texture and Blend. The Lab has six CV jacks, so those two are left to re-routing.

Reading the lights

Rings from the SDK, buttons from this firmware
LightMeans
B1 whiteFrozen, by B1 or by the J3 gate. Dim blue when not.
B2 greenThe input meter: brighter as the input gets louder.
B2 amberInput above 70 % of full scale.
B2 redThe input is clipping, or the audio callback is averaging over 80 % of the CPU.
B2 white flashA grain was seeded from B2 (60 ms).
B3 dim tealSetup is one hold away.
P1 ring at bootFor 2.5 s: the previous session's worst CPU load. Green under 75 %, amber to 90 %, red above; one dim blue dot means no data yet (first boot after a flash).

Installing

From the SD card, no computer needed

Download v0.2.0 · built and tested on a computer, not yet run on a module

clouds_alchemy.binSD card zip · all seven

The zip holds all seven firmwares and the Elements samples, laid out for the card: unzip it onto the card's top level and the .bin files land in /alchemy, elements.smp in /mi. Release notes and SHA-256 checksums.

Copy the firmware into the card's alchemy folder next to the others. Open Settings on whatever firmware is running (hold B2 + B3 for two seconds), press B1 to reach the firmware page, choose the file with P1 and fire P2: turn it below about 85 %, then past 95 %. It writes, verifies and reboots into Clouds.

Clouds keeps its knobs in its own file on the card, /alchemy/state/clouds.st, and saves five seconds after the last change, with your hands off the buttons. Switching to another firmware and back brings Clouds' settings back; the pots catch before they take over. Up to v0.1.0 it used preset slot 8; the first boot of v0.2.0 copies that onto the card. The other Lab firmwares keep their own slots, 1–5 and 12–15, so 6–11 are free for presets you save by hand.

/alchemy/
  clouds_alchemy.bin     this firmware
  elements_alchemy.bin
  marbles_alchemy.bin
  plaits_alchemy.bin
  …the rest of your firmwares

build it yourself:
  make libdaisy
  make FW=clouds  →  build-clouds/clouds_alchemy.bin

v0.1 uses the front USB-C for HostLink only (the web programmer, presets and the card). It does not host a Launchpad or act as an audio interface, and it never changes the card's shared USB setting, so your other firmwares keep theirs.

Where it stands

Honest status, 2026-09-26

Done

  • Builds: 387 KB of the Lab's 480 KB program memory. The two buffers (116 KB and 64 KB) sit in fast on-chip RAM.
  • Native test suite green: all 4 modes × 4 qualities render, freeze holds the buffer, the pitch curve spans ±24 semitones.
  • That test found an upstream bug: on eurorack's master branch, Stretch mode goes silent after its first window. The one missing line is restored here and sent upstream as pichenettes/eurorack #72.

Not yet tested

  • It has not been flashed or heard on a module.
  • CPU load on the Lab's processor is unmeasured. It should be light (Clouds ran on a slower chip), but Spectral mode shares the main loop with the lights and HostLink.
  • Input level against Clouds' original ±10 V range is unverified.
  • Freeze, seed and V/Oct from real gates and CV.

Left out, compared with a real Clouds

  • Saving the audio buffer to flash (hold both buttons on the original). Presets hold the knobs only.
  • CV inputs for Texture and Blend, unless you re-route J6–J8.
  • The Parasites alternate firmware's extra modes. This is stock Clouds.

How it is built

A port, not a rewrite

The DSP is clouds::GranularProcessor from Mutable Instruments' eurorack repository at commit 08460a6, compiled unchanged apart from the one restored line. It runs at its own 32 kHz with its own 32-sample block, so the parameter smoothing reads once a millisecond exactly as the original's did. The firmware around it does what the original's cv_scaler.cc and ui.cc did: the same smoothing coefficients, the same pitch curve, the same dry/wet scaling.

Source: github.com/timncox/mi-alchemy (src/clouds/). Clouds is by Emilie Gillet, Mutable Instruments, MIT licence. The Alchemy SDK and hardware are Hermetic Modular's.