221 |
} |
} |
222 |
|
|
223 |
const uint8_t pan = (pSignalUnitRack) ? pSignalUnitRack->GetEndpointUnit()->CalculatePan(MIDIPan) : MIDIPan; |
const uint8_t pan = (pSignalUnitRack) ? pSignalUnitRack->GetEndpointUnit()->CalculatePan(MIDIPan) : MIDIPan; |
224 |
NotePanLeft = (pNote) ? AbstractEngine::PanCurveValueNorm(pNote->Override.Pan, 0 /*left*/ ) : 1.f; |
for (int c = 0; c < 2; ++c) { |
225 |
NotePanRight = (pNote) ? AbstractEngine::PanCurveValueNorm(pNote->Override.Pan, 1 /*right*/) : 1.f; |
float value = (pNote) ? AbstractEngine::PanCurveValueNorm(pNote->Override.Pan, c) : 1.f; |
226 |
|
NotePan[c].setCurveOnly(pNote ? pNote->Override.PanCurve : DEFAULT_FADE_CURVE); |
227 |
|
NotePan[c].setCurrentValue(value); |
228 |
|
NotePan[c].setDefaultDuration(pNote ? pNote->Override.PanTime : DEFAULT_NOTE_PAN_TIME_S); |
229 |
|
} |
230 |
|
|
231 |
PanLeftSmoother.trigger( |
PanLeftSmoother.trigger( |
232 |
AbstractEngine::PanCurve[128 - pan] * NotePanLeft, |
AbstractEngine::PanCurve[128 - pan], |
233 |
quickRampRate //NOTE: maybe we should have 2 separate pan smoothers, one for MIDI CC10 (with slow rate) and one for instrument script change_pan() calls (with fast rate) |
quickRampRate //NOTE: maybe we should have 2 separate pan smoothers, one for MIDI CC10 (with slow rate) and one for instrument script change_pan() calls (with fast rate) |
234 |
); |
); |
235 |
PanRightSmoother.trigger( |
PanRightSmoother.trigger( |
236 |
AbstractEngine::PanCurve[pan] * NotePanRight, |
AbstractEngine::PanCurve[pan], |
237 |
quickRampRate //NOTE: maybe we should have 2 separate pan smoothers, one for MIDI CC10 (with slow rate) and one for instrument script change_pan() calls (with fast rate) |
quickRampRate //NOTE: maybe we should have 2 separate pan smoothers, one for MIDI CC10 (with slow rate) and one for instrument script change_pan() calls (with fast rate) |
238 |
); |
); |
239 |
|
|
253 |
} else { |
} else { |
254 |
finalVolume = pEngineChannel->MidiVolume * crossfadeVolume * pSignalUnitRack->GetEndpointUnit()->GetVolume(); |
finalVolume = pEngineChannel->MidiVolume * crossfadeVolume * pSignalUnitRack->GetEndpointUnit()->GetVolume(); |
255 |
} |
} |
256 |
|
finalVolume *= NoteVolume.currentValue(); |
257 |
|
|
258 |
finalSynthesisParameters.fFinalVolumeLeft = finalVolume * VolumeLeft * PanLeftSmoother.render(); |
finalSynthesisParameters.fFinalVolumeLeft = finalVolume * VolumeLeft * PanLeftSmoother.render() * NotePan[0].currentValue(); |
259 |
finalSynthesisParameters.fFinalVolumeRight = finalVolume * VolumeRight * PanRightSmoother.render(); |
finalSynthesisParameters.fFinalVolumeRight = finalVolume * VolumeRight * PanRightSmoother.render() * NotePan[1].currentValue(); |
260 |
} |
} |
261 |
#endif |
#endif |
262 |
#endif |
#endif |
474 |
uint8_t pan = MIDIPan; |
uint8_t pan = MIDIPan; |
475 |
if (pSignalUnitRack != NULL) pan = pSignalUnitRack->GetEndpointUnit()->CalculatePan(MIDIPan); |
if (pSignalUnitRack != NULL) pan = pSignalUnitRack->GetEndpointUnit()->CalculatePan(MIDIPan); |
476 |
|
|
477 |
PanLeftSmoother.update(AbstractEngine::PanCurve[128 - pan] * NotePanLeft); |
PanLeftSmoother.update(AbstractEngine::PanCurve[128 - pan]); |
478 |
PanRightSmoother.update(AbstractEngine::PanCurve[pan] * NotePanRight); |
PanRightSmoother.update(AbstractEngine::PanCurve[pan]); |
479 |
|
|
480 |
finalSynthesisParameters.fFinalPitch = Pitch.PitchBase * Pitch.PitchBend * NotePitch.render(); |
finalSynthesisParameters.fFinalPitch = Pitch.PitchBase * Pitch.PitchBend * NotePitch.render(); |
481 |
|
|
580 |
finalSynthesisParameters.uiToGo = iSubFragmentEnd - i; |
finalSynthesisParameters.uiToGo = iSubFragmentEnd - i; |
581 |
#ifdef CONFIG_INTERPOLATE_VOLUME |
#ifdef CONFIG_INTERPOLATE_VOLUME |
582 |
finalSynthesisParameters.fFinalVolumeDeltaLeft = |
finalSynthesisParameters.fFinalVolumeDeltaLeft = |
583 |
(fFinalVolume * VolumeLeft * PanLeftSmoother.render() - |
(fFinalVolume * VolumeLeft * PanLeftSmoother.render() * NotePan[0].render() - |
584 |
finalSynthesisParameters.fFinalVolumeLeft) / finalSynthesisParameters.uiToGo; |
finalSynthesisParameters.fFinalVolumeLeft) / finalSynthesisParameters.uiToGo; |
585 |
finalSynthesisParameters.fFinalVolumeDeltaRight = |
finalSynthesisParameters.fFinalVolumeDeltaRight = |
586 |
(fFinalVolume * VolumeRight * PanRightSmoother.render() - |
(fFinalVolume * VolumeRight * PanRightSmoother.render() * NotePan[1].render() - |
587 |
finalSynthesisParameters.fFinalVolumeRight) / finalSynthesisParameters.uiToGo; |
finalSynthesisParameters.fFinalVolumeRight) / finalSynthesisParameters.uiToGo; |
588 |
#else |
#else |
589 |
finalSynthesisParameters.fFinalVolumeLeft = |
finalSynthesisParameters.fFinalVolumeLeft = |
590 |
fFinalVolume * VolumeLeft * PanLeftSmoother.render(); |
fFinalVolume * VolumeLeft * PanLeftSmoother.render() * NotePan[0].render(); |
591 |
finalSynthesisParameters.fFinalVolumeRight = |
finalSynthesisParameters.fFinalVolumeRight = |
592 |
fFinalVolume * VolumeRight * PanRightSmoother.render(); |
fFinalVolume * VolumeRight * PanRightSmoother.render() * NotePan[1].render(); |
593 |
#endif |
#endif |
594 |
// render audio for one subfragment |
// render audio for one subfragment |
595 |
if (!delay) RunSynthesisFunction(SynthesisMode, &finalSynthesisParameters, &loop); |
if (!delay) RunSynthesisFunction(SynthesisMode, &finalSynthesisParameters, &loop); |
780 |
NotePitch.setCurve((fade_curve_t)itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
NotePitch.setCurve((fade_curve_t)itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
781 |
break; |
break; |
782 |
case Event::synth_param_pan: |
case Event::synth_param_pan: |
783 |
NotePanLeft = AbstractEngine::PanCurveValueNorm(itEvent->Param.NoteSynthParam.AbsValue, 0 /*left*/); |
NotePan[0].fadeTo( |
784 |
NotePanRight = AbstractEngine::PanCurveValueNorm(itEvent->Param.NoteSynthParam.AbsValue, 1 /*right*/); |
AbstractEngine::PanCurveValueNorm(itEvent->Param.NoteSynthParam.AbsValue, 0 /*left*/), |
785 |
|
GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE |
786 |
|
); |
787 |
|
NotePan[1].fadeTo( |
788 |
|
AbstractEngine::PanCurveValueNorm(itEvent->Param.NoteSynthParam.AbsValue, 1 /*right*/), |
789 |
|
GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE |
790 |
|
); |
791 |
|
break; |
792 |
|
case Event::synth_param_pan_time: |
793 |
|
NotePan[0].setDefaultDuration(itEvent->Param.NoteSynthParam.AbsValue); |
794 |
|
NotePan[1].setDefaultDuration(itEvent->Param.NoteSynthParam.AbsValue); |
795 |
|
break; |
796 |
|
case Event::synth_param_pan_curve: |
797 |
|
NotePan[0].setCurve((fade_curve_t)itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
798 |
|
NotePan[1].setCurve((fade_curve_t)itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
799 |
break; |
break; |
800 |
case Event::synth_param_cutoff: |
case Event::synth_param_cutoff: |
801 |
NoteCutoff = itEvent->Param.NoteSynthParam.AbsValue; |
NoteCutoff = itEvent->Param.NoteSynthParam.AbsValue; |