/[svn]/linuxsampler/trunk/src/engines/gig/Voice.cpp
ViewVC logotype

Annotation of /linuxsampler/trunk/src/engines/gig/Voice.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1923 - (hide annotations) (download)
Sat Jun 27 16:55:41 2009 UTC (14 years, 9 months ago) by persson
File size: 51138 byte(s)
* fixed crash happening when a pitch bend event arrived at the same
  time a new instrument was loading
* fixed building with sqlite installed in a non-standard directory

1 schoenebeck 53 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 schoenebeck 56 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 schoenebeck 1857 * Copyright (C) 2005 - 2009 Christian Schoenebeck *
7 schoenebeck 53 * *
8     * This program is free software; you can redistribute it and/or modify *
9     * it under the terms of the GNU General Public License as published by *
10     * the Free Software Foundation; either version 2 of the License, or *
11     * (at your option) any later version. *
12     * *
13     * This program is distributed in the hope that it will be useful, *
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16     * GNU General Public License for more details. *
17     * *
18     * You should have received a copy of the GNU General Public License *
19     * along with this program; if not, write to the Free Software *
20     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21     * MA 02111-1307 USA *
22     ***************************************************************************/
23    
24 schoenebeck 319 #include "../../common/Features.h"
25     #include "Synthesizer.h"
26 schoenebeck 770 #include "Profiler.h"
27 schoenebeck 53
28     #include "Voice.h"
29    
30     namespace LinuxSampler { namespace gig {
31    
32     Voice::Voice() {
33     pEngine = NULL;
34     pDiskThread = NULL;
35 schoenebeck 285 PlaybackState = playback_state_end;
36 schoenebeck 738 pLFO1 = new LFOUnsigned(1.0f); // amplitude EG (0..1 range)
37     pLFO2 = new LFOUnsigned(1.0f); // filter EG (0..1 range)
38     pLFO3 = new LFOSigned(1200.0f); // pitch EG (-1200..+1200 range)
39 schoenebeck 239 KeyGroup = 0;
40 schoenebeck 361 SynthesisMode = 0; // set all mode bits to 0 first
41 schoenebeck 1259 // select synthesis implementation (asm core is not supported ATM)
42     #if 0 // CONFIG_ASM && ARCH_X86
43 schoenebeck 319 SYNTHESIS_MODE_SET_IMPLEMENTATION(SynthesisMode, Features::supportsMMX() && Features::supportsSSE());
44 schoenebeck 361 #else
45     SYNTHESIS_MODE_SET_IMPLEMENTATION(SynthesisMode, false);
46     #endif
47 schoenebeck 770 SYNTHESIS_MODE_SET_PROFILING(SynthesisMode, Profiler::isEnabled());
48 schoenebeck 368
49 schoenebeck 770 finalSynthesisParameters.filterLeft.Reset();
50     finalSynthesisParameters.filterRight.Reset();
51 schoenebeck 53 }
52    
53     Voice::~Voice() {
54     if (pLFO1) delete pLFO1;
55     if (pLFO2) delete pLFO2;
56     if (pLFO3) delete pLFO3;
57     }
58    
59     void Voice::SetEngine(Engine* pEngine) {
60 schoenebeck 738 this->pEngine = pEngine;
61 schoenebeck 53 this->pDiskThread = pEngine->pDiskThread;
62 schoenebeck 64 dmsg(6,("Voice::SetEngine()\n"));
63 schoenebeck 53 }
64    
65     /**
66     * Initializes and triggers the voice, a disk stream will be launched if
67     * needed.
68     *
69 schoenebeck 669 * @param pEngineChannel - engine channel on which this voice was ordered
70     * @param itNoteOnEvent - event that caused triggering of this voice
71     * @param PitchBend - MIDI detune factor (-8192 ... +8191)
72     * @param pDimRgn - points to the dimension region which provides sample wave(s) and articulation data
73     * @param VoiceType - type of this voice
74     * @param iKeyGroup - a value > 0 defines a key group in which this voice is member of
75 schoenebeck 354 * @returns 0 on success, a value < 0 if the voice wasn't triggered
76     * (either due to an error or e.g. because no region is
77     * defined for the given key)
78 schoenebeck 53 */
79 schoenebeck 669 int Voice::Trigger(EngineChannel* pEngineChannel, Pool<Event>::Iterator& itNoteOnEvent, int PitchBend, ::gig::DimensionRegion* pDimRgn, type_t VoiceType, int iKeyGroup) {
80 schoenebeck 411 this->pEngineChannel = pEngineChannel;
81 schoenebeck 669 this->pDimRgn = pDimRgn;
82 persson 1038 Orphan = false;
83 schoenebeck 669
84 schoenebeck 563 #if CONFIG_DEVMODE
85     if (itNoteOnEvent->FragmentPos() > pEngine->MaxSamplesPerCycle) { // just a sanity check for debugging
86 schoenebeck 319 dmsg(1,("Voice::Trigger(): ERROR, TriggerDelay > Totalsamples\n"));
87     }
88 schoenebeck 563 #endif // CONFIG_DEVMODE
89 schoenebeck 53
90 schoenebeck 669 Type = VoiceType;
91 schoenebeck 271 MIDIKey = itNoteOnEvent->Param.Note.Key;
92 schoenebeck 563 PlaybackState = playback_state_init; // mark voice as triggered, but no audio rendered yet
93 schoenebeck 271 Delay = itNoteOnEvent->FragmentPos();
94     itTriggerEvent = itNoteOnEvent;
95     itKillEvent = Pool<Event>::Iterator();
96 schoenebeck 669 KeyGroup = iKeyGroup;
97     pSample = pDimRgn->pSample; // sample won't change until the voice is finished
98 schoenebeck 53
99 persson 630 // calculate volume
100     const double velocityAttenuation = pDimRgn->GetVelocityAttenuation(itNoteOnEvent->Param.Note.Velocity);
101    
102 persson 903 // For 16 bit samples, we downscale by 32768 to convert from
103     // int16 value range to DSP value range (which is
104     // -1.0..1.0). For 24 bit, we downscale from int32.
105     float volume = velocityAttenuation / (pSample->BitDepth == 16 ? 32768.0f : 32768.0f * 65536.0f);
106 persson 630
107 persson 1010 volume *= pDimRgn->SampleAttenuation * pEngineChannel->GlobalVolume * GLOBAL_VOLUME;
108 persson 630
109     // the volume of release triggered samples depends on note length
110 schoenebeck 669 if (Type == type_release_trigger) {
111 persson 630 float noteLength = float(pEngine->FrameTime + Delay -
112     pEngineChannel->pMIDIKeyInfo[MIDIKey].NoteOnTime) / pEngine->SampleRate;
113     float attenuation = 1 - 0.01053 * (256 >> pDimRgn->ReleaseTriggerDecay) * noteLength;
114     if (attenuation <= 0) return -1;
115 persson 832 volume *= attenuation;
116 persson 630 }
117    
118 schoenebeck 319 // select channel mode (mono or stereo)
119     SYNTHESIS_MODE_SET_CHANNELS(SynthesisMode, pSample->Channels == 2);
120 persson 903 // select bit depth (16 or 24)
121     SYNTHESIS_MODE_SET_BITDEPTH24(SynthesisMode, pSample->BitDepth == 24);
122 schoenebeck 319
123 schoenebeck 236 // get starting crossfade volume level
124 persson 832 float crossfadeVolume;
125 schoenebeck 236 switch (pDimRgn->AttenuationController.type) {
126     case ::gig::attenuation_ctrl_t::type_channelaftertouch:
127 persson 903 crossfadeVolume = Engine::CrossfadeCurve[CrossfadeAttenuation(pEngineChannel->ControllerTable[128])];
128 schoenebeck 236 break;
129     case ::gig::attenuation_ctrl_t::type_velocity:
130 persson 832 crossfadeVolume = Engine::CrossfadeCurve[CrossfadeAttenuation(itNoteOnEvent->Param.Note.Velocity)];
131 schoenebeck 236 break;
132     case ::gig::attenuation_ctrl_t::type_controlchange: //FIXME: currently not sample accurate
133 persson 832 crossfadeVolume = Engine::CrossfadeCurve[CrossfadeAttenuation(pEngineChannel->ControllerTable[pDimRgn->AttenuationController.controller_number])];
134 schoenebeck 236 break;
135     case ::gig::attenuation_ctrl_t::type_none: // no crossfade defined
136     default:
137 persson 832 crossfadeVolume = 1.0f;
138 schoenebeck 236 }
139    
140 persson 832 VolumeLeft = volume * Engine::PanCurve[64 - pDimRgn->Pan];
141     VolumeRight = volume * Engine::PanCurve[64 + pDimRgn->Pan];
142 schoenebeck 245
143 persson 832 float subfragmentRate = pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;
144     CrossfadeSmoother.trigger(crossfadeVolume, subfragmentRate);
145 persson 1010 VolumeSmoother.trigger(pEngineChannel->MidiVolume, subfragmentRate);
146 persson 832 PanLeftSmoother.trigger(pEngineChannel->GlobalPanLeft, subfragmentRate);
147     PanRightSmoother.trigger(pEngineChannel->GlobalPanRight, subfragmentRate);
148    
149 schoenebeck 770 finalSynthesisParameters.dPos = pDimRgn->SampleStartOffset; // offset where we should start playback of sample (0 - 2000 sample points)
150 persson 783 Pos = pDimRgn->SampleStartOffset;
151 schoenebeck 236
152 schoenebeck 53 // Check if the sample needs disk streaming or is too short for that
153     long cachedsamples = pSample->GetCache().Size / pSample->FrameSize;
154     DiskVoice = cachedsamples < pSample->SamplesTotal;
155    
156 persson 865 const DLS::sample_loop_t& loopinfo = pDimRgn->pSampleLoops[0];
157    
158 schoenebeck 53 if (DiskVoice) { // voice to be streamed from disk
159 persson 1895 if (cachedsamples > (pEngine->MaxSamplesPerCycle << CONFIG_MAX_PITCH)) {
160     MaxRAMPos = cachedsamples - (pEngine->MaxSamplesPerCycle << CONFIG_MAX_PITCH) / pSample->Channels; //TODO: this calculation is too pessimistic and may better be moved to Render() method, so it calculates MaxRAMPos dependent to the current demand of sample points to be rendered (e.g. in case of JACK)
161     } else {
162     // The cache is too small to fit a max sample buffer.
163     // Setting MaxRAMPos to 0 will probably cause a click
164     // in the audio, but it's better than not handling
165     // this case at all, which would have caused the
166     // unsigned MaxRAMPos to be set to a negative number.
167     MaxRAMPos = 0;
168     }
169 schoenebeck 53
170     // check if there's a loop defined which completely fits into the cached (RAM) part of the sample
171 persson 865 RAMLoop = (pDimRgn->SampleLoops && (loopinfo.LoopStart + loopinfo.LoopLength) <= MaxRAMPos);
172 schoenebeck 53
173 persson 865 if (pDiskThread->OrderNewStream(&DiskStreamRef, pDimRgn, MaxRAMPos, !RAMLoop) < 0) {
174 schoenebeck 53 dmsg(1,("Disk stream order failed!\n"));
175 schoenebeck 239 KillImmediately();
176 schoenebeck 53 return -1;
177     }
178     dmsg(4,("Disk voice launched (cached samples: %d, total Samples: %d, MaxRAMPos: %d, RAMLooping: %s)\n", cachedsamples, pSample->SamplesTotal, MaxRAMPos, (RAMLoop) ? "yes" : "no"));
179     }
180     else { // RAM only voice
181     MaxRAMPos = cachedsamples;
182 persson 865 RAMLoop = (pDimRgn->SampleLoops != 0);
183 schoenebeck 53 dmsg(4,("RAM only voice launched (Looping: %s)\n", (RAMLoop) ? "yes" : "no"));
184     }
185 persson 799 if (RAMLoop) {
186     loop.uiTotalCycles = pSample->LoopPlayCount;
187     loop.uiCyclesLeft = pSample->LoopPlayCount;
188 persson 865 loop.uiStart = loopinfo.LoopStart;
189     loop.uiEnd = loopinfo.LoopStart + loopinfo.LoopLength;
190     loop.uiSize = loopinfo.LoopLength;
191 persson 799 }
192 schoenebeck 53
193     // calculate initial pitch value
194     {
195 persson 1858 double pitchbasecents = pEngineChannel->pInstrument->FineTune + pDimRgn->FineTune + pEngine->ScaleTuning[MIDIKey % 12];
196 persson 1700
197     // GSt behaviour: maximum transpose up is 40 semitones. If
198     // MIDI key is more than 40 semitones above unity note,
199     // the transpose is not done.
200     if (pDimRgn->PitchTrack && (MIDIKey - (int) pDimRgn->UnityNote) < 40) pitchbasecents += (MIDIKey - (int) pDimRgn->UnityNote) * 100;
201    
202 persson 1862 this->PitchBase = RTMath::CentsToFreqRatioUnlimited(pitchbasecents) * (double(pSample->SamplesPerSecond) / double(pEngine->SampleRate));
203 persson 1923 this->PitchBendRange = 1.0 / 8192.0 * 100.0 * pEngineChannel->pInstrument->PitchbendRange;
204     this->PitchBend = RTMath::CentsToFreqRatio(PitchBend * PitchBendRange);
205 schoenebeck 53 }
206    
207 persson 614 // the length of the decay and release curves are dependent on the velocity
208     const double velrelease = 1 / pDimRgn->GetVelocityRelease(itNoteOnEvent->Param.Note.Velocity);
209    
210 schoenebeck 53 // setup EG 1 (VCA EG)
211     {
212     // get current value of EG1 controller
213     double eg1controllervalue;
214     switch (pDimRgn->EG1Controller.type) {
215     case ::gig::eg1_ctrl_t::type_none: // no controller defined
216     eg1controllervalue = 0;
217     break;
218     case ::gig::eg1_ctrl_t::type_channelaftertouch:
219 persson 903 eg1controllervalue = pEngineChannel->ControllerTable[128];
220 schoenebeck 53 break;
221     case ::gig::eg1_ctrl_t::type_velocity:
222 schoenebeck 271 eg1controllervalue = itNoteOnEvent->Param.Note.Velocity;
223 schoenebeck 53 break;
224     case ::gig::eg1_ctrl_t::type_controlchange: // MIDI control change controller
225 schoenebeck 411 eg1controllervalue = pEngineChannel->ControllerTable[pDimRgn->EG1Controller.controller_number];
226 schoenebeck 53 break;
227     }
228     if (pDimRgn->EG1ControllerInvert) eg1controllervalue = 127 - eg1controllervalue;
229    
230 persson 696 // calculate influence of EG1 controller on EG1's parameters
231     // (eg1attack is different from the others)
232     double eg1attack = (pDimRgn->EG1ControllerAttackInfluence) ?
233     1 + 0.031 * (double) (pDimRgn->EG1ControllerAttackInfluence == 1 ?
234     1 : 1 << pDimRgn->EG1ControllerAttackInfluence) * eg1controllervalue : 1.0;
235     double eg1decay = (pDimRgn->EG1ControllerDecayInfluence) ? 1 + 0.00775 * (double) (1 << pDimRgn->EG1ControllerDecayInfluence) * eg1controllervalue : 1.0;
236     double eg1release = (pDimRgn->EG1ControllerReleaseInfluence) ? 1 + 0.00775 * (double) (1 << pDimRgn->EG1ControllerReleaseInfluence) * eg1controllervalue : 1.0;
237 schoenebeck 53
238 schoenebeck 738 EG1.trigger(pDimRgn->EG1PreAttack,
239     pDimRgn->EG1Attack * eg1attack,
240     pDimRgn->EG1Hold,
241     pDimRgn->EG1Decay1 * eg1decay * velrelease,
242     pDimRgn->EG1Decay2 * eg1decay * velrelease,
243     pDimRgn->EG1InfiniteSustain,
244     pDimRgn->EG1Sustain,
245     pDimRgn->EG1Release * eg1release * velrelease,
246     velocityAttenuation,
247     pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
248 schoenebeck 53 }
249    
250 persson 832 #ifdef CONFIG_INTERPOLATE_VOLUME
251 persson 830 // setup initial volume in synthesis parameters
252 persson 832 #ifdef CONFIG_PROCESS_MUTED_CHANNELS
253     if (pEngineChannel->GetMute()) {
254     finalSynthesisParameters.fFinalVolumeLeft = 0;
255     finalSynthesisParameters.fFinalVolumeRight = 0;
256     }
257     else
258     #else
259     {
260 persson 1010 float finalVolume = pEngineChannel->MidiVolume * crossfadeVolume * EG1.getLevel();
261 schoenebeck 53
262 persson 832 finalSynthesisParameters.fFinalVolumeLeft = finalVolume * VolumeLeft * pEngineChannel->GlobalPanLeft;
263     finalSynthesisParameters.fFinalVolumeRight = finalVolume * VolumeRight * pEngineChannel->GlobalPanRight;
264     }
265     #endif
266     #endif
267 persson 830
268 schoenebeck 53 // setup EG 2 (VCF Cutoff EG)
269     {
270     // get current value of EG2 controller
271     double eg2controllervalue;
272     switch (pDimRgn->EG2Controller.type) {
273     case ::gig::eg2_ctrl_t::type_none: // no controller defined
274     eg2controllervalue = 0;
275     break;
276     case ::gig::eg2_ctrl_t::type_channelaftertouch:
277 persson 903 eg2controllervalue = pEngineChannel->ControllerTable[128];
278 schoenebeck 53 break;
279     case ::gig::eg2_ctrl_t::type_velocity:
280 schoenebeck 271 eg2controllervalue = itNoteOnEvent->Param.Note.Velocity;
281 schoenebeck 53 break;
282     case ::gig::eg2_ctrl_t::type_controlchange: // MIDI control change controller
283 schoenebeck 411 eg2controllervalue = pEngineChannel->ControllerTable[pDimRgn->EG2Controller.controller_number];
284 schoenebeck 53 break;
285     }
286     if (pDimRgn->EG2ControllerInvert) eg2controllervalue = 127 - eg2controllervalue;
287    
288 persson 696 // calculate influence of EG2 controller on EG2's parameters
289     double eg2attack = (pDimRgn->EG2ControllerAttackInfluence) ? 1 + 0.00775 * (double) (1 << pDimRgn->EG2ControllerAttackInfluence) * eg2controllervalue : 1.0;
290     double eg2decay = (pDimRgn->EG2ControllerDecayInfluence) ? 1 + 0.00775 * (double) (1 << pDimRgn->EG2ControllerDecayInfluence) * eg2controllervalue : 1.0;
291     double eg2release = (pDimRgn->EG2ControllerReleaseInfluence) ? 1 + 0.00775 * (double) (1 << pDimRgn->EG2ControllerReleaseInfluence) * eg2controllervalue : 1.0;
292 schoenebeck 53
293 schoenebeck 738 EG2.trigger(pDimRgn->EG2PreAttack,
294     pDimRgn->EG2Attack * eg2attack,
295     false,
296     pDimRgn->EG2Decay1 * eg2decay * velrelease,
297     pDimRgn->EG2Decay2 * eg2decay * velrelease,
298     pDimRgn->EG2InfiniteSustain,
299     pDimRgn->EG2Sustain,
300     pDimRgn->EG2Release * eg2release * velrelease,
301     velocityAttenuation,
302     pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
303 schoenebeck 53 }
304    
305    
306     // setup EG 3 (VCO EG)
307     {
308 schoenebeck 829 // if portamento mode is on, we dedicate EG3 purely for portamento, otherwise if portamento is off we do as told by the patch
309     bool bPortamento = pEngineChannel->PortamentoMode && pEngineChannel->PortamentoPos >= 0.0f;
310     float eg3depth = (bPortamento)
311     ? RTMath::CentsToFreqRatio((pEngineChannel->PortamentoPos - (float) MIDIKey) * 100)
312     : RTMath::CentsToFreqRatio(pDimRgn->EG3Depth);
313     float eg3time = (bPortamento)
314     ? pEngineChannel->PortamentoTime
315     : pDimRgn->EG3Attack;
316     EG3.trigger(eg3depth, eg3time, pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
317     dmsg(5,("PortamentoPos=%f, depth=%f, time=%f\n", pEngineChannel->PortamentoPos, eg3depth, eg3time));
318 schoenebeck 53 }
319    
320    
321     // setup LFO 1 (VCA LFO)
322     {
323     uint16_t lfo1_internal_depth;
324     switch (pDimRgn->LFO1Controller) {
325     case ::gig::lfo1_ctrl_internal:
326     lfo1_internal_depth = pDimRgn->LFO1InternalDepth;
327     pLFO1->ExtController = 0; // no external controller
328 schoenebeck 687 bLFO1Enabled = (lfo1_internal_depth > 0);
329 schoenebeck 53 break;
330     case ::gig::lfo1_ctrl_modwheel:
331     lfo1_internal_depth = 0;
332     pLFO1->ExtController = 1; // MIDI controller 1
333 schoenebeck 687 bLFO1Enabled = (pDimRgn->LFO1ControlDepth > 0);
334 schoenebeck 53 break;
335     case ::gig::lfo1_ctrl_breath:
336     lfo1_internal_depth = 0;
337     pLFO1->ExtController = 2; // MIDI controller 2
338 schoenebeck 687 bLFO1Enabled = (pDimRgn->LFO1ControlDepth > 0);
339 schoenebeck 53 break;
340     case ::gig::lfo1_ctrl_internal_modwheel:
341     lfo1_internal_depth = pDimRgn->LFO1InternalDepth;
342     pLFO1->ExtController = 1; // MIDI controller 1
343 schoenebeck 687 bLFO1Enabled = (lfo1_internal_depth > 0 || pDimRgn->LFO1ControlDepth > 0);
344 schoenebeck 53 break;
345     case ::gig::lfo1_ctrl_internal_breath:
346     lfo1_internal_depth = pDimRgn->LFO1InternalDepth;
347     pLFO1->ExtController = 2; // MIDI controller 2
348 schoenebeck 687 bLFO1Enabled = (lfo1_internal_depth > 0 || pDimRgn->LFO1ControlDepth > 0);
349 schoenebeck 53 break;
350     default:
351     lfo1_internal_depth = 0;
352     pLFO1->ExtController = 0; // no external controller
353 schoenebeck 687 bLFO1Enabled = false;
354 schoenebeck 53 }
355 persson 841 if (bLFO1Enabled) {
356     pLFO1->trigger(pDimRgn->LFO1Frequency,
357 persson 922 start_level_min,
358 persson 841 lfo1_internal_depth,
359     pDimRgn->LFO1ControlDepth,
360     pDimRgn->LFO1FlipPhase,
361     pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
362     pLFO1->update(pLFO1->ExtController ? pEngineChannel->ControllerTable[pLFO1->ExtController] : 0);
363     }
364 schoenebeck 53 }
365    
366 schoenebeck 319
367 schoenebeck 53 // setup LFO 2 (VCF Cutoff LFO)
368     {
369     uint16_t lfo2_internal_depth;
370     switch (pDimRgn->LFO2Controller) {
371     case ::gig::lfo2_ctrl_internal:
372     lfo2_internal_depth = pDimRgn->LFO2InternalDepth;
373     pLFO2->ExtController = 0; // no external controller
374 schoenebeck 687 bLFO2Enabled = (lfo2_internal_depth > 0);
375 schoenebeck 53 break;
376     case ::gig::lfo2_ctrl_modwheel:
377     lfo2_internal_depth = 0;
378     pLFO2->ExtController = 1; // MIDI controller 1
379 schoenebeck 687 bLFO2Enabled = (pDimRgn->LFO2ControlDepth > 0);
380 schoenebeck 53 break;
381     case ::gig::lfo2_ctrl_foot:
382     lfo2_internal_depth = 0;
383     pLFO2->ExtController = 4; // MIDI controller 4
384 schoenebeck 687 bLFO2Enabled = (pDimRgn->LFO2ControlDepth > 0);
385 schoenebeck 53 break;
386     case ::gig::lfo2_ctrl_internal_modwheel:
387     lfo2_internal_depth = pDimRgn->LFO2InternalDepth;
388     pLFO2->ExtController = 1; // MIDI controller 1
389 schoenebeck 687 bLFO2Enabled = (lfo2_internal_depth > 0 || pDimRgn->LFO2ControlDepth > 0);
390 schoenebeck 53 break;
391     case ::gig::lfo2_ctrl_internal_foot:
392     lfo2_internal_depth = pDimRgn->LFO2InternalDepth;
393     pLFO2->ExtController = 4; // MIDI controller 4
394 schoenebeck 687 bLFO2Enabled = (lfo2_internal_depth > 0 || pDimRgn->LFO2ControlDepth > 0);
395 schoenebeck 53 break;
396     default:
397     lfo2_internal_depth = 0;
398     pLFO2->ExtController = 0; // no external controller
399 schoenebeck 687 bLFO2Enabled = false;
400 schoenebeck 53 }
401 persson 841 if (bLFO2Enabled) {
402     pLFO2->trigger(pDimRgn->LFO2Frequency,
403     start_level_max,
404     lfo2_internal_depth,
405     pDimRgn->LFO2ControlDepth,
406     pDimRgn->LFO2FlipPhase,
407     pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
408     pLFO2->update(pLFO2->ExtController ? pEngineChannel->ControllerTable[pLFO2->ExtController] : 0);
409     }
410 schoenebeck 53 }
411    
412 schoenebeck 319
413 schoenebeck 53 // setup LFO 3 (VCO LFO)
414     {
415     uint16_t lfo3_internal_depth;
416     switch (pDimRgn->LFO3Controller) {
417     case ::gig::lfo3_ctrl_internal:
418     lfo3_internal_depth = pDimRgn->LFO3InternalDepth;
419     pLFO3->ExtController = 0; // no external controller
420 schoenebeck 687 bLFO3Enabled = (lfo3_internal_depth > 0);
421 schoenebeck 53 break;
422     case ::gig::lfo3_ctrl_modwheel:
423     lfo3_internal_depth = 0;
424     pLFO3->ExtController = 1; // MIDI controller 1
425 schoenebeck 687 bLFO3Enabled = (pDimRgn->LFO3ControlDepth > 0);
426 schoenebeck 53 break;
427     case ::gig::lfo3_ctrl_aftertouch:
428     lfo3_internal_depth = 0;
429 persson 903 pLFO3->ExtController = 128;
430     bLFO3Enabled = true;
431 schoenebeck 53 break;
432     case ::gig::lfo3_ctrl_internal_modwheel:
433     lfo3_internal_depth = pDimRgn->LFO3InternalDepth;
434     pLFO3->ExtController = 1; // MIDI controller 1
435 schoenebeck 687 bLFO3Enabled = (lfo3_internal_depth > 0 || pDimRgn->LFO3ControlDepth > 0);
436 schoenebeck 53 break;
437     case ::gig::lfo3_ctrl_internal_aftertouch:
438     lfo3_internal_depth = pDimRgn->LFO3InternalDepth;
439 persson 903 pLFO1->ExtController = 128;
440     bLFO3Enabled = (lfo3_internal_depth > 0 || pDimRgn->LFO3ControlDepth > 0);
441 schoenebeck 53 break;
442     default:
443     lfo3_internal_depth = 0;
444     pLFO3->ExtController = 0; // no external controller
445 schoenebeck 687 bLFO3Enabled = false;
446 schoenebeck 53 }
447 persson 841 if (bLFO3Enabled) {
448     pLFO3->trigger(pDimRgn->LFO3Frequency,
449     start_level_mid,
450     lfo3_internal_depth,
451     pDimRgn->LFO3ControlDepth,
452     false,
453     pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
454     pLFO3->update(pLFO3->ExtController ? pEngineChannel->ControllerTable[pLFO3->ExtController] : 0);
455     }
456 schoenebeck 53 }
457    
458 schoenebeck 319
459 schoenebeck 554 #if CONFIG_FORCE_FILTER
460 schoenebeck 368 const bool bUseFilter = true;
461 schoenebeck 53 #else // use filter only if instrument file told so
462 schoenebeck 368 const bool bUseFilter = pDimRgn->VCFEnabled;
463 schoenebeck 554 #endif // CONFIG_FORCE_FILTER
464 schoenebeck 368 SYNTHESIS_MODE_SET_FILTER(SynthesisMode, bUseFilter);
465     if (bUseFilter) {
466 schoenebeck 554 #ifdef CONFIG_OVERRIDE_CUTOFF_CTRL
467     VCFCutoffCtrl.controller = CONFIG_OVERRIDE_CUTOFF_CTRL;
468 schoenebeck 53 #else // use the one defined in the instrument file
469     switch (pDimRgn->VCFCutoffController) {
470     case ::gig::vcf_cutoff_ctrl_modwheel:
471     VCFCutoffCtrl.controller = 1;
472     break;
473     case ::gig::vcf_cutoff_ctrl_effect1:
474     VCFCutoffCtrl.controller = 12;
475     break;
476     case ::gig::vcf_cutoff_ctrl_effect2:
477     VCFCutoffCtrl.controller = 13;
478     break;
479     case ::gig::vcf_cutoff_ctrl_breath:
480     VCFCutoffCtrl.controller = 2;
481     break;
482     case ::gig::vcf_cutoff_ctrl_foot:
483     VCFCutoffCtrl.controller = 4;
484     break;
485     case ::gig::vcf_cutoff_ctrl_sustainpedal:
486     VCFCutoffCtrl.controller = 64;
487     break;
488     case ::gig::vcf_cutoff_ctrl_softpedal:
489     VCFCutoffCtrl.controller = 67;
490     break;
491     case ::gig::vcf_cutoff_ctrl_genpurpose7:
492     VCFCutoffCtrl.controller = 82;
493     break;
494     case ::gig::vcf_cutoff_ctrl_genpurpose8:
495     VCFCutoffCtrl.controller = 83;
496     break;
497 persson 903 case ::gig::vcf_cutoff_ctrl_aftertouch:
498     VCFCutoffCtrl.controller = 128;
499     break;
500 schoenebeck 53 case ::gig::vcf_cutoff_ctrl_none:
501     default:
502     VCFCutoffCtrl.controller = 0;
503     break;
504     }
505 schoenebeck 554 #endif // CONFIG_OVERRIDE_CUTOFF_CTRL
506 schoenebeck 53
507 schoenebeck 554 #ifdef CONFIG_OVERRIDE_RESONANCE_CTRL
508     VCFResonanceCtrl.controller = CONFIG_OVERRIDE_RESONANCE_CTRL;
509 schoenebeck 53 #else // use the one defined in the instrument file
510     switch (pDimRgn->VCFResonanceController) {
511     case ::gig::vcf_res_ctrl_genpurpose3:
512     VCFResonanceCtrl.controller = 18;
513     break;
514     case ::gig::vcf_res_ctrl_genpurpose4:
515     VCFResonanceCtrl.controller = 19;
516     break;
517     case ::gig::vcf_res_ctrl_genpurpose5:
518     VCFResonanceCtrl.controller = 80;
519     break;
520     case ::gig::vcf_res_ctrl_genpurpose6:
521     VCFResonanceCtrl.controller = 81;
522     break;
523     case ::gig::vcf_res_ctrl_none:
524     default:
525     VCFResonanceCtrl.controller = 0;
526     }
527 schoenebeck 554 #endif // CONFIG_OVERRIDE_RESONANCE_CTRL
528 schoenebeck 53
529 schoenebeck 554 #ifndef CONFIG_OVERRIDE_FILTER_TYPE
530 schoenebeck 770 finalSynthesisParameters.filterLeft.SetType(pDimRgn->VCFType);
531     finalSynthesisParameters.filterRight.SetType(pDimRgn->VCFType);
532 schoenebeck 53 #else // override filter type
533 schoenebeck 1181 finalSynthesisParameters.filterLeft.SetType(CONFIG_OVERRIDE_FILTER_TYPE);
534     finalSynthesisParameters.filterRight.SetType(CONFIG_OVERRIDE_FILTER_TYPE);
535 schoenebeck 554 #endif // CONFIG_OVERRIDE_FILTER_TYPE
536 schoenebeck 53
537 schoenebeck 411 VCFCutoffCtrl.value = pEngineChannel->ControllerTable[VCFCutoffCtrl.controller];
538     VCFResonanceCtrl.value = pEngineChannel->ControllerTable[VCFResonanceCtrl.controller];
539 schoenebeck 53
540     // calculate cutoff frequency
541 persson 729 float cutoff = pDimRgn->GetVelocityCutoff(itNoteOnEvent->Param.Note.Velocity);
542     if (pDimRgn->VCFKeyboardTracking) {
543     cutoff *= exp((itNoteOnEvent->Param.Note.Key - pDimRgn->VCFKeyboardTrackingBreakpoint) * 0.057762265f); // (ln(2) / 12)
544     }
545     CutoffBase = cutoff;
546 schoenebeck 53
547 persson 729 int cvalue;
548     if (VCFCutoffCtrl.controller) {
549     cvalue = pEngineChannel->ControllerTable[VCFCutoffCtrl.controller];
550     if (pDimRgn->VCFCutoffControllerInvert) cvalue = 127 - cvalue;
551 persson 791 // VCFVelocityScale in this case means Minimum cutoff
552 persson 729 if (cvalue < pDimRgn->VCFVelocityScale) cvalue = pDimRgn->VCFVelocityScale;
553     }
554     else {
555     cvalue = pDimRgn->VCFCutoff;
556     }
557 persson 877 cutoff *= float(cvalue);
558     if (cutoff > 127.0f) cutoff = 127.0f;
559 persson 729
560 schoenebeck 53 // calculate resonance
561 persson 877 float resonance = (float) (VCFResonanceCtrl.controller ? VCFResonanceCtrl.value : pDimRgn->VCFResonance);
562 schoenebeck 53
563 persson 877 VCFCutoffCtrl.fvalue = cutoff;
564 schoenebeck 53 VCFResonanceCtrl.fvalue = resonance;
565     }
566     else {
567     VCFCutoffCtrl.controller = 0;
568     VCFResonanceCtrl.controller = 0;
569     }
570    
571     return 0; // success
572     }
573    
574     /**
575     * Renders the audio data for this voice for the current audio fragment.
576     * The sample input data can either come from RAM (cached sample or sample
577     * part) or directly from disk. The output signal will be rendered by
578     * resampling / interpolation. If this voice is a disk streaming voice and
579     * the voice completely played back the cached RAM part of the sample, it
580     * will automatically switch to disk playback for the next RenderAudio()
581     * call.
582     *
583     * @param Samples - number of samples to be rendered in this audio fragment cycle
584     */
585     void Voice::Render(uint Samples) {
586    
587 schoenebeck 319 // select default values for synthesis mode bits
588     SYNTHESIS_MODE_SET_LOOP(SynthesisMode, false);
589    
590     switch (this->PlaybackState) {
591 schoenebeck 80
592 schoenebeck 563 case playback_state_init:
593     this->PlaybackState = playback_state_ram; // we always start playback from RAM cache and switch then to disk if needed
594     // no break - continue with playback_state_ram
595    
596 schoenebeck 319 case playback_state_ram: {
597     if (RAMLoop) SYNTHESIS_MODE_SET_LOOP(SynthesisMode, true); // enable looping
598 schoenebeck 80
599 schoenebeck 319 // render current fragment
600     Synthesize(Samples, (sample_t*) pSample->GetCache().pStart, Delay);
601 schoenebeck 53
602     if (DiskVoice) {
603     // check if we reached the allowed limit of the sample RAM cache
604 schoenebeck 770 if (finalSynthesisParameters.dPos > MaxRAMPos) {
605     dmsg(5,("Voice: switching to disk playback (Pos=%f)\n", finalSynthesisParameters.dPos));
606 schoenebeck 53 this->PlaybackState = playback_state_disk;
607     }
608 schoenebeck 770 } else if (finalSynthesisParameters.dPos >= pSample->GetCache().Size / pSample->FrameSize) {
609 schoenebeck 53 this->PlaybackState = playback_state_end;
610     }
611     }
612     break;
613    
614     case playback_state_disk: {
615     if (!DiskStreamRef.pStream) {
616     // check if the disk thread created our ordered disk stream in the meantime
617     DiskStreamRef.pStream = pDiskThread->AskForCreatedStream(DiskStreamRef.OrderID);
618     if (!DiskStreamRef.pStream) {
619     std::cout << stderr << "Disk stream not available in time!" << std::endl << std::flush;
620 schoenebeck 239 KillImmediately();
621 schoenebeck 53 return;
622     }
623 schoenebeck 770 DiskStreamRef.pStream->IncrementReadPos(pSample->Channels * (int(finalSynthesisParameters.dPos) - MaxRAMPos));
624     finalSynthesisParameters.dPos -= int(finalSynthesisParameters.dPos);
625 schoenebeck 330 RealSampleWordsLeftToRead = -1; // -1 means no silence has been added yet
626 schoenebeck 53 }
627    
628 schoenebeck 323 const int sampleWordsLeftToRead = DiskStreamRef.pStream->GetReadSpace();
629    
630 schoenebeck 53 // add silence sample at the end if we reached the end of the stream (for the interpolator)
631 schoenebeck 323 if (DiskStreamRef.State == Stream::state_end) {
632 schoenebeck 554 const int maxSampleWordsPerCycle = (pEngine->MaxSamplesPerCycle << CONFIG_MAX_PITCH) * pSample->Channels + 6; // +6 for the interpolator algorithm
633 schoenebeck 323 if (sampleWordsLeftToRead <= maxSampleWordsPerCycle) {
634 schoenebeck 330 // remember how many sample words there are before any silence has been added
635     if (RealSampleWordsLeftToRead < 0) RealSampleWordsLeftToRead = sampleWordsLeftToRead;
636 schoenebeck 323 DiskStreamRef.pStream->WriteSilence(maxSampleWordsPerCycle - sampleWordsLeftToRead);
637     }
638 schoenebeck 53 }
639    
640 persson 903 sample_t* ptr = (sample_t*)DiskStreamRef.pStream->GetReadPtr(); // get the current read_ptr within the ringbuffer where we read the samples from
641 schoenebeck 319
642     // render current audio fragment
643     Synthesize(Samples, ptr, Delay);
644    
645 schoenebeck 770 const int iPos = (int) finalSynthesisParameters.dPos;
646 schoenebeck 323 const int readSampleWords = iPos * pSample->Channels; // amount of sample words actually been read
647     DiskStreamRef.pStream->IncrementReadPos(readSampleWords);
648 schoenebeck 770 finalSynthesisParameters.dPos -= iPos; // just keep fractional part of playback position
649 schoenebeck 323
650     // change state of voice to 'end' if we really reached the end of the sample data
651 schoenebeck 330 if (RealSampleWordsLeftToRead >= 0) {
652     RealSampleWordsLeftToRead -= readSampleWords;
653     if (RealSampleWordsLeftToRead <= 0) this->PlaybackState = playback_state_end;
654     }
655 schoenebeck 53 }
656     break;
657    
658     case playback_state_end:
659 schoenebeck 285 std::cerr << "gig::Voice::Render(): entered with playback_state_end, this is a bug!\n" << std::flush;
660 schoenebeck 53 break;
661     }
662    
663     // Reset delay
664     Delay = 0;
665    
666 schoenebeck 271 itTriggerEvent = Pool<Event>::Iterator();
667 schoenebeck 53
668 schoenebeck 285 // If sample stream or release stage finished, kill the voice
669 schoenebeck 738 if (PlaybackState == playback_state_end || EG1.getSegmentType() == EGADSR::segment_end) KillImmediately();
670 schoenebeck 53 }
671    
672     /**
673     * Resets voice variables. Should only be called if rendering process is
674     * suspended / not running.
675     */
676     void Voice::Reset() {
677 schoenebeck 770 finalSynthesisParameters.filterLeft.Reset();
678     finalSynthesisParameters.filterRight.Reset();
679 schoenebeck 53 DiskStreamRef.pStream = NULL;
680     DiskStreamRef.hStream = 0;
681     DiskStreamRef.State = Stream::state_unused;
682     DiskStreamRef.OrderID = 0;
683 schoenebeck 285 PlaybackState = playback_state_end;
684     itTriggerEvent = Pool<Event>::Iterator();
685     itKillEvent = Pool<Event>::Iterator();
686 schoenebeck 53 }
687    
688     /**
689 schoenebeck 738 * Process given list of MIDI note on, note off and sustain pedal events
690     * for the given time.
691 schoenebeck 53 *
692 schoenebeck 738 * @param itEvent - iterator pointing to the next event to be processed
693 persson 832 * @param End - youngest time stamp where processing should be stopped
694 schoenebeck 53 */
695 schoenebeck 738 void Voice::processTransitionEvents(RTList<Event>::Iterator& itEvent, uint End) {
696     for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) {
697     if (itEvent->Type == Event::type_release) {
698 persson 783 EG1.update(EGADSR::event_release, pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
699     EG2.update(EGADSR::event_release, pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
700 schoenebeck 738 } else if (itEvent->Type == Event::type_cancel_release) {
701 persson 783 EG1.update(EGADSR::event_cancel_release, pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
702     EG2.update(EGADSR::event_cancel_release, pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
703 schoenebeck 738 }
704     }
705     }
706 schoenebeck 53
707 schoenebeck 738 /**
708     * Process given list of MIDI control change and pitch bend events for
709     * the given time.
710     *
711     * @param itEvent - iterator pointing to the next event to be processed
712 persson 832 * @param End - youngest time stamp where processing should be stopped
713 schoenebeck 738 */
714     void Voice::processCCEvents(RTList<Event>::Iterator& itEvent, uint End) {
715     for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) {
716     if (itEvent->Type == Event::type_control_change &&
717     itEvent->Param.CC.Controller) { // if (valid) MIDI control change event
718     if (itEvent->Param.CC.Controller == VCFCutoffCtrl.controller) {
719     processCutoffEvent(itEvent);
720 schoenebeck 53 }
721 schoenebeck 738 if (itEvent->Param.CC.Controller == VCFResonanceCtrl.controller) {
722     processResonanceEvent(itEvent);
723 schoenebeck 53 }
724 schoenebeck 738 if (itEvent->Param.CC.Controller == pLFO1->ExtController) {
725     pLFO1->update(itEvent->Param.CC.Value);
726 schoenebeck 53 }
727 schoenebeck 738 if (itEvent->Param.CC.Controller == pLFO2->ExtController) {
728     pLFO2->update(itEvent->Param.CC.Value);
729 schoenebeck 53 }
730 schoenebeck 738 if (itEvent->Param.CC.Controller == pLFO3->ExtController) {
731     pLFO3->update(itEvent->Param.CC.Value);
732 schoenebeck 53 }
733 schoenebeck 236 if (pDimRgn->AttenuationController.type == ::gig::attenuation_ctrl_t::type_controlchange &&
734 schoenebeck 738 itEvent->Param.CC.Controller == pDimRgn->AttenuationController.controller_number) {
735 persson 832 CrossfadeSmoother.update(Engine::CrossfadeCurve[CrossfadeAttenuation(itEvent->Param.CC.Value)]);
736 schoenebeck 236 }
737 persson 832 if (itEvent->Param.CC.Controller == 7) { // volume
738 schoenebeck 947 VolumeSmoother.update(Engine::VolumeCurve[itEvent->Param.CC.Value]);
739 persson 832 } else if (itEvent->Param.CC.Controller == 10) { // panpot
740     PanLeftSmoother.update(Engine::PanCurve[128 - itEvent->Param.CC.Value]);
741     PanRightSmoother.update(Engine::PanCurve[itEvent->Param.CC.Value]);
742     }
743 schoenebeck 738 } else if (itEvent->Type == Event::type_pitchbend) { // if pitch bend event
744     processPitchEvent(itEvent);
745 schoenebeck 53 }
746     }
747 schoenebeck 738 }
748 schoenebeck 53
749 schoenebeck 738 void Voice::processPitchEvent(RTList<Event>::Iterator& itEvent) {
750 persson 1923 PitchBend = RTMath::CentsToFreqRatio(itEvent->Param.Pitch.Pitch * PitchBendRange);
751 schoenebeck 738 }
752 schoenebeck 53
753 schoenebeck 738 void Voice::processCutoffEvent(RTList<Event>::Iterator& itEvent) {
754     int ccvalue = itEvent->Param.CC.Value;
755     if (VCFCutoffCtrl.value == ccvalue) return;
756     VCFCutoffCtrl.value == ccvalue;
757     if (pDimRgn->VCFCutoffControllerInvert) ccvalue = 127 - ccvalue;
758     if (ccvalue < pDimRgn->VCFVelocityScale) ccvalue = pDimRgn->VCFVelocityScale;
759 persson 877 float cutoff = CutoffBase * float(ccvalue);
760     if (cutoff > 127.0f) cutoff = 127.0f;
761 persson 791
762 persson 877 VCFCutoffCtrl.fvalue = cutoff; // needed for initialization of fFinalCutoff next time
763 schoenebeck 738 fFinalCutoff = cutoff;
764     }
765 schoenebeck 53
766 schoenebeck 738 void Voice::processResonanceEvent(RTList<Event>::Iterator& itEvent) {
767     // convert absolute controller value to differential
768     const int ctrldelta = itEvent->Param.CC.Value - VCFResonanceCtrl.value;
769     VCFResonanceCtrl.value = itEvent->Param.CC.Value;
770 persson 877 const float resonancedelta = (float) ctrldelta;
771 schoenebeck 738 fFinalResonance += resonancedelta;
772     // needed for initialization of parameter
773 persson 877 VCFResonanceCtrl.fvalue = itEvent->Param.CC.Value;
774 schoenebeck 738 }
775 schoenebeck 53
776 schoenebeck 738 /**
777     * Synthesizes the current audio fragment for this voice.
778     *
779     * @param Samples - number of sample points to be rendered in this audio
780     * fragment cycle
781     * @param pSrc - pointer to input sample data
782     * @param Skip - number of sample points to skip in output buffer
783     */
784     void Voice::Synthesize(uint Samples, sample_t* pSrc, uint Skip) {
785 schoenebeck 1001 finalSynthesisParameters.pOutLeft = &pEngineChannel->pChannelLeft->Buffer()[Skip];
786     finalSynthesisParameters.pOutRight = &pEngineChannel->pChannelRight->Buffer()[Skip];
787 schoenebeck 770 finalSynthesisParameters.pSrc = pSrc;
788    
789 schoenebeck 738 RTList<Event>::Iterator itCCEvent = pEngineChannel->pEvents->first();
790     RTList<Event>::Iterator itNoteEvent = pEngineChannel->pMIDIKeyInfo[MIDIKey].pEvents->first();
791 persson 768
792 persson 1748 if (itTriggerEvent) { // skip events that happened before this voice was triggered
793 schoenebeck 738 while (itCCEvent && itCCEvent->FragmentPos() <= Skip) ++itCCEvent;
794 schoenebeck 1857 // we can't simply compare the timestamp here, because note events
795     // might happen on the same time stamp, so we have to deal on the
796     // actual sequence the note events arrived instead (see bug #112)
797     for (; itNoteEvent; ++itNoteEvent) {
798     if (itTriggerEvent == itNoteEvent) {
799     ++itNoteEvent;
800     break;
801     }
802     }
803 schoenebeck 53 }
804 persson 768
805 persson 796 uint killPos;
806 persson 1748 if (itKillEvent) {
807     int maxFadeOutPos = Samples - pEngine->MinFadeOutSamples;
808     if (maxFadeOutPos < 0) {
809     // There's not enough space in buffer to do a fade out
810     // from max volume (this can only happen for audio
811     // drivers that use Samples < MaxSamplesPerCycle).
812     // End the EG1 here, at pos 0, with a shorter max fade
813     // out time.
814     EG1.enterFadeOutStage(Samples / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
815     itKillEvent = Pool<Event>::Iterator();
816     } else {
817     killPos = RTMath::Min(itKillEvent->FragmentPos(), maxFadeOutPos);
818     }
819     }
820 persson 796
821 schoenebeck 738 uint i = Skip;
822     while (i < Samples) {
823     int iSubFragmentEnd = RTMath::Min(i + CONFIG_DEFAULT_SUBFRAGMENT_SIZE, Samples);
824 persson 768
825 schoenebeck 738 // initialize all final synthesis parameters
826     fFinalCutoff = VCFCutoffCtrl.fvalue;
827     fFinalResonance = VCFResonanceCtrl.fvalue;
828 persson 768
829 schoenebeck 738 // process MIDI control change and pitchbend events for this subfragment
830     processCCEvents(itCCEvent, iSubFragmentEnd);
831 schoenebeck 53
832 persson 1858 finalSynthesisParameters.fFinalPitch = PitchBase * PitchBend;
833 persson 832 float fFinalVolume = VolumeSmoother.render() * CrossfadeSmoother.render();
834     #ifdef CONFIG_PROCESS_MUTED_CHANNELS
835     if (pEngineChannel->GetMute()) fFinalVolume = 0;
836     #endif
837    
838 schoenebeck 738 // process transition events (note on, note off & sustain pedal)
839     processTransitionEvents(itNoteEvent, iSubFragmentEnd);
840 persson 768
841 persson 950 // if the voice was killed in this subfragment, or if the
842     // filter EG is finished, switch EG1 to fade out stage
843     if ((itKillEvent && killPos <= iSubFragmentEnd) ||
844     (SYNTHESIS_MODE_GET_FILTER(SynthesisMode) &&
845     EG2.getSegmentType() == EGADSR::segment_end)) {
846 persson 796 EG1.enterFadeOutStage();
847     itKillEvent = Pool<Event>::Iterator();
848     }
849    
850 schoenebeck 738 // process envelope generators
851     switch (EG1.getSegmentType()) {
852     case EGADSR::segment_lin:
853     fFinalVolume *= EG1.processLin();
854     break;
855     case EGADSR::segment_exp:
856     fFinalVolume *= EG1.processExp();
857     break;
858     case EGADSR::segment_end:
859     fFinalVolume *= EG1.getLevel();
860     break; // noop
861 schoenebeck 236 }
862 schoenebeck 738 switch (EG2.getSegmentType()) {
863     case EGADSR::segment_lin:
864     fFinalCutoff *= EG2.processLin();
865     break;
866     case EGADSR::segment_exp:
867     fFinalCutoff *= EG2.processExp();
868     break;
869     case EGADSR::segment_end:
870     fFinalCutoff *= EG2.getLevel();
871     break; // noop
872 schoenebeck 236 }
873 schoenebeck 829 if (EG3.active()) finalSynthesisParameters.fFinalPitch *= EG3.render();
874 persson 768
875 schoenebeck 738 // process low frequency oscillators
876 persson 922 if (bLFO1Enabled) fFinalVolume *= (1.0f - pLFO1->render());
877 schoenebeck 738 if (bLFO2Enabled) fFinalCutoff *= pLFO2->render();
878 schoenebeck 770 if (bLFO3Enabled) finalSynthesisParameters.fFinalPitch *= RTMath::CentsToFreqRatio(pLFO3->render());
879 schoenebeck 236
880 persson 1862 // limit the pitch so we don't read outside the buffer
881     finalSynthesisParameters.fFinalPitch = RTMath::Min(finalSynthesisParameters.fFinalPitch, float(1 << CONFIG_MAX_PITCH));
882    
883 schoenebeck 738 // if filter enabled then update filter coefficients
884     if (SYNTHESIS_MODE_GET_FILTER(SynthesisMode)) {
885 persson 877 finalSynthesisParameters.filterLeft.SetParameters(fFinalCutoff, fFinalResonance, pEngine->SampleRate);
886     finalSynthesisParameters.filterRight.SetParameters(fFinalCutoff, fFinalResonance, pEngine->SampleRate);
887 schoenebeck 53 }
888    
889 schoenebeck 770 // do we need resampling?
890     const float __PLUS_ONE_CENT = 1.000577789506554859250142541782224725466f;
891     const float __MINUS_ONE_CENT = 0.9994225441413807496009516495583113737666f;
892     const bool bResamplingRequired = !(finalSynthesisParameters.fFinalPitch <= __PLUS_ONE_CENT &&
893     finalSynthesisParameters.fFinalPitch >= __MINUS_ONE_CENT);
894     SYNTHESIS_MODE_SET_INTERPOLATE(SynthesisMode, bResamplingRequired);
895 persson 768
896 schoenebeck 770 // prepare final synthesis parameters structure
897 persson 830 finalSynthesisParameters.uiToGo = iSubFragmentEnd - i;
898     #ifdef CONFIG_INTERPOLATE_VOLUME
899     finalSynthesisParameters.fFinalVolumeDeltaLeft =
900 persson 832 (fFinalVolume * VolumeLeft * PanLeftSmoother.render() -
901     finalSynthesisParameters.fFinalVolumeLeft) / finalSynthesisParameters.uiToGo;
902 persson 830 finalSynthesisParameters.fFinalVolumeDeltaRight =
903 persson 832 (fFinalVolume * VolumeRight * PanRightSmoother.render() -
904     finalSynthesisParameters.fFinalVolumeRight) / finalSynthesisParameters.uiToGo;
905 persson 830 #else
906 persson 832 finalSynthesisParameters.fFinalVolumeLeft =
907     fFinalVolume * VolumeLeft * PanLeftSmoother.render();
908     finalSynthesisParameters.fFinalVolumeRight =
909     fFinalVolume * VolumeRight * PanRightSmoother.render();
910 persson 830 #endif
911 schoenebeck 738 // render audio for one subfragment
912 schoenebeck 770 RunSynthesisFunction(SynthesisMode, &finalSynthesisParameters, &loop);
913 schoenebeck 53
914 persson 830 // stop the rendering if volume EG is finished
915     if (EG1.getSegmentType() == EGADSR::segment_end) break;
916    
917 persson 783 const double newPos = Pos + (iSubFragmentEnd - i) * finalSynthesisParameters.fFinalPitch;
918    
919 persson 768 // increment envelopes' positions
920 schoenebeck 738 if (EG1.active()) {
921 persson 783
922     // if sample has a loop and loop start has been reached in this subfragment, send a special event to EG1 to let it finish the attack hold stage
923 persson 865 if (pDimRgn->SampleLoops && Pos <= pDimRgn->pSampleLoops[0].LoopStart && pDimRgn->pSampleLoops[0].LoopStart < newPos) {
924 persson 783 EG1.update(EGADSR::event_hold_end, pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
925     }
926    
927 persson 768 EG1.increment(1);
928 persson 783 if (!EG1.toStageEndLeft()) EG1.update(EGADSR::event_stage_end, pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
929 schoenebeck 53 }
930 schoenebeck 738 if (EG2.active()) {
931 persson 768 EG2.increment(1);
932 persson 783 if (!EG2.toStageEndLeft()) EG2.update(EGADSR::event_stage_end, pEngine->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
933 schoenebeck 53 }
934 persson 768 EG3.increment(1);
935 schoenebeck 738 if (!EG3.toEndLeft()) EG3.update(); // neutralize envelope coefficient if end reached
936 persson 768
937 persson 783 Pos = newPos;
938 persson 768 i = iSubFragmentEnd;
939 schoenebeck 53 }
940     }
941    
942 schoenebeck 829 /** @brief Update current portamento position.
943     *
944     * Will be called when portamento mode is enabled to get the final
945     * portamento position of this active voice from where the next voice(s)
946     * might continue to slide on.
947     *
948     * @param itNoteOffEvent - event which causes this voice to die soon
949     */
950     void Voice::UpdatePortamentoPos(Pool<Event>::Iterator& itNoteOffEvent) {
951     const float fFinalEG3Level = EG3.level(itNoteOffEvent->FragmentPos());
952     pEngineChannel->PortamentoPos = (float) MIDIKey + RTMath::FreqRatioToCents(fFinalEG3Level) * 0.01f;
953     }
954    
955 schoenebeck 53 /**
956 schoenebeck 239 * Immediately kill the voice. This method should not be used to kill
957     * a normal, active voice, because it doesn't take care of things like
958     * fading down the volume level to avoid clicks and regular processing
959     * until the kill event actually occured!
960     *
961 schoenebeck 1321 * If it's necessary to know when the voice's disk stream was actually
962     * deleted, then one can set the optional @a bRequestNotification
963     * parameter and this method will then return the handle of the disk
964     * stream (unique identifier) and one can use this handle to poll the
965     * disk thread if this stream has been deleted. In any case this method
966     * will return immediately and will not block until the stream actually
967     * was deleted.
968     *
969     * @param bRequestNotification - (optional) whether the disk thread shall
970     * provide a notification once it deleted
971     * the respective disk stream
972     * (default=false)
973     * @returns handle to the voice's disk stream or @c Stream::INVALID_HANDLE
974     * if the voice did not use a disk stream at all
975     * @see Kill()
976 schoenebeck 53 */
977 schoenebeck 1321 Stream::Handle Voice::KillImmediately(bool bRequestNotification) {
978     Stream::Handle hStream = Stream::INVALID_HANDLE;
979 schoenebeck 53 if (DiskVoice && DiskStreamRef.State != Stream::state_unused) {
980 schoenebeck 1321 pDiskThread->OrderDeletionOfStream(&DiskStreamRef, bRequestNotification);
981     hStream = DiskStreamRef.hStream;
982 schoenebeck 53 }
983     Reset();
984 schoenebeck 1321 return hStream;
985 schoenebeck 53 }
986    
987 schoenebeck 239 /**
988     * Kill the voice in regular sense. Let the voice render audio until
989     * the kill event actually occured and then fade down the volume level
990     * very quickly and let the voice die finally. Unlike a normal release
991     * of a voice, a kill process cannot be cancalled and is therefore
992     * usually used for voice stealing and key group conflicts.
993     *
994 schoenebeck 271 * @param itKillEvent - event which caused the voice to be killed
995 schoenebeck 239 */
996 schoenebeck 271 void Voice::Kill(Pool<Event>::Iterator& itKillEvent) {
997 schoenebeck 554 #if CONFIG_DEVMODE
998 schoenebeck 287 if (!itKillEvent) dmsg(1,("gig::Voice::Kill(): ERROR, !itKillEvent !!!\n"));
999     if (itKillEvent && !itKillEvent.isValid()) dmsg(1,("gig::Voice::Kill(): ERROR, itKillEvent invalid !!!\n"));
1000 schoenebeck 554 #endif // CONFIG_DEVMODE
1001 schoenebeck 287
1002 schoenebeck 271 if (itTriggerEvent && itKillEvent->FragmentPos() <= itTriggerEvent->FragmentPos()) return;
1003     this->itKillEvent = itKillEvent;
1004 schoenebeck 239 }
1005    
1006 schoenebeck 53 }} // namespace LinuxSampler::gig

  ViewVC Help
Powered by ViewVC