MANIFOLD

MANIFOLD — User Guide

Generative just-intonation firmware for the M-VAVE FM-1

The Perform page
The Perform page

MANIFOLD turns the FM-1 into a self-playing instrument. Two layers of moving points wander over a map of a scale, and every note they pass near sounds, as loud as the points near it. Nothing is sequenced: there are no steps, no patterns and no note triggers. The motion is continuous, the loudness is continuous, and the rhythm is a continuous landscape the motion is shaded by. You steer it with four performance knobs, play into it with the keys, roll new patches with one button, and dig into every part of it from the page buttons.

Everything is in tune in a strict sense. Every note is a whole-number ratio of the scale's root (just intonation), and every partial of every note is a whole-number multiple of that note, so chords fuse instead of beating.

This guide covers installing the firmware, playing it, and every page and setting. The last part, For developers, gives the mathematics of each generator and how the code is organised.



Install

MANIFOLD is a single firmware file, manifold-VERSION.fwsc. Installing it replaces the FM-1's current firmware; you can go back to the stock firmware or any other FM-1 firmware the same way.

From the web installer (Chrome or Edge, desktop):

  1. Connect the FM-1 to the computer with a USB data cable and switch it on.
  2. Open the installer page on the MANIFOLD site and press Connect. Pick the FM-1 when the browser asks.
  3. Press Install and wait for it to finish. The FM-1 restarts into MANIFOLD.

From the command line (with fm1-base checked out):

python3 tools/fm1_install.py manifold-VERSION.fwsc

Try it first in the browser. The MANIFOLD site has the whole firmware running in WebAssembly on a drawn FM-1 (the emu page): click the buttons, drag the knobs, play the keys with the mouse or the computer keyboard. It sounds the same as the FM-1, and patches you store there are kept in the browser.

After installing, the FM-1 starts on a fresh patch every time: a Groove-style roll on the 1-3-5-9 hexany with its root on A1. It is silent until you press PLAY (the keys play at once).


Quick start

  1. Press PLAY. The two layers start moving and the patch plays itself. PLAY again stops it.
  2. Turn K1–K4 on the Perform page. These are the performance knobs: Timbre, Groove, Space and Motion. Each one moves a dozen or more settings at once along its own path; the centre is the patch as rolled.
  3. Play the keys. A key sounds its note and pulls the moving points toward it, so the music bends around what you play and lets go when you release.
  4. Tap REC for a new sound (the scale stays). Double-tap REC to roll everything.
  5. Turn PRESET to choose a style (Wild, Tongue drum, Groove, Ambient, Cosmic, Drum circle, Machine, Breaks); it rolls a new patch in that style once the knob rests.
  6. Hold SAVE and press a key (1–16) to store the patch. Hold HOME and press the key to load it again. A tap on SAVE shows the Patches page: four banks of 16.
  7. Hold PLAY to see the performance keys: scenes, tap tempo, fill, freeze, latch, mutes, undo and panic.

That is enough to play. The rest of this guide explains what each part does, so you can shape it.


How MANIFOLD thinks

The scale is a map

The notes of the scale are laid out like a tongue drum: the root (the ding) and the scale's notes over one to six octaves. Each note has a place on a Tonnetz, a map where neighbours are consonant: fifths run along one axis, major thirds at 60°, natural sevenths at −60°. On the Perform page this map is the square on the left; each small square is a note.

Two layers of moving points

Each layer is a generator: one to eight points that move across the map along a motion (a continuous function of time: an orbit, a chaotic flow, a run up the scale, a chord progression…). Each point also carries an envelope, a loudness that changes continuously (a pulse, a swell, its own speed, the rhythm…).

A note sounds as loud as the points near it, weighted by their envelopes. A point sitting on a note is that note; a point between two notes sounds both, crossfaded; a point crossing the map glides from note to note. Reach sets how far a point's influence spreads.

Layer 1 is drawn as crosses, layer 2 as dots. The layers can also act on each other instead of both playing (see Route).

Each layer has a voice

Every sounding note is a bank of up to 16 oscillators at exact harmonics of the note. A layer's voice (Voice 1, Voice 2) is one smooth function that sets all their levels and phases from a few controls: where the spectrum peaks, its slope, its stride, its phase pattern. Anything can move these while notes ring and the tone follows without a seam.

The rhythm is a landscape, not a grid

There is no step sequencer. The rhythm is a stream: a sum of smooth peaks at the bar, the half bar, the beat and faster divisions (in twos, in threes, or both). It shades every envelope (Grip) and its peaks above a threshold are events that the drums play. Swing, three-against-four, rotation and long-form variation are all continuous controls on that one function.

The drums ride the synth

The four drums (kick, snare, hat, tom) make no sound of their own and never change a note's pitch. A hit puts an envelope and a change of colour (brighter, snappier) on a note that the synth is already playing. So the drums are always in tune and always part of the same sound.


The screen

A typical page
A typical page

Every page has the same three parts.

Header. The page's name and the part of it you are on. On the right: the tempo in BPM and the transport (a triangle while it runs, a square when stopped), plus BT while Bluetooth audio streams. On the Perform page, a battery gauge sits left of the tempo: 0–3 bars, amber at one bar or none, or USB when a computer powers the FM-1. When you change something, its name and new value show in the header for a moment.

Middle. Four rows, one for each knob, K1 at the top. Each row shows the setting's name, its value in real units (Hz, ms, BPM, notes, names) and a bar. A dash means the knob does nothing on this tab.

Footer. The page's tabs; SELECT moves between them (the underlined one is shown). Below them, a reminder of what the buttons do on this page.

Color themes. Nine: Glacier, Ember, Moss, Rose, Violet, Sunset, Lagoon, Gold and Mono (Setup → General → K1).


Controls at a glance

Knobs

ControlOn the Perform pageOn any other page
K1–K4the performance knobs: Timbre, Groove, Space, Motionthe four rows of the tab shown
SELECTtempo (one BPM a detent)the tabs
PRESETchoose a style and roll a patch in it (once the knob rests)same
ALGOthe next / previous seed: a new patch, the same one every time for a given seedsame

Page buttons

ButtonOpensWhat is there
HOMEPerform (from Perform: Setup)the map, the knobs, what is playing
SELScalescale, rotation, root, octaves; temper, surface
ENVVoice 1layer 1's sound
EDITLayer 1layer 1's motion, points, envelope, path view
SEQDrumsthe rhythm and the four drums
ARPLayer 2layer 2's motion, points, envelope
LFOModulationthe modulation matrix, LFO 1–6
FXEffectsfuzz, filter, delay, reverb, compressor, output
GLOVoice 2layer 2's sound

Buttons and gestures

