Granular synthesis: grains from a recording or a live tap, FOF, PSOLA, concatenative, and the time-stretch no engine has #141

Open
opened 2026-10-06 00:33:31 +00:00 by bcox · 0 comments
Owner

bcox asked on 2026-10-05 for a ticket for each family in his gaps.md that has none. Engine claims are from reading the tree at cd68bd3e on main; literature named below is from recollection and was not re-read. Nothing here is built, measured or listened to.

What the tree has

  • The particle engine is the nearest thing: ParticleLayer over ParticleScheduler (when an arrival happens), ParticleBurst (the one retained burst every arrival injects) and ParticleDiffuse (the FDN). Its Patch::tap feeds a tap into the diffuse body only; the scheduler scatters the retained burst and nothing else. The stochastic-events design says by name "Not a granular sampler", and parked "the scheduler's retained burst replaced by a tap, which scatters another slot's signal into a cloud" for its Stage 2. That is not in the tree.
  • SampleSlot is one mono one-shot of kSampleCapacity words, read by the VA oscillator under VaShape::kSample with one read head and no loop. #78 is the sampler's ticket; it stores excitations and synthesizes resonances, defers loop points and a pitch shifter by name, and the stochastic design calls sample-based granular "the sample oscillator's territory".
  • #105 lists a pitch shifter, "granular or delay-based", as a candidate layer effect.
  • The long delay's line lives in a dsp::StorageRegion block through a RegionView, which is the storage shape a ring of live audio would take.

So nothing reads a buffer at a grain's position through a window at a density, nothing stretches time, and nothing shifts pitch with the formants kept.

What the family is

  1. Grain clouds from a recording. N read heads over a SampleSlot or a region block, each with a position, a duration, a window, a pitch, a gain and a pan, onsets scheduled at a density with jitter. The particle scheduler's rate curves are the cloud's shape already; what it lacks is a read head per arrival instead of a burst.
  2. Live granulation. The same over a ring of the external input or a tap, which is the time-stretch and the freeze everyone means by "granular delay". Channel-scope, since the input is the channel's.
  3. FOF and CHANT. Grains that are damped sinusoids at formant frequencies, pitch-synchronous, so pitch and formants are independent by construction. A synthesis, not a sampler: the time-domain dual of the formant banks the FM pair and UnvoicedLayer have.
  4. PSOLA. Pitch-synchronous overlap-add on a recording with pitch marks: the formant-preserving pitch shift and the time stretch, which needs the marks found at load (#118's tracker, offline) rather than per sample.
  5. Concatenative. Unit selection from a corpus by descriptors (CataRT). The selection is control-path work on the host; the engine plays grains as in 1. Nothing to build in dsp/ beyond 1.

Shape and cost

A layer engine by all three of #105's tests: bulk storage, a modulator inside (the scheduler), per-note sense. Voice-scope for 1, 3 and 4, channel-scope for 2. Each grain is a read head with linear interpolation and a window lookup, so the price is grains per voice times voices against the sample pool's bandwidth: 32 grains at 128 voices is the figure to put against #78's streaming note (bounded stream counts, a fixed round-robin). FOF is cheaper, a damped sine per grain and no memory read.

Open

  • Whether the particle scheduler is reused with a read head per arrival, or a grain scheduler of its own; the two have the same job.
  • Window shapes: Gaussian, Hann, trapezoid, Tukey, and the asymmetric ones FOF wants.
  • The sample pool: a granular layer wants seconds of audio, which is #78's "one budget, one meter" question before it is this ticket's.
  • A phase-vocoder stretch (#140) does 2 and 4 the other way; which one the instrument gets first is a choice, not both.

#78, #105, #118, #140, the stochastic-events design's "Open for Stage 2".

bcox asked on 2026-10-05 for a ticket for each family in his `gaps.md` that has none. Engine claims are from reading the tree at `cd68bd3e` on `main`; literature named below is from recollection and was not re-read. **Nothing here is built, measured or listened to.** ## What the tree has - The particle engine is the nearest thing: `ParticleLayer` over `ParticleScheduler` (when an arrival happens), `ParticleBurst` (the one retained burst every arrival injects) and `ParticleDiffuse` (the FDN). Its `Patch::tap` feeds a tap into the diffuse body only; the scheduler scatters the retained burst and nothing else. The stochastic-events design says by name "Not a granular sampler", and parked "the scheduler's retained burst replaced by a tap, which scatters another slot's signal into a cloud" for its Stage 2. That is not in the tree. - `SampleSlot` is one mono one-shot of `kSampleCapacity` words, read by the VA oscillator under `VaShape::kSample` with one read head and no loop. #78 is the sampler's ticket; it stores excitations and synthesizes resonances, defers loop points and a pitch shifter by name, and the stochastic design calls sample-based granular "the sample oscillator's territory". - #105 lists a pitch shifter, "granular or delay-based", as a candidate layer effect. - The long delay's line lives in a `dsp::StorageRegion` block through a `RegionView`, which is the storage shape a ring of live audio would take. So nothing reads a buffer at a grain's position through a window at a density, nothing stretches time, and nothing shifts pitch with the formants kept. ## What the family is 1. **Grain clouds from a recording.** N read heads over a `SampleSlot` or a region block, each with a position, a duration, a window, a pitch, a gain and a pan, onsets scheduled at a density with jitter. The particle scheduler's rate curves are the cloud's shape already; what it lacks is a read head per arrival instead of a burst. 2. **Live granulation.** The same over a ring of the external input or a tap, which is the time-stretch and the freeze everyone means by "granular delay". Channel-scope, since the input is the channel's. 3. **FOF and CHANT.** Grains that are damped sinusoids at formant frequencies, pitch-synchronous, so pitch and formants are independent by construction. A synthesis, not a sampler: the time-domain dual of the formant banks the FM pair and `UnvoicedLayer` have. 4. **PSOLA.** Pitch-synchronous overlap-add on a recording with pitch marks: the formant-preserving pitch shift and the time stretch, which needs the marks found at load (#118's tracker, offline) rather than per sample. 5. **Concatenative.** Unit selection from a corpus by descriptors (CataRT). The selection is control-path work on the host; the engine plays grains as in 1. Nothing to build in `dsp/` beyond 1. ## Shape and cost A layer engine by all three of #105's tests: bulk storage, a modulator inside (the scheduler), per-note sense. Voice-scope for 1, 3 and 4, channel-scope for 2. Each grain is a read head with linear interpolation and a window lookup, so the price is grains per voice times voices against the sample pool's bandwidth: 32 grains at 128 voices is the figure to put against #78's streaming note (bounded stream counts, a fixed round-robin). FOF is cheaper, a damped sine per grain and no memory read. ## Open - Whether the particle scheduler is reused with a read head per arrival, or a grain scheduler of its own; the two have the same job. - Window shapes: Gaussian, Hann, trapezoid, Tukey, and the asymmetric ones FOF wants. - The sample pool: a granular layer wants seconds of audio, which is #78's "one budget, one meter" question before it is this ticket's. - A phase-vocoder stretch (#140) does 2 and 4 the other way; which one the instrument gets first is a choice, not both. ## Related #78, #105, #118, #140, the stochastic-events design's "Open for Stage 2".
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
bcox/tymbal#141
No description provided.