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

Contents of /linuxsampler/trunk/src/engines/sfz/sfz.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4018 - (show annotations) (download)
Mon Jan 3 17:10:09 2022 UTC (2 years, 3 months ago) by schoenebeck
File size: 110694 byte(s)
* sfz.h: Add Instrument::GetFile() method.

* Bumped version (2.2.0.svn13).

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2008 Anders Dahnielson <anders@dahnielson.com> *
6 * Copyright (C) 2009 - 2016 Anders Dahnielson and Grigor Iliev *
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 "sfz.h"
25
26 #include <iostream>
27 #include <sstream>
28 #include <cctype>
29 #include <cstdio>
30 #include <cstring>
31 #include <sys/stat.h>
32
33 #include "../../common/File.h"
34 #include "../../common/Path.h"
35 #include "LookupTable.h"
36 #include "../../common/global_private.h"
37
38 namespace sfz
39 {
40 template <typename T> T check(std::string name, T min, T max, T val) {
41 if (val < min) {
42 std::cerr << "sfz: The value of opcode '" << name;
43 std::cerr << "' is below the minimum allowed value (min=" << min << "): " << val << std::endl;
44 val = min;
45 }
46 if (val > max) {
47 std::cerr << "sfz: The value of opcode '" << name;
48 std::cerr << "' is above the maximum allowed value (max=" << max << "): " << val << std::endl;
49 val = max;
50 }
51
52 return val;
53 }
54
55 Sample* SampleManager::FindSample(std::string samplePath, uint offset, int end) {
56 std::map<Sample*, std::set<Region*> >::iterator it = sampleMap.begin();
57 for (; it != sampleMap.end(); it++) {
58 if (it->first->GetFile() == samplePath) {
59 /* Because the start of the sample is cached in RAM we treat
60 * same sample with different offset as different samples
61 * // TODO: Ignore offset when the whole sample is cached in RAM?
62 */
63 if (it->first->Offset == offset && it->first->End == end) return it->first;
64 }
65 }
66
67 return NULL;
68 }
69
70 /////////////////////////////////////////////////////////////
71 // class Script
72
73 Script::Script(LinuxSampler::Path path) : m_path(path) {
74 }
75
76 Script::Script(String path) : m_path(LinuxSampler::Path::fromUnknownFS(path)) {
77 }
78
79 Script::~Script() {
80 }
81
82 String Script::Name() const {
83 return m_path.getName();
84 }
85
86 Script::Language_t Script::Language() {
87 return LANGUAGE_NKSP;
88 }
89
90 String Script::GetSourceCode() {
91 std::ifstream f(m_path.toNativeFSPath().c_str());
92 std::string s;
93 // reserve required space on string object
94 f.seekg(0, std::ios::end);
95 s.reserve(f.tellg());
96 f.seekg(0, std::ios::beg);
97 // read entire content from file and assign it to string object
98 s.assign((std::istreambuf_iterator<char>(f)),
99 std::istreambuf_iterator<char>());
100 return s;
101 }
102
103 /////////////////////////////////////////////////////////////
104 // class Articulation
105
106 Articulation::Articulation()
107 {
108 }
109
110 Articulation::~Articulation()
111 {
112 }
113
114 /////////////////////////////////////////////////////////////
115 // class Definition
116
117 Definition::Definition()
118 {
119 }
120
121 Definition::~Definition()
122 {
123 }
124
125 /////////////////////////////////////////////////////////////
126 // class Region
127
128 Region::Region()
129 {
130 pSample = NULL;
131 seq_counter = 1;
132 }
133
134 Region::~Region()
135 {
136 DestroySampleIfNotUsed();
137 }
138
139 Sample* Region::GetSample(bool create)
140 {
141 if (pSample == NULL && create && sample != "*silence") {
142 uint i = offset ? *offset : 0;
143 Sample* sf = GetInstrument()->GetSampleManager()->FindSample(sample, i, end);
144 if (sf != NULL) pSample = sf; // Reuse already created sample
145 else pSample = new Sample(sample, false, i, end);
146 GetInstrument()->GetSampleManager()->AddSampleConsumer(pSample, this);
147 }
148 return pSample;
149 }
150
151 void Region::DestroySampleIfNotUsed() {
152 if (pSample == NULL) return;
153 GetInstrument()->GetSampleManager()->RemoveSampleConsumer(pSample, this);
154 if (!GetInstrument()->GetSampleManager()->HasSampleConsumers(pSample)) {
155 GetInstrument()->GetSampleManager()->RemoveSample(pSample);
156 delete pSample;
157 pSample = NULL;
158 }
159 }
160
161 bool Region::OnKey(const Query& q) {
162 // As the region comes from a LookupTable search on the query,
163 // the following parameters are not checked here: chan, key,
164 // vel, chanaft, polyaft, prog, sw_previous, cc. They are all
165 // handled by the lookup table.
166 bool is_triggered(
167 q.bend >= lobend && q.bend <= hibend &&
168 q.bpm >= lobpm && q.bpm < hibpm &&
169 q.rand >= lorand && q.rand < hirand &&
170 q.timer >= lotimer && q.timer <= hitimer &&
171
172 ( sw_last == -1 ||
173 ((sw_last >= sw_lokey && sw_last <= sw_hikey) ? (q.last_sw_key == sw_last) : false) ) &&
174
175 ( sw_down == -1 ||
176 ((sw_down >= sw_lokey && (sw_hikey == -1 || sw_down <= sw_hikey)) ? (q.sw[sw_down]) : false) ) &&
177
178 ( sw_up == -1 ||
179 ((sw_up >= sw_lokey && (sw_hikey == -1 || sw_up <= sw_hikey)) ? (!q.sw[sw_up]) : true) ) &&
180
181 ((trigger & q.trig) != 0)
182 );
183
184 if (!is_triggered)
185 return false;
186
187 // seq_position has to be checked last, so we know that we
188 // increment the right counter
189 is_triggered = (seq_counter == seq_position);
190 seq_counter = (seq_counter % seq_length) + 1;
191
192 return is_triggered;
193 }
194
195 Articulation*
196 Region::GetArticulation(int bend, uint8_t bpm, uint8_t chanaft, uint8_t polyaft, uint8_t* cc)
197 {
198 return new Articulation(); //todo: implement GetArticulation()
199 }
200
201 bool Region::HasLoop() {
202 bool b = loop_mode == LOOP_UNSET ? pSample->GetLoops() :
203 (loop_mode == LOOP_CONTINUOUS || loop_mode == LOOP_SUSTAIN);
204 return b && GetLoopEnd() > GetLoopStart();
205 }
206
207 uint Region::GetLoopStart() {
208 return (!loop_start) ? pSample->GetLoopStart() : *loop_start;
209 }
210
211 uint Region::GetLoopEnd() {
212 return (!loop_end) ? pSample->GetLoopEnd() : *loop_end;
213 }
214
215 uint Region::GetLoopCount() {
216 return (!count) ? 0 : *count;
217 }
218
219 /////////////////////////////////////////////////////////////
220 // class Instrument
221
222 Instrument::Instrument(File* file, std::string name, SampleManager* pSampleManager) : KeyBindings(128, false), KeySwitchBindings(128, false)
223 {
224 this->file = file;
225 this->name = name;
226 this->pSampleManager = pSampleManager ? pSampleManager : this;
227 pLookupTable = 0;
228
229 // The first 6 curves are defined internally (actually 7 with the one at index 0)
230 Curve c;
231 for (int i = 0; i < 128; i++) c.v[i] = i / 127.0f;
232 curves.add(c); curves.add(c); curves.add(c); curves.add(c);
233 curves.add(c); curves.add(c); curves.add(c);
234 ///////
235 }
236
237 Instrument::~Instrument()
238 {
239 for (int i = 0; i < regions.size(); i++) {
240 delete regions[i];
241 }
242 delete pLookupTable;
243 for (int i = 0 ; i < 128 ; i++) {
244 delete pLookupTableCC[i];
245 }
246 }
247
248 void Query::search(const Instrument* pInstrument) {
249 pRegionList = &pInstrument->pLookupTable->query(*this);
250 regionIndex = 0;
251 }
252
253 void Query::search(const Instrument* pInstrument, int triggercc) {
254 pRegionList = &pInstrument->pLookupTableCC[triggercc]->query(*this);
255 regionIndex = 0;
256 }
257
258 Region* Query::next() {
259 for ( ; regionIndex < pRegionList->size() ; regionIndex++) {
260 if ((*pRegionList)[regionIndex]->OnKey(*this)) {
261 return (*pRegionList)[regionIndex++];
262 }
263 }
264 return 0;
265 }
266
267 bool Instrument::DestroyRegion(Region* pRegion) {
268 for (std::vector<Region*>::iterator it = regions.begin(); it != regions.end(); it++) {
269 if(*it == pRegion) {
270 regions.erase(it);
271 delete pRegion;
272 return true;
273 }
274 }
275
276 return false;
277 }
278
279 bool Instrument::HasKeyBinding(uint8_t key) {
280 if (key > 127) return false;
281 return KeyBindings[key];
282 }
283
284 bool Instrument::HasKeySwitchBinding(uint8_t key) {
285 if (key > 127) return false;
286 return KeySwitchBindings[key];
287 }
288
289 /////////////////////////////////////////////////////////////
290 // class ContainerDefinition
291
292 ContainerDefinition::ContainerDefinition(section_type type)
293 {
294 Reset();
295 level = type;
296 }
297
298 ContainerDefinition::~ContainerDefinition()
299 {
300 }
301
302 void
303 ContainerDefinition::Reset()
304 {
305 // This is where all the default values are set.
306
307 // sample definition default
308 sample = "";
309
310 // input control
311 lochan = 1; hichan = 16;
312 lokey = 0; hikey = 127;
313 lovel = 0; hivel = 127;
314 lobend = -8192; hibend = 8192;
315 lobpm = 0; hibpm = 500;
316 lochanaft = 0; hichanaft = 127;
317 lopolyaft = 0; hipolyaft = 127;
318 loprog = 0; hiprog = 127;
319 lorand = 0.0; hirand = 1.0;
320 lotimer = 0.0; hitimer = 0.0;
321
322 seq_length = 1;
323 seq_position = 1;
324
325 sw_lokey = -1; sw_hikey = -1;
326 sw_last = -1;
327 sw_down = -1;
328 sw_up = -1;
329 sw_previous = -1;
330 sw_vel = VEL_CURRENT;
331
332 trigger = TRIGGER_ATTACK;
333
334 group = 0;
335 off_by = 0;
336 off_mode = OFF_FAST;
337
338 // sample player
339 count = optional<int>::nothing;
340 delay = optional<float>::nothing;
341 delay_random = optional<float>::nothing;
342 delay_beats = optional<int>::nothing;
343 stop_beats = optional<int>::nothing;
344 delay_samples = optional<int>::nothing;
345 end = 0;
346 loop_crossfade = optional<float>::nothing;
347 offset = optional<uint>::nothing;
348 offset_random = optional<int>::nothing;
349 loop_mode = LOOP_UNSET;
350 loop_start = optional<int>::nothing;
351 loop_end = optional<int>::nothing;
352 sync_beats = optional<int>::nothing;
353 sync_offset = optional<int>::nothing;
354
355 // amplifier
356 volume = 0;
357 volume_oncc.clear();
358 volume_curvecc.clear();
359 volume_smoothcc.clear();
360 volume_stepcc.clear();
361 amplitude = 100;
362 pan = 0;
363 pan_oncc.clear();
364 pan_curvecc.clear();
365 pan_smoothcc.clear();
366 pan_stepcc.clear();
367 width = 100;
368 position = 0;
369 amp_keytrack = 0;
370 amp_keycenter = 60;
371 amp_veltrack = 100;
372 amp_random = 0;
373 rt_decay = 0;
374 xfin_lokey = 0; xfin_hikey = 0;
375 xfout_lokey = 127; xfout_hikey = 127;
376 xf_keycurve = POWER;
377 xfin_lovel = 0; xfin_hivel = 0;
378 xfout_lovel = 127; xfout_hivel = 127;
379 xf_velcurve = POWER;
380 xf_cccurve = POWER;
381
382 // pitch
383 transpose = 0;
384 tune = 0;
385 pitch_keycenter = 60;
386 pitch_keytrack = 100;
387 pitch_veltrack = 0;
388 pitch_random = 0;
389 bend_up = 200;
390 bend_down = -200;
391 bend_step = 1;
392
393 pitch_oncc.clear();
394 pitch_smoothcc.clear();
395 pitch_curvecc.clear();
396 pitch_stepcc.clear();
397
398 // filter
399 fil_type = LPF_2P;
400 cutoff = optional<float>::nothing;
401 cutoff_chanaft = 0;
402 cutoff_polyaft = 0;
403 resonance = 0;
404 fil_keytrack = 0;
405 fil_keycenter = 60;
406 fil_veltrack = 0;
407 fil_random = 0;
408
409 fil2_type = LPF_2P;
410 cutoff2 = optional<float>::nothing;
411 cutoff2_chanaft = 0;
412 cutoff2_polyaft = 0;
413 resonance2 = 0;
414 fil2_keytrack = 0;
415 fil2_keycenter = 60;
416 fil2_veltrack = 0;
417 fil2_random = 0;
418
419 cutoff_oncc.clear();
420 cutoff_smoothcc.clear();
421 cutoff_curvecc.clear();
422 cutoff_stepcc.clear();
423 cutoff2_oncc.clear();
424 cutoff2_smoothcc.clear();
425 cutoff2_curvecc.clear();
426 cutoff2_stepcc.clear();
427
428 resonance_oncc.clear();
429 resonance_smoothcc.clear();
430 resonance_curvecc.clear();
431 resonance_stepcc.clear();
432 resonance2_oncc.clear();
433 resonance2_smoothcc.clear();
434 resonance2_curvecc.clear();
435 resonance2_stepcc.clear();
436
437 // per voice equalizer
438 eq1_freq = 50;
439 eq2_freq = 500;
440 eq3_freq = 5000;
441 eq1_vel2freq = 0;
442 eq2_vel2freq = 0;
443 eq3_vel2freq = 0;
444 eq1_bw = 1;
445 eq2_bw = 1;
446 eq3_bw = 1;
447 eq1_gain = 0;
448 eq2_gain = 0;
449 eq3_gain = 0;
450 eq1_vel2gain = 0;
451 eq2_vel2gain = 0;
452 eq3_vel2gain = 0;
453
454 // CCs
455 for (int i = 0; i < 128; ++i)
456 {
457 // input control
458 locc.set(i, 0);
459 hicc.set(i, 127);
460 start_locc.set(i, -1);
461 start_hicc.set(i, -1);
462 stop_locc.set(i, -1);
463 stop_hicc.set(i, -1);
464 on_locc.set(i, -1);
465 on_hicc.set(i, -1);
466
467 // sample player
468 delay_oncc.set(i, optional<float>::nothing);
469 delay_samples_oncc.set(i, optional<int>::nothing);
470 offset_oncc.set(i, optional<int>::nothing);
471
472 // amplifier
473 amp_velcurve.set(i, -1);
474 gain_oncc.set(i, 0);
475 xfin_locc.set(i, 0);
476 xfin_hicc.set(i, 0);
477 xfout_locc.set(i, 0);
478 xfout_hicc.set(i, 0);
479
480 // per voice equalizer
481 eq1_freq_oncc.set(i, 0);
482 eq2_freq_oncc.set(i, 0);
483 eq3_freq_oncc.set(i, 0);
484 eq1_bw_oncc.set(i, 0);
485 eq2_bw_oncc.set(i, 0);
486 eq3_bw_oncc.set(i, 0);
487 eq1_gain_oncc.set(i, 0);
488 eq2_gain_oncc.set(i, 0);
489 eq3_gain_oncc.set(i, 0);
490 }
491
492 eg.clear();
493 lfos.clear();
494
495 // deprecated
496 ampeg_delay = 0;
497 ampeg_start = 0; //in percentage
498 ampeg_attack = 0;
499 ampeg_hold = 0;
500 ampeg_decay = 0;
501 ampeg_sustain = -1; // in percentage
502 ampeg_release = 0;
503
504 ampeg_vel2delay = 0;
505 ampeg_vel2attack = 0;
506 ampeg_vel2hold = 0;
507 ampeg_vel2decay = 0;
508 ampeg_vel2sustain = 0;
509 ampeg_vel2release = 0;
510
511 ampeg_delaycc.clear();
512 ampeg_startcc.clear();
513 ampeg_attackcc.clear();
514 ampeg_holdcc.clear();
515 ampeg_decaycc.clear();
516 ampeg_sustaincc.clear();
517 ampeg_releasecc.clear();
518
519 fileg_delay = 0;
520 fileg_start = 0; //in percentage
521 fileg_attack = 0;
522 fileg_hold = 0;
523 fileg_decay = 0;
524 fileg_sustain = 100; // in percentage
525 fileg_release = 0;
526
527 fileg_vel2delay = 0;
528 fileg_vel2attack = 0;
529 fileg_vel2hold = 0;
530 fileg_vel2decay = 0;
531 fileg_vel2sustain = 0;
532 fileg_vel2release = 0;
533 fileg_depth = 0;
534
535 fileg_delay_oncc.clear();
536 fileg_start_oncc.clear();
537 fileg_attack_oncc.clear();
538 fileg_hold_oncc.clear();
539 fileg_decay_oncc.clear();
540 fileg_sustain_oncc.clear();
541 fileg_release_oncc.clear();
542 fileg_depth_oncc.clear();
543
544 pitcheg_delay = 0;
545 pitcheg_start = 0; //in percentage
546 pitcheg_attack = 0;
547 pitcheg_hold = 0;
548 pitcheg_decay = 0;
549 pitcheg_sustain = 100; // in percentage
550 pitcheg_release = 0;
551 pitcheg_depth = 0;
552
553 pitcheg_vel2delay = 0;
554 pitcheg_vel2attack = 0;
555 pitcheg_vel2hold = 0;
556 pitcheg_vel2decay = 0;
557 pitcheg_vel2sustain = 0;
558 pitcheg_vel2release = 0;
559
560 pitcheg_delay_oncc.clear();
561 pitcheg_start_oncc.clear();
562 pitcheg_attack_oncc.clear();
563 pitcheg_hold_oncc.clear();
564 pitcheg_decay_oncc.clear();
565 pitcheg_sustain_oncc.clear();
566 pitcheg_release_oncc.clear();
567 pitcheg_depth_oncc.clear();
568
569 amplfo_delay = 0;
570 amplfo_fade = 0;
571 amplfo_freq = -1; /* -1 is used to determine whether the LFO was initialized */
572 amplfo_depth = 0;
573 amplfo_delay_oncc.clear();
574 amplfo_fade_oncc.clear();
575 amplfo_depthcc.clear();
576 amplfo_freqcc.clear();
577
578 fillfo_delay = 0;
579 fillfo_fade = 0;
580 fillfo_freq = -1; /* -1 is used to determine whether the LFO was initialized */
581 fillfo_depth = 0;
582 fillfo_delay_oncc.clear();
583 fillfo_fade_oncc.clear();
584 fillfo_depthcc.clear();
585 fillfo_freqcc.clear();
586
587 pitchlfo_delay = 0;
588 pitchlfo_fade = 0;
589 pitchlfo_freq = -1; /* -1 is used to determine whether the LFO was initialized */
590 pitchlfo_depth = 0;
591 pitchlfo_delay_oncc.clear();
592 pitchlfo_fade_oncc.clear();
593 pitchlfo_depthcc.clear();
594 pitchlfo_freqcc.clear();
595 }
596
597 void ContainerDefinition::CopyValuesToDefinition(Definition* definition)
598 {
599 // This is where the current settings are copied to the new definition.
600
601 // sample definition
602 definition->sample = sample;
603
604 // input control
605 definition->lochan = lochan;
606 definition->hichan = hichan;
607 definition->lokey = lokey;
608 definition->hikey = hikey;
609 definition->lovel = lovel;
610 definition->hivel = hivel;
611 definition->locc = locc;
612 definition->hicc = hicc;
613 definition->lobend = lobend;
614 definition->hibend = hibend;
615 definition->lobpm = lobpm;
616 definition->hibpm = hibpm;
617 definition->lochanaft = lochanaft;
618 definition->hichanaft = hichanaft;
619 definition->lopolyaft = lopolyaft;
620 definition->hipolyaft = hipolyaft;
621 definition->loprog = loprog;
622 definition->hiprog = hiprog;
623 definition->lorand = lorand;
624 definition->hirand = hirand;
625 definition->lotimer = lotimer;
626 definition->hitimer = hitimer;
627 definition->seq_length = seq_length;
628 definition->seq_position = seq_position;
629 definition->start_locc = start_locc;
630 definition->start_hicc = start_hicc;
631 definition->stop_locc = stop_locc;
632 definition->stop_hicc = stop_hicc;
633 definition->sw_lokey = sw_lokey;
634 definition->sw_hikey = sw_hikey;
635 definition->sw_last = sw_last;
636 definition->sw_down = sw_down;
637 definition->sw_up = sw_up;
638 definition->sw_previous = sw_previous;
639 definition->sw_vel = sw_vel;
640 definition->trigger = trigger;
641 definition->group = group;
642 definition->off_by = off_by;
643 definition->off_mode = off_mode;
644 definition->on_locc = on_locc;
645 definition->on_hicc = on_hicc;
646
647 // sample player
648 definition->count = count;
649 definition->delay = delay;
650 definition->delay_random = delay_random;
651 definition->delay_oncc = delay_oncc;
652 definition->delay_beats = delay_beats;
653 definition->stop_beats = stop_beats;
654 definition->delay_samples = delay_samples;
655 definition->delay_samples_oncc = delay_samples_oncc;
656 definition->end = end;
657 definition->loop_crossfade = loop_crossfade;
658 definition->offset = offset;
659 definition->offset_random = offset_random;
660 definition->offset_oncc = offset_oncc;
661 definition->loop_mode = loop_mode;
662 definition->loop_start = loop_start;
663 definition->loop_end = loop_end;
664 definition->sync_beats = sync_beats;
665 definition->sync_offset = sync_offset;
666
667 // amplifier
668 definition->volume = volume;
669 definition->volume_oncc = volume_oncc;
670 definition->volume_curvecc = volume_curvecc;
671 definition->volume_smoothcc = volume_smoothcc;
672 definition->volume_stepcc = volume_stepcc;
673 definition->amplitude = amplitude;
674 definition->pan = pan;
675 definition->pan_oncc = pan_oncc;
676 definition->pan_curvecc = pan_curvecc;
677 definition->pan_smoothcc = pan_smoothcc;
678 definition->pan_stepcc = pan_stepcc;
679 definition->width = width;
680 definition->position = position;
681 definition->amp_keytrack = amp_keytrack;
682 definition->amp_keycenter = amp_keycenter;
683 definition->amp_veltrack = amp_veltrack;
684 definition->amp_velcurve = amp_velcurve;
685 definition->amp_random = amp_random;
686 definition->rt_decay = rt_decay;
687 definition->gain_oncc = gain_oncc;
688 definition->xfin_lokey = xfin_lokey;
689 definition->xfin_hikey = xfin_hikey;
690 definition->xfout_lokey = xfout_lokey;
691 definition->xfout_hikey = xfout_hikey;
692 definition->xf_keycurve = xf_keycurve;
693 definition->xfin_lovel = xfin_lovel;
694 definition->xfin_hivel = xfin_hivel;
695 definition->xfout_lovel = xfout_lovel;
696 definition->xfout_hivel = xfout_hivel;
697 definition->xf_velcurve = xf_velcurve;
698 definition->xfin_locc = xfin_locc;
699 definition->xfin_hicc = xfin_hicc;
700 definition->xfout_locc = xfout_locc;
701 definition->xfout_hicc = xfout_hicc;
702 definition->xf_cccurve = xf_cccurve;
703
704 // pitch
705 definition->transpose = transpose;
706 definition->tune = tune;
707 definition->pitch_keycenter = pitch_keycenter;
708 definition->pitch_keytrack = pitch_keytrack;
709 definition->pitch_veltrack = pitch_veltrack;
710 definition->pitch_random = pitch_random;
711 definition->bend_up = bend_up;
712 definition->bend_down = bend_down;
713 definition->bend_step = bend_step;
714
715 definition->pitch_oncc = pitch_oncc;
716 definition->pitch_smoothcc = pitch_smoothcc;
717 definition->pitch_curvecc = pitch_curvecc;
718 definition->pitch_stepcc = pitch_stepcc;
719
720 // filter
721 definition->fil_type = fil_type;
722 definition->cutoff = cutoff;
723 definition->cutoff_oncc = cutoff_oncc;
724 definition->cutoff_smoothcc = cutoff_smoothcc;
725 definition->cutoff_stepcc = cutoff_stepcc;
726 definition->cutoff_curvecc = cutoff_curvecc;
727 definition->cutoff_chanaft = cutoff_chanaft;
728 definition->cutoff_polyaft = cutoff_polyaft;
729 definition->resonance = resonance;
730 definition->resonance_oncc = resonance_oncc;
731 definition->resonance_smoothcc = resonance_smoothcc;
732 definition->resonance_stepcc = resonance_stepcc;
733 definition->resonance_curvecc = resonance_curvecc;
734 definition->fil_keytrack = fil_keytrack;
735 definition->fil_keycenter = fil_keycenter;
736 definition->fil_veltrack = fil_veltrack;
737 definition->fil_random = fil_random;
738
739 definition->fil2_type = fil2_type;
740 definition->cutoff2 = cutoff2;
741 definition->cutoff2_oncc = cutoff2_oncc;
742 definition->cutoff2_smoothcc = cutoff2_smoothcc;
743 definition->cutoff2_stepcc = cutoff2_stepcc;
744 definition->cutoff2_curvecc = cutoff2_curvecc;
745 definition->cutoff2_chanaft = cutoff2_chanaft;
746 definition->cutoff2_polyaft = cutoff2_polyaft;
747 definition->resonance2 = resonance2;
748 definition->resonance2_oncc = resonance2_oncc;
749 definition->resonance2_smoothcc = resonance2_smoothcc;
750 definition->resonance2_stepcc = resonance2_stepcc;
751 definition->resonance2_curvecc = resonance2_curvecc;
752 definition->fil2_keytrack = fil2_keytrack;
753 definition->fil2_keycenter = fil2_keycenter;
754 definition->fil2_veltrack = fil2_veltrack;
755 definition->fil2_random = fil2_random;
756
757 // per voice equalizer
758 definition->eq1_freq = eq1_freq;
759 definition->eq2_freq = eq2_freq;
760 definition->eq3_freq = eq3_freq;
761 definition->eq1_freq_oncc = eq1_freq_oncc;
762 definition->eq2_freq_oncc = eq2_freq_oncc;
763 definition->eq3_freq_oncc = eq3_freq_oncc;
764 definition->eq1_vel2freq = eq1_vel2freq;
765 definition->eq2_vel2freq = eq2_vel2freq;
766 definition->eq3_vel2freq = eq3_vel2freq;
767 definition->eq1_bw = eq1_bw;
768 definition->eq2_bw = eq2_bw;
769 definition->eq3_bw = eq3_bw;
770 definition->eq1_bw_oncc = eq1_bw_oncc;
771 definition->eq2_bw_oncc = eq2_bw_oncc;
772 definition->eq3_bw_oncc = eq3_bw_oncc;
773 definition->eq1_gain = eq1_gain;
774 definition->eq2_gain = eq2_gain;
775 definition->eq3_gain = eq3_gain;
776 definition->eq1_gain_oncc = eq1_gain_oncc;
777 definition->eq2_gain_oncc = eq2_gain_oncc;
778 definition->eq3_gain_oncc = eq3_gain_oncc;
779 definition->eq1_vel2gain = eq1_vel2gain;
780 definition->eq2_vel2gain = eq2_vel2gain;
781 definition->eq3_vel2gain = eq3_vel2gain;
782
783 // envelope generator
784 definition->eg = eg;
785
786 // deprecated
787 definition->ampeg_delay = ampeg_delay;
788 definition->ampeg_start = ampeg_start;
789 definition->ampeg_attack = ampeg_attack;
790 definition->ampeg_hold = ampeg_hold;
791 definition->ampeg_decay = ampeg_decay;
792 definition->ampeg_sustain = ampeg_sustain;
793 definition->ampeg_release = ampeg_release;
794
795 definition->ampeg_vel2delay = ampeg_vel2delay;
796 definition->ampeg_vel2attack = ampeg_vel2attack;
797 definition->ampeg_vel2hold = ampeg_vel2hold;
798 definition->ampeg_vel2decay = ampeg_vel2decay;
799 definition->ampeg_vel2sustain = ampeg_vel2sustain;
800 definition->ampeg_vel2release = ampeg_vel2release;
801
802 definition->ampeg_delaycc = ampeg_delaycc;
803 definition->ampeg_startcc = ampeg_startcc;
804 definition->ampeg_attackcc = ampeg_attackcc;
805 definition->ampeg_holdcc = ampeg_holdcc;
806 definition->ampeg_decaycc = ampeg_decaycc;
807 definition->ampeg_sustaincc = ampeg_sustaincc;
808 definition->ampeg_releasecc = ampeg_releasecc;
809
810 definition->fileg_delay = fileg_delay;
811 definition->fileg_start = fileg_start;
812 definition->fileg_attack = fileg_attack;
813 definition->fileg_hold = fileg_hold;
814 definition->fileg_decay = fileg_decay;
815 definition->fileg_sustain = fileg_sustain;
816 definition->fileg_release = fileg_release;
817 definition->fileg_depth = fileg_depth;
818
819 definition->fileg_vel2delay = fileg_vel2delay;
820 definition->fileg_vel2attack = fileg_vel2attack;
821 definition->fileg_vel2hold = fileg_vel2hold;
822 definition->fileg_vel2decay = fileg_vel2decay;
823 definition->fileg_vel2sustain = fileg_vel2sustain;
824 definition->fileg_vel2release = fileg_vel2release;
825
826 definition->fileg_delay_oncc = fileg_delay_oncc;
827 definition->fileg_start_oncc = fileg_start_oncc;
828 definition->fileg_attack_oncc = fileg_attack_oncc;
829 definition->fileg_hold_oncc = fileg_hold_oncc;
830 definition->fileg_decay_oncc = fileg_decay_oncc;
831 definition->fileg_sustain_oncc = fileg_sustain_oncc;
832 definition->fileg_release_oncc = fileg_release_oncc;
833 definition->fileg_depth_oncc = fileg_depth_oncc;
834
835 definition->pitcheg_delay = pitcheg_delay;
836 definition->pitcheg_start = pitcheg_start;
837 definition->pitcheg_attack = pitcheg_attack;
838 definition->pitcheg_hold = pitcheg_hold;
839 definition->pitcheg_decay = pitcheg_decay;
840 definition->pitcheg_sustain = pitcheg_sustain;
841 definition->pitcheg_release = pitcheg_release;
842 definition->pitcheg_depth = pitcheg_depth;
843
844 definition->pitcheg_vel2delay = pitcheg_vel2delay;
845 definition->pitcheg_vel2attack = pitcheg_vel2attack;
846 definition->pitcheg_vel2hold = pitcheg_vel2hold;
847 definition->pitcheg_vel2decay = pitcheg_vel2decay;
848 definition->pitcheg_vel2sustain = pitcheg_vel2sustain;
849 definition->pitcheg_vel2release = pitcheg_vel2release;
850
851 definition->pitcheg_delay_oncc = pitcheg_delay_oncc;
852 definition->pitcheg_start_oncc = pitcheg_start_oncc;
853 definition->pitcheg_attack_oncc = pitcheg_attack_oncc;
854 definition->pitcheg_hold_oncc = pitcheg_hold_oncc;
855 definition->pitcheg_decay_oncc = pitcheg_decay_oncc;
856 definition->pitcheg_sustain_oncc = pitcheg_sustain_oncc;
857 definition->pitcheg_release_oncc = pitcheg_release_oncc;
858 definition->pitcheg_depth_oncc = pitcheg_depth_oncc;
859
860 definition->amplfo_delay = amplfo_delay;
861 definition->amplfo_fade = amplfo_fade;
862 definition->amplfo_freq = amplfo_freq;
863 definition->amplfo_depth = amplfo_depth;
864
865 definition->amplfo_delay_oncc = amplfo_delay_oncc;
866 definition->amplfo_fade_oncc = amplfo_fade_oncc;
867 definition->amplfo_depthcc = amplfo_depthcc;
868 definition->amplfo_freqcc = amplfo_freqcc;
869
870 definition->fillfo_delay = fillfo_delay;
871 definition->fillfo_fade = fillfo_fade;
872 definition->fillfo_freq = fillfo_freq;
873 definition->fillfo_depth = fillfo_depth;
874
875 definition->fillfo_delay_oncc = fillfo_delay_oncc;
876 definition->fillfo_fade_oncc = fillfo_fade_oncc;
877 definition->fillfo_depthcc = fillfo_depthcc;
878 definition->fillfo_freqcc = fillfo_freqcc;
879
880 definition->pitchlfo_delay = pitchlfo_delay;
881 definition->pitchlfo_fade = pitchlfo_fade;
882 definition->pitchlfo_freq = pitchlfo_freq;
883 definition->pitchlfo_depth = pitchlfo_depth;
884
885 definition->pitchlfo_delay_oncc = pitchlfo_delay_oncc;
886 definition->pitchlfo_fade_oncc = pitchlfo_fade_oncc;
887 definition->pitchlfo_depthcc = pitchlfo_depthcc;
888 definition->pitchlfo_freqcc = pitchlfo_freqcc;
889
890 definition->eg = eg;
891 definition->lfos = lfos;
892 }
893
894 /////////////////////////////////////////////////////////////
895 // class File
896
897 const std::string File::MACRO_NAME_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
898 const std::string File::MACRO_VALUE_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_. /\\";
899
900 File::File(std::string file, SampleManager* pSampleManager) :
901 rootFile(file),
902 _current_section(GLOBAL),
903 id(0),
904 default_path(""),
905 octave_offset(0),
906 note_offset(0)
907 {
908 _instrument = new Instrument(this, LinuxSampler::Path::getBaseName(file), pSampleManager);
909 ContainerDefinition* defaultGlobalContainer = new ContainerDefinition(ContainerDefinition::GLOBAL);
910 _current_containers.push(defaultGlobalContainer);
911 pCurDef = defaultGlobalContainer;
912
913 parseFile(file,pSampleManager);
914
915 std::set<float*> velcurves;
916 for (int i = 0; i < _instrument->regions.size(); i++) {
917 ::sfz::Region* pRegion = _instrument->regions[i];
918 int low = pRegion->lokey;
919 int high = pRegion->hikey;
920 if (low != -1) { // lokey -1 means region doesn't play on note-on
921 // hikey -1 is the same as no limit, except that it
922 // also enables on_locc/on_hicc
923 if (high == -1) high = 127;
924 if (low < 0 || low > 127 || high < 0 || high > 127 || low > high) {
925 std::cerr << "Invalid key range: " << low << " - " << high << std::endl;
926 } else {
927 for (int j = low; j <= high; j++) _instrument->KeyBindings[j] = true;
928 }
929 }
930
931 // get keyswitches
932 low = pRegion->sw_lokey;
933 if (low < 0) low = 0;
934 high = pRegion->sw_hikey;
935 if (high == -1) {
936 // Key switches not defined, so nothing to do
937 } else if (low >= 0 && low <= 127 && high >= 0 && high <= 127 && high >= low) {
938 for (int j = low; j <= high; j++) _instrument->KeySwitchBindings[j] = true;
939 } else {
940 std::cerr << "Invalid key switch range: " << low << " - " << high << std::endl;
941 }
942
943 // create velocity response curve
944
945 // don't use copy-on-write here, instead change the actual
946 // unique buffers in memory
947 float* velcurve = const_cast<float*>(&pRegion->amp_velcurve[0]);
948 if (velcurves.insert(velcurve).second) {
949 int prev = 0;
950 float prevvalue = 0;
951 for (int v = 0 ; v < 128 ; v++) {
952 if (velcurve[v] >= 0) {
953 float step = (velcurve[v] - prevvalue) / (v - prev);
954 for ( ; prev < v ; prev++) {
955 velcurve[prev] = prevvalue;
956 prevvalue += step;
957 }
958 }
959 }
960 if (prev) {
961 float step = (1 - prevvalue) / (127 - prev);
962 for ( ; prev < 128 ; prev++) {
963 velcurve[prev] = prevvalue;
964 prevvalue += step;
965 }
966 } else {
967 // default curve
968 for (int v = 0 ; v < 128 ; v++) {
969 velcurve[v] = v * v / (127.0 * 127.0);
970 }
971 }
972 }
973 }
974
975 _instrument->pLookupTable = new LookupTable(_instrument);
976
977 // create separate lookup tables for controller triggered
978 // regions, one for each CC
979 for (int i = 0 ; i < 128 ; i++) {
980 _instrument->pLookupTableCC[i] = new LookupTable(_instrument, i);
981 }
982
983 for (int i = 0; i < _instrument->regions.size(); i++) {
984 Region* r = _instrument->regions[i];
985
986 copyCurves(r->volume_curvecc, r->volume_oncc);
987 r->volume_curvecc.clear();
988
989 copySmoothValues(r->volume_smoothcc, r->volume_oncc);
990 r->volume_smoothcc.clear();
991
992 copyStepValues(r->volume_stepcc, r->volume_oncc);
993 r->volume_stepcc.clear();
994
995 copyCurves(r->pitch_curvecc, r->pitch_oncc);
996 r->pitch_curvecc.clear();
997
998 copySmoothValues(r->pitch_smoothcc, r->pitch_oncc);
999 r->pitch_smoothcc.clear();
1000
1001 copyStepValues(r->pitch_stepcc, r->pitch_oncc);
1002 r->pitch_stepcc.clear();
1003
1004 copyCurves(r->pan_curvecc, r->pan_oncc);
1005 r->pan_curvecc.clear();
1006
1007 copySmoothValues(r->pan_smoothcc, r->pan_oncc);
1008 r->pan_smoothcc.clear();
1009
1010 copyStepValues(r->pan_stepcc, r->pan_oncc);
1011 r->pan_stepcc.clear();
1012
1013 copyCurves(r->cutoff_curvecc, r->cutoff_oncc);
1014 r->cutoff_curvecc.clear();
1015
1016 copySmoothValues(r->cutoff_smoothcc, r->cutoff_oncc);
1017 r->cutoff_smoothcc.clear();
1018
1019 copyStepValues(r->cutoff_stepcc, r->cutoff_oncc);
1020 r->cutoff_stepcc.clear();
1021
1022 copyCurves(r->cutoff2_curvecc, r->cutoff2_oncc);
1023 r->cutoff2_curvecc.clear();
1024
1025 copySmoothValues(r->cutoff2_smoothcc, r->cutoff2_oncc);
1026 r->cutoff2_smoothcc.clear();
1027
1028 copyStepValues(r->cutoff2_stepcc, r->cutoff2_oncc);
1029 r->cutoff2_stepcc.clear();
1030
1031 copyCurves(r->resonance_curvecc, r->resonance_oncc);
1032 r->resonance_curvecc.clear();
1033
1034 copySmoothValues(r->resonance_smoothcc, r->resonance_oncc);
1035 r->resonance_smoothcc.clear();
1036
1037 copyStepValues(r->resonance_stepcc, r->resonance_oncc);
1038 r->resonance_stepcc.clear();
1039
1040 copyCurves(r->resonance2_curvecc, r->resonance2_oncc);
1041 r->resonance2_curvecc.clear();
1042
1043 copySmoothValues(r->resonance2_smoothcc, r->resonance2_oncc);
1044 r->resonance2_smoothcc.clear();
1045
1046 copyStepValues(r->resonance2_stepcc, r->resonance2_oncc);
1047 r->resonance2_stepcc.clear();
1048
1049 for (int j = 0; j < r->eg.size(); j++) {
1050 copyCurves(r->eg[j].pan_curvecc, r->eg[j].pan_oncc);
1051 r->eg[j].pan_curvecc.clear();
1052 }
1053
1054 for (int j = 0; j < r->lfos.size(); j++) {
1055 r->lfos[j].copySmoothValues();
1056 r->lfos[j].copyStepValues();
1057
1058 copySmoothValues(r->lfos[j].volume_smoothcc, r->lfos[j].volume_oncc);
1059 r->lfos[j].volume_smoothcc.clear();
1060
1061 copyStepValues(r->lfos[j].volume_stepcc, r->lfos[j].volume_oncc);
1062 r->lfos[j].volume_stepcc.clear();
1063
1064 copySmoothValues(r->lfos[j].freq_smoothcc, r->lfos[j].freq_oncc);
1065 r->lfos[j].freq_smoothcc.clear();
1066
1067 copyStepValues(r->lfos[j].freq_stepcc, r->lfos[j].freq_oncc);
1068 r->lfos[j].freq_stepcc.clear();
1069
1070 copySmoothValues(r->lfos[j].pitch_smoothcc, r->lfos[j].pitch_oncc);
1071 r->lfos[j].pitch_smoothcc.clear();
1072
1073 copyStepValues(r->lfos[j].pitch_stepcc, r->lfos[j].pitch_oncc);
1074 r->lfos[j].pitch_stepcc.clear();
1075
1076 copySmoothValues(r->lfos[j].pan_smoothcc, r->lfos[j].pan_oncc);
1077 r->lfos[j].pan_smoothcc.clear();
1078
1079 copyStepValues(r->lfos[j].pan_stepcc, r->lfos[j].pan_oncc);
1080 r->lfos[j].pan_stepcc.clear();
1081
1082 copySmoothValues(r->lfos[j].cutoff_smoothcc, r->lfos[j].cutoff_oncc);
1083 r->lfos[j].cutoff_smoothcc.clear();
1084
1085 copyStepValues(r->lfos[j].cutoff_stepcc, r->lfos[j].cutoff_oncc);
1086 r->lfos[j].cutoff_stepcc.clear();
1087
1088 copySmoothValues(r->lfos[j].resonance_smoothcc, r->lfos[j].resonance_oncc);
1089 r->lfos[j].resonance_smoothcc.clear();
1090
1091 copyStepValues(r->lfos[j].resonance_stepcc, r->lfos[j].resonance_oncc);
1092 r->lfos[j].resonance_stepcc.clear();
1093 }
1094 }
1095 }
1096
1097 void File::parseFile(std::string file, SampleManager* pSampleManager){
1098 enum token_type_t { HEADER, OPCODE };
1099 token_type_t token_type = (token_type_t) -1;
1100 std::string token_string;
1101
1102 std::ifstream fs(file.c_str());
1103 currentDir = LinuxSampler::Path::stripLastName(file);
1104 std::string token;
1105 std::string line;
1106 currentLine = 0;
1107
1108 // remember latest modification time of file
1109 checkFileModified(file);
1110
1111 while (std::getline(fs, line))
1112 {
1113 currentLine++;
1114 // COMMENT
1115 std::string::size_type slash_index = line.find("//");
1116 if (slash_index != std::string::npos)
1117 line.resize(slash_index);
1118
1119 // #include
1120 if (line.find("#include ") == 0) {
1121 size_t fname_start = line.find("\"");
1122 if (fname_start == std::string::npos) continue;
1123
1124 size_t fname_end = line.find("\"", fname_start + 1);
1125 if (fname_end == std::string::npos || fname_start == fname_end)
1126 continue;
1127 std::string fname = line.substr(fname_start + 1, fname_end - fname_start - 1);
1128
1129 if (!currentDir.empty() && !LinuxSampler::Path(fname).isAbsolute())
1130 fname = currentDir + LinuxSampler::File::DirSeparator + fname;
1131
1132 std::string cd = currentDir; // backup current dir
1133 int cl = currentLine;
1134 parseFile(fname, pSampleManager);
1135 currentDir = cd; // restore currentDir (since altered by parsefile())
1136 currentLine = cl;
1137 continue;
1138 }
1139 // #define
1140 else if (line.find("#define") == 0)
1141 {
1142
1143 size_t varname_start = line.find_first_not_of("\t ", std::strlen("#define"));
1144 size_t varname_end = line.find_first_of("\t ", varname_start + 1);
1145 size_t value_start = line.find_first_not_of("\t ", varname_end + 1);
1146
1147 std::string varname = line.substr(varname_start, varname_end - varname_start);
1148 std::string value = line.substr(value_start, std::string::npos);
1149
1150 if (varname.size() == 0 || value.size() == 0)
1151 {
1152 std::cerr << "sfz error: Malformed #define statement on line " << currentLine << std::endl;
1153 continue;
1154 }
1155
1156 // Deal with DOS EOLs
1157 if (value[value.size() - 1] == '\r')
1158 {
1159 value.erase(value.size() - 1);
1160 }
1161
1162 // Check varname
1163 if (varname[0] != '$')
1164 {
1165 std::cerr << "sfz error: Macro name '" << varname;
1166 std::cerr << "' doesn't start with '$'." << std::endl;
1167 continue;
1168 }
1169 // Invalid chars
1170 if (varname.find_first_not_of(MACRO_NAME_CHARS, 1) != std::string::npos)
1171 {
1172 std::cerr << "sfz error: Macro name '" << varname;
1173 std::cerr << "' contains invalid characters." << std::endl;
1174 }
1175
1176 // Check value
1177 // Match alphanumeric, underscore, and decimal point.
1178 if (value.find_first_not_of(MACRO_VALUE_CHARS) != std::string::npos)
1179 {
1180 std::cerr << "sfz error: Macro value '" << value;
1181 std::cerr << "' contains invalid characters." << std::endl;
1182 continue;
1183 }
1184
1185 _defined_macros[varname] = value;
1186
1187 continue;
1188 }
1189 // script=path/to/scriptfile
1190 else if (line.find("script") == 0) {
1191 size_t eq = line.find_first_of("=");
1192 if (eq == std::string::npos) {
1193 std::cerr << "sfz error: opcode 'script' misses '=' character\n";
1194 continue;
1195 }
1196 std::string value = trim( line.substr(eq+1, std::string::npos) );
1197 if (value.empty()) {
1198 std::cerr << "sfz error: empty path assigned to opcode 'script'\n";
1199 continue;
1200 }
1201 LinuxSampler::Path path = LinuxSampler::Path::fromUnknownFS(value);
1202 if (!currentDir.empty() && !path.isAbsolute())
1203 path = LinuxSampler::Path::fromUnknownFS(currentDir) + path;
1204 LinuxSampler::File file(path);
1205 if (!file.Exist()) {
1206 std::cerr << "sfz error: script file '" << value << "' does not exist\n";
1207 continue;
1208 }
1209 if (!file.IsFile()) {
1210 std::cerr << "sfz error: script '" << value << "' is not a file\n";
1211 continue;
1212 }
1213 Script script(path);
1214 _instrument->scripts.push_back(script);
1215
1216 continue;
1217 }
1218
1219 // DEFINITION
1220 std::stringstream linestream(line);
1221 int spaces = 0;
1222 while (linestream >> token)
1223 {
1224 linestream >> std::noskipws;
1225 if (token[0] == '<') {
1226 std::string::size_type p = token.find('>', 1);
1227 if (p != std::string::npos && p < (token.size() - 1)) {
1228 linestream.seekg(p + 1 - token.size(), std::stringstream::cur);
1229 token.erase(p + 1);
1230 }
1231 }
1232 if (token[0] == '<' && token[token.size()-1] == '>')
1233 {
1234 // HEAD
1235 if (!token_string.empty())
1236 {
1237 switch (token_type)
1238 {
1239 case HEADER:
1240 push_header(token_string);
1241 break;
1242 case OPCODE:
1243 push_opcode(token_string);
1244 break;
1245 }
1246 token_string.erase();
1247 }
1248 token_string.append(token);
1249 token_type = HEADER;
1250 }
1251 else if (token.find('=') != std::string::npos)
1252 {
1253 // HEAD
1254 if (!token_string.empty())
1255 {
1256 switch (token_type)
1257 {
1258 case HEADER:
1259 push_header(token_string);
1260 break;
1261 case OPCODE:
1262 push_opcode(token_string);
1263 break;
1264 }
1265 token_string.erase();
1266 }
1267 token_string.append(token);
1268 token_type = OPCODE;
1269 }
1270 else
1271 {
1272 // TAIL
1273 token_string.append(spaces, ' ');
1274 token_string.append(token);
1275 }
1276 spaces = 0;
1277 while (isspace(linestream.peek())) {
1278 linestream.ignore();
1279 spaces++;
1280 }
1281 }
1282
1283 // EOL
1284 if (!token_string.empty())
1285 {
1286 switch (token_type)
1287 {
1288 case HEADER:
1289 push_header(token_string);
1290 break;
1291 case OPCODE:
1292 push_opcode(token_string);
1293 break;
1294 }
1295 token_string.erase();
1296 }
1297 }
1298 }
1299
1300 optional<File::Time> File::getModTimeOfFile(std::string filename) {
1301 struct stat st;
1302
1303 if (stat(filename.c_str(), &st))
1304 return optional<File::Time>::nothing;
1305
1306 return (Time) {
1307 #if defined(WIN32)
1308 .sec = (intmax_t) st.st_mtime,
1309 .nsec = (uint32_t) 0
1310 #elif defined(__APPLE__)
1311 .sec = (intmax_t) st.st_mtimespec.tv_sec,
1312 .nsec = (uint32_t) st.st_mtimespec.tv_nsec
1313 #else
1314 .sec = (intmax_t) st.st_mtim.tv_sec,
1315 .nsec = (uint32_t) st.st_mtim.tv_nsec
1316 #endif
1317 };
1318 }
1319
1320 bool File::checkFileModified(std::string filename) {
1321 if (filename.empty()) {
1322 bool res = false;
1323 for (const auto& mod_time : mod_times) {
1324 res |= checkFileModified(mod_time.first);
1325 }
1326 return res;
1327 }
1328 optional<Time> mod_time = getModTimeOfFile(filename);
1329 if (!mod_time) return false;
1330 Time& prevTime = mod_times[filename];
1331 const bool res = *mod_time != prevTime;
1332 prevTime = *mod_time; // remember changed mtime
1333 return res;
1334 }
1335
1336 File::~File()
1337 {
1338 for (int i = 0; i < _current_containers.size(); i++)
1339 {
1340 delete _current_containers.top();
1341 _current_containers.pop();
1342 }
1343 delete _instrument;
1344 }
1345
1346 std::string File::filename() const {
1347 return rootFile;
1348 }
1349
1350 Instrument*
1351 File::GetInstrument()
1352 {
1353 return _instrument;
1354 }
1355
1356 void File::copyCurves(LinuxSampler::ArrayList<CC>& curves, LinuxSampler::ArrayList<CC>& dest) {
1357 for (int i = 0; i < curves.size(); i++) {
1358 for (int j = 0; j < dest.size(); j++) {
1359 if (curves[i].Controller == dest[j].Controller) {
1360 dest[j].Curve = curves[i].Curve;
1361 }
1362 }
1363 }
1364 }
1365
1366 void File::copySmoothValues(LinuxSampler::ArrayList<CC>& smooths, LinuxSampler::ArrayList<CC>& dest) {
1367 for (int i = 0; i < smooths.size(); i++) {
1368 for (int j = 0; j < dest.size(); j++) {
1369 if (smooths[i].Controller == dest[j].Controller) {
1370 dest[j].Smooth = smooths[i].Smooth;
1371 }
1372 }
1373 }
1374 }
1375
1376 void File::copyStepValues(LinuxSampler::ArrayList<CC>& steps, LinuxSampler::ArrayList<CC>& dest) {
1377 for (int i = 0; i < steps.size(); i++) {
1378 for (int j = 0; j < dest.size(); j++) {
1379 if (steps[i].Controller == dest[j].Controller) {
1380 dest[j].Step = steps[i].Step;
1381 }
1382 }
1383 }
1384 }
1385
1386 int File::ToInt(const std::string& s) throw(LinuxSampler::Exception) {
1387 int i;
1388 std::istringstream iss(s);
1389 if(!(iss >> i)) {
1390 std::ostringstream oss;
1391 oss << "Line " << currentLine << ": Expected an integer";
1392 throw LinuxSampler::Exception(oss.str());
1393 }
1394 return i;
1395 }
1396
1397 float File::ToFloat(const std::string& s) throw(LinuxSampler::Exception) {
1398 float i;
1399 std::istringstream iss(s);
1400 if(!(iss >> i)) {
1401 std::ostringstream oss;
1402 oss << "Line " << currentLine << ": Expected a floating-point number";
1403 throw LinuxSampler::Exception(oss.str());
1404 }
1405 return i;
1406 }
1407
1408 void
1409 File::push_header(std::string token)
1410 {
1411 if (token == "<global>" ||
1412 token == "<master>" ||
1413 token == "<group>")
1414 {
1415 ContainerDefinition::section_type level = ContainerDefinition::GLOBAL; // initialized only to avoid an irrelevant compiler warning
1416
1417 if (token == "<global>")
1418 {
1419 _current_section = GLOBAL;
1420 level = ContainerDefinition::GLOBAL;
1421 }
1422 else if (token == "<master>")
1423 {
1424 _current_section = MASTER;
1425 level = ContainerDefinition::MASTER;
1426 }
1427 else if (token == "<group>")
1428 {
1429 _current_section = GROUP;
1430 level = ContainerDefinition::GROUP;
1431 }
1432
1433 ContainerDefinition* newContainer = new ContainerDefinition(level);
1434
1435 while (_current_containers.size() > 0 && _current_containers.top()->level <= level)
1436 {
1437 delete _current_containers.top();
1438 _current_containers.pop();
1439 }
1440
1441 //If the new header is a <global>, there won't be anything left in _current_containers
1442 //to copy from.
1443 if (_current_containers.size() > 0)
1444 {
1445 _current_containers.top()->CopyValuesToDefinition(newContainer);
1446 }
1447 _current_containers.push(newContainer);
1448 pCurDef = newContainer;
1449 }
1450 else if (token == "<region>")
1451 {
1452 _current_section = REGION;
1453 _current_region = new Region();
1454 _current_region->id = id++;
1455 _current_containers.top()->CopyValuesToDefinition(_current_region);
1456 pCurDef = _current_region;
1457 _instrument->regions.push_back(_current_region);
1458 _current_region->SetInstrument(_instrument);
1459 }
1460 else if (token == "<control>")
1461 {
1462 _current_section = CONTROL;
1463 default_path = "";
1464 octave_offset = 0;
1465 note_offset = 0;
1466 }
1467 else if (token == "<curve>")
1468 {
1469 _current_section = CURVE;
1470 _instrument->curves.add(Curve());
1471 _current_curve = &_instrument->curves[_instrument->curves.size() - 1];
1472 }
1473 else
1474 {
1475 _current_section = UNKNOWN;
1476 std::cerr << "The header '" << token << "' is unsupported by libsfz!" << std::endl;
1477 }
1478 }
1479
1480 void
1481 File::push_opcode(std::string token)
1482 {
1483 if (_current_section == UNKNOWN)
1484 return;
1485
1486 std::string::size_type delimiter_index = token.find('=');
1487 std::string key = token.substr(0, delimiter_index);
1488 std::string value = token.substr(delimiter_index + 1);
1489 int x, y, z;
1490
1491 // Apply macros
1492 size_t macro_start = 0;
1493 size_t macro_end = 0;
1494 std::string macro_value;
1495 while ((macro_start = value.find("$", macro_start + macro_value.size())) != std::string::npos)
1496 {
1497 macro_end = value.find_first_not_of(MACRO_NAME_CHARS, macro_start + 1);
1498 size_t macro_len = macro_end - macro_start;
1499 std::string macro_name = value.substr(macro_start, macro_len);
1500 if (_defined_macros.count(macro_name) != 0)
1501 {
1502 macro_value = _defined_macros[macro_name];
1503 value.replace(macro_start, macro_len, macro_value);
1504 }
1505 else
1506 {
1507 std::cerr << "Macro '" << macro_name << "' referenced on line ";
1508 std::cerr << currentLine << " is undefined." << std::endl;
1509 return;
1510 }
1511 }
1512
1513 if (_current_section == CURVE) {
1514 if (sscanf(key.c_str(), "v%d", &x)) {
1515 if (x < 0 || x > 127) {
1516 std::cerr << "Invalid curve index: " << x << std::endl;
1517 }
1518 _current_curve->v[x] = check(key, 0.0f, 1.0f, ToFloat(value));
1519 } else {
1520 std::cerr << "The opcode '" << key << "' in section <curve> is unsupported by libsfz!" << std::endl;
1521 }
1522
1523 return;
1524 }
1525
1526 // sample definition
1527 if ("sample" == key)
1528 {
1529 // handle built-in sample types ...
1530 if (value == "*silence") {
1531 pCurDef->sample = value;
1532 return;
1533 } else if (value.length() >= 1 && value[0] == '*') {
1534 std::cerr << "Unknown or unsupported built-in sample type '" << value << "'!" << std::endl;
1535 return;
1536 }
1537
1538 // handle external samples ...
1539 std::string path = default_path + value;
1540 #ifndef WIN32
1541 for (int i = 0; i < path.length(); i++) if (path[i] == '\\') path[i] = '/';
1542 bool absolute = path[0] == '/';
1543 #else
1544 bool absolute = path[0] == '/' || path[0] == '\\' ||
1545 (path.length() >= 2 && isalpha(path[0]) && path[1] == ':');
1546 #endif
1547 if (!absolute) path = currentDir + LinuxSampler::File::DirSeparator + path;
1548 if(pCurDef) pCurDef->sample = path;
1549 return;
1550 }
1551
1552 // control header directives
1553 else if ("default_path" == key)
1554 {
1555 switch (_current_section)
1556 {
1557 case CONTROL:
1558 default_path = value;
1559 break;
1560 default:
1561 ; // noop
1562 }
1563 return;
1564 }
1565 else if ("octave_offset" == key)
1566 {
1567 switch (_current_section)
1568 {
1569 case CONTROL:
1570 octave_offset = ToInt(value);
1571 break;
1572 default:
1573 ; // noop
1574 }
1575 return;
1576 }
1577 else if ("note_offset" == key)
1578 {
1579 switch (_current_section)
1580 {
1581 case CONTROL:
1582 note_offset = ToInt(value);
1583 break;
1584 default:
1585 ; // noop
1586 }
1587 return;
1588 }
1589
1590 // input controls
1591 else if ("lochan" == key) pCurDef->lochan = ToInt(value);
1592 else if ("hichan" == key) pCurDef->hichan = ToInt(value);
1593 else if ("lokey" == key) pCurDef->lokey = parseKey(value);
1594 else if ("hikey" == key) pCurDef->hikey = parseKey(value);
1595 else if ("key" == key)
1596 {
1597 pCurDef->lokey = pCurDef->hikey = pCurDef->pitch_keycenter = parseKey(value);
1598 }
1599 else if ("lovel" == key) pCurDef->lovel = ToInt(value);
1600 else if ("hivel" == key) pCurDef->hivel = ToInt(value);
1601 else if ("lobend" == key) pCurDef->lobend = ToInt(value);
1602 else if ("hibend" == key) pCurDef->hibend = ToInt(value);
1603 else if ("lobpm" == key) pCurDef->lobpm = ToFloat(value);
1604 else if ("hibpm" == key) pCurDef->hibpm = ToFloat(value);
1605 else if ("lochanaft" == key) pCurDef->lochanaft = ToInt(value);
1606 else if ("hichanaft" == key) pCurDef->hichanaft = ToInt(value);
1607 else if ("lopolyaft" == key) pCurDef->lopolyaft = ToInt(value);
1608 else if ("hipolyaft" == key) pCurDef->hipolyaft = ToInt(value);
1609 else if ("loprog" == key) pCurDef->loprog = ToInt(value);
1610 else if ("hiprog" == key) pCurDef->hiprog = ToInt(value);
1611 else if ("lorand" == key) pCurDef->lorand = ToFloat(value);
1612 else if ("hirand" == key) pCurDef->hirand = ToFloat(value);
1613 else if ("lotimer" == key) pCurDef->lotimer = ToFloat(value);
1614 else if ("hitimer" == key) pCurDef->hitimer = ToFloat(value);
1615 else if ("seq_length" == key) pCurDef->seq_length = ToInt(value);
1616 else if ("seq_position" == key) pCurDef->seq_position = ToInt(value);
1617 else if ("sw_lokey" == key) pCurDef->sw_lokey = parseKey(value);
1618 else if ("sw_hikey" == key) pCurDef->sw_hikey = parseKey(value);
1619 else if ("sw_last" == key) pCurDef->sw_last = parseKey(value);
1620 else if ("sw_down" == key) pCurDef->sw_down = parseKey(value);
1621 else if ("sw_up" == key) pCurDef->sw_up = parseKey(value);
1622 else if ("sw_previous" == key) pCurDef->sw_previous = parseKey(value);
1623 else if ("sw_vel" == key)
1624 {
1625 if (value == "current") pCurDef->sw_vel = VEL_CURRENT;
1626 else if (value == "previous") pCurDef->sw_vel = VEL_PREVIOUS;
1627 }
1628 else if ("trigger" == key)
1629 {
1630 if (value == "attack") pCurDef->trigger = TRIGGER_ATTACK;
1631 else if (value == "release") pCurDef->trigger = TRIGGER_RELEASE;
1632 else if (value == "first") pCurDef->trigger = TRIGGER_FIRST;
1633 else if (value == "legato") pCurDef->trigger = TRIGGER_LEGATO;
1634 }
1635 else if ("group" == key) pCurDef->group = ToInt(value);
1636 else if ("off_by" == key || "offby" == key) pCurDef->off_by = ToInt(value);
1637 else if ("off_mode" == key || "offmode" == key)
1638 {
1639 if (value == "fast") pCurDef->off_mode = OFF_FAST;
1640 else if (value == "normal") pCurDef->off_mode = OFF_NORMAL;
1641 }
1642
1643 // sample player
1644 else if ("count" == key) { pCurDef->count = ToInt(value); pCurDef->loop_mode = ONE_SHOT; }
1645 else if ("delay" == key) pCurDef->delay = ToFloat(value);
1646 else if ("delay_random" == key) pCurDef->delay_random = ToFloat(value);
1647 else if ("delay_beats" == key) pCurDef->delay_beats = ToInt(value);
1648 else if ("stop_beats" == key) pCurDef->stop_beats = ToInt(value);
1649 else if ("delay_samples" == key) pCurDef->delay_samples = ToInt(value);
1650 else if ("end" == key) pCurDef->end = ToInt(value);
1651 else if ("loop_crossfade" == key) pCurDef->loop_crossfade = ToFloat(value);
1652 else if ("offset_random" == key) pCurDef->offset_random = ToInt(value);
1653 else if ("loop_mode" == key || "loopmode" == key)
1654 {
1655 if (value == "no_loop") pCurDef->loop_mode = NO_LOOP;
1656 else if (value == "one_shot") pCurDef->loop_mode = ONE_SHOT;
1657 else if (value == "loop_continuous") pCurDef->loop_mode = LOOP_CONTINUOUS;
1658 else if (value == "loop_sustain") pCurDef->loop_mode = LOOP_SUSTAIN;
1659 }
1660 else if ("loop_start" == key) pCurDef->loop_start = ToInt(value);
1661 else if ("loopstart" == key) pCurDef->loop_start = ToInt(value); // nonstandard
1662 else if ("loop_end" == key) pCurDef->loop_end = ToInt(value);
1663 else if ("loopend" == key) pCurDef->loop_end = ToInt(value); // nonstandard
1664 else if ("offset" == key) pCurDef->offset = ToInt(value);
1665 else if ("sync_beats" == key) pCurDef->sync_beats = ToInt(value);
1666 else if ("sync_offset" == key) pCurDef->sync_offset = ToInt(value);
1667
1668 // amplifier
1669 else if ("volume" == key) pCurDef->volume = ToFloat(value);
1670 else if ("amplitude" == key) pCurDef->amplitude = ToFloat(value);
1671 else if ("pan" == key) pCurDef->pan = ToFloat(value);
1672 else if ("width" == key) pCurDef->width = ToFloat(value);
1673 else if ("position" == key) pCurDef->position = ToFloat(value);
1674 else if ("amp_keytrack" == key) pCurDef->amp_keytrack = ToFloat(value);
1675 else if ("amp_keycenter" == key) pCurDef->amp_keycenter = parseKey(value);
1676 else if ("amp_veltrack" == key) pCurDef->amp_veltrack = ToFloat(value);
1677 else if ("amp_random" == key) pCurDef->amp_random = ToFloat(value);
1678 else if ("rt_decay" == key || "rtdecay" == key) pCurDef->rt_decay = ToFloat(value);
1679 else if ("xfin_lokey" == key) pCurDef->xfin_lokey = parseKey(value);
1680 else if ("xfin_hikey" == key) pCurDef->xfin_hikey = parseKey(value);
1681 else if ("xfout_lokey" == key) pCurDef->xfout_lokey = parseKey(value);
1682 else if ("xfout_hikey" == key) pCurDef->xfout_hikey = parseKey(value);
1683 else if ("xf_keycurve" == key)
1684 {
1685 if (value == "gain") pCurDef->xf_keycurve = GAIN;
1686 else if (value == "power") pCurDef->xf_keycurve = POWER;
1687 }
1688 else if ("xfin_lovel" == key) pCurDef->xfin_lovel = ToInt(value);
1689 else if ("xfin_hivel" == key) pCurDef->xfin_hivel = ToInt(value);
1690 else if ("xfout_lovel" == key) pCurDef->xfout_lovel = ToInt(value);
1691 else if ("xfout_hivel" == key) pCurDef->xfout_hivel = ToInt(value);
1692 else if ("xf_velcurve" == key)
1693 {
1694 if (value == "gain") pCurDef->xf_velcurve = GAIN;
1695 else if (value == "power") pCurDef->xf_velcurve = POWER;
1696 }
1697 else if ("xf_cccurve" == key)
1698 {
1699 if (value == "gain") pCurDef->xf_cccurve = GAIN;
1700 else if (value == "power") pCurDef->xf_cccurve = POWER;
1701 }
1702
1703 // pitch
1704 else if ("transpose" == key) pCurDef->transpose = ToInt(value);
1705 else if ("tune" == key) pCurDef->tune = ToInt(value);
1706 else if ("pitch_keycenter" == key) pCurDef->pitch_keycenter = parseKey(value);
1707 else if ("pitch_keytrack" == key) pCurDef->pitch_keytrack = ToInt(value);
1708 else if ("pitch_veltrack" == key) pCurDef->pitch_veltrack = ToInt(value);
1709 else if ("pitch_random" == key) pCurDef->pitch_random = ToInt(value);
1710 else if ("bend_up" == key || "bendup" == key) pCurDef->bend_up = ToInt(value);
1711 else if ("bend_down" == key || "benddown" == key) pCurDef->bend_down = ToInt(value);
1712 else if ("bend_step" == key || "bendstep" == key) pCurDef->bend_step = ToInt(value);
1713
1714 // filter
1715 else if ("fil_type" == key || "filtype" == key)
1716 {
1717 if (value == "lpf_1p") pCurDef->fil_type = LPF_1P;
1718 else if (value == "hpf_1p") pCurDef->fil_type = HPF_1P;
1719 else if (value == "bpf_1p") pCurDef->fil_type = BPF_1P;
1720 else if (value == "brf_1p") pCurDef->fil_type = BRF_1P;
1721 else if (value == "apf_1p") pCurDef->fil_type = APF_1P;
1722 else if (value == "lpf_2p") pCurDef->fil_type = LPF_2P;
1723 else if (value == "hpf_2p") pCurDef->fil_type = HPF_2P;
1724 else if (value == "bpf_2p") pCurDef->fil_type = BPF_2P;
1725 else if (value == "brf_2p") pCurDef->fil_type = BRF_2P;
1726 else if (value == "pkf_2p") pCurDef->fil_type = PKF_2P;
1727 else if (value == "lpf_4p") pCurDef->fil_type = LPF_4P;
1728 else if (value == "hpf_4p") pCurDef->fil_type = HPF_4P;
1729 else if (value == "lpf_6p") pCurDef->fil_type = LPF_6P;
1730 else if (value == "hpf_6p") pCurDef->fil_type = HPF_6P;
1731 }
1732 else if ("fil2_type" == key)
1733 {
1734 if (value == "lpf_1p") pCurDef->fil2_type = LPF_1P;
1735 else if (value == "hpf_1p") pCurDef->fil2_type = HPF_1P;
1736 else if (value == "bpf_1p") pCurDef->fil2_type = BPF_1P;
1737 else if (value == "brf_1p") pCurDef->fil2_type = BRF_1P;
1738 else if (value == "apf_1p") pCurDef->fil2_type = APF_1P;
1739 else if (value == "lpf_2p") pCurDef->fil2_type = LPF_2P;
1740 else if (value == "hpf_2p") pCurDef->fil2_type = HPF_2P;
1741 else if (value == "bpf_2p") pCurDef->fil2_type = BPF_2P;
1742 else if (value == "brf_2p") pCurDef->fil2_type = BRF_2P;
1743 else if (value == "pkf_2p") pCurDef->fil2_type = PKF_2P;
1744 else if (value == "lpf_4p") pCurDef->fil2_type = LPF_4P;
1745 else if (value == "hpf_4p") pCurDef->fil2_type = HPF_4P;
1746 else if (value == "lpf_6p") pCurDef->fil2_type = LPF_6P;
1747 else if (value == "hpf_6p") pCurDef->fil2_type = HPF_6P;
1748 }
1749 else if ("cutoff" == key) pCurDef->cutoff = ToFloat(value);
1750 else if ("cutoff2" == key) pCurDef->cutoff2 = ToFloat(value);
1751 else if ("cutoff_chanaft" == key) {
1752 pCurDef->cutoff_chanaft = check(key, -9600, 9600, ToInt(value));
1753 pCurDef->cutoff_oncc.add( CC(128, check(key, -9600, 9600, ToInt(value))) );
1754 } else if ("cutoff2_chanaft" == key) pCurDef->cutoff2_chanaft = ToInt(value);
1755 else if ("cutoff_polyaft" == key) pCurDef->cutoff_polyaft = ToInt(value);
1756 else if ("cutoff2_polyaft" == key) pCurDef->cutoff2_polyaft = ToInt(value);
1757 else if ("resonance" == key) pCurDef->resonance = ToFloat(value);
1758 else if ("resonance2" == key) pCurDef->resonance2 = ToFloat(value);
1759 else if ("fil_keytrack" == key) pCurDef->fil_keytrack = ToInt(value);
1760 else if ("fil2_keytrack" == key) pCurDef->fil2_keytrack = ToInt(value);
1761 else if ("fil_keycenter" == key) pCurDef->fil_keycenter = parseKey(value);
1762 else if ("fil2_keycenter" == key) pCurDef->fil2_keycenter = parseKey(value);
1763 else if ("fil_veltrack" == key) pCurDef->fil_veltrack = ToInt(value);
1764 else if ("fil2_veltrack" == key) pCurDef->fil2_veltrack = ToInt(value);
1765 else if ("fil_random" == key) pCurDef->fil_random = ToInt(value);
1766 else if ("fil2_random" == key) pCurDef->fil2_random = ToInt(value);
1767
1768 // per voice equalizer
1769 else if ("eq1_freq" == key) pCurDef->eq1_freq = ToFloat(value);
1770 else if ("eq2_freq" == key) pCurDef->eq2_freq = ToFloat(value);
1771 else if ("eq3_freq" == key) pCurDef->eq3_freq = ToFloat(value);
1772 else if ("eq1_vel2freq" == key) pCurDef->eq1_vel2freq = ToFloat(value);
1773 else if ("eq2_vel2freq" == key) pCurDef->eq2_vel2freq = ToFloat(value);
1774 else if ("eq3_vel2freq" == key) pCurDef->eq3_vel2freq = ToFloat(value);
1775 else if ("eq1_bw" == key) pCurDef->eq1_bw = ToFloat(value);
1776 else if ("eq2_bw" == key) pCurDef->eq2_bw = ToFloat(value);
1777 else if ("eq3_bw" == key) pCurDef->eq3_bw = ToFloat(value);
1778 else if ("eq1_gain" == key) pCurDef->eq1_gain = ToFloat(value);
1779 else if ("eq2_gain" == key) pCurDef->eq2_gain = ToFloat(value);
1780 else if ("eq3_gain" == key) pCurDef->eq3_gain = ToFloat(value);
1781 else if ("eq1_vel2gain" == key) pCurDef->eq1_vel2gain = ToFloat(value);
1782 else if ("eq2_vel2gain" == key) pCurDef->eq2_vel2gain = ToFloat(value);
1783 else if ("eq3_vel2gain" == key) pCurDef->eq3_vel2gain = ToFloat(value);
1784
1785 else if (sscanf(key.c_str(), "amp_velcurve_%d", &x)) {
1786 pCurDef->amp_velcurve.set(x, ToFloat(value));
1787 }
1788
1789 // v2 envelope generators
1790 else if (sscanf(key.c_str(), "eg%d%n", &x, &y)) {
1791 const char* s = key.c_str() + y;
1792 if (sscanf(s, "_time%d%n", &y, &z)) {
1793 const char* s2 = s + z;
1794 if (strcmp(s2, "") == 0) egnode(x, y).time = check(key, 0.0f, 100.0f, ToFloat(value));
1795 else if (sscanf(s2, "_oncc%d", &z)) egnode(x, y).time_oncc.add( CC(z, check(key, 0.0f, 100.0f, ToFloat(value))) );
1796 } else if (sscanf(s, "_level%d%n", &y, &z)) {
1797 const char* s2 = s + z;
1798 if (strcmp(s2, "") == 0) egnode(x, y).level = check(key, 0.0f, 1.0f, ToFloat(value));
1799 else if (sscanf(s2, "_oncc%d", &z)) egnode(x, y).level_oncc.add( CC(z, check(key, 0.0f, 1.0f, ToFloat(value))) );
1800 }
1801 else if (sscanf(s, "_shape%d", &y)) egnode(x, y).shape = ToFloat(value);
1802 else if (sscanf(s, "_curve%d", &y)) egnode(x, y).curve = ToFloat(value);
1803 else if (strcmp(s, "_sustain") == 0) eg(x).sustain = ToInt(value);
1804 else if (strcmp(s, "_loop") == 0) eg(x).loop = ToInt(value);
1805 else if (strcmp(s, "_loop_count") == 0) eg(x).loop_count = ToInt(value);
1806 else if (strcmp(s, "_amplitude") == 0) eg(x).amplitude = ToFloat(value);
1807 else if (sscanf(s, "_amplitude_oncc%d", &y)) eg(x).amplitude_oncc.add( CC(y, check(key, 0.0f, 100.0f, ToFloat(value))) );
1808 else if (strcmp(s, "_volume") == 0) eg(x).volume = check(key, -144.0f, 6.0f, ToFloat(value));
1809 else if (sscanf(s, "_volume_oncc%d", &y)) eg(x).volume_oncc.add( CC(y, check(key, -144.0f, 6.0f, ToFloat(value))) );
1810 else if (strcmp(s, "_cutoff") == 0) eg(x).cutoff = ToFloat(value);
1811 else if (sscanf(s, "_cutoff_oncc%d", &y)) eg(x).cutoff_oncc.add( CC(y, check(key, -9600, 9600, ToInt(value))) );
1812 else if (strcmp(s, "_pitch") == 0) eg(x).pitch = check(key, -9600, 9600, ToInt(value));
1813 else if (sscanf(s, "_pitch_oncc%d", &y)) eg(x).pitch_oncc.add( CC(y, check(key, -9600, 9600, ToInt(value))) );
1814 else if (strcmp(s, "_resonance") == 0) eg(x).resonance = check(key, 0.0f, 40.0f, ToFloat(value));
1815 else if (sscanf(s, "_resonance_oncc%d", &y)) eg(x).resonance_oncc.add( CC(y, check(key, 0.0f, 40.0f, ToFloat(value))) );
1816 else if (strcmp(s, "_pan") == 0) eg(x).pan = check(key, -100.0f, 100.0f, ToFloat(value));
1817 else if (strcmp(s, "_pan_curve") == 0) eg(x).pan_curve = check(key, 0, 30000, ToInt(value));
1818 else if (sscanf(s, "_pan_oncc%d", &y)) eg(x).pan_oncc.add( CC(y, check(key, -100.0f, 100.0f, ToFloat(value))) );
1819 else if (sscanf(s, "_pan_curvecc%d", &y)) eg(x).pan_curvecc.add( CC(y, 0.0f, check(key, 0, 30000, ToInt(value))) );
1820 else if (strcmp(s, "_eq1freq") == 0) eg(x).eq1freq = check(key, 0.0f, 30000.0f, ToFloat(value));
1821 else if (strcmp(s, "_eq2freq") == 0) eg(x).eq2freq = check(key, 0.0f, 30000.0f, ToFloat(value));
1822 else if (strcmp(s, "_eq3freq") == 0) eg(x).eq3freq = check(key, 0.0f, 30000.0f, ToFloat(value));
1823 else if (strcmp(s, "_eq1bw") == 0) eg(x).eq1bw = check(key, 0.001f, 4.0f, ToFloat(value));
1824 else if (strcmp(s, "_eq2bw") == 0) eg(x).eq2bw = check(key, 0.001f, 4.0f, ToFloat(value));
1825 else if (strcmp(s, "_eq3bw") == 0) eg(x).eq3bw = check(key, 0.001f, 4.0f, ToFloat(value));
1826 else if (strcmp(s, "_eq1gain") == 0) eg(x).eq1gain = check(key, -96.0f, 24.0f, ToFloat(value));
1827 else if (strcmp(s, "_eq2gain") == 0) eg(x).eq2gain = check(key, -96.0f, 24.0f, ToFloat(value));
1828 else if (strcmp(s, "_eq3gain") == 0) eg(x).eq3gain = check(key, -96.0f, 24.0f, ToFloat(value));
1829 else if (sscanf(s, "_eq1freq_oncc%d", &y)) eg(x).eq1freq_oncc.add( CC(y, check(key, 0.0f, 30000.0f, ToFloat(value))) );
1830 else if (sscanf(s, "_eq2freq_oncc%d", &y)) eg(x).eq2freq_oncc.add( CC(y, check(key, 0.0f, 30000.0f, ToFloat(value))) );
1831 else if (sscanf(s, "_eq3freq_oncc%d", &y)) eg(x).eq3freq_oncc.add( CC(y, check(key, 0.0f, 30000.0f, ToFloat(value))) );
1832 else if (sscanf(s, "_eq1bw_oncc%d", &y)) eg(x).eq1bw_oncc.add( CC(y, check(key, 0.001f, 4.0f, ToFloat(value))) );
1833 else if (sscanf(s, "_eq2bw_oncc%d", &y)) eg(x).eq2bw_oncc.add( CC(y, check(key, 0.001f, 4.0f, ToFloat(value))) );
1834 else if (sscanf(s, "_eq3bw_oncc%d", &y)) eg(x).eq3bw_oncc.add( CC(y, check(key, 0.001f, 4.0f, ToFloat(value))) );
1835 else if (sscanf(s, "_eq1gain_oncc%d", &y)) eg(x).eq1gain_oncc.add( CC(y, check(key, -96.0f, 24.0f, ToFloat(value))) );
1836 else if (sscanf(s, "_eq2gain_oncc%d", &y)) eg(x).eq2gain_oncc.add( CC(y, check(key, -96.0f, 24.0f, ToFloat(value))) );
1837 else if (sscanf(s, "_eq3gain_oncc%d", &y)) eg(x).eq3gain_oncc.add( CC(y, check(key, -96.0f, 24.0f, ToFloat(value))) );
1838 else std::cerr << "The opcode '" << key << "' is unsupported by libsfz!" << std::endl;
1839 }
1840
1841 // v1 envelope generators
1842 else if ("ampeg_delay" == key) pCurDef->ampeg_delay = ToFloat(value);
1843 else if ("ampeg_start" == key) pCurDef->ampeg_start = ToFloat(value);
1844 else if ("ampeg_attack" == key) pCurDef->ampeg_attack = ToFloat(value);
1845 else if ("ampeg_hold" == key) pCurDef->ampeg_hold = ToFloat(value);
1846 else if ("ampeg_decay" == key) pCurDef->ampeg_decay = ToFloat(value);
1847 else if ("ampeg_sustain" == key) pCurDef->ampeg_sustain = ToFloat(value);
1848 else if ("ampeg_release" == key) pCurDef->ampeg_release = ToFloat(value);
1849 else if ("ampeg_vel2delay" == key) pCurDef->ampeg_vel2delay = ToFloat(value);
1850 else if ("ampeg_vel2attack" == key) pCurDef->ampeg_vel2attack = ToFloat(value);
1851 else if ("ampeg_vel2hold" == key) pCurDef->ampeg_vel2hold = ToFloat(value);
1852 else if ("ampeg_vel2decay" == key) pCurDef->ampeg_vel2decay = ToFloat(value);
1853 else if ("ampeg_vel2sustain" == key) pCurDef->ampeg_vel2sustain = ToFloat(value);
1854 else if ("ampeg_vel2release" == key) pCurDef->ampeg_vel2release = ToFloat(value);
1855 else if ("fileg_delay" == key) pCurDef->fileg_delay = ToFloat(value);
1856 else if ("fileg_start" == key) pCurDef->fileg_start = ToFloat(value);
1857 else if ("fileg_attack" == key) pCurDef->fileg_attack = ToFloat(value);
1858 else if ("fileg_hold" == key) pCurDef->fileg_hold = ToFloat(value);
1859 else if ("fileg_decay" == key) pCurDef->fileg_decay = ToFloat(value);
1860 else if ("fileg_sustain" == key) pCurDef->fileg_sustain = ToFloat(value);
1861 else if ("fileg_release" == key) pCurDef->fileg_release = ToFloat(value);
1862 else if ("fileg_depth" == key) pCurDef->fileg_depth = check(key, -12000, 12000, ToInt(value));
1863 else if ("fileg_vel2delay" == key) pCurDef->fileg_vel2delay = check(key, -100.0f, 100.0f, ToFloat(value));
1864 else if ("fileg_vel2attack" == key) pCurDef->fileg_vel2attack = ToFloat(value);
1865 else if ("fileg_vel2hold" == key) pCurDef->fileg_vel2hold = ToFloat(value);
1866 else if ("fileg_vel2decay" == key) pCurDef->fileg_vel2decay = ToFloat(value);
1867 else if ("fileg_vel2sustain" == key) pCurDef->fileg_vel2sustain = ToFloat(value);
1868 else if ("fileg_vel2release" == key) pCurDef->fileg_vel2release = ToFloat(value);
1869 else if ("pitcheg_delay" == key) pCurDef->pitcheg_delay = ToFloat(value);
1870 else if ("pitcheg_start" == key) pCurDef->pitcheg_start = ToFloat(value);
1871 else if ("pitcheg_attack" == key) pCurDef->pitcheg_attack = ToFloat(value);
1872 else if ("pitcheg_hold" == key) pCurDef->pitcheg_hold = ToFloat(value);
1873 else if ("pitcheg_decay" == key) pCurDef->pitcheg_decay = ToFloat(value);
1874 else if ("pitcheg_sustain" == key) pCurDef->pitcheg_sustain = ToFloat(value);
1875 else if ("pitcheg_release" == key) pCurDef->pitcheg_release = ToFloat(value);
1876 else if ("pitcheg_depth" == key) pCurDef->pitcheg_depth = check(key, -12000, 12000, ToInt(value));
1877 else if ("pitcheg_vel2delay" == key) pCurDef->pitcheg_vel2delay = check(key, -100.0f, 100.0f, ToFloat(value));
1878 else if ("pitcheg_vel2attack" == key) pCurDef->pitcheg_vel2attack = ToFloat(value);
1879 else if ("pitcheg_vel2hold" == key) pCurDef->pitcheg_vel2hold = ToFloat(value);
1880 else if ("pitcheg_vel2decay" == key) pCurDef->pitcheg_vel2decay = ToFloat(value);
1881 else if ("pitcheg_vel2sustain" == key) pCurDef->pitcheg_vel2sustain = ToFloat(value);
1882 else if ("pitcheg_vel2release" == key) pCurDef->pitcheg_vel2release = ToFloat(value);
1883
1884
1885 // v1 LFO
1886 else if ("amplfo_delay" == key) pCurDef->amplfo_delay = ToFloat(value);
1887 else if ("amplfo_fade" == key) pCurDef->amplfo_fade = ToFloat(value);
1888 else if ("amplfo_freq" == key) pCurDef->amplfo_freq = ToFloat(value);
1889 else if ("amplfo_freqchanaft" == key) pCurDef->amplfo_freqcc.add( CC(128, check(key, -200.0f, 200.0f, ToFloat(value))) );
1890 else if ("amplfo_depth" == key) pCurDef->amplfo_depth = ToFloat(value);
1891 else if ("amplfo_depthchanaft" == key) pCurDef->amplfo_depthcc.add( CC(128, check(key, -10.0f, 10.0f, ToFloat(value))) );
1892 else if ("fillfo_delay" == key) pCurDef->fillfo_delay = ToFloat(value);
1893 else if ("fillfo_fade" == key) pCurDef->fillfo_fade = ToFloat(value);
1894 else if ("fillfo_freq" == key) pCurDef->fillfo_freq = ToFloat(value);
1895 else if ("fillfo_freqchanaft" == key) pCurDef->fillfo_freqcc.add( CC(128, check(key, -200.0f, 200.0f, ToFloat(value))) );
1896 else if ("fillfo_depth" == key) pCurDef->fillfo_depth = ToFloat(value);
1897 else if ("fillfo_depthchanaft" == key) pCurDef->fillfo_depthcc.add( CC(128, check(key, -1200, 1200, ToInt(value))) );
1898 else if ("pitchlfo_delay" == key) pCurDef->pitchlfo_delay = ToFloat(value);
1899 else if ("pitchlfo_fade" == key) pCurDef->pitchlfo_fade = ToFloat(value);
1900 else if ("pitchlfo_freq" == key) pCurDef->pitchlfo_freq = ToFloat(value);
1901 else if ("pitchlfo_freqchanaft" == key) pCurDef->pitchlfo_freqcc.add( CC(128, check(key, -200.0f, 200.0f, ToFloat(value))) );
1902 else if ("pitchlfo_depth" == key) pCurDef->pitchlfo_depth = ToInt(value);
1903 else if ("pitchlfo_depthchanaft" == key) pCurDef->pitchlfo_depthcc.add( CC(128, check(key, -1200, 1200, ToInt(value))) );
1904
1905
1906 // v2 LFO
1907 else if (sscanf(key.c_str(), "lfo%d%n", &x, &y)) {
1908 const char* s = key.c_str() + y;
1909 if (strcmp(s, "_freq") == 0) lfo(x).freq = check(key, 0.0f, 20.0f, ToFloat(value));
1910 else if (sscanf(s, "_freq_oncc%d", &y)) lfo(x).freq_oncc.add( CC(y, check(key, 0.0f, 20.0f, ToFloat(value))) );
1911 else if (sscanf(s, "_freq_smoothcc%d", &y)) lfo(x).freq_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1912 else if (sscanf(s, "_freq_stepcc%d", &y)) lfo(x).freq_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 20.0f, ToFloat(value))) );
1913 else if (strcmp(s, "_wave") == 0) lfo(x).wave = ToInt(value);
1914 else if (strcmp(s, "_delay") == 0) lfo(x).delay = check(key, 0.0f, 100.0f, ToFloat(value));
1915 else if (sscanf(s, "_delay_oncc%d", &y)) lfo(x).delay_oncc.add( CC(y, check(key, 0.0f, 100.0f, ToFloat(value))) );
1916 else if (strcmp(s, "_fade") == 0) lfo(x).fade = check(key, 0.0f, 100.0f, ToFloat(value));
1917 else if (sscanf(s, "_fade_oncc%d", &y)) lfo(x).fade_oncc.add( CC(y, check(key, 0.0f, 100.0f, ToFloat(value))) );
1918 else if (strcmp(s, "_phase") == 0) lfo(x).phase = check(key, 0.0f, 360.0f, ToFloat(value));
1919 else if (sscanf(s, "_phase_oncc%d", &y)) lfo(x).phase_oncc.add( CC(y, check(key, 0.0f, 360.0f, ToFloat(value))) );
1920 else if (strcmp(s, "_volume") == 0) lfo(x).volume = check(key, -144.0f, 6.0f, ToFloat(value));
1921 else if (sscanf(s, "_volume_oncc%d", &y)) lfo(x).volume_oncc.add( CC(y, check(key, -144.0f, 6.0f, ToFloat(value))) );
1922 else if (sscanf(s, "_volume_smoothcc%d", &y)) lfo(x).volume_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1923 else if (sscanf(s, "_volume_stepcc%d", &y)) lfo(x).volume_stepcc.add( CC(y, 0, -1, 0, check(key, -20.0f, 20.0f, ToFloat(value))) );
1924 else if (strcmp(s, "_pitch") == 0) lfo(x).pitch = check(key, -9600, 9600, ToInt(value));
1925 else if (sscanf(s, "_pitch_oncc%d", &y)) lfo(x).pitch_oncc.add( CC(y, check(key, -9600, 9600, ToInt(value))) );
1926 else if (sscanf(s, "_pitch_smoothcc%d", &y)) lfo(x).pitch_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1927 else if (sscanf(s, "_pitch_stepcc%d", &y)) lfo(x).pitch_stepcc.add( CC(y, 0, -1, 0, check(key, -9600, 9600, ToInt(value))) );
1928 else if (strcmp(s, "_cutoff") == 0) lfo(x).cutoff = check(key, -9600, 9600, ToInt(value));
1929 else if (sscanf(s, "_cutoff_oncc%d", &y)) lfo(x).cutoff_oncc.add( CC(y, check(key, -9600, 9600, ToInt(value))) );
1930 else if (sscanf(s, "_cutoff_smoothcc%d", &y)) lfo(x).cutoff_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1931 else if (sscanf(s, "_cutoff_stepcc%d", &y)) lfo(x).cutoff_stepcc.add( CC(y, 0, -1, 0, check(key, -9600, 9600, ToInt(value))) );
1932 else if (strcmp(s, "_resonance") == 0) lfo(x).resonance = check(key, 0.0f, 40.0f, ToFloat(value));
1933 else if (sscanf(s, "_resonance_oncc%d", &y)) lfo(x).resonance_oncc.add( CC(y, check(key, 0.0f, 40.0f, ToFloat(value))) );
1934 else if (sscanf(s, "_resonance_smoothcc%d", &y)) lfo(x).resonance_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1935 else if (sscanf(s, "_resonance_stepcc%d", &y)) lfo(x).resonance_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 40.0f, ToFloat(value))) );
1936 else if (strcmp(s, "_pan") == 0) lfo(x).pan = check(key, -100.0f, 100.0f, ToFloat(value));
1937 else if (sscanf(s, "_pan_oncc%d", &y)) lfo(x).pan_oncc.add( CC(y, check(key, -100.0f, 100.0f, ToFloat(value))) );
1938 else if (sscanf(s, "_pan_smoothcc%d", &y)) lfo(x).pan_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1939 else if (sscanf(s, "_pan_stepcc%d", &y)) lfo(x).pan_stepcc.add( CC(y, 0, -1, 0, check(key, -100.0f, 100.0f, ToFloat(value))) );
1940 else if (strcmp(s, "_eq1freq") == 0) lfo(x).eq1freq = check(key, 0.0f, 30000.0f, ToFloat(value));
1941 else if (strcmp(s, "_eq2freq") == 0) lfo(x).eq2freq = check(key, 0.0f, 30000.0f, ToFloat(value));
1942 else if (strcmp(s, "_eq3freq") == 0) lfo(x).eq3freq = check(key, 0.0f, 30000.0f, ToFloat(value));
1943 else if (strcmp(s, "_eq1bw") == 0) lfo(x).eq1bw = check(key, 0.001f, 4.0f, ToFloat(value));
1944 else if (strcmp(s, "_eq2bw") == 0) lfo(x).eq2bw = check(key, 0.001f, 4.0f, ToFloat(value));
1945 else if (strcmp(s, "_eq3bw") == 0) lfo(x).eq3bw = check(key, 0.001f, 4.0f, ToFloat(value));
1946 else if (strcmp(s, "_eq1gain") == 0) lfo(x).eq1gain = check(key, -96.0f, 24.0f, ToFloat(value));
1947 else if (strcmp(s, "_eq2gain") == 0) lfo(x).eq2gain = check(key, -96.0f, 24.0f, ToFloat(value));
1948 else if (strcmp(s, "_eq3gain") == 0) lfo(x).eq3gain = check(key, -96.0f, 24.0f, ToFloat(value));
1949 else if (sscanf(s, "_eq1freq_oncc%d", &y)) lfo(x).eq1freq_oncc.add( CC(y, check(key, 0.0f, 30000.0f, ToFloat(value))) );
1950 else if (sscanf(s, "_eq1freq_smoothcc%d", &y)) lfo(x).eq1freq_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1951 else if (sscanf(s, "_eq1freq_stepcc%d", &y)) lfo(x).eq1freq_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 4294967296.0f, ToFloat(value))) );
1952 else if (sscanf(s, "_eq2freq_oncc%d", &y)) lfo(x).eq2freq_oncc.add( CC(y, check(key, 0.0f, 30000.0f, ToFloat(value))) );
1953 else if (sscanf(s, "_eq2freq_smoothcc%d", &y)) lfo(x).eq2freq_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1954 else if (sscanf(s, "_eq2freq_stepcc%d", &y)) lfo(x).eq2freq_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 4294967296.0f, ToFloat(value))) );
1955 else if (sscanf(s, "_eq3freq_oncc%d", &y)) lfo(x).eq3freq_oncc.add( CC(y, check(key, 0.0f, 30000.0f, ToFloat(value))) );
1956 else if (sscanf(s, "_eq3freq_smoothcc%d", &y)) lfo(x).eq3freq_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1957 else if (sscanf(s, "_eq3freq_stepcc%d", &y)) lfo(x).eq3freq_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 4294967296.0f, ToFloat(value))) );
1958 else if (sscanf(s, "_eq1bw_oncc%d", &y)) lfo(x).eq1bw_oncc.add( CC(y, check(key, 0.001f, 4.0f, ToFloat(value))) );
1959 else if (sscanf(s, "_eq1bw_smoothcc%d", &y)) lfo(x).eq1bw_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1960 else if (sscanf(s, "_eq1bw_stepcc%d", &y)) lfo(x).eq1bw_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 4294967296.0f, ToFloat(value))) );
1961 else if (sscanf(s, "_eq2bw_oncc%d", &y)) lfo(x).eq2bw_oncc.add( CC(y, check(key, 0.001f, 4.0f, ToFloat(value))) );
1962 else if (sscanf(s, "_eq2bw_smoothcc%d", &y)) lfo(x).eq2bw_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1963 else if (sscanf(s, "_eq2bw_stepcc%d", &y)) lfo(x).eq2bw_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 4294967296.0f, ToFloat(value))) );
1964 else if (sscanf(s, "_eq3bw_oncc%d", &y)) lfo(x).eq3bw_oncc.add( CC(y, check(key, 0.001f, 4.0f, ToFloat(value))) );
1965 else if (sscanf(s, "_eq3bw_smoothcc%d", &y)) lfo(x).eq3bw_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1966 else if (sscanf(s, "_eq3bw_stepcc%d", &y)) lfo(x).eq3bw_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 4294967296.0f, ToFloat(value))) );
1967 else if (sscanf(s, "_eq1gain_oncc%d", &y)) lfo(x).eq1gain_oncc.add( CC(y, check(key, -96.0f, 24.0f, ToFloat(value))) );
1968 else if (sscanf(s, "_eq1gain_smoothcc%d", &y)) lfo(x).eq1gain_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1969 else if (sscanf(s, "_eq1gain_stepcc%d", &y)) lfo(x).eq1gain_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 4294967296.0f, ToFloat(value))) );
1970 else if (sscanf(s, "_eq2gain_oncc%d", &y)) lfo(x).eq2gain_oncc.add( CC(y, check(key, -96.0f, 24.0f, ToFloat(value))) );
1971 else if (sscanf(s, "_eq2gain_smoothcc%d", &y)) lfo(x).eq2gain_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1972 else if (sscanf(s, "_eq2gain_stepcc%d", &y)) lfo(x).eq2gain_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 4294967296.0f, ToFloat(value))) );
1973 else if (sscanf(s, "_eq3gain_oncc%d", &y)) lfo(x).eq3gain_oncc.add( CC(y, check(key, -96.0f, 24.0f, ToFloat(value))) );
1974 else if (sscanf(s, "_eq3gain_smoothcc%d", &y)) lfo(x).eq3gain_smoothcc.add( CC(y, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
1975 else if (sscanf(s, "_eq3gain_stepcc%d", &y)) lfo(x).eq3gain_stepcc.add( CC(y, 0, -1, 0, check(key, 0.0f, 4294967296.0f, ToFloat(value))) );
1976 else std::cerr << "The opcode '" << key << "' is unsupported by libsfz!" << std::endl;
1977 }
1978
1979 // CCs
1980 else if (key.find("cc") != std::string::npos)
1981 {
1982 std::string::size_type delimiter_index = key.find("cc");
1983 std::string key_cc = key.substr(0, delimiter_index);
1984 if (key_cc.size() > 3 && !strcmp(key_cc.c_str() + (key_cc.size() - 3), "_on")) {
1985 key_cc = key_cc.substr(0, key_cc.size() - 3);
1986 }
1987
1988 // Apply macros
1989 std::string num_cc_str = key.substr(delimiter_index + 2);
1990
1991 if (num_cc_str[0] == '$')
1992 {
1993 if (_defined_macros.count(num_cc_str) == 0)
1994 {
1995 std::cerr << "Macro '" << value << "' referenced on line ";
1996 std::cerr << currentLine << " is undefined." << std::endl;
1997 return;
1998 }
1999
2000 num_cc_str = _defined_macros[num_cc_str];
2001 }
2002
2003 int num_cc = ToInt(num_cc_str);
2004 if (num_cc < 0 || num_cc > 127) {
2005 std::cerr << "sfz: WARNING: CC " << num_cc << " of opcode '" << key;
2006 std::cerr << "' is an invalid MIDI controller number." << std::endl;
2007 }
2008
2009 // input controls
2010 if ("lo" == key_cc) pCurDef->locc.set(num_cc, ToInt(value));
2011 else if ("hi" == key_cc) pCurDef->hicc.set(num_cc, ToInt(value));
2012 else if ("start_lo" == key_cc) pCurDef->start_locc.set(num_cc, ToInt(value));
2013 else if ("start_hi" == key_cc) pCurDef->start_hicc.set(num_cc, ToInt(value));
2014 else if ("stop_lo" == key_cc) pCurDef->stop_locc.set(num_cc, ToInt(value));
2015 else if ("stop_hi" == key_cc) pCurDef->stop_hicc.set(num_cc, ToInt(value));
2016 else if ("on_lo" == key_cc) pCurDef->on_locc.set(num_cc, ToInt(value));
2017 else if ("on_hi" == key_cc) pCurDef->on_hicc.set(num_cc, ToInt(value));
2018
2019 // sample player
2020 else if ("delay" == key_cc) pCurDef->delay_oncc.set(num_cc, ToFloat(value));
2021 else if ("delay_samples" == key_cc) pCurDef->delay_samples_oncc.set(num_cc, ToInt(value));
2022 else if ("offset" == key_cc) pCurDef->offset_oncc.set(num_cc, ToInt(value));
2023
2024 // amplifier
2025 else if ("gain" == key_cc || "gain_" == key_cc) pCurDef->gain_oncc.set(num_cc, ToFloat(value));
2026 else if ("xfin_lo" == key_cc) pCurDef->xfin_locc.set(num_cc, ToInt(value));
2027 else if ("xfin_hi" == key_cc) pCurDef->xfin_hicc.set(num_cc, ToInt(value));
2028 else if ("xfout_lo" == key_cc) pCurDef->xfout_locc.set(num_cc, ToInt(value));
2029 else if ("xfout_hi" == key_cc) pCurDef->xfout_hicc.set(num_cc, ToInt(value));
2030
2031 // pitch
2032 else if ("pitch" == key_cc) pCurDef->pitch_oncc.add( CC(num_cc, check(key, -9600, 9600, ToInt(value))) );
2033 else if ("pitch_smooth" == key_cc) pCurDef->pitch_smoothcc.add( CC(num_cc, 0, -1, check(key, 0.0f, 100000.0f /* max? */, ToFloat(value))) );
2034 else if ("pitch_curve" == key_cc) pCurDef->pitch_curvecc.add( CC(num_cc, 0, check(key, 0, 30000, ToInt(value))) );
2035 else if ("pitch_step" == key_cc) pCurDef->pitch_stepcc.add( CC(num_cc, 0, -1, 0, check(key, 0, 1200, ToInt(value))) );
2036
2037 // filter
2038 else if ("cutoff" == key_cc || "cutoff_" == key_cc) {
2039 pCurDef->cutoff_oncc.add( CC(num_cc, check(key, -9600, 9600, ToInt(value))) );
2040 } else if ("cutoff2" == key_cc) pCurDef->cutoff2_oncc.add( CC(num_cc, check(key, -9600, 9600, ToInt(value))) );
2041 else if ("cutoff_smooth" == key_cc) pCurDef->cutoff_smoothcc.add( CC(num_cc, 0, -1, check(key, 0.0f, 100000.0f /* max? */, ToFloat(value))) );
2042 else if ("cutoff2_smooth" == key_cc) pCurDef->cutoff2_smoothcc.add( CC(num_cc, 0, -1, check(key, 0.0f, 100000.0f /* max? */, ToFloat(value))) );
2043 else if ("cutoff_step" == key_cc) pCurDef->cutoff_stepcc.add( CC(num_cc, 0, -1, 0, check(key, -1200, 1200, ToInt(value))) );
2044 else if ("cutoff2_step" == key_cc) pCurDef->cutoff2_stepcc.add( CC(num_cc, 0, -1, 0, check(key, -1200, 1200, ToInt(value))) );
2045 else if ("cutoff_curve" == key_cc) pCurDef->cutoff_curvecc.add( CC(num_cc, 0, check(key, 0, 30000, ToInt(value))) );
2046 else if ("cutoff2_curve" == key_cc) pCurDef->cutoff2_curvecc.add( CC(num_cc, 0, check(key, 0, 30000, ToInt(value))) );
2047 else if ("resonance" == key_cc) pCurDef->resonance_oncc.add( CC(num_cc, check(key, 0.0f, 40.0f, ToFloat(value))) );
2048 else if ("resonance2" == key_cc) pCurDef->resonance2_oncc.add( CC(num_cc, check(key, 0.0f, 40.0f, ToFloat(value))) );
2049 else if ("resonance_smooth" == key_cc) pCurDef->resonance_smoothcc.add( CC(num_cc, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
2050 else if ("resonance2_smooth" == key_cc) pCurDef->resonance2_smoothcc.add( CC(num_cc, 0, -1, check(key, 0, 100000 /* max? */, ToInt(value))) );
2051 else if ("resonance_step" == key_cc) pCurDef->resonance_stepcc.add( CC(num_cc, 0, -1, 0, check(key, 0.0f, 40.0f, ToFloat(value))) );
2052 else if ("resonance2_step" == key_cc) pCurDef->resonance2_stepcc.add( CC(num_cc, 0, -1, 0, check(key, 0.0f, 40.0f, ToFloat(value))) );
2053 else if ("resonance_curve" == key_cc) pCurDef->resonance_curvecc.add( CC(num_cc, 0.0f, check(key, 0, 30000, ToInt(value))) );
2054 else if ("resonance2_curve" == key_cc) pCurDef->resonance2_curvecc.add( CC(num_cc, 0.0f, check(key, 0, 30000, ToInt(value))) );
2055
2056 // per voice equalizer
2057 else if ("eq1_freq" == key_cc) pCurDef->eq1_freq_oncc.set(num_cc, ToInt(value));
2058 else if ("eq2_freq" == key_cc) pCurDef->eq2_freq_oncc.set(num_cc, ToInt(value));
2059 else if ("eq3_freq" == key_cc) pCurDef->eq3_freq_oncc.set(num_cc, ToInt(value));
2060 else if ("eq1_bw" == key_cc) pCurDef->eq1_bw_oncc.set(num_cc, ToInt(value));
2061 else if ("eq2_bw" == key_cc) pCurDef->eq2_bw_oncc.set(num_cc, ToInt(value));
2062 else if ("eq3_bw" == key_cc) pCurDef->eq3_bw_oncc.set(num_cc, ToInt(value));
2063 else if ("eq1_gain" == key_cc) pCurDef->eq1_gain_oncc.set(num_cc, ToInt(value));
2064 else if ("eq2_gain" == key_cc) pCurDef->eq2_gain_oncc.set(num_cc, ToInt(value));
2065 else if ("eq3_gain" == key_cc) pCurDef->eq3_gain_oncc.set(num_cc, ToInt(value));
2066
2067 else if ("ampeg_delay" == key_cc) pCurDef->ampeg_delaycc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2068 else if ("ampeg_start" == key_cc) pCurDef->ampeg_startcc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2069 else if ("ampeg_attack" == key_cc) pCurDef->ampeg_attackcc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2070 else if ("ampeg_hold" == key_cc) pCurDef->ampeg_holdcc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2071 else if ("ampeg_decay" == key_cc) pCurDef->ampeg_decaycc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2072 else if ("ampeg_sustain" == key_cc) pCurDef->ampeg_sustaincc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2073 else if ("ampeg_release" == key_cc) pCurDef->ampeg_releasecc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2074
2075 else if ("fileg_delay" == key_cc) pCurDef->fileg_delay_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2076 else if ("fileg_start" == key_cc) pCurDef->fileg_start_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2077 else if ("fileg_attack" == key_cc) pCurDef->fileg_attack_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2078 else if ("fileg_hold" == key_cc) pCurDef->fileg_hold_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2079 else if ("fileg_decay" == key_cc) pCurDef->fileg_decay_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2080 else if ("fileg_sustain" == key_cc) pCurDef->fileg_sustain_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2081 else if ("fileg_release" == key_cc) pCurDef->fileg_release_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2082 else if ("fileg_depth" == key_cc) pCurDef->fileg_depth_oncc.add( CC(num_cc, check(key, -12000, 12000, ToInt(value))) );
2083
2084 else if ("pitcheg_delay" == key_cc) pCurDef->pitcheg_delay_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2085 else if ("pitcheg_start" == key_cc) pCurDef->pitcheg_start_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2086 else if ("pitcheg_attack" == key_cc) pCurDef->pitcheg_attack_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2087 else if ("pitcheg_hold" == key_cc) pCurDef->pitcheg_hold_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2088 else if ("pitcheg_decay" == key_cc) pCurDef->pitcheg_decay_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2089 else if ("pitcheg_sustain" == key_cc) pCurDef->pitcheg_sustain_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2090 else if ("pitcheg_release" == key_cc) pCurDef->pitcheg_release_oncc.add( CC(num_cc, check(key, -100.0f, 100.0f, ToFloat(value))) );
2091 else if ("pitcheg_depth" == key_cc) pCurDef->pitcheg_depth_oncc.add( CC(num_cc, check(key, -12000, 12000, ToInt(value))) );
2092
2093 else if ("pitchlfo_delay" == key_cc) pCurDef->pitchlfo_delay_oncc.add( CC(num_cc, check(key, 0.0f, 100.0f, ToFloat(value))) );
2094 else if ("pitchlfo_fade" == key_cc) pCurDef->pitchlfo_fade_oncc.add( CC(num_cc, check(key, 0.0f, 100.0f, ToFloat(value))) );
2095 else if ("pitchlfo_depth" == key_cc) pCurDef->pitchlfo_depthcc.add( CC(num_cc, check(key, -1200, 1200, ToInt(value))) );
2096 else if ("pitchlfo_freq" == key_cc) pCurDef->pitchlfo_freqcc.add( CC(num_cc, check(key, -200.0f, 200.0f, ToFloat(value))) );
2097 else if ("fillfo_delay" == key_cc) pCurDef->fillfo_delay_oncc.add( CC(num_cc, check(key, 0.0f, 100.0f, ToFloat(value))) );
2098 else if ("fillfo_fade" == key_cc) pCurDef->fillfo_fade_oncc.add( CC(num_cc, check(key, 0.0f, 100.0f, ToFloat(value))) );
2099 else if ("fillfo_depth" == key_cc) pCurDef->fillfo_depthcc.add( CC(num_cc, check(key, -1200, 1200, ToInt(value))) );
2100 else if ("fillfo_freq" == key_cc) pCurDef->fillfo_freqcc.add( CC(num_cc, check(key, -200.0f, 200.0f, ToFloat(value))) );
2101 else if ("amplfo_delay" == key_cc) pCurDef->amplfo_delay_oncc.add( CC(num_cc, check(key, 0.0f, 100.0f, ToFloat(value))) );
2102 else if ("amplfo_fade" == key_cc) pCurDef->amplfo_fade_oncc.add( CC(num_cc, check(key, 0.0f, 100.0f, ToFloat(value))) );
2103 else if ("amplfo_depth" == key_cc) pCurDef->amplfo_depthcc.add( CC(num_cc, check(key, -10.0f, 10.0f, ToFloat(value))) );
2104 else if ("amplfo_freq" == key_cc) pCurDef->amplfo_freqcc.add( CC(num_cc, check(key, -200.0f, 200.0f, ToFloat(value))) );
2105 else if ("volume" == key_cc) pCurDef->volume_oncc.add( CC(num_cc, check(key, -144.0f, 100.0f, ToFloat(value))) );
2106 else if ("volume_curve" == key_cc) pCurDef->volume_curvecc.add( CC(num_cc, 0, check(key, 0, 30000, ToInt(value))) );
2107 else if ("volume_smooth" == key_cc) pCurDef->volume_smoothcc.add( CC(num_cc, 0, -1, check(key, 0.0f, 100000.0f /* max? */, ToFloat(value))) );
2108 else if ("volume_step" == key_cc) pCurDef->volume_stepcc.add( CC(num_cc, 0, -1, 0, check(key, -20.0f, 20.0f, ToFloat(value))) );
2109 else if ("pan" == key_cc) pCurDef->pan_oncc.add( CC(num_cc, check(key, -200.0f, 200.0f, ToFloat(value))) );
2110 else if ("pan_curve" == key_cc) pCurDef->pan_curvecc.add( CC(num_cc, 0, check(key, 0, 30000, ToInt(value))) );
2111 else if ("pan_smooth" == key_cc) pCurDef->pan_smoothcc.add( CC(num_cc, 0, -1, check(key, 0.0f, 100000.0f /* max? */, ToFloat(value))) );
2112 else if ("pan_step" == key_cc) pCurDef->pan_stepcc.add( CC(num_cc, 0, -1, 0, check(key, -100.0f, 100.0f, ToFloat(value))) );
2113 else if ("set_" == key_cc) _instrument->initialCCValues[num_cc] = (num_cc < 128) ? check(key, 0, 127, ToInt(value)) : ToInt(value);
2114 else std::cerr << "The opcode '" << key << "' is unsupported by libsfz!" << std::endl;
2115 }
2116
2117 else {
2118 std::cerr << "The opcode '" << key << "' is unsupported by libsfz!" << std::endl;
2119 }
2120 }
2121
2122 int File::parseKey(const std::string& s) {
2123 int i;
2124 std::istringstream iss(s);
2125 if (isdigit(iss.peek())) {
2126 iss >> i;
2127 } else {
2128 switch (tolower(iss.get())) {
2129 case 'c': i = 0; break;
2130 case 'd': i = 2; break;
2131 case 'e': i = 4; break;
2132 case 'f': i = 5; break;
2133 case 'g': i = 7; break;
2134 case 'a': i = 9; break;
2135 case 'b': i = 11; break;
2136 case '-': if (s == "-1") return -1;
2137 default:
2138 std::cerr << "Not a note: " << s << std::endl;
2139 return 0;
2140 }
2141 if (iss.peek() == '#') {
2142 i++;
2143 iss.get();
2144 } else if (tolower(iss.peek()) == 'b') {
2145 i--;
2146 iss.get();
2147 }
2148 int octave;
2149 if (!(iss >> octave)) {
2150 std::cerr << "Not a note: " << s << std::endl;
2151 return 0;
2152 }
2153 i += (octave + 1) * 12;
2154 }
2155 return i + note_offset + 12 * octave_offset;
2156 }
2157
2158 EGNode::EGNode() : time(0), level(0), shape(0), curve(0) {
2159 }
2160
2161 void EGNode::Copy(const EGNode& egNode) {
2162 time = egNode.time;
2163 level = egNode.level;
2164 shape = egNode.shape;
2165 curve = egNode.curve;
2166
2167 time_oncc = egNode.time_oncc;
2168 level_oncc = egNode.level_oncc;
2169 }
2170
2171 EG::EG() :
2172 sustain(0), loop(0), loop_count(0), amplitude(0), volume(-200), /* less than -144 dB is considered unset */
2173 cutoff(0), pitch(0), resonance(0), pan(0), pan_curve(-1)
2174 { }
2175
2176 void EG::Copy(const EG& eg) {
2177 EqImpl::Copy(static_cast<const EqImpl>(eg));
2178
2179 sustain = eg.sustain;
2180 loop = eg.loop;
2181 loop_count = eg.loop_count;
2182 amplitude = eg.amplitude;
2183 volume = eg.volume;
2184 cutoff = eg.cutoff;
2185 pitch = eg.pitch;
2186 resonance = eg.resonance;
2187 pan = eg.pan;
2188 pan_curve = eg.pan_curve;
2189 node = eg.node;
2190
2191 amplitude_oncc = eg.amplitude_oncc;
2192 volume_oncc = eg.volume_oncc;
2193 cutoff_oncc = eg.cutoff_oncc;
2194 pitch_oncc = eg.pitch_oncc;
2195 resonance_oncc = eg.resonance_oncc;
2196 pan_oncc = eg.pan_oncc;
2197 pan_curvecc = eg.pan_curvecc;
2198 }
2199
2200 LFO::LFO():
2201 delay(0),
2202 freq(-1), /* -1 is used to determine whether the LFO was initialized */
2203 fade(0), phase(0), wave(0), volume(0), pitch(0), cutoff(0), resonance(0), pan(0)
2204 {
2205 }
2206
2207 void LFO::Copy(const LFO& lfo) {
2208 EqSmoothStepImpl::Copy(static_cast<const EqSmoothStepImpl>(lfo));
2209
2210 delay = lfo.delay;
2211 freq = lfo.freq;
2212 fade = lfo.fade;
2213 phase = lfo.phase;
2214 wave = lfo.wave;
2215 volume = lfo.volume;
2216 pitch = lfo.pitch;
2217 cutoff = lfo.cutoff;
2218 resonance = lfo.resonance;
2219 pan = lfo.pan;
2220
2221 delay_oncc = lfo.delay_oncc;
2222 freq_oncc = lfo.freq_oncc;
2223 freq_smoothcc = lfo.freq_smoothcc;
2224 freq_stepcc = lfo.freq_stepcc;
2225 fade_oncc = lfo.fade_oncc;
2226 phase_oncc = lfo.phase_oncc;
2227 pitch_oncc = lfo.pitch_oncc;
2228 pitch_smoothcc = lfo.pitch_smoothcc;
2229 pitch_stepcc = lfo.pitch_stepcc;
2230 volume_oncc = lfo.volume_oncc;
2231 volume_smoothcc = lfo.volume_smoothcc;
2232 volume_stepcc = lfo.volume_stepcc;
2233 pan_oncc = lfo.pan_oncc;
2234 pan_smoothcc = lfo.pan_smoothcc;
2235 pan_stepcc = lfo.pan_stepcc;
2236 cutoff_oncc = lfo.cutoff_oncc;
2237 cutoff_smoothcc = lfo.cutoff_smoothcc;
2238 cutoff_stepcc = lfo.cutoff_stepcc;
2239 resonance_oncc = lfo.resonance_oncc;
2240 resonance_smoothcc = lfo.resonance_smoothcc;
2241 resonance_stepcc = lfo.resonance_stepcc;
2242 }
2243
2244 EqImpl::EqImpl() {
2245 eq1freq = eq2freq = eq3freq = 0;
2246 eq1bw = eq2bw = eq3bw = 0;
2247 eq1gain = eq2gain = eq3gain = 0;
2248 }
2249
2250 void EqImpl::Copy(const EqImpl& eq) {
2251 eq1freq = eq.eq1freq;
2252 eq2freq = eq.eq2freq;
2253 eq3freq = eq.eq3freq;
2254 eq1bw = eq.eq1bw;
2255 eq2bw = eq.eq2bw;
2256 eq3bw = eq.eq3bw;
2257 eq1gain = eq.eq1gain;
2258 eq2gain = eq.eq2gain;
2259 eq3gain = eq.eq3gain;
2260
2261 eq1freq_oncc = eq.eq1freq_oncc;
2262 eq2freq_oncc = eq.eq2freq_oncc;
2263 eq3freq_oncc = eq.eq3freq_oncc;
2264 eq1bw_oncc = eq.eq1bw_oncc;
2265 eq2bw_oncc = eq.eq2bw_oncc;
2266 eq3bw_oncc = eq.eq3bw_oncc;
2267 eq1gain_oncc = eq.eq1gain_oncc;
2268 eq2gain_oncc = eq.eq2gain_oncc;
2269 eq3gain_oncc = eq.eq3gain_oncc;
2270 }
2271
2272 bool EqImpl::HasEq() {
2273 return eq1freq || eq2freq || eq3freq || eq1bw || eq2bw || eq3bw ||
2274 eq1gain || eq2gain || eq3gain || !eq1gain_oncc.empty() ||
2275 !eq2gain_oncc.empty() || !eq3gain_oncc.empty() ||
2276 !eq1freq_oncc.empty() || !eq2freq_oncc.empty() || !eq3freq_oncc.empty() ||
2277 !eq1bw_oncc.empty() || !eq2bw_oncc.empty() || !eq3bw_oncc.empty();
2278 }
2279
2280 void EqSmoothStepImpl::Copy(const EqSmoothStepImpl& eq) {
2281 EqImpl::Copy(eq);
2282
2283 eq1freq_smoothcc = eq.eq1freq_smoothcc;
2284 eq2freq_smoothcc = eq.eq2freq_smoothcc;
2285 eq3freq_smoothcc = eq.eq3freq_smoothcc;
2286 eq1bw_smoothcc = eq.eq1bw_smoothcc;
2287 eq2bw_smoothcc = eq.eq2bw_smoothcc;
2288 eq3bw_smoothcc = eq.eq3bw_smoothcc;
2289 eq1gain_smoothcc = eq.eq1gain_smoothcc;
2290 eq2gain_smoothcc = eq.eq2gain_smoothcc;
2291 eq3gain_smoothcc = eq.eq3gain_smoothcc;
2292
2293 eq1freq_stepcc = eq.eq1freq_stepcc;
2294 eq2freq_stepcc = eq.eq2freq_stepcc;
2295 eq3freq_stepcc = eq.eq3freq_stepcc;
2296 eq1bw_stepcc = eq.eq1bw_stepcc;
2297 eq2bw_stepcc = eq.eq2bw_stepcc;
2298 eq3bw_stepcc = eq.eq3bw_stepcc;
2299 eq1gain_stepcc = eq.eq1gain_stepcc;
2300 eq2gain_stepcc = eq.eq2gain_stepcc;
2301 eq3gain_stepcc = eq.eq3gain_stepcc;
2302 }
2303
2304 void EqSmoothStepImpl::copySmoothValues() {
2305 File::copySmoothValues(eq1freq_smoothcc, eq1freq_oncc);
2306 eq1freq_smoothcc.clear();
2307
2308 File::copySmoothValues(eq2freq_smoothcc, eq2freq_oncc);
2309 eq2freq_smoothcc.clear();
2310
2311 File::copySmoothValues(eq3freq_smoothcc, eq3freq_oncc);
2312 eq3freq_smoothcc.clear();
2313
2314 File::copySmoothValues(eq1bw_smoothcc, eq1bw_oncc);
2315 eq1bw_smoothcc.clear();
2316
2317 File::copySmoothValues(eq2bw_smoothcc, eq2bw_oncc);
2318 eq2bw_smoothcc.clear();
2319
2320 File::copySmoothValues(eq3bw_smoothcc, eq3bw_oncc);
2321 eq3bw_smoothcc.clear();
2322
2323 File::copySmoothValues(eq1gain_smoothcc, eq1gain_oncc);
2324 eq1gain_smoothcc.clear();
2325
2326 File::copySmoothValues(eq2gain_smoothcc, eq2gain_oncc);
2327 eq2gain_smoothcc.clear();
2328
2329 File::copySmoothValues(eq3gain_smoothcc, eq3gain_oncc);
2330 eq3gain_smoothcc.clear();
2331 }
2332
2333 void EqSmoothStepImpl::copyStepValues() {
2334 File::copyStepValues(eq1freq_stepcc, eq1freq_oncc);
2335 eq1freq_stepcc.clear();
2336
2337 File::copyStepValues(eq2freq_stepcc, eq2freq_oncc);
2338 eq2freq_stepcc.clear();
2339
2340 File::copyStepValues(eq3freq_stepcc, eq3freq_oncc);
2341 eq3freq_stepcc.clear();
2342
2343 File::copyStepValues(eq1bw_stepcc, eq1bw_oncc);
2344 eq1bw_stepcc.clear();
2345
2346 File::copyStepValues(eq2bw_stepcc, eq2bw_oncc);
2347 eq2bw_stepcc.clear();
2348
2349 File::copyStepValues(eq3bw_stepcc, eq3bw_oncc);
2350 eq3bw_stepcc.clear();
2351
2352 File::copyStepValues(eq1gain_stepcc, eq1gain_oncc);
2353 eq1gain_stepcc.clear();
2354
2355 File::copyStepValues(eq2gain_stepcc, eq2gain_oncc);
2356 eq2gain_stepcc.clear();
2357
2358 File::copyStepValues(eq3gain_stepcc, eq3gain_oncc);
2359 eq3gain_stepcc.clear();
2360 }
2361
2362 EG& File::eg(int x) {
2363 while (pCurDef->eg.size() <= x) {
2364 pCurDef->eg.add(EG());
2365 }
2366 return pCurDef->eg[x];
2367 }
2368
2369 EGNode& File::egnode(int x, int y) {
2370 EG& e = eg(x);
2371 while (e.node.size() <= y) {
2372 e.node.add(EGNode());
2373 }
2374 return e.node[y];
2375 }
2376
2377 LFO& File::lfo(int x) {
2378 while (pCurDef->lfos.size() <= x) {
2379 pCurDef->lfos.add(LFO());
2380 }
2381 return pCurDef->lfos[x];
2382 }
2383
2384 } // !namespace sfz

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC