Repository navigation
FM Synth 0.1.3: LFOs and scenes reach the AMP envelope and VOIC/CHRD; LFO pitch depth as on other machines - #884
jankolkmeier wants to merge 9 commits into
Conversation
…on FLEX; VOIC/CHRD/RATO scenes jump Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks Jan, that's a really thorough one. Two things first. @timhastie FM Synth is your module, so I'd like your OK before this goes in. Jan found that LFOs and scenes don't reach AMP ATK/HOLD/REL or VOIC/CHRD on FM tracks, and that an LFO on PTCH swings five times as far as on FLEX (#883). The fix is all in poly.s. Are you fine with it as is, or would you rather take it into your 2.18 re-cut? Jan: my #895 also claims 0.1.3-experimental. I'd like to merge that first, so this one becomes 0.1.4-experimental after merging main. Once Tim's OK is in I'll look at the approval and the release builds. |
…dules-isolated.sh at 34206f4, modules:import --development) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…for 0.1.3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks Jan, good finds. I'd rather not merge this as it is, because my line has moved on: scene locks on VOIC and CHRD have been in it since 2.17, and there the crossfader deliberately sweeps through every voice count and chord shape rather than jumping at the midpoint. I'll fold your two other fixes into my re-cut, credited to you: LFOs and scene locks on AMP ATK / HOLD / REL shaping FM's volume envelope, and the PTCH LFO depth matching FLEX. When my re-cut is up, #884 can be closed in its favour. Thanks again! |
|
Thanks for checking it out, and happy to help! I (or let's be honest: claude) did not realize you had a further advanced version of this elsewhere. Glad I did still find some things to improve, though! I also just realized an hour ago, sweeping through VOIC and CHRD is probably the better call, as demonstrated by innerkop :) |
|
Thanks Jan! I'll tag you when the re-cut with your two fixes is up. |
|
Thanks again for these, Jan. As Tim said, his line has moved on, and he's folding your two fixes into his re-cut with credit: LFOs and scene locks on AMP ATK/HOLD/REL shaping FM's envelope, and the PTCH LFO depth matching FLEX. So I'm closing this one in favour of that. Nothing is lost; your changes reach FM Synth through Tim's release. |
Related to #883. FM Synth
0.1.2-experimental→0.1.3-experimental. Engine by Tim Hastie (@timhastie), changes by Jan Kolkmeier (@jankolkmeier). This is not an author update, so it needs owner review. Draft: it needs an owner approval and the release builds; see "Needs the owner".What changes for players
How
All in
upstream/synth/poly.s, Modwerk's copy of the octatrick engine. No new hook sites, pokes or tables; one 64-byte per-track snapshot (po_amp).sy_isonoverrides the DSP voice record's ATK/HOLD/REL (0 / INF / INF) every frame. The engine read those values from the live lane, which carries Part values and locks but not the LFO and scene-morph contributions, which are written to the voice record.po_amp_snapkeeps the record's values per track while they're still the frame builder's: insy_coldat a START, and insy_isonbefore the override.po_amp_atserves the five readers (sy_cold,po_mono_env×2,po_frame×2,po_st_note). Until a track has a snapshot it falls back to the lane.sy_wordstretches the PTCH word ×5, because a synth PTCH unit is a semitone, and the LFO's contribution was stretched with it.po_lfo3_depth, the existing detour at the LFO engine's depth read (both copies), now also divides the depth by 5 on a synth track when the LFO's PMTR is PTCH.sy_warm,po_st_note, the held-chord path) now read the snapshot.po_scene_jumppicks VOIC/CHRD from the morph's working copy (0x80000ed4 + 64 t, [A, B] per slot;MIDI.mdApp. C), the fader (0x460d16c8) and the scene-off flags. The flags are0x80000006for A and0x80000007for B, read from the morph at0x4000cc6c.po_ratio_wordtakes the morph's share out of the RATO word,(eA·xf + eB·(127 − xf)) << 8 / 127, and puts the nearer scene's value in. The LFO share stays.Other files:
sdk/machines/octatrack/module-adapters/machine-ports.json:poly.shash.machine-recipes.json: the synth recipe recaptured for the new image (--capture-stock-recipe; 38 copies, hashes only).sdk/imports/synth-fixes-0.1.3.json: the full delta from the original import, assynth-fixes-273-264.jsonwas for 0.1.2.sdk/tests/test_synth_release.pynow reads it.src/community/module-changelogs/synth.json.evidence/release-0.1.2/TESTING.md.evidence/lfo-regressions.json: sanitized measurements and the hardware report, per build.USB package: 26,660 bytes (+500 against 0.1.2), module id
e8c3e4faunchanged, strict stock-free scan passes. Before any change, the published 0.1.2 package rebuilt byte for byte. Compatibility is unchanged: same sites, events and conflicts.Evidence
Emulator. The adapted
ot_emu(scripts/octatrack-emulator/build.py) running basecd39c494, with packages installed over emulated USB. T1 is FM SYNTH with INDX 0 (a sine), trigs on 1/5/9/13, LFO1 from the project file; T1's stem was measured.The sample jumps at each trig on held notes are identical in both versions: the existing retrigger dip.
Hardware (reported by @jankolkmeier, not verified). Octatrack MKII, OS 1.40C, base
cd39c494, over USB, beside Sidechain Compressor 0.1.2, Preview Vol 0.1.2 and the draft Deja Vu. The build each result comes from is listed inevidence/lfo-regressions.json.Not tested:
Needs the owner
@repeat98, everything except your approval is now in the PR:
build-modules-isolated.sh+modules:import);0.1.3-experimental(ff99f9c2…, the build tested on the MKII);synth-release.test.ts,test_synth_release.py) for 0.1.3.CI stops only at
sdk/synth-build-approval.json, which only you can give. With this record, both release tests pass locally (tried with a stand-in that was never committed):{ "kind": "owner-approved-update", "id": "synth", "version": "0.1.3-experimental", "sourceSha256": "e5c05ab5272f83e7142d6bc00e40a1aa3de7d899a5fa2336332ff2eb5dac9fbe", "approvedBy": "repeat98", "approvedOn": "<date>", "waived": ["current-build-hardware", "chip-worst-case-cycles", "complete-memory-bounds"], "ownerStatement": "<your words>", "reason": "<why>" }No
release-documentationwaiver is needed any more, because the captures are fresh. Two other points:chooser-metadata.json:module:verifyasks to commit a change to it that only moves POLY8's entry within the list, with the same content. I left it out, since the beta base hashes that file. Your call.Checklist
machines.md) walked; TESTING.md lists what is not tested;npm run module:doctor -- synth: blocked at the owner approval.requires, no hooks into another module;uiClaimsunchanged.resources.impact/tests.qualification: unchanged figures; +64 B state, +500 B package; worst-case cycles not re-measured.main;npm run pr:readysays Ready: merged withmain(71600295);pr:readystops at the owner approval.Validation commands and results:
What the guides lacked or got wrong
ot_emuplay needs extra steps that I found no guide stating for the interactive mode:--mountfor the project load;0x80000028bit 0;--internal-clockonly acts with--sequencer);frame onbefore PLAY.docs/OCTATRACK_DRIVING.mddoesn't.Both go into a separate
Docs:PR.🤖 Generated with Claude Code