Bake window: derive it from the rate the voice actually reads at, so a dialled Rate or downward Pitch no longer truncates the file
This commit is contained in:
@@ -421,7 +421,12 @@ public:
|
||||
// Peer of AdsrEnvelope::snapLive (see it for why the two paths cannot share code): a voice
|
||||
// that has rendered nothing takes the new shape and depth outright. `enabled` is a discrete
|
||||
// toggle travelling by reload, so the caller's copy of it is deliberately ignored.
|
||||
void snapLive(const PitchEnvParams& params) {
|
||||
//
|
||||
// Both live entry points re-take `spanFrames` rather than keeping configure()'s: the span is
|
||||
// an OUTPUT-frame duration the caller converts from the read rate, and that rate carries a
|
||||
// live control (voice.h's pitchEnvSpanFrames). Passing the span back unchanged is exact.
|
||||
void snapLive(std::int64_t spanFrames, const PitchEnvParams& params) {
|
||||
span_ = spanFrames > 0 ? spanFrames : 0;
|
||||
params_.peakSemitones = params.peakSemitones;
|
||||
params_.shape = params.shape;
|
||||
fit_ = fitAhd(span_, params_.shape);
|
||||
@@ -430,9 +435,11 @@ public:
|
||||
|
||||
// Live parameter delivery, same rule as AdsrEnvelope::applyLive: hold the normalized
|
||||
// position within whichever leg the envelope is in, and absorb the depth step (peak is a
|
||||
// level, not a duration).
|
||||
void applyLive(const PitchEnvParams& params) {
|
||||
// level, not a duration). A moved span re-fits under the same rule, so a live Pitch move
|
||||
// reshapes this envelope continuously instead of leaving it on the note-on read rate.
|
||||
void applyLive(std::int64_t spanFrames, const PitchEnvParams& params) {
|
||||
const double before = offsetAt();
|
||||
span_ = spanFrames > 0 ? spanFrames : 0;
|
||||
const AhdSpan next = fitAhd(span_, params.shape);
|
||||
pos_ = holdPhase(fit_, next);
|
||||
params_.peakSemitones = params.peakSemitones;
|
||||
|
||||
Reference in New Issue
Block a user