--- linuxsampler/trunk/src/engines/sfz/SfzSignalUnitRack.cpp 2011/07/28 17:17:42 2221 +++ linuxsampler/trunk/src/engines/sfz/SfzSignalUnitRack.cpp 2011/08/03 09:12:09 2226 @@ -78,13 +78,38 @@ GetSampleRate()); } + + void FilEGUnit::Trigger() { + ::sfz::Region* const pRegion = pVoice->pRegion; + depth = pRegion->fileg_depth; + + // the length of the decay and release curves are dependent on the velocity + const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity); + + // set the delay trigger + uiDelayTrigger = (pRegion->fileg_delay + pRegion->fileg_vel2delay * velrelease) * GetSampleRate(); + + EG.trigger(uint(pRegion->fileg_start * 10), + std::max(0.0, pRegion->fileg_attack + pRegion->fileg_vel2attack * velrelease), + std::max(0.0, pRegion->fileg_hold + pRegion->fileg_vel2hold * velrelease), + std::max(0.0, pRegion->fileg_decay + pRegion->fileg_vel2decay * velrelease), + uint(std::min(std::max(0.0, 10 * (pRegion->fileg_sustain + pRegion->fileg_vel2sustain * velrelease)), 1000.0)), + std::max(0.0, pRegion->fileg_release + pRegion->fileg_vel2release * velrelease), + GetSampleRate()); + } + + + LFOUnit::LFOUnit(const LFOUnit& Unit): SfzSignalUnit(Unit), suFadeEG(static_cast(Unit.pRack)) { + Copy(Unit); + } void LFOUnit::Increment() { if (DelayStage()) return; SignalUnit::Increment(); - Level = lfo.render(); + Level = pLFO->Render(); + if (suFadeEG.Active()) Level *= suFadeEG.GetLevel(); } void LFOUnit::Trigger() { @@ -93,6 +118,18 @@ // set the delay trigger uiDelayTrigger = pLfoInfo->delay * GetSampleRate(); + if(pLfoInfo->fade != 0 || !pLfoInfo->fade_oncc.empty()) { + float f = pLfoInfo->fade; + for (int i = 0; i < pLfoInfo->fade_oncc.size(); i++) { + int val = pVoice->GetControllerValue(pLfoInfo->fade_oncc[i].Controller); + f += (val / 127.0f) * pLfoInfo->fade_oncc[i].Influence; + } + + if (f != 0) { + suFadeEG.uiDelayTrigger = pLfoInfo->delay * GetSampleRate(); + suFadeEG.EG.trigger(0, f, 0, 0, 1000, 0, GetSampleRate()); + } + } } void LFOv1Unit::Trigger() { @@ -106,21 +143,48 @@ lfo.update(0); } + + LFOv2Unit::LFOv2Unit(SfzSignalUnitRack* rack) + : LFOUnit(rack), lfos(8), lfo0(1200.0f), lfo1(1200.0f), lfo2(1200.0f), + lfo3(1200.0f), lfo4(1200.0f), lfo5(1200.0f), lfo6(1200.0f), lfo7(1200.0f), + suPitchOnCC(rack) + { + lfos.add(&lfo0); + lfos.add(&lfo1); + lfos.add(&lfo2); + lfos.add(&lfo3); + lfos.add(&lfo4); + lfos.add(&lfo5); + lfos.add(&lfo6); + lfos.add(&lfo7); + } + void LFOv2Unit::Trigger() { LFOUnit::Trigger(); - lfo.trigger ( + if (pLfoInfo->wave < 0 || pLfoInfo->wave >= lfos.size()) pLFO = &lfo0; + else pLFO = lfos[pLfoInfo->wave]; + + pLFO->Trigger ( pLfoInfo->freq, start_level_mid, 1, 0, false, GetSampleRate() ); - lfo.update(0); + pLFO->Update(0); + + float phase = pLfoInfo->phase; + for (int i = 0; i < pLfoInfo->phase_oncc.size(); i++) { + int val = pVoice->GetControllerValue(pLfoInfo->phase_oncc[i].Controller); + phase += (val / 127.0f) * pLfoInfo->phase_oncc[i].Influence; + } + if (phase != 0) pLFO->SetPhase(phase); } void AmpLFOUnit::Trigger() { ::sfz::Region* const pRegion = pVoice->pRegion; - pLfoInfo->delay = pRegion->amplfo_delay; - pLfoInfo->freq = pRegion->amplfo_freq; + pLfoInfo->delay = pRegion->amplfo_delay; + pLfoInfo->freq = pRegion->amplfo_freq; + pLfoInfo->fade = pRegion->amplfo_fade; pLfoInfo->volume = pRegion->amplfo_depth; LFOv1Unit::Trigger(); @@ -129,7 +193,8 @@ void PitchLFOUnit::Trigger() { ::sfz::Region* const pRegion = pVoice->pRegion; pLfoInfo->delay = pRegion->pitchlfo_delay; - pLfoInfo->freq = pRegion->pitchlfo_freq; + pLfoInfo->freq = pRegion->pitchlfo_freq; + pLfoInfo->fade = pRegion->pitchlfo_fade; pLfoInfo->pitch = pRegion->pitchlfo_depth; LFOv1Unit::Trigger(); @@ -137,12 +202,36 @@ void FilLFOUnit::Trigger() { ::sfz::Region* const pRegion = pVoice->pRegion; - pLfoInfo->delay = pRegion->fillfo_delay; - pLfoInfo->freq = pRegion->fillfo_freq; + pLfoInfo->delay = pRegion->fillfo_delay; + pLfoInfo->freq = pRegion->fillfo_freq; + pLfoInfo->fade = pRegion->fillfo_fade; pLfoInfo->cutoff = pRegion->fillfo_depth; LFOv1Unit::Trigger(); } + + CCUnit::CCUnit(SfzSignalUnitRack* rack): CCSignalUnit(rack) { } + + void CCUnit::Trigger() { + for (int i = 0; i < Ctrls.size(); i++) { + Ctrls[i].Value = pVoice->GetControllerValue(Ctrls[i].Controller); + } + CCSignalUnit::Trigger(); + } + + void CCUnit::SetCCs(::sfz::Array& cc) { + RemoveAllCCs(); + for (int i = 0; i < 128; i++) { + if (cc[i] != 0) AddCC(i, cc[i]); + } + } + + void CCUnit::SetCCs(ArrayList< ::sfz::CC>& cc) { + RemoveAllCCs(); + for (int i = 0; i < cc.size(); i++) { + if (cc[i].Influence != 0) AddCC(cc[i].Controller, cc[i].Influence); + } + } EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack) { @@ -189,6 +278,9 @@ FilLFOUnit* u = &(GetRack()->suFilLFO); val = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->pLfoInfo->cutoff) : 1; + FilEGUnit* u2 = &(GetRack()->suFilEG); + val *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * u2->depth) : 1; + for (int i = 0; i < GetRack()->filLFOs.size(); i++) { LFOv2Unit* lfo = GetRack()->filLFOs[i]; if (!lfo->Active()) continue; @@ -206,7 +298,17 @@ p = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->depth) : 1; PitchLFOUnit* u2 = &(GetRack()->suPitchLFO); - p *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * u2->pLfoInfo->pitch) : 1; + CCSignalUnit* u3 = &(GetRack()->suPitchLFO.suDepthCC); + float f = u3->Active() ? u3->GetLevel() : 0; + p *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * (u2->pLfoInfo->pitch + f)) : 1; + + for (int i = 0; i < GetRack()->pitchLFOs.size(); i++) { + LFOv2Unit* lfo = GetRack()->pitchLFOs[i]; + if (!lfo->Active()) continue; + + float f = lfo->suPitchOnCC.Active() ? lfo->suPitchOnCC.GetLevel() : 0; + p *= RTMath::CentsToFreqRatioUnlimited(lfo->GetLevel() * (lfo->pLfoInfo->pitch + f)); + } return p; } @@ -242,13 +344,16 @@ SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice) - : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suPitchEG(this), + : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this), EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), suAmpLFO(this), suPitchLFO(this), suFilLFO(this), - LFOs(maxLfoCount), filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) + LFOs(maxLfoCount), pitchLFOs(maxLfoCount), filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) { - suEndpoint.pVoice = suVolEG.pVoice = suPitchEG.pVoice = voice; + suEndpoint.pVoice = suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice; suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = voice; + suPitchLFO.suDepthCC.pVoice = suPitchLFO.suFadeEG.pVoice = voice; + suFilLFO.suFadeEG.pVoice = voice; + suAmpLFO.suFadeEG.pVoice = voice; for (int i = 0; i < EGs.capacity(); i++) { EGs[i] = new EGv2Unit(this); @@ -258,6 +363,8 @@ for (int i = 0; i < LFOs.capacity(); i++) { LFOs[i] = new LFOv2Unit(this); LFOs[i]->pVoice = voice; + LFOs[i]->suFadeEG.pVoice = voice; + LFOs[i]->suPitchOnCC.pVoice = voice; } } @@ -277,6 +384,7 @@ pitchEGs.clear(); LFOs.clear(); + pitchLFOs.clear(); filLFOs.clear(); resLFOs.clear(); panLFOs.clear(); @@ -311,8 +419,14 @@ LFOv2Unit lfo(this); lfo.pLfoInfo = &(pRegion->lfos[i]); LFOs.increment()->Copy(lfo); + LFOs[LFOs.size() - 1]->suPitchOnCC.SetCCs(pRegion->lfos[i].pitch_oncc); } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; } + if (pRegion->lfos[i].pitch != 0 || !pRegion->lfos[i].pitch_oncc.empty()) { + if(pitchLFOs.size() < pitchLFOs.capacity()) pitchLFOs.add(LFOs[LFOs.size() - 1]); + else std::cerr << "Maximum number of LFOs reached!" << std::endl; + } + if (pRegion->lfos[i].cutoff != 0) { if(filLFOs.size() < filLFOs.capacity()) filLFOs.add(LFOs[LFOs.size() - 1]); else std::cerr << "Maximum number of LFOs reached!" << std::endl; @@ -329,13 +443,20 @@ } } + suPitchLFO.suDepthCC.SetCCs(pRegion->pitchlfo_depthcc); + Units.clear(); Units.add(&suVolEG); + Units.add(&suFilEG); Units.add(&suPitchEG); Units.add(&suPitchLFO); + Units.add(&suPitchLFO.suDepthCC); + Units.add(&suPitchLFO.suFadeEG); Units.add(&suAmpLFO); + Units.add(&suAmpLFO.suFadeEG); Units.add(&suFilLFO); + Units.add(&suFilLFO.suFadeEG); for (int i = 0; i < EGs.size(); i++) { Units.add(EGs[i]); @@ -343,6 +464,8 @@ for (int i = 0; i < LFOs.size(); i++) { Units.add(LFOs[i]); + Units.add(&(LFOs[i]->suFadeEG)); + Units.add(&(LFOs[i]->suPitchOnCC)); } Units.add(&suEndpoint);