This firmware compiles, and its native test suite passes: the samples file round-trips byte for byte, all six sound cases render, and the string tunes within 5 cents. It has not been flashed onto a module or listened to. CPU load on the module, the pitch at 0 V and the input levels are unmeasured.
Mutable Instruments' Elements is a modal synthesis voice: three exciters (a bow, a breath of noise and a strike) set a virtual object ringing, and you decide what the object is made of. This is its DSP, unchanged, running at its native 32 kHz on the Alchemy Lab.
Mix them on the Exciter page (hold B3). Each has a level, a timbre and, for blow and strike, a character: FLOW turns the breath from steady to sputtering, MALLET goes from a mallet through recorded samples to bouncing particles. CONTOUR is the envelope over all three.
The Play page tunes it and shapes it: GEOMETRY from plates and bars through strings to bells, BRIGHTNESS, DAMPING, and POSITION, where on the object it is excited. MODEL on the Timbre page swaps the modal resonator for a string, a string ensemble, or Ominous.
SPACE (Timbre page, hold B2) opens the two outputs from mono to stereo into Elements' reverb. The last eighth of its travel freezes the reverb, which the original module only reached with CV.
Elements had 16 knobs, 3 sliders and 7 CV attenuverters. The Alchemy Lab has six pots, so they are spread over three pages that you reach by holding a button, and the pots catch their stored values before taking over. Hold B1 to play; a gate on J3 does the same. Patch audio into J1 or J2 and it replaces the blow or strike exciter.
The coordinates come from the Alchemy SDK's KiCad front-panel template, and the drawing is generated from them. Rings show the first-boot values in the firmware's own colours.
| Page | P1 | P2 | P3 | P4 | P5 | P6 |
|---|---|---|---|---|---|---|
| Play | COARSE | FINE | GEOMETRY | BRIGHTNESS | DAMPING | POSITION |
| Exciter · hold B3 | BOW | BLOW | STRIKE | CONTOUR | FLOW | MALLET |
| Timbre · hold B2 | BOW timbre | BLOW timbre | STRIKE timbre | SPACE | MODEL | FM |
| Settings | Brightness | · | Preset slot | Save / load | · | · |
| Settings 2 | FILE | FLASH | DFU | · | · | · |
In the other firmwares for this module B2 is a plain button and only B3 holds a page. Elements needs a third page, so holding B2 shows Timbre. Hold B2 and B3 together for two seconds and Settings still opens: the pager drops a layer when both are down. How that feels on the panel is one of the things to check on hardware.
Patch J9 and J10 to your mixer. J9 is Elements' main output, J10 the aux; with SPACE up they are a stereo pair.
Hold B1. On a first boot the voice is Elements' init sound: a struck modal resonator, STRIKE at 80%, a short CONTOUR, a little SPACE. B1 is momentary, so a tap is a short note.
Tune it on the Play page. COARSE covers five octaves in semitone steps, FINE ±2 semitones. Patch 1 V/octave into J5 and a gate into J3 to play it from a sequencer.
Change what it is. Sweep GEOMETRY slowly: plates, then strings, then bells and inharmonic objects. Lower BRIGHTNESS darkens the high modes, DAMPING shortens the ring, POSITION moves where it is struck.
Hold B3 and bring up BOW or BLOW. Hold B2 for SPACE and MODEL. Let go and the Play page is back, each pot waiting to catch its value before it takes over.
A modal resonator is a bank of filters, one per mode of the object. Elements works out
52 of them from GEOMETRY, BRIGHTNESS and DAMPING, and weights them by POSITION. The plot below does
the same arithmetic as Resonator::ComputeFilters, with the same lookup tables, and plays
the result.
What is exact and what is not: mode frequencies,
their count (up to 52, stopping below 0.49 of 32 kHz), stiffness from lut_stiffness, the Q
from lut_4_decades and its per-mode loss are ported line for line from
vendor/eurorack/elements/dsp/resonator.cc. Each mode is then played as a decaying sine
(ring time Q ÷ πf, level proportional to the filter's gain) instead of Elements' state-variable filter
bank, the pickup weighting uses an exact cosine where Elements uses a fast approximation, and there is
no bow, no exciter envelope and no reverb. Strike is an impulse; Blow is white noise through the same
response. On the module you hear the real thing.
| Pot | Does | Range and curve |
|---|---|---|
| P1 · COARSE | Resonator pitch. J5 adds 1 V/octave. | 0–60 semitones, whole steps with 0.3-semitone hysteresis (upstream's quantized-note law) |
| P2 · FINE | Fine tune. | ±2 semitones, square law: finest at noon |
| P3 · GEOMETRY | The object's structure: plates and bars, strings, then bells and inharmonic objects. J7 adds CV. | 0–1 |
| P4 · BRIGHTNESS | How much the high modes are kept. J8 adds CV. | 0–1 |
| P5 · DAMPING | How long it rings. | 0–1 |
| P6 · POSITION | Where on the object it is excited: the comb-filtering of the modes. | 0–1 |
| Pot | Does | Notes |
|---|---|---|
| P1 · BOW | Level of the bow: a friction model that sustains while the gate is on. | First boot 0 |
| P2 · BLOW | Level of the blow exciter: granular noise, or J1's audio when patched and louder than −80 dB. | First boot 0 · noise from the card |
| P3 · STRIKE | Level of the strike exciter: mallet, samples, particles, or J2's audio. | First boot 80% · samples from the card |
| P4 · CONTOUR | The exciter envelope: gate-length AD at one end, a slow swell at the other, ADSR shapes between. | First boot 20% |
| P5 · FLOW | Blow character: a steady breath to granular sputter. | First boot 50% |
| P6 · MALLET | Strike character: a mallet, then the recorded samples, then bouncing particles. | First boot 30% |
| Pot | Does | Notes |
|---|---|---|
| P1 · BOW timbre | Colour of the bow. | First boot 50% |
| P2 · BLOW timbre | Colour of the breath. | First boot 50% |
| P3 · STRIKE timbre | Brightness of the strike. | First boot 50% |
| P4 · SPACE | Mono, then stereo, then reverb. The last eighth of the travel freezes the reverb. | 0–2 · first boot 0.6 |
| P5 · MODEL | Modal (Elements) · String · Strings (sympathetic ensemble) · Ominous, the two-oscillator FM drone voice Elements shipped as a hidden easter egg. | 4 zones · first boot Modal |
| P6 · FM | Attenuverter for J6. | Quartic: fine near noon, ±12 semitones per volt at the ends |
On a first boot the Play page follows the pots, so whatever they point at is what you hear. After that, every page is saved and restored, and each pot must catch its stored value before it moves anything. The pots are shared by every firmware on the card, so after switching they point wherever the last firmware left them.
| Jack | Role | How it is read |
|---|---|---|
| J1 · Blow in | Audio. Replaces the blow exciter. | Elements' noise gate: below −80 dB it fades out, so an unpatched jack's hiss never replaces the internal noise |
| J2 · Strike in | Audio. Replaces the strike exciter. | Same gate |
| J3 · Gate | Plays the voice, ORed with B1. | Raw ADC once per 0.5 ms block: on above 1.5 V, off below 0.5 V. Read one block after the CVs, as upstream, so the pitch is in before the strike |
| J4 · Strength | How hard each note is played. | 0.5 + 0.1 × volts, so ±5 V spans 0–1 and an unpatched jack gives 0.5 |
| J5 · V/Oct | Pitch. | Calibrated volts × 12. Jumps over 0.4 semitone land at once, smaller moves glide |
| J6 · FM | Frequency modulation. | Through the FM attenuverter (Timbre P6) |
| J7 · CV | GEOMETRY. | The SDK's CV matrix; re-routable in Hermetic's web programmer |
| J8 · CV | BRIGHTNESS. | Same |
| J9 · Out main | Elements' main output (left). | Codec |
| J10 · Out aux | Elements' aux output (right). | Codec |
Elements had CV for damping, position, space and each timbre, with an attenuverter on most. Here only J7 and J8 are free for that, so re-route them in the web programmer if you need a different destination.
White while the gate is on. Otherwise the exciter
level in orange over a dim base: dim blue when the
samples are loaded, dim amber when
/mi/elements.smp is missing or bad.
The resonator's level in green over a dim blue, Elements' second meter. Red when the audio callback averages over 80% CPU. Blue while held, as the Timbre page's colour.
A dim red tint at rest, the Exciter page's colour while held.
For 2.5 s after power-up: the worst audio-block load of the previous session as a fill, green, amber from 75%, red from 90%. One dim blue pip means no data yet, after a fresh flash.
For the same 2.5 s: full green, loaded; one red pip, no file; full red, a file was there and was refused.
Elements' strike exciter plays recorded samples and its blow exciter reads a noise recording. Together those two tables are 338 KB, and the firmware image has to fit in 480 KB of SRAM beside the SDK. So they ship as a file, and the firmware reads them into SDRAM at boot.
/mi/elements.smpA folder named mi in the root of the card, not alchemy: the firmware
picker lists everything in /alchemy. The build writes the file to
build-elements/elements.smp; it is 337,976 bytes.
A 24-byte header (magic MIES, version 1, the two sample counts, a CRC-32 of the
payload), then 128,013 strike samples and 40,963 noise samples. Anything short of an intact file
is refused. The bytes are upstream's own arrays, written by a tool that includes the vendored
resources.cc.
The two tables are zeroed: the strike samples and the blow noise go silent. The bow, the mallet synthesis, particles, the external inputs, the resonator and the reverb all still work. B1 rests dim amber and the P2 ring shows red at boot.
The file is read once, at boot, before audio starts. If the card is slow to mount, the samples stay silent until the next power-up. At build 30989c0 its SHA-256 is c1838da0e3ed431f02446bdc349998f1b8089b5139416af14eb39230424e90c5.
Like the other firmwares for this module, Elements can write any .bin from
the card into the module's firmware slot, verify it and reboot into it, from a Settings page.
| File on the card | What it is |
|---|---|
/alchemy/elements_alchemy.bin | This firmware (download) |
/mi/elements.smp | The exciter samples (download) |
/alchemy/*.bin | Any other Alchemy Lab firmware: Clouds, Marbles, Plaits, Mark, Belt, Smack… |
| Pot | Does | Ring |
|---|---|---|
| P1 · FILE | Picks a file: one dot per .bin in /alchemy, the chosen one bright. |
green dots · red: no card · orange: no folder or no files |
| P2 · FLASH | Turn it below 85%, then all the way up. The dip arms it. It compares first: if the file is the firmware already running, nothing is written. | teal comparing · solid green: already loaded · orange erasing · blue writing · green verifying · white, then reboot · blinking red: failed, nothing booted |
| P3 · DFU | Same gesture: reboots into the bootloader's update mode and stays there, for a USB flash. | violet arming bar |
The first Settings page holds the LED brightness (P1, 30% by default; these LEDs get very bright) and the preset gesture: P3 picks a slot, P4 saves or loads it. Elements keeps its working state in its own file on the card, /alchemy/state/elements.st, saved five seconds after the last change once your hands are off the buttons. Up to v0.1.0 it used slot 9; 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.
Download v0.2.0 · built and tested on a computer, not yet run on a module
elements_alchemy.binelements.smpSD 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. Elements needs both files. Release notes and SHA-256 checksums.
Copy elements_alchemy.bin into /alchemy and elements.smp
into /mi, then pick it from Settings page 2 of any firmware in the family.
Hold B3 through the boot window and the module enters update mode. Flash the .bin
with Hermetic's web programmer, or pin
dfu-util to your module's serial:
make FW=elements program-live DFU_SERIAL=<serial>
make libdaisy make FW=elements make -C test test-elements
Never build with a module attached in DFU mode.
This 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. Mutable Instruments wrote the DSP and has nothing to do with this port either. It has not yet run on a module. Worth reporting if you try it: the CPU readout on P1 after a busy session, whether 0 V with COARSE at noon sounds near note 73, and how the B2 page button gets along with the Settings chord.
| Piece | What it is |
|---|---|
| The DSP | elements::Part from pichenettes/eurorack at 08460a6, byte-identical, at 32 kHz with its 16-frame block, so the parameter reads happen at 2 kHz as they did on the original. |
| The shim | What cv_scaler.cc, ui.cc and elements.cc did: the pot laws, one-pole smoothing (0.01 for pots, 0.05 where a CV joins), the input noise gates, and the gate read one block late. |
| Samples out of the image | The build cuts the two sample arrays out of a copy of resources.cc and checks it found both; the vendored file stays untouched. The engine links to two SDRAM arrays under its own symbol names, filled from the card at boot. |
| Memory | Image 366 KB, 77% of the 480 KB SRAM region. Part (113 KB) and the reverb buffer (64 KB) in cached D2 SRAM; the samples in SDRAM. |
| Per-unit character | Elements seeded its reverb and resonator modulation from the chip's serial number. This uses the H750's unique ID for the same job, so each module sounds slightly its own. |
| Pitch | note = 24.1 + 12 × V(J5) + COARSE + 19 + FINE. The 24.1 is upstream's default calibration at 0 V, worked out from its constants: 0 V with COARSE at noon is note 73.1, about 558 Hz. Nobody has checked it by ear yet. |
| Tests | On a laptop, with address and undefined-behaviour checks: the samples file through the firmware's own reader in five chunk sizes, byte-identical, and six kinds of bad file refused; modal strike, bow and blow, string, strings and Ominous for 2 s each, finite and not silent; the string at note 57 reads 220.17 Hz (+1.4 cents), note 69 441.14 Hz (+4.5 cents). |
Found something? Open an issue. A report from someone playing it is worth more than anything measurable on a laptop.