Remove the helpers in the midi class and be explicit in the process
This commit is contained in:
parent
eac0c0e804
commit
0da5c43bb5
2 changed files with 44 additions and 31 deletions
|
|
@ -154,26 +154,6 @@ public:
|
|||
return returnedValue;
|
||||
}
|
||||
|
||||
template<class T, class F = decltype(gainModifier<T>)>
|
||||
void additiveModifiers(const CCMap<T>& modifiers, absl::Span<float> output, absl::Span<float> temp, F&& lambda = gainModifier<T>)
|
||||
{
|
||||
fill<float>(output, 0.0f);
|
||||
for (auto& mod : modifiers) {
|
||||
linearEnvelope(mod, temp, lambda);
|
||||
add<float>(temp, output);
|
||||
}
|
||||
}
|
||||
|
||||
template<class T, class F = decltype(gainModifier<T>)>
|
||||
void multiplicativeModifiers(const CCMap<T>& modifiers, absl::Span<float> output, absl::Span<float> temp, F&& lambda = gainModifier<T>)
|
||||
{
|
||||
for (auto& mod : modifiers) {
|
||||
linearEnvelope(mod, temp, lambda);
|
||||
applyGain<float>(temp, output);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const EventVector& getEvents(int ccIdx) const noexcept;
|
||||
|
||||
template<class T, class F>
|
||||
|
|
|
|||
|
|
@ -275,15 +275,23 @@ void sfz::Voice::ampStageMono(AudioSpan<float> buffer) noexcept
|
|||
|
||||
// Amplitude envelope
|
||||
fill<float>(*modulationSpan, baseGain);
|
||||
resources.midiState.multiplicativeModifiers(region->amplitudeCC, *modulationSpan, *tempSpan);
|
||||
for (auto& mod : region->amplitudeCC) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
|
||||
applyGain<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
DBG("Final gain: " << modulationSpan->back());
|
||||
applyGain<float>(*modulationSpan, leftBuffer);
|
||||
|
||||
// Crossfade envelopes
|
||||
// crossfadeEnvelope.getBlock(modulationSpan);
|
||||
fill<float>(*modulationSpan, 1.0f);
|
||||
resources.midiState.multiplicativeModifiers(region->crossfadeCCInRange, *modulationSpan, *tempSpan, xfinBind);
|
||||
resources.midiState.multiplicativeModifiers(region->crossfadeCCOutRange, *modulationSpan, *tempSpan, xfoutBind);
|
||||
for (auto& mod : region->crossfadeCCInRange) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, xfinBind);
|
||||
applyGain<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
for (auto& mod : region->crossfadeCCOutRange) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, xfoutBind);
|
||||
applyGain<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
DBG("XF: " << modulationSpan->back());
|
||||
applyGain<float>(*modulationSpan, leftBuffer);
|
||||
|
||||
|
|
@ -311,15 +319,28 @@ void sfz::Voice::ampStageStereo(AudioSpan<float> buffer) noexcept
|
|||
const auto xfinBind = std::bind(crossfadeIn<float, float>, _1, _2, region->crossfadeCCCurve);
|
||||
const auto xfoutBind = std::bind(crossfadeIn<float, float>, _1, _2, region->crossfadeCCCurve);
|
||||
|
||||
|
||||
// Amplitude envelope
|
||||
fill<float>(*modulationSpan, baseGain);
|
||||
resources.midiState.multiplicativeModifiers(region->amplitudeCC, *modulationSpan, *tempSpan);
|
||||
for (auto& mod : region->amplitudeCC) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
|
||||
applyGain<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
DBG("Final gain: " << modulationSpan->back());
|
||||
buffer.applyGain(*modulationSpan);
|
||||
|
||||
|
||||
// Crossfade envelopes
|
||||
fill<float>(*modulationSpan, 1.0f);
|
||||
resources.midiState.multiplicativeModifiers(region->crossfadeCCInRange, *modulationSpan, *tempSpan, xfinBind);
|
||||
resources.midiState.multiplicativeModifiers(region->crossfadeCCOutRange, *modulationSpan, *tempSpan, xfoutBind);
|
||||
for (auto& mod : region->crossfadeCCInRange) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, xfinBind);
|
||||
applyGain<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
for (auto& mod : region->crossfadeCCOutRange) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, xfoutBind);
|
||||
applyGain<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
DBG("XF: " << modulationSpan->back());
|
||||
buffer.applyGain(*modulationSpan);
|
||||
|
||||
// Volume envelope
|
||||
|
|
@ -349,7 +370,10 @@ void sfz::Voice::panStageMono(AudioSpan<float> buffer) noexcept
|
|||
|
||||
// Apply panning
|
||||
fill<float>(*modulationSpan, region->pan);
|
||||
resources.midiState.additiveModifiers(region->panCC, *modulationSpan, *tempSpan);
|
||||
for (auto& mod : region->panCC) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
|
||||
add<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
DBG("Pan: " << modulationSpan->back());
|
||||
pan<float>(*modulationSpan, leftBuffer, rightBuffer);
|
||||
}
|
||||
|
|
@ -369,18 +393,27 @@ void sfz::Voice::panStageStereo(AudioSpan<float> buffer) noexcept
|
|||
// Apply panning
|
||||
// panningModulation(*modulationSpan);
|
||||
fill<float>(*modulationSpan, region->pan);
|
||||
resources.midiState.additiveModifiers(region->panCC, *modulationSpan, *tempSpan);
|
||||
for (auto& mod : region->panCC) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
|
||||
add<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
pan<float>(*modulationSpan, leftBuffer, rightBuffer);
|
||||
|
||||
// Apply the width/position process
|
||||
// widthModulation(*modulationSpan);
|
||||
fill<float>(*modulationSpan, region->width);
|
||||
resources.midiState.additiveModifiers(region->widthCC, *modulationSpan, *tempSpan);
|
||||
for (auto& mod : region->widthCC) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
|
||||
add<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
width<float>(*modulationSpan, leftBuffer, rightBuffer);
|
||||
|
||||
// positionModulation(*modulationSpan);
|
||||
fill<float>(*modulationSpan, region->position);
|
||||
resources.midiState.additiveModifiers(region->positionCC, *modulationSpan, *tempSpan);
|
||||
for (auto& mod : region->positionCC) {
|
||||
resources.midiState.linearEnvelope(mod, *tempSpan, gainModifier<float>);
|
||||
add<float>(*tempSpan, *modulationSpan);
|
||||
}
|
||||
pan<float>(*modulationSpan, leftBuffer, rightBuffer);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue