A dual macro-oscillator, built on the Mutable Instruments Plaits DSP (src/engine/mosc/thirdparty/plaits) — the full 24-engine synthesis voice. Each deck wraps one plaits::Voice, so the two decks are two independent macro-oscillators (virtual analog, waveshaping, FM, wavetable, granular, additive, chord, speech, modal, drums, and the newer "engine2" models). Sibling of the reso engine (both are Mutable Instruments DSP placement-new'd into the SDRAM arena and share the same stmlib).

Implementation (PIMPL + QSPI build), the file map, the 24-engine order, and the build internals live in docs/dev/mosc-impl.md.

Like csound and chuck, mosc is a QSPI build — the full 24-engine voice is ~292 KB of code, too big for the 186 KB execution SRAM, so it runs from QSPI flash (make engine-mosc). Unlike those two it still synthesises from the platform's SDRAM arena (it is a normal SRAM-class engine that simply executes from QSPI), so no SD card or external library is required.


Concept

Plaits is a "macro-oscillator": one knob picks a synthesis model (engine), and four continuous controls — harmonics, timbre, morph, plus the note — shape it, with an internal low-pass gate (LPG) for decay/colour. mosc gives each deck a complete Plaits voice and projects Plaits' panel onto the Spotykach controls.

Two switches set behaviour:

Control map (per deck)

Mosc control surface
Mosc control surface - open full size download PDF

_Generated from docs/diagrams/controls/mosc.json via make diagrams._

KnobParamIdPlaits target
PITCHSpeednote (pitch) → patch.note (+ V/Oct CV)
SIZESizepatch.harmonics
POSPospatch.timbre
ENVEnvpatch.morph
MOD_AMTModAmppatch.decay (LPG decay)
MODFREQModSpeedpatch.lpg_colour
SOS / MIXMixoutput level
Alt+PITCHAuxengine select (one of 24 models)

capabilities() = CapOwnDisplay | CapDualDeck | CapAux.

CV map (per deck)

mosc wires the three per-deck CV jacks the platform provides. All readings are calibrated and signed (≈0 when nothing is patched), so the knobs rule until a cable is inserted.

CV jackDestination
V/Octnote (additive transposition, like reso)
CV_SIZE_POSharmonics modulation (summed)
CV_MIXtimbre modulation (via Plaits' timbre attenuverter)

Plaits' other CV inputs (MODEL CV, FM CV, MORPH CV, LEVEL/accent CV, and the FM/MORPH attenuverters) have no hardware home on the Spotykach panel and are left unpatched. The modulation depths are tunable constants (kHarmCvDepth, kTimbreModAmt) at the top of mosc_engine.cpp.

Engine selection (Alt+PITCH)

There are 24 engines; hold Alt and turn PITCH to scroll them (pickup-gated, like the other CapAux selectors). While Alt is held the ring shows the current engine position in place of the pitch dot. The boot default is #8, Virtual Analog. The full order (Plaits' own registration order — newer "engine2" bank first, then the classic models) is listed in docs/dev/mosc-impl.md.

Display

render draws, per deck: an energy meter coloured by the deck's Mode (Gate green, Drone orange), a white pitch dot at pitch_n (replaced by the engine dot while Alt is held), and a play-LED flash on each trigger. The center/left/right mode LEDs show the global Route (Stereo = center, DoubleMono = left, GenerativeStereo = right) — they sit under the routing switch.


Build / flash

mosc is a QSPI-execute target (BOOT_QSPI + alt_qspi.lds), like csound/chuck:

make engine-mosc             # clean + build + DFU flash (board in DFU)
make program-mosc            # re-flash the last build without rebuilding
make ENGINE=mosc APP_TYPE=BOOT_QSPI LDSCRIPT=linker/alt_qspi.lds   # explicit form

No prerequisite fetch is needed — the Plaits DSP and the shared stmlib are vendored in the tree (src/engine/mosc/thirdparty/plaits, src/engine/common/thirdparty/stmlib). A plain make ENGINE=mosc (BOOT_SRAM) will not link — the 292 KB of code overflows SRAM_EXEC; that is by design, mosc runs from QSPI.