GestureDoes
PLAY (tap)start / stop the generators and the rhythm (the keys always play)
PLAY (hold)the performance keys appear on the white keys (see below)
REC (tap)roll the sound: both voices, both layers, the rhythm and the drums (never the scale, effects or knobs)
REC (double tap)roll everything except the scale
REC (hold 0.7 s)mutate: a small nudge to every continuous setting
REC + a page buttonroll only that page (REC + FX or REC + LFO: the matrix, the LFOs and the effects together)
REC + HOMEroll the performance knobs' paths
REC + SELroll the scale (the only way a roll changes it)
SAVE (tap)the Patches page: the banks and their slots (tap again: back to the page you were on)
SAVE + a page buttonlock / unlock that page: rolls leave a locked page alone
SAVE + HOMElock / unlock the performance knobs
SAVE + key 1–16store the patch in that slot of the active bank
HOME + key 1–16load the patch in that slot of the active bank
SAVE + OCT+keep the settings (theme, octave, MIDI, Bluetooth, load, keys); SAVE + OCT− does nothing
OCT − / OCT +move the keys down / up a scale period (−3 to +3); on the Patches page, choose the bank

The Perform page

Perform
Perform

The map (left). Every note of the scale where it sits on the surface. A note lights up as it sounds (brighter is louder; a held key is white and larger). Layer 1's points are crosses, layer 2's are dots; each is brighter while its envelope is up.

What is playing (right, top to bottom):

Chips. LATCH, FREEZE and FILL light while those performance keys are on. L1, L2, GEN and DRM are lit while layer 1, layer 2, the generators and the drums are on (DRM also flashes on each hit).

The performance knobs (bottom). Four bipolar bars. The centre is the patch as rolled.

Turning a knob
Turning a knob

The performance knobs

Each knob rides a path through most of the settings of its part of the instrument. Turning it does not just scale one value: every setting on the path goes its own way, and the half-way point can lean somewhere different from the end, so a full turn is a journey through several different sounds. The header shows how many settings ride the knob as you turn it.

KnobPart of the instrumentAlways on its path
Timbreboth voicesTone, Center, Band and Tilt of the voices
Groovethe rhythm and the drumsDensity, Swing
Spacethe effectsfilter cutoff and resonance, reverb mix, size and decay, delay send and feedback
Motionboth layers, the path view and the LFOslayer 1's Rate and Reach

Levels (layer levels, drum levels, master) and Temper are never on a knob. REC + HOME rolls new paths; SAVE + HOME locks them so rolls keep them. The knobs can also be turned by the modulation matrix: see Knobs as destinations. A white tick on a knob's bar shows where the matrix has it.

The performance keys

PLAY held
PLAY held

Hold PLAY: the white keys become the performance keys and the screen shows the map. Let go of PLAY to return.

White keyDoes
1–4Scenes 1–4: tap to recall (a 1.2 s morph); hold a second to store the current sound in it
5Tap tempo: from the second tap, averaged over the last four; a pause of over 2 s starts again (so taps reach down to 30 BPM; SELECT goes to 10)
6Fill: both layers' energy up while held
7Freeze: the reverb holds what it has, forever, until pressed again
8Latch: keys stay on after you let go (press a latched key again to release it)
9mute / unmute Layer 1
10mute / unmute Layer 2
11mute / unmute the Generators (the keys still play)
12Drums on / off
13Undo the last roll, mutation or seed
14Panic: everything off
15Drum keys: the keys play the drums, and back

Playing the keys

A held key
A held key

The keys play the scale, not the chromatic keyboard. Key 1 is a low note of the scale and each key up is the next note of the scale in pitch order, so every key is in tune with the patch. OCT − and OCT + shift the keys by a scale period (−3 to +3).

