Skip to content

MS-20 sound: K35/OTA filters, patch panel, and the Squelch 33 acid synth - #30

Merged
nooga merged 5 commits into
masterfrom
claude/ms20-analog
Oct 22, 2026
Merged

nooga merged 5 commits into
masterfrom
claude/ms20-analog

Conversation

@nooga

@nooga nooga commented Oct 22, 2026

Copy link
Copy Markdown
Owner

The SM-24 Mono sounded like a 303. Its HOT/WET lowpass subtracts a clipped lowpass at a hot input, so PEAK cut the bass by 16–25 dB and put the peak 1.5–2 octaves above CUT. This PR gives the SM-24 the MS-20's own filters and a patch panel, and moves the acid filter into its own synth.

SM-24 Mono: K35 and OTA filters (3c41640)

  • LPF MODE gains K35 and OTA, built on Stinchcombe's MS-20 transfer function.
    • Both run HPF → LPF in series and resonate up to self-oscillation.
    • The PEAK pot taper is ours: it gives +6 dB of peak at noon.
  • K35 is the new default.
  • HOT and WET stay for the acid sound.
  • Measured:
    • bass stays within ±0.4 dB at any PEAK;
    • the peak sits within 0.02 octave of CUT;
    • slope is −11 to −12 dB/oct;
    • K35 distorts lopsided, OTA symmetric.
  • New presets: k35-scream, k35-round-bass, ota-singing-lead.
  • The init patch is re-voiced. Saved songs keep their mode.

Squelch 33, a new acid synth (8f10ce1)

  • Built on the HOT/WET filter (ms20_lpf.fy), which is not changed.
  • A mono 303-style voice:
    • SAW or SQR oscillator;
    • decay-only filter envelope with ENV MOD;
    • accent from velocity: a 200 ms envelope, a VCA push, and an accent RC that stacks over consecutive accents;
    • slide on overlapping notes.
  • Measured:
    • accent +4–5 dB and 20–40% brighter;
    • RES thins the fundamental 13 dB;
    • presets level at −20 dB RMS ±0.4.
  • Presets: classic-squelch, square-bounce, wet-scream, round-line.

SM-24 Mono: patch panel (d9f0abe)

  • Four cords evaluated every sample, with each source arriving one sample late. That delay allows feedback such as VCA OUT → FLT IN.
  • Uses Concoction's dock, knob rings and matrix display, on a new PATCH page.
  • An unpatched SM-24 renders bit-exactly as before.
  • VCO1's wave became a select. This keeps the bay within fy's 32 versioned bodies; without it, an unpatched voice cost 609 ns per sample.
  • Five patch-* presets: S&H bubbles, feedback growl, FM metal bass, tracking lead, vowel sweep.

Demos (068d58c, d9f0abe)

  • songs/k35_night_run.py
  • songs/squelch_acid.py
  • songs/ms20_patch_bay.py

Checks

  • zig build test: 527/527 pass.
  • zig build bench -- --all --check --no-sheets: 174 golden cases are bit-exact. ms20 goldens were re-recorded in 3c41640 for the new default; acid goldens are new.
    • The command still exits 1, because shift2, resonator2, buffer2 and phaser2 have never had goldens. That predates this branch.
  • The PATCH page hasn't been checked by hand in the app.

Docs: docs/14 (new sections with measurements), docs/20 (regenerated), CHANGELOG.

🤖 Generated with Claude Code

nooga and others added 5 commits October 21, 2026 23:39
HOT and WET measure as a 303-style ladder. PEAK costs 16-25 dB of bass,
the peak sits 1.5-2 octaves above CUT and moves with level, and the
slope is 8-11 dB/oct. Stinchcombe's MS-10/MS-20 study gives the MS-20
LP = 1/(s^2 + (a-k)s + 1) instead: flat bass and a fixed corner.

ms20_sk.fy is a zero-delay TPT core with bandpass feedback through
diodes:
- K35: forward-path diodes and a lopsided resonance.
- OTA: feedback-path diodes and a symmetric resonance.
- Both filters resonate, HPF into LPF at 4x, and cut off at 15 kHz.
- PEAK taper: +6 dB at noon, self-oscillation from 91%.

K35 is the default, and the init patch is re-voiced for a real
corner. HOT and WET are bit-exact and stay for the acid sound. New
presets: k35-scream, k35-round-bass, ota-singing-lead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ilter (docs/14)

One VCO (saw/square), the unchanged ms20_lpf.fy at 4x, a decay-only MEG
with ENV MOD, accent by velocity (short MEG, VCA push, stacking accent RC)
and slide on overlapping notes. Four presets levelled to -20 dB RMS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Squelch 33

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cs/14 §patch panel)

Jacks FENV AENV AENV- MG MG-PUL S&H NOISE KBD VEL PRESS VCO1 VCO2 VCA-OUT
into PITCH VCO2 PW HPF-CUT LPF-CUT VCA MG-FREQ FLT-IN, per sample, a
sample late through the jack array. Concoction's dock, rings and matrix
display on a new PATCH page. Unpatched renders stay bit-exact; VCO1's wave
is a select so the bay keeps its versioned bodies. Five patch-* presets and
the songs/ms20_patch_bay.py demo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@nooga
nooga merged commit 4b7a4e1 into master Oct 22, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant