Remove the helpers in the midi class and be explicit in the process

This commit is contained in:
Paul Ferrand 2020-03-30 19:58:32 +02:00
parent eac0c0e804
commit 0da5c43bb5
2 changed files with 44 additions and 31 deletions

View file

@ -154,26 +154,6 @@ public:
return returnedValue; 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; const EventVector& getEvents(int ccIdx) const noexcept;
template<class T, class F> template<class T, class F>

View file

@ -275,15 +275,23 @@ void sfz::Voice::ampStageMono(AudioSpan<float> buffer) noexcept
// Amplitude envelope // Amplitude envelope
fill<float>(*modulationSpan, baseGain); 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()); DBG("Final gain: " << modulationSpan->back());
applyGain<float>(*modulationSpan, leftBuffer); applyGain<float>(*modulationSpan, leftBuffer);
// Crossfade envelopes // Crossfade envelopes
// crossfadeEnvelope.getBlock(modulationSpan);
fill<float>(*modulationSpan, 1.0f); fill<float>(*modulationSpan, 1.0f);
resources.midiState.multiplicativeModifiers(region->crossfadeCCInRange, *modulationSpan, *tempSpan, xfinBind); for (auto& mod : region->crossfadeCCInRange) {
resources.midiState.multiplicativeModifiers(region->crossfadeCCOutRange, *modulationSpan, *tempSpan, xfoutBind); 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()); DBG("XF: " << modulationSpan->back());
applyGain<float>(*modulationSpan, leftBuffer); 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 xfinBind = std::bind(crossfadeIn<float, float>, _1, _2, region->crossfadeCCCurve);
const auto xfoutBind = std::bind(crossfadeIn<float, float>, _1, _2, region->crossfadeCCCurve); const auto xfoutBind = std::bind(crossfadeIn<float, float>, _1, _2, region->crossfadeCCCurve);
// Amplitude envelope // Amplitude envelope
fill<float>(*modulationSpan, baseGain); 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); buffer.applyGain(*modulationSpan);
// Crossfade envelopes // Crossfade envelopes
fill<float>(*modulationSpan, 1.0f); fill<float>(*modulationSpan, 1.0f);
resources.midiState.multiplicativeModifiers(region->crossfadeCCInRange, *modulationSpan, *tempSpan, xfinBind); for (auto& mod : region->crossfadeCCInRange) {
resources.midiState.multiplicativeModifiers(region->crossfadeCCOutRange, *modulationSpan, *tempSpan, xfoutBind); 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); buffer.applyGain(*modulationSpan);
// Volume envelope // Volume envelope
@ -349,7 +370,10 @@ void sfz::Voice::panStageMono(AudioSpan<float> buffer) noexcept
// Apply panning // Apply panning
fill<float>(*modulationSpan, region->pan); 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()); DBG("Pan: " << modulationSpan->back());
pan<float>(*modulationSpan, leftBuffer, rightBuffer); pan<float>(*modulationSpan, leftBuffer, rightBuffer);
} }
@ -369,18 +393,27 @@ void sfz::Voice::panStageStereo(AudioSpan<float> buffer) noexcept
// Apply panning // Apply panning
// panningModulation(*modulationSpan); // panningModulation(*modulationSpan);
fill<float>(*modulationSpan, region->pan); 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); pan<float>(*modulationSpan, leftBuffer, rightBuffer);
// Apply the width/position process // Apply the width/position process
// widthModulation(*modulationSpan); // widthModulation(*modulationSpan);
fill<float>(*modulationSpan, region->width); 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); width<float>(*modulationSpan, leftBuffer, rightBuffer);
// positionModulation(*modulationSpan); // positionModulation(*modulationSpan);
fill<float>(*modulationSpan, region->position); 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); pan<float>(*modulationSpan, leftBuffer, rightBuffer);
} }