A key is an input into the system, not a note-on. Pressing a key sounds its note directly (with the key's velocity) and pulls the layer's points toward that note over about 0.15 s, so the motion bends around what you play; it lets go when you release. The patch's own envelope shapes the key's note: a sharp Contour gives a struck note (fast rise and fall), a soft one a bowed note (slow rise, long hold, slow release). While the generators run, a held key also breathes with the layer's envelope.

Which layer the keys play is set in Setup → Keys: Layer 1, Layer 2, Both layers, or Drums.

Drum keys (performance key 15, or Keys play → Drums): each key plays one of the four drums (kick, snare, hat, tom, repeating up the keys) at its velocity. The hit rides a note the drum layer is playing, as rhythm hits do.

Latch (performance key 8) holds every key you press until you press it again.


Rolls, styles, locks and undo

A roll makes a new patch from a random seed, shaped by the current style. The same seed and style always give the same patch.

StyleCharacter
Wildeverything anywhere: the whole range of every setting
Tongue drumstruck, clear, pentatonic and handpan scales, a low band, a pulse
Grooverhythmic and bright, runs and loops on the beat, drums on most of the time
Ambientslow, soft, wide; swells and drifts; drums rarely
Cosmicstrange scales and combs, passing motions, anything goes
Drum circleTongue drum's sound with busy, long-cycle drum patterns
MachineGroove's sound with an IDM rhythm: drums always on, Euclidean-feeling routes
BreaksGroove's sound with drum'n'bass: 4/4 at 164–176 BPM, two-step kick, fast hats

What a roll changes:

Locks. Hold SAVE and press a page button to lock that page: rolls and mutations leave it alone. The header shows LOCKED on a locked page. Lock the scale, a voice you like, or the matrix (SAVE + LFO) and keep rolling the rest.

Undo. Performance key 13 undoes the last roll, mutation or seed change.

Morphs. A roll glides into the new patch (about 1.5 s; 0.3 s in Wild) instead of jumping. Settings that rebuild the map (scale, rotation, root, octaves, surface) cause a short silence of about 15 ms.


Patches and scenes

Patches
Patches

Patches. 64 slots: four banks (A–D) of 16, one slot per key. SAVE + key stores everything in that slot of the active bank: every setting, the matrix, the knobs' paths and positions, the locks and the four scenes. HOME + key loads it. While SAVE or HOME is held, the keys that hold a patch in the active bank light up. The Perform page shows "patch B5" while a loaded patch is unchanged by rolls. If a patch was the last thing you loaded, it comes back at power-on, with its bank active; otherwise the FM-1 starts on a fresh roll.

The Patches page. A tap on SAVE opens it; another tap goes back to the page you were on (HOME and the page buttons leave it too). It shows the four banks with how many patches each holds, and the active bank's 16 slots: a stored patch lit, the one playing bright.

On the Patches page
K1, or OCT − / OCT +choose the bank (A–D)
SAVE + key 1–16store in that slot of the bank shown
HOME + key 1–16load from it
K4 (turn right)keep the settings; the row says "unsaved" when there is something to keep

The bank stays active when you leave the page, so SAVE + key and HOME + key work on it from any page. Storing over a slot that holds a patch replaces it, without asking.

Patches and firmware updates. Updates keep the patches and the settings. 1.0.4 moved the patches into a shared area of the flash to make room for 64: the 16 slots of earlier versions become bank A by themselves at the first power-on. Do not go back to a version before 1.0.4 afterwards: it would miss some patches and forget the Bluetooth speakers, and storing a patch there could overwrite others.

Scenes. Four snapshots inside the current patch, on performance keys 1–4. Hold a scene key for a second to store the current sound; tap it to recall, with a 1.2 s morph. Scenes are saved with the patch.

Settings (theme, key octave, MIDI channel and output, Bluetooth, load caps, keys, the style) are kept with SAVE + OCT+ (hold SAVE first), or K4 on the Patches page. The SAVE button lights while there are changes not kept yet; without keeping them, the next power-on brings back the settings as they were. Storing a patch keeps them too.


Scale (SEL)

Scale: Tuning](img/manual/scale-1.png) ![Scale: Temper & surface
Scale: Tuning](img/manual/scale-1.png) ![Scale: Temper & surface
TabKnobSettingRangeWhat it does
TuningK1Scale41 scalesthe set of notes (below)
K2Rotation (the ding)each note of the scalewhich note is the root: the same notes, another mode (named "/2", "/3"…)
K3RootA0–A3the ding's pitch
K4Octaves1–6how far the scale extends above the ding
Temper & surfaceK1TemperJust … Equal (12-tone)moves every note continuously from its just ratio to the nearest equal-tempered pitch, to play along with other instruments
K2SurfacePlane, Torus, Spherethe shape of the map: the plane reflects at its edges, the torus wraps around, the sphere has no edge (a path over a pole comes down the other side)

Changes to Scale, Rotation, Root, Octaves and Surface take effect when the knob rests (about 0.3 s) and rebuild the map (a moment of silence). Temper retunes without a rebuild.

The 41 scales, in five groups:

Every note is a whole-number ratio of the ding. Notes that hold the key more strongly (the ding, its fifth, its third) have more tonal weight: the motions lean toward them. Low notes far from the ding are kept quieter in the bass, as an arranger would voice them, so low chords stay clear.


Voice 1 and Voice 2 (ENV and GLO)

Voice: Tone](img/manual/voice1-1.png) ![Voice: Spectrum](img/manual/voice1-2.png) ![Voice: Voice
Voice: Tone](img/manual/voice1-1.png) !Voice: Spectrum ![Voice: Voice

Voice 1 is layer 1's sound, Voice 2 is layer 2's. Both pages are the same. Every note is up to 16 oscillators at the note's exact harmonics; these settings shape all of them at once, live, and the sound is normalised so they change the colour, not the volume.

TabKnobSettingRangeWhat it does
ToneK1Tone250 Hz – 16 kHzwhere the partials stop: above it they fall 24 dB an octave. Not a filter: each partial's level is set by its own frequency, so nothing rings
K2Tilt0–100 %the spectrum's slope: dark (k^−1.6) through a saw's slope (k^−1) to bright (k^−0.4)
K3Detune0–100 %doubles each note's first three partials with a copy up to 14 cents away (each note its own amount and side): slow beating and stereo movement. 0 = no copy
K4Wave0–100 %each oscillator from a sine to a richer wave (adds its own 2nd and 3rd harmonics)
SpectrumK1Centerpartial 1–12where a formant-like lift sits in the series (up to +9.5 dB once above the 5th partial)
K2Band0–100 %how wide that lift is
K3Strideevery partial … every 4ththins the spectrum: 2 = odd partials only (hollow, clarinet-like), 3 = every third… continuous between
K4Phase0–100 %the phase pattern across the partials: aligned (a sharp, buzzy pulse), Schroeder at 50 % (smooth, glassy), then dispersed (a twangy, stiff-string quality)
VoiceK1Bloom0–100 %louder is brighter, note by note: quiet notes lose their upper partials
K2Width0–100 %stereo: each note is panned by its place on the map
K3RegisterOctave down, As tuned, Octave upthe whole layer an octave down or up
K4Layer level0–100 %the layer's volume

A layer plays up to 8 notes at once (Setup → Load). When more want to sound, the quietest fade out over 8 ms; no note is ever cut.


Layer 1 and Layer 2 (EDIT and ARP)

Layer: Motion](img/manual/layer1-1.png) ![Layer: Points
Layer: Motion](img/manual/layer1-1.png) ![Layer: Points
Layer: Envelope](img/manual/layer1-3.png) ![Layer: Path view
Layer: Envelope](img/manual/layer1-3.png) ![Layer: Path view

The two layers are the same, except that Path view is on Layer 1's page and moves both.

TabKnobSettingWhat it does
MotionK1Motionthe function the points follow (12, below)
K2Athe motion's first control (its name changes with the motion)
K3Bthe motion's second control
K4Ratehow fast: cycles per bar, from 1 per 64 bars to 4 a bar, snapped to whole-number ratios so a repeating motion lines up with the rhythm
PointsK1Points1–8 points: how many notes the layer can sound at once
K2Spreadhow far apart the points are along the motion (0 = all together)
K3Reachhow far a point's sound spreads to nearby notes: 0 = mostly the note it is on, 100 % = its neighbours at about half
K4Energythe layer's drive (also the depth when it shapes the other layer)
EnvelopeK1Envelopehow each point's loudness moves (8, below)
K2Envelope ratefor Pulse and Swell: 1 per 16 bars to 4 a beat (exact ratios to the bar). For Drums: which drum
K3Contourthe envelope's shape: soft and broad … sharp and narrow
K4RoutePlays, or shapes the other layer (below)
Path viewK1Path scalehow much of the map the motions cover (1.0 = all the notes)
K2Path rotationturns every motion on the map: a different set of neighbours along the same path
K3, K4Path x, Path yslides the motions across the map

When a motion's discrete choice changes (a ratio, a figure, the motion itself, the number of points), each point glides from where it is onto the new path over about 0.3 s. A point never jumps.

The twelve motions

MotionWhat you hearAB
Orbita closed loop (a Lissajous figure): an ostinato that returns every cycleRatio (1:1, 2:1, 3:2, 4:3, 5:4, 5:3, 3:1, 5:2): the figurePhase: opens it from a line to a loop
Ladderruns through the notes in pitch order, resting on each: scales and arpeggios by stepSpan: 3–12 notesContour: up, up and down, down
Swarmthe points are coupled oscillators: they gather into a chord, then scatterCoupling: how strongly they pull togetherSpread: how different their speeds are
Lorenzchaos with two lobes: circles one group of notes, then flips to the otherChaos (ρ 20–50): how often it flipsZoom: how much of the attractor fills the map
Motifa small figure stated at the ding, again, answered away, then home (A A B A)Figure: the figure's shape (a ratio)Answer: at the fifth, at the third, or alternating
Drifta smooth random walk: slow, aimless, never repeatingDetail: a finer wander on topDensity: how many turns a cycle
Billiardstraight runs that bounce off the edges and a central bumper: arpeggios that fold backAngle: the heading (0–180°)Bumper: its size; with it, the runs never repeat
Gravitythe point orbits the key's own notes, falling toward the ding, swinging round and awayWells: the ding; ding and fifth; ding, fifth and thirdEnergy: low = tight orbits, high = wide swings
Stridemoves only as the rhythm's stream peaks and turns while it rests: a melody that steps with the beatTurn: how much and which way it turnsStride: how far each step goes
Loopseach point is a tape loop on its own note, of lengths 5, 7, 8, 11, 13, 17, 19, 23: they never line up twiceNotes: how many of the key's notes they share (2–6)Swell: how long each note sounds in its loop
Erodeone six-note figure repeated, wearing away note by note (weakest first), then renewedLife: passes until renewal (4–64)Wear: how much of it is worn away
Chordsthe points are a chord and the chord changes: harmonic rhythm, four chords a cycleProgression: I IV V I, I VI IV V, I III IV II, I V VI IV, I I IV I, I VII VI VVoicing: thirds, fourths, fifths

The eight envelopes

EnvelopeLoudness follows…Contour
Pulsea periodic peak at Envelope rate, locked to the barsoft swell … sharp attack and narrow peak (the steepest rise is still a few ms, never a click)
Swella periodic raised-cosine swell at Envelope ratehow narrow the swell is
Speedthe point's speed: loud while it moves, quiet while it restshow steep
Passnearness to a note: it sounds as it passes through notes, silent betweenhow narrowly
Heightthe motion's third dimension (a flow's height, the distance from the centre, the speed round a well)how steep
Holdsteady (the motion alone shapes the music)—
Streamthe rhythm's stream itself: it sounds where the drum events areonly the strongest events … all of them
Drumsa drum's envelope (Envelope rate picks kick, snare, hat, tom, or all)how sharp

