/[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 796 - (hide annotations) (download)
Sun Oct 30 08:35:13 2005 UTC (18 years, 5 months ago) by persson
File size: 45061 byte(s)
* fixed voice stealing - stolen voices weren't killed

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

  ViewVC Help
Powered by ViewVC