A traditional FM engine: operators and algorithms as the DX7, DX1 and FM-X have them, without the pair's additive carrier #138
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
bcox/tymbal#138
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
bcox asked on 2026-10-05 for this ticket, to cover the DX7 algorithms the importer refuses and the operator features the pair has no place for, with Yamaha's later operator features in scope where no patent bars them. Engine claims are from reading the tree at
f6aa8ebaonmain. Hardware claims marked as recollection were not read from a source in that session. Nothing here is built, measured or listened to.Why a second FM engine
The FM pair is one carrier and up to two modulators per layer, with the carrier an additive spectrum of up to 512 harmonics crossfaded through a table (
dsp/spectrum.h,plugin/program.h:71,:97). That is what makes it the resynthesis engine and the Synclavier's, and it is also why a DX7 voice reaches it only throughdx7/decompose.h, which splits an algorithm into pair-shaped stacks and refuses what does not split (dx7/decompose.h:54-66): feedback spanning two operators (algorithms 4 and 6), a chain deeper than three operators, three or more parallel modulators, a modulator fed by more than one operator, a modulator shared between two carriers. The importer also drops level scaling and rate scaling per operator (dx7/translate.cc:680-687), refuses a fixed-frequency operator (:659-662, #126), and bakes feedback into a static table because the pair has no loop (:871-878;dsp/fm_pair_layer.h:636-646argues series routing replaces it for the pair's purposes).A traditional engine has none of that complexity and all of those features: N operators, each a sine, each with its own envelope, level scaling, rate scaling, velocity sensitivity and frequency mode, wired by an algorithm table, with feedback on an operator the algorithm names.
What it covers
dx7/vced.hholds the parameter block already, and the importer's envelope tracing against Dexed'senv.cccarries over.What shapes it
kPhaselaw; thekFrequencylaw is the pair's and can stay there.//plugin:instrument_benchis where it gets a scenario.LayerKind, appended (plugin/program.h:1120); every switch over it is a registration site under-Werror=switch, andpatchdiff/needs a walker or its fields report as unaccounted.Related