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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 799 - (show annotations) (download)
Sat Nov 5 10:59:37 2005 UTC (18 years, 5 months ago) by persson
File size: 44849 byte(s)
* Bug-fixes: pitch changes larger than one octave didn't work. Looped
  samples small enough to fit in RAM didn't work.

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

  ViewVC Help
Powered by ViewVC