Every envelope is also accented by the rhythm's stream, by the amount set with Grip (Drums → Lock & motion).

Route: one layer shaping the other

With Route set to anything but Plays, a layer falls silent and acts on the other one instead. Its Energy is the depth. Point j of the played layer takes point j of the shaping layer (wrapping around).

RouteWhat it doesExample
Playsboth layers sound—
Movesits path is added to the other's patha Lissajous loop carried along a Lorenz orbit
Adds toits envelope is added to the other'sStream accents on a chaotic swell
Multipliesits envelope gates the other'sa chaotic flow gated by a pulse

If both layers are set to route, layer 2 shapes and layer 1 plays ("Plays (2 routes)").


Drums and rhythm (SEQ)

The Drums page has 19 tabs. The first ones are the ones you reach for most.

Groove](img/manual/drums-1.png) ![Drums](img/manual/drums-2.png) ![Mix
Groove](img/manual/drums-1.png) !Drums ![Mix

How the rhythm works

The rhythm is a stream: a smooth curve over the bar that peaks at the downbeat, the half bar and the beats, and (depending on the Groove settings) at eighths, sixteenths, triplets or both. It never stops changing smoothly; there is no grid.

The stream also shapes the synth: Grip accents every envelope with it, and the Stream envelope and Stride motion follow it.

All the drum settings

TabKnobSettingWhat it does
GrooveK1Densityhow many events: the threshold the stream must cross
K2Swingthe off-beat's timing: straight (0 %), triplet swing (about 67 %), hard (100 %)
K3Threestwos (eighths, sixteenths) … 3 against 4 (50 %) … threes (triplets)
K4Finehow far the subdivisions go: beats only … sixteenths and thirty-seconds
DrumsK1–K4Kick, Snare, Hat, Tom densityeach drum's share of the events (0 = that drum off)
LevelsK1–K4Kick, Snare, Hat, Tom leveleach drum's level (Off … 0 dB). A light by the name flashes on each hit
MixK1Drumson / off
K2Drum layerwhich layer's notes the drums ride: Layer 1, Layer 2, or Split (kick and tom on the lower-sounding layer, snare and hat on the higher)
K3Drum levelall the drums
K4Accenthow much an event's strength sets the hit's velocity
Kick / Snare / Hat / TomK1Voicewhich of the drum layer's sounding notes the hit rides: lowest note … highest note
K2Attack1–20 ms
K3Decay20 ms – 3 s (to −35 dB)
K4Curvethe decay's shape: exponential … straight
RhythmK1Tempo10–180 BPM
K2Rhythmthe engine: Threshold or Lock
K3Formlong-form variation: slow functions move the threshold, the sixteenths, the three-feel and the drum choice, so the pattern evolves over many bars (with all of it, it repeats only after 6,720 bars)
K4Turnshifts the threes against the twos by up to a third of a bar: every rotation is a different rhythm
Drum choiceK1Drum choiceSelect: each drum bids for each event by its strength (Place) and the selector; Count: hat on every event, kick every n-th, snare between kicks, tom on strong leftovers
K2Selectorthe selector's speed (Select): 1 per 2 bars … 3 a bar; it makes kick and snare answer each other
K3Feedback(Select) how much a drum that just played steps back for the others
K4Kick every(Count) the kick every 2–8 events
Lock & motionK1Pull(Lock) how strongly the drum oscillators lock to the grid
K2Motionlayer 1's path moves the threshold: the melody makes the rhythm busier or sparser
K3Evolvea slow random wander of both layers' A and B (and looser Lock timing)
K4Griphow strongly the stream accents every synth envelope
HoldK1–K4per drumhow long the envelope holds at full level after the attack (0–50 ms)
PlaceK1–K4per drumwhich events it prefers: Strongest … Weakest (kick strongest, hat weakest). When a drum follows a layer: which point it follows
Shape & duckK1Shape byNone, Layer 1, Layer 2: every drum is multiplied by that layer's envelope, and its decays lengthen in a swell and shorten in a trough
K2Shape depthhow much
K3Kick ducksidechain: the kick ducks the synth
FollowK1–K4per drumThe stream (the rhythm decides), or Layer 1 / Layer 2: the drum fires when one point's envelope of that layer rises past 1 − its density. A silent, shaping layer works too
Kick / Snare / Hat / Tom soundK1Brightthe hit tilts the note's partials up at its start (up to +2.7 dB a partial)
K2Settlehow fast that brightness settles (300 ms … 9 ms) and how far
K3Snapa push on the voice's Wave at the hit (25 ms): a bite on the attack
Kick](img/manual/drums-5.png) ![Rhythm](img/manual/drums-9.png) ![Kick sound
Kick](img/manual/drums-5.png) !Rhythm ![Kick sound

The drums never change pitch. A hit swells a note that is already sounding and colours it. The kick also lets the note's fundamental through in full (normally partials under 90 Hz are softened), so it has weight. If the drum layer is silent, the hit lands on the note under its loudest point.

With the drums on, the synth sits about 4 dB lower to make room.


Modulation (LFO)

The matrix

Matrix](img/manual/mod-1.png) ![A route to a knob
Matrix](img/manual/mod-1.png) ![A route to a knob

The first tab of the LFO page. 24 routes, each a source onto a destination at a depth.

KnobDoes
K1 Routewhich route (1–24) you are editing ("empty" if unused)
K2 Sourcewhat modulates. None clears the route
K3 Destinationwhat is modulated
K4 Depth−100 % … +100 % of the destination's range (on a knob: of its full turn)

A new route starts at +25 % onto the Timbre knob.

Sources

SourceRangeWhat it is
LFO 1–6−1 … +1the six LFOs
Timbre / Groove / Space / Motion knob−1 … +1where your hand has the knob
Output level0 … 1the instrument's loudness (an envelope follower)
Layer 1 onsets0 … 1a pulse each time layer 1's notes rise
Random (a bar)−1 … +1a new random value each bar, reached smoothly across the bar
Path X, Path Y−1 … +1where layer 1's main point is on the map
Velocity0 … 1the last key's velocity
Layer 1 motion, Layer 2 motion0 … 1that layer's loudest point's envelope: the generators as modulators

Sources marked 0 … 1 push one way only from where the destination is set: use a negative depth to pull it down.

Destinations, in this order: the four performance knobs, the LFO rates, Layer 1 (with the path view), Layer 2, Voice 1, Voice 2, the drums, the rhythm, and the effects. Names say where each one is: "Kick decay", "LFO 3 rate", "Layer 2 rate", "Voice 1 tilt". Every continuous setting is there except the master level.

Knobs as destinations

A route onto a knob turns that knob for you, so every setting on its path moves together, exactly as if a hand were turning it. A white tick on the Perform page shows where the matrix has the knob. Your hand still sets the centre the route moves around. Knob sources always read your hand, never the routed position, so knob → knob routes cannot loop. Rolls never route onto the knobs.

Generators as sources

Layer 1 motion and Layer 2 motion let the generators modulate anything: the drums' envelopes, a voice, an effect, a knob. Rolls with the drums on often add one or two Motion → drum routes. Two things to know:

Rolls and the matrix. Rolling the LFO page (or REC + FX, or a double tap) rewrites the matrix, and mutation nudges its depths. SAVE + LFO locks it so your routes survive both.

LFO 1–6

LFO
LFO
KnobSettingRangeWhat it does
K1Rate0.01–12 Hzspeed
K2ShapeSine, Triangle, Saw, Square, Step random, Smooth random, Chaos, Rhythm, Shape 9Chaos is a logistic map (a new value each cycle); Rhythm a fixed 8-step pattern; Shape 9 follows the output level
K3SyncFree, TempoTempo snaps the rate to the nearest of 1/8 … 4 cycles a beat (just ratios: 1/3, 2/3, 3/4, 4/5, 5/4, 4/3, 3/2…)
K4LFO coupling0–2 (shared by all six)the LFOs pull on each other's phases (Kuramoto coupling): at higher values they drift into step

Effects (FX)

Fuzz](img/manual/fx-1.png) ![Reverb
Fuzz](img/manual/fx-1.png) ![Reverb

The chain: fuzz → filter → delay and reverb sends → compressor → master → limiter.

TabKnobSettingWhat it does
FuzzK1Fuzz mixwet/dry (0 = bypassed)
K2Fuzz sustaindrive (24–52 dB): a two-stage, Big-Muff-style fuzz on the whole mix. On a just scale its sum and difference tones land back on the harmonic series
K3Fuzz tonedark … scooped … bright
FilterK1Filter cutoff60 Hz – 18 kHz
K2Filter resonance0–0.95
K3Filter typeLow-pass → band-pass → high-pass, continuously
DelayK1Delay send
K2Delay timein ten tempo divisions: 0 % = 1/16, then 1/8 triplet, dotted 1/16, 1/8, 1/4 triplet, dotted 1/8, 1/4, 1/2 triplet, dotted 1/4, 100 % = 1/2 (at most 3 s)
K3Delay fbfeedback (above 100 % it grows)
K4Delay tonethe repeats' brightness (a tape-like, darkening delay)
Delay 2K1Delay tapa second tap at a fraction of the time: 1 of 5 = the same time, then 3/4, 2/3, 1/2, 4/5
K2Delay into reverbhow much of the delay feeds the reverb
ReverbK1Reverb mix
K2Reverb sizeroom size
K3Reverb decay0.3–60 s
K4Reverb damphigh-frequency damping
SpaceK1Predelay0–100 ms
K2Reverb modslow movement in the tail (chorus-like)
K3Reverb tunedOn: the reverb's delay lines snap to periods of the scale's notes, so the tail rings in key
K4Reverb freezeOn: the reverb holds what it has, indefinitely (also performance key 7)
CompressorK1–K4Threshold, Ratio, Attack, Releasethe bus compressor (−36–0 dB, 1–20:1, 0.5–80 ms, 20–800 ms)
OutputK1Comp mixparallel compression: dry … fully compressed
K2Pumpthe compressor ducks on layer 1's onsets
K3Masterthe output level (0–150 %)

After the master, a look-ahead limiter holds peaks at −0.5 dBFS, and a soft clip catches anything that still gets past. Patches come out loud (about −14 dBFS on average) without distorting.


Setup (HOME twice)

From the Perform page, press HOME again for Setup. SAVE + OCT+ keeps these settings.

General](img/manual/setup-1.png) ![Bluetooth audio](img/manual/setup-2.png) ![Load
General](img/manual/setup-1.png) !Bluetooth audio ![Load
TabKnobSettingWhat it does
GeneralK1Color themenine themes
K2Key octave−3 … +3 (also OCT − / OCT +)
K3MIDI channelOmni or 1–16, for MIDI in
K4Keys to MIDI outthe keys send notes over USB and Bluetooth MIDI
Bluetooth audioK1–K4see Bluetooth audio
LoadK1Layer 1 voices4–8 notes at once
K2Layer 2 voices4–8
K3Partials4–16 oscillators a note
Load cuts 2K1Second corelayer 2 on the FM-1's second core (default) or off
K2Peakthe worst block since reset; turn to reset
KeysK1Keys playLayer 1, Layer 2, Both layers, Drums

The load page

The Load tabs show a live profiler: the share of each audio block spent on Control (smoothing, LFOs, the matrix, tables; "of it, gens" is the generators' part), Layer 1, Layer 2 (on core 2) and how long core 1 waited for it, Drums + FX, and the Total. Peak is the worst block, Platform the USB and Bluetooth work, Xruns the blocks that ran out of time, over 90 % the blocks close to it, and voices the current voice cap.

If the audio ever runs out of time, MANIFOLD drops a voice at once (a thinner chord, never a click) and gives voices back one every 4 s while it keeps up. "OVER n" in the Perform page's header counts these moments.


MIDI

MANIFOLD is a USB MIDI device, and a Bluetooth MIDI device.

In (on the MIDI channel set in Setup, or any channel at Omni):

MessageDoes
Note on / offplays the scale note nearest the incoming pitch, as a key does (velocity included)
CC 1the Timbre knob
CC 21, 22, 23, 24the Timbre, Groove, Space and Motion knobs
CC 120, CC 123everything off

Out (with Keys to MIDI out on): the keys send note on / off on channel 1, each as its nearest equal-tempered note, over USB and Bluetooth MIDI. The generators do not send MIDI. MANIFOLD does not send or follow MIDI clock.


Bluetooth audio

MANIFOLD can send its audio to Bluetooth headphones and speakers. It cannot receive audio.

Bluetooth audio
Bluetooth audio
  1. Press HOME twice for Setup, then SELECT to Bluetooth audio.
  2. K1 turns Bluetooth on.
  3. Put the speaker or headphones in pairing mode and press REC to scan (about 10 s).
  4. K2 picks the device.
  5. Turn K3 right to connect (left to hang up).
  6. K4 sets whether the last device is called again at power-on.

Four devices are remembered. While it streams, the FM-1's own output is muted and the header shows BT. Bluetooth audio arrives 150–300 ms late (the receiver's buffer), so it suits listening more than playing in time.

The FM-1 sends SBC at 44.1 kHz, joint stereo. It works both with devices that wait for the source to set up the stream and with those that set it up themselves after pairing (most speakers do; 1.0 refused those). If a device will not connect, put it back in pairing mode, connect again, then open the web installer's Read the crash report straight away: it lists each step of the Bluetooth set-up and whether the FM-1 or the device turned it down.


Recipes

A slow ambient bed. PRESET → Ambient. On Layer 1: Motion Drift or Gravity, Envelope Swell at 1 per 4 bars, Contour low. Drums off (performance key 12). FX: Reverb decay 20 s, Reverb tuned On. Turn Space up.

A pulse that plays the scale. Layer 1: Motion Ladder (Span 8, up and down), Rate 1 a bar, Envelope Pulse at 2 a beat, Contour high. Layer 2: Route Multiplies, Envelope Stream: the run is gated by the rhythm.

Drums from the melody. Drums → Follow: set the hat to Layer 2, Place to point 1. The hat now fires when layer 2's first point swells. Set layer 2's Route to Adds so it shapes layer 1 silently while it drives the hat.

The melody makes the groove. Drums → Lock & motion: Motion up. As layer 1 moves across the map, the rhythm gets busier on one side and sparser on the other.

A generator turns a knob. LFO page, Matrix: Source Layer 2 motion, Destination Space knob, Depth +40 %. Layer 2's swells now open the reverb and delay. Lock the matrix with SAVE + LFO.

Long-form evolution. Drums → Rhythm: Form high. Drums → Lock & motion: Evolve around 30 %. Leave it running.

Play along with other instruments. Scale → Temper: Equal (12-tone). Root to match the song.


Troubleshooting

No sound. Press PLAY (the generators start stopped). Check Master (FX → Output) and the layer levels. Check the performance-key mutes (hold PLAY: L1, L2, GEN on the Perform page should be lit). If BT shows in the header, the sound is going to Bluetooth.

A key does nothing. Setup → Keys: is it set to Drums, or to a muted layer? Latch may be holding the key: press it again, or performance key 14 (Panic).

It stopped changing when I roll. A page may be locked: LOCKED shows in its header. SAVE + its button unlocks it.

"OVER" in the header. The audio ran out of time and a voice was dropped. Lower Setup → Load (voices, partials) for very dense patches.

The scale did not change on a roll. Only REC + SEL rolls the scale.

A Bluetooth speaker says connected but plays nothing, or the screen says REFUSED. Update to 1.0.2 or later (1.0 refused speakers that set up the stream themselves). Then see Bluetooth audio for reading the set-up's log.

Saved patches or settings are gone after power-off. FM-1s sold since autumn 2026 carry a different flash chip (UC25HQ80). MANIFOLD before 1.0.3 did not recognise it and kept everything in memory only. Install 1.0.3 or later.

The battery gauge. It reads the battery once at power-on and then every 10 s (in a slot of the key scan that no key uses, so playing is never affected), averaged over about 40 s. On USB power it shows USB.


For developers

MANIFOLD is open source (MPL-2.0) and builds on fm1-base. This part describes the engine's mathematics and the code's organisation.

Building

git clone https://github.com/stets43/Manifold
git clone --recursive https://github.com/charlesvestal/fm1-base
cd fm1-base
git checkout 2d8ed74 && (cd bsp && git checkout 773b0b9)
git apply ../Manifold/patches/fm1-base.patch
(cd bsp && git apply ../../Manifold/patches/felucca-bsp.patch)
python3 tools/build.py ../Manifold --host        # the host simulator: any Linux or macOS
../Manifold/build/host/manifold_host ../Manifold/tests/basic.txt ../Manifold/build/host
tools/get_toolchain.sh                           # JieLi's clang for pi32v2
export JIELI_TOOLCHAIN=~/.jieli/toolchain AC79_SDK=/path/to/fw-AC79_AIoT_SDK
python3 tools/build.py ../Manifold --release 1.0.4 # -> build/manifold-1.0.4.fwsc

MANIFOLD needs a few changes to fm1-base (a larger RAM code window for its control tick, the battery read in the key scan's pot slot, Bluetooth audio's acceptor role, both flash chips, and the store's APP_STORE_POOL_FOREIGN); they are in patches/, against the fm1-base and felucca-bsp commits above.

The store. The 64 patch slots and the Bluetooth record share fm1-base's pool (APP_STORE_POOL, app.h): 69 sectors from 0x97000, one copy per sector, the newest valid copy of an object winning, so a power cut during a save leaves the previous copy. 1.0's 16 slot pairs sat at the pool's first 32 sectors and are read as pool copies as they are; the Bluetooth record's pair at 0xDE000 moves in at the first boot. A slot's current copy that is not a MANIFOLD patch (another firmware's record of the same format) is erased at boot. A patch is 3052 bytes.

The device build needs three files from JieLi's AC79 SDK (cpu/wl82/tools/uboot.boot, cfg_tool.bin, cfg/eq_cfg_hw.bin; Apache-2.0). tests/basic.txt is the host test suite (144 checks: every page, rolls, locks, the performance keys, scenes, undo, patches, MIDI, the matrix, the profiler). hosttest/render.c is a desktop render harness (single patches, sweeps, a tour).

Architecture

The audio runs at 44.1 kHz in blocks; everything that is not per-sample runs in a control tick every 64 samples (1.45 ms): parameter smoothing, the LFOs, the matrix, the rhythm, both generators, the drums' envelopes and the voices' spectra. Layer 2's voices run on the FM-1's second core while core 1 renders layer 1. The UI talks to the engine only through a lock-free command queue drained at the start of each audio block.

FileContents
app.c, app.h, fm1.tomlthe app on fm1-base: UI, pages, performance keys, scenes, patches, MIDI, Bluetooth audio
dsp/gen.cthe twelve motions, the eight envelopes, routes, keys, the drive
dsp/rhythm.cthe stream, events, drum choice, the Lock engine
dsp/drums.cdrum triggers, envelopes and character (on the synth's voices)
dsp/voice.cthe oscillator banks and their spectral function
dsp/engine.cthe surfaces, the Tonnetz layout, tuning
dsp/scales.cthe scale library, tonal weights
dsp/mod.cLFOs, the matrix, the knobs' paths
dsp/fx.cfuzz, filter, delay, reverb, compressor, limiter
dsp/params.cthe parameter table, rolls and styles
dsp/synth.cthe top level: the block, the tick

Parameters are stored normalised (0…1) in target (what is set), base (smoothed toward it) and mod (base plus the matrix and the knobs' paths, recomputed each tick). Structural parameters (scale, rotation, root, octaves, surface) rebuild the engine in the main loop. Code that runs in the audio interrupt is placed in RAM (DSP_CTL, DSP_INL); the rest runs from flash (DSP_FAR calls). The audio path never allocates and never calls into flash.

The drive: from points to loudness

Each layer has points j = 1…n at positions qⱼ(t) with envelopes *e*ⱼ(t). Each note i sits at pᵢ on the surface with tonal weight *w*ᵢ. The note's drive is

u_i(t) = w_i · Σ_j  A · e_j(t) · g(t) · φ(|q_j(t) − p_i|)

φ(d) = (1 − (d/R)²)²  for d < R,  else 0          R = s · (0.6 + 1.2 · Reach)

where s is the layout's mean spacing between notes of different pitch classes, A = 0.35 + 0.65·Energy and g(t) the stream's accent: g = (1 − γ) + γ · clamp(0.25 + 1.5 R̂(τ), 0, 1), γ = 0.7·Grip. φ is a smooth bump with a continuous slope that is exactly zero beyond R, so the drive is C¹ in the points' positions. Distances are on the surface: Euclidean on the plane, wrapped on the torus, chordal on the sphere. The keys add their own input: *u*ᵢ += *k*ᵢ(t). Loudness is the drive through a 3 ms symmetric smoother.

Point j's phase along the motion is t·Rate + Spread·j/n, with Rate snapped to the nearest of 1/64 … 4 cycles a bar (whole-number ratios). Motions output (x, y) in [−0.45, 0.45]² and a third coordinate h ∈ [0, 1]. The path view maps them onto the surface:

X = c_x + o_x + k · (x cos θ − y sin θ),    Y = c_y + o_y + k · (x sin θ + y cos θ),    k = (f / 0.45) · scale

with (*c*ₓ, *c*ᵧ) and f the centre and half-extent of the notes' frame (so scale 1 covers every note), θ the path rotation and o the path offset. The plane folds at its edges, the torus wraps, and on the sphere crossing a pole flips longitude by half a turn, so every path stays continuous.

When a motion's discrete choice changes, the point's offset from the new path decays with a 0.1 s time constant: the position is always continuous.

The motions

Below, t is the point's phase in cycles, sn(z) = sin 2π*z*, cs(z) = cos 2π*z*, and A, B ∈ [0, 1] the two controls.

Orbit (Lissajous). With ρ chosen from {1, 2, 3/2, 4/3, 5/4, 5/3, 3, 5/2} by A:

x = 0.45 sn(t),   y = 0.45 sn(ρt + B/4),   h = ½ + ½ sn(ρt/2)

Ladder. The notes sorted by pitch; a window of M = 3 + round(9A) notes, each point starting two notes higher. The position along the run is u = φM (up), (1 − |2φ − 1|)(M − 1) (up and down) or (1 − φ)M (down), φ = t mod 1. Between note i and i+1 the point rests and then moves: f = smoothstep((frac(u) − 0.55)/0.45).

Swarm (Kuramoto). Each point j has a phase θⱼ on a circle of radius 0.2 + 0.25 j/(n − 1):

dθ_j/dt = ω_j + K (Im(Z) cos 2πθ_j − Re(Z) sin 2πθ_j),   Z = (1/n) Σ_q e^{2πiθ_q}
K = 3A,   ω_j = 1 + B/2 · ξ_j  (ξ_j ∈ [−1, 1] fixed per point),   h = |Z|

Above a critical coupling the phases lock (the points gather into a chord); below it they scatter.

Lorenz. Integrated with Heun's method (RK2), steps ≤ 0.004:

ẋ = 10(y − x),   ẏ = x(ρ − z) − y,   ż = xy − (8/3)z,   ρ = 20 + 30A
position = (x, z − ρ + 1) / (35 + 30(1 − B)),   h = z / 1.6ρ

Motif. A small Lissajous figure of ratio r (from A) around a centre that moves each quarter cycle through home, home, answer, home (A A B A). "Home" is the ding, the "answer" the next strongest note of the key (its fifth), the third, or alternating (B). The centre glides over the last 15 % of each quarter.

Drift (value noise). Two octaves of hashed random knots joined by the quintic w = 6f⁵ − 15f⁴ + 10f³, at 1 + 3B knots a cycle, the second octave three times denser at amplitude 0.6A:

x = 0.9/(1 + 0.6A) · Σ_o a_o [ (1 − w) N(n) + w N(n + 1) − ½ ]

Billiard (Sinai). A point moves in straight lines at constant speed in the box |x|, |y| ≤ 0.45, reflecting off the walls and off a central circular bumper of radius 0.28B (mirroring the velocity in the bumper's tangent). The heading turns with changes of A. Without the bumper the paths close into figures; with it the billiard is chaotic.

Gravity. Up to three wells at the key's strongest notes (the ding, then its fifth, then its third: W = 1…3 from A), each of mass GM = 0.25/W, softened by ε² = 0.0064:

a = −Σ_k GM (q − w_k) / (|q − w_k|² + ε²)^{3/2}

integrated with symplectic Euler (steps ≤ 0.01). To keep the orbit bounded without damping it, the speed is eased toward the value the target energy E = −GM·W·(0.8 + 3(1 − B)) asks for at the current potential: v² → 2(E − Φ), by at most 10 % a step. h is the speed.

Stride. A heading θ and a speed v = R̂^{3/2}·(2 + 8B), with R̂ the rhythm's normalised stream: the point moves only as the stream peaks, and turns while it rests: dθ = (A − ½)·3·(1 − R̂)·dt. Walls reflect.

Loops. Point j sits on its own note of the key (the strongest 2 + round(4A), each in its own octave) and swells once per loop of length Lⱼ ∈ {5, 7, 8, 11, 13, 17, 19, 23} quarter cycles:

ψ_j = frac(4t / L_j + 0.37 j),   e_j = ½ − ½ cos(2π ψ_j / w)  for ψ_j < w,  w = 0.12 + 0.5B

The lengths are pairwise coprime, so the whole pattern returns only after their product.

Erode. A six-note figure (scale steps 0, 2, 4, 3, 5, 1 from a low note) repeated every cycle. Over a life of 4·2^{4A} cycles a wear level rises to 0.25 + 0.75B and then renews over the last tenth. Each note i fades when the wear passes its threshold (0.95, 0.35, 0.6, 0.15, 0.8, 0.5), so the weakest notes go first.

Chords. Four chords a cycle from a progression (A): I IV V I, I VI IV V, I III IV II, I V VI IV, I I IV I, I VII VI V. Point j holds the chord's root + j × 2, 3 or 4 scale steps (B: thirds, fourths, fifths), from an octave and a half above the ding, gliding to the next chord over the last 20 % of each quarter.

The envelopes

Each point's envelope eⱼ(t) ∈ [0, 1] (Adds may reach 1.2), with Contour C ∈ [0, 1]:

EnvelopeFormula
Pulsee = sin(π ψ′)^p, ψ′ = ψ / (ψ + k(1 − ψ)), p = 1 + 7C², k = 1 − 0.88C
Swelle = (½ − ½ cos 2πψ)^{1 + 2C}
Speede = ½ + c·(S((v/v̄ − 1)(0.8 + 2.5C) + ½) − ½), v̄ the 2 s running mean speed
Passe = (exp(−4 d²/s²))^{0.6 + 1.6C}, d the distance to the nearest note
Heighte = ½ + c·(S((h − h̄)/σ_h · (0.35 + 0.6C) + ½) − ½)
Holde = 1
Streame = S((R̂(τ − Spread/rate) − (0.04 + 0.5C)) / 0.16)
Drumse = (drum envelope)^{0.4 + 2C}

S is smoothstep; c ramps from 0 to 1 over the first second (the running averages need data). For Pulse and Swell, ψ is the envelope's phase at Envelope rate ν (cycles a beat, times 4 beats a bar), plus the point's Spread offset. It is phase-locked to the bar: dψ/dt = ν/bar + 2·err, err the wrapped difference from ν·(bar position), so after a tempo change it eases back into step within about half a second.

Routes, with depth d = the shaping layer's Energy and m its point j mod n: Moves qⱼ += d·qₘ; Adds eⱼ += d·eₘ; Multiplies eⱼ ← eⱼ·(1 − d + d·eₘ).

Keys. A key press is a kernel in time: a smoothstep rise over a = 2 ms + 1.2(1 − C)³ s, then an exponential fall with time constant 0.12 + 3(1 − C)² s; a held key adds a sustained level (0.25 + 0.65(1 − C))·velocity that breathes with the layer's envelope while it runs. Each key also pulls every point of its layer toward its note: the offset approaches Σ kᵢ Δᵢ / (1 + Σ kᵢ) with a 0.15 s time constant (Δᵢ the way to note i on the surface).

The rhythm

The stream is a sum of von Mises bumps over the bar position τ ∈ [0, 1):

R(τ) = (1/W) Σ_k w_k · b(n_k τ − φ_k),     b(z) = exp(5 (cos 2πz − 1)),    W = Σ w_k

with harmonics nₖ = 1, 2, 4 (always), 8, 16, 32 (the twos), 3, 6, 12, 24, 18 (the threes) and an off-beat at 4. Threes crossfades the two families; Fine opens 8/3, 16/6/12, 32/24 in turn; Swing moves the off-beat's phase from ½ through ⅔ (triplet swing) to ¾ while the straight 8, 16, 32 give way to 12 and 24; Turn shifts the threes by up to ⅓ bar. Form adds slow cosines (periods 3, 4, 5, 8, 16, 64 bars) to the threshold, the sixteenths' weight, the three-feel and the selector.

Events (Threshold engine) are local maxima of R above the threshold θ = 0.03 + 0.6(1 − Density)², refined by a parabola through three ticks so they land on the right sample. An event's strength is (peak − θ)/(1 − θ).

Select scores each drum d for an event of strength s: score = 1 − 1.6|s − (1 − Place)| + polarity·selector + (density − ½)·0.8 − Feedback·tired, with the kick taking the strongest events (s > 0.8) as an anchor. Count distributes events by their order.

Lock: four phase oscillators θ_d with rates r_d (kick 2, snare 2 offset ½, hat 8, tom 3 a bar, varying with Density, Fine and Threes) and small detunings δ_d:

dθ_d/dx = r_d (1 + δ_d) + K r_d sin 2π(r_d x − θ_d),    K = 0.4 Pull

Above its detuning a drum locks to its exact rate; below, it slips and catches. Each hit nudges the others.

The drums

A drum's envelope after a hit: a linear rise from its current level over Attack, a hold, then a decay over Decay,

env(t) = ex + Curve · (lin − ex),   ex = 2^{−5.77 t/Decay}  (−35 dB at Decay),   lin = max(0, 1 − t/Decay)

so Curve blends exponential and straight. It is recomputed each tick from the current parameters, so modulation reshapes a hit that is still ringing. The hit rides a sounding note on the drum layer (Voice picks lowest … highest), raising that note's level by the envelope (its own gain, independent of the layer's level staging) and, in proportion to its share of the note's level, tilting the partials (Bright, up to +2.7 dB per partial, settling over 300 … 9 ms) and pushing Wave (Snap, 25 ms). The kick's duck multiplies the other voices by 1 − 0.75·Duck·env², released over 150 ms. No drum ever changes a frequency.

The voices

Each note f is a bank of oscillators at k·f, k = 1…16 (and up to 64 for low notes, from shared tail tables). The level of partial k is one function, normalised to unit energy:

a_k ∝ k^{−1.6 + 1.2·Tilt} · (1 + g · exp(−(k − c)² / 2b²)) · comb(k) · tone(k f) · bloom(k)
c = 2 + 10·Center^1.6,   b = 0.5 + 7·Band,   g = 2·clamp((c − 2)/3, 0, 1)   (a lift of up to +9.5 dB)
comb(k) = (½ + ½ cos(2π (k − 1) / stride))²,   stride = 1 + 3·Stride
tone(F) = 1 / (1 + (F / f_c)⁴)  (−24 dB/oct),   f_c = 250 · 2^{6·Tone} Hz
bloom(k) = (2^{−0.36·Bloom·(1 − loudness)})^{k − 1}

Partials 7, 11, 13 and 14, which belong to no scale but the harmonic series, are held back. Phases follow φₖ = π·D·k², D = Phase/8 (Schroeder's low-crest-factor phases at D = 1/16, Phase = 50 %). Partials below 90 Hz are softened (12 dB/oct), with the level made up from the partials above, so bass notes read on small speakers and leave the sub to the kick. Wave adds each oscillator's own 2nd and 3rd harmonics (0.5 sin 2x + 0.33 sin 3x); Detune doubles partials 1–3 with copies up to 14 cents away. No partial above 0.45·*f*ₛ is played.

The oscillator budget is 64 per layer. When a layer needs more, a floor rises (from −44 dB relative to each note) so the quietest partials fade first, over a one-octave knee; whole notes are never cut.

The map

Each scale degree n/d is factored into exponents (e₃, e₅, e₇) of 3, 5 and 7 and placed at

x = e₃ + 0.5 e₅ + 0.45 e₇,     y = 0.866 e₅ − 0.78 e₇

(fifths along x, major thirds at 60°, natural sevenths at −60°; 11, 13 and higher primes of the harmonic series each get a direction of their own). Each octave of a degree is offset by a small step at the golden angle, so registers spread without breaking the lattice. The plane scales the lattice into [0.1, 0.9]²; the torus wraps it (fifths one way, thirds the other); the sphere uses a Fibonacci layout with low pitches to the south.

A note's tonal weight is its harmonicity to the ding (Tenney height: 1.15 − 0.1 log₂(nd), from 1 down to 0.45), times a bass-voicing factor: an interval over the ding is clear only above a frequency limit that rises as the interval gets more complex (about 58 Hz for a fifth, 100 Hz for a major third, 150 Hz for a second).

Effects

Fuzz: two cascaded gain stages into slightly asymmetric soft clippers with band-limiting between them, and a tone blend from a 500 Hz low-pass to a 1.4 kHz high-pass. Filter: one resonant state-variable filter, its low, band and high outputs crossfaded by Filter type. Delay: a bucket-brigade-style line whose write rate sets the time. Reverb: an 8-line feedback delay network at half the sample rate (mutually prime lengths of 34–99 ms scaled by Size, four of them modulated), with allpass diffusion; Tuned snaps each line to a whole number of periods of a scale note. Compressor: a bus compressor with parallel mix; Pump ducks it on layer 1's onsets. Limiter: peak detection over eight 8-sample segments 64 samples ahead, a 7-sample attack and ~280 ms release, ceiling −0.5 dBFS; then a soft clip.

Licence and credits

MANIFOLD is MPL-2.0. It is built on fm1-base by Charles Vestal (MPL-2.0), which includes code by Leo Kuroshita (Felucca), Chris Farrell and others; see fm1-base's LICENSING.md. A firmware built with fm1-base's own Bluetooth stack also contains Apache-2.0 and BSD-2-Clause code (an SBC encoder, micro-ecc, JieLi radio tables): their licence texts ship with the firmware.