Real-time spectral processing: freeze, blur, morph, spectral filtering and cross-synthesis, on an audio path that has no FFT #140
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
bcox/tymbal#140
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 a ticket for each family in his
gaps.mdthat has none. Engine claims are from reading the tree atcd68bd3eonmain; literature named below is from recollection and was not re-read. Nothing here is built, measured or listened to.What the tree has
dsp/has none; the string appears there only inside test names.dsp/spectrum.h'sWaveis a list of harmonic amplitudes and phases, and aSpectralTableis a sequence of them crossfaded harmonic by harmonic, which the FM pair plays.resynth/produces those tables offline, indouble, from a recording; it is analysis as a build step, not a live engine (#16, closed).PartialLayer) plays a trajectory and takes no input; #92 is its noisy residual.dsp/mod_source.h'skSharedExternalInputandkSharedSidechainreach every voice, each engine's primary input selector can read them (WaveguideLayer::Drive::kInput, the VA oscillator's tap), and the console's compressor has a detector (fabric/inserts.h). So an incoming signal can excite, modulate and be filtered. Nothing analyzes it in the frequency domain.What is missing
Spectral freeze (hold one frame's magnitudes and resynthesize with running phase); spectral blur and smear; a morph between two live analyses; spectral filtering and gating by a drawn or derived mask; cross-synthesis, the spectral envelope of one signal imposed on another, which is what a phase-vocoder vocoder does and a band vocoder approximates. Time-stretch and formant-preserving pitch shift are the granular ticket's (#141), which can do them either way.
Two shapes, and why the second is the engine's own
dsp::StorageRegionblock. The fixed-point question is word growth: a radix-2 stage grows a bit, whichdsp/fixed.hmakes explicit, and the rounding mode per stage decides the noise floor.SpectralTableentry per hop, handed to an FM pair or partial bank as a table that moves: aresynthrunning at the output rate, pitch-tracked (#118's tracker). Freeze is the analyzer stopping; morph is the crossfade the table already does; spectral filtering is a mask on the harmonic amplitudes, a matrix destination per band. It is whatdsp/spectrum.h's own comment anticipates ("a Synclavier-style resynthesis frame drops straight in as one entry"), it changes no renderer, and it is harmonic-only. The analysis itself is where the FFT sits, or a bank of heterodyne filters at the tracked harmonics, which is what Beauchamp's SNDAN did and which costs one complex multiply-add per harmonic per sample, no transform.The second plays to what the engine has and is the recommended first step; the first is what every other instrument means by "spectral" and should be priced in fabric before either is designed.
Open
Related
#105 (band vocoder), #118, #92, #16 and #20 (closed, the offline analysis and the spectral timeline), #141.