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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4018 - (hide 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 iliev 2012 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 persson 2055 * Copyright (C) 2008 Anders Dahnielson <anders@dahnielson.com> *
6 persson 2856 * Copyright (C) 2009 - 2016 Anders Dahnielson and Grigor Iliev *
7 iliev 2012 * *
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 persson 2058 #include <cctype>
29 persson 2055 #include <cstdio>
30     #include <cstring>
31 schoenebeck 4016 #include <sys/stat.h>
32 iliev 2012
33     #include "../../common/File.h"
34     #include "../../common/Path.h"
35 persson 2106 #include "LookupTable.h"
36 schoenebeck 3082 #include "../../common/global_private.h"
37 iliev 2012
38     namespace sfz
39     {
40 iliev 2218 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 iliev 2012
55 iliev 2234 Sample* SampleManager::FindSample(std::string samplePath, uint offset, int end) {
56 iliev 2021 std::map<Sample*, std::set<Region*> >::iterator it = sampleMap.begin();
57 iliev 2012 for (; it != sampleMap.end(); it++) {
58 iliev 2216 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 iliev 2234 if (it->first->Offset == offset && it->first->End == end) return it->first;
64 iliev 2216 }
65 iliev 2012 }
66    
67     return NULL;
68     }
69    
70     /////////////////////////////////////////////////////////////
71 schoenebeck 3082 // class Script
72 iliev 2012
73 schoenebeck 3082 Script::Script(LinuxSampler::Path path) : m_path(path) {
74     }
75 iliev 2012
76 schoenebeck 3082 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 iliev 2012 /////////////////////////////////////////////////////////////
104     // class Articulation
105    
106     Articulation::Articulation()
107     {
108     }
109    
110     Articulation::~Articulation()
111     {
112     }
113    
114     /////////////////////////////////////////////////////////////
115     // class Definition
116    
117 persson 2091 Definition::Definition()
118 iliev 2012 {
119     }
120    
121     Definition::~Definition()
122     {
123     }
124    
125     /////////////////////////////////////////////////////////////
126     // class Region
127    
128     Region::Region()
129     {
130     pSample = NULL;
131 persson 2072 seq_counter = 1;
132 iliev 2012 }
133    
134     Region::~Region()
135     {
136     DestroySampleIfNotUsed();
137     }
138    
139 iliev 2021 Sample* Region::GetSample(bool create)
140 iliev 2012 {
141 schoenebeck 3497 if (pSample == NULL && create && sample != "*silence") {
142 iliev 2234 uint i = offset ? *offset : 0;
143 persson 2317 Sample* sf = GetInstrument()->GetSampleManager()->FindSample(sample, i, end);
144 iliev 2012 if (sf != NULL) pSample = sf; // Reuse already created sample
145 persson 2317 else pSample = new Sample(sample, false, i, end);
146 iliev 2012 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 persson 2101 bool Region::OnKey(const Query& q) {
162 persson 2106 // 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 persson 2101 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 iliev 2012
172 persson 2086 ( sw_last == -1 ||
173 persson 2101 ((sw_last >= sw_lokey && sw_last <= sw_hikey) ? (q.last_sw_key == sw_last) : false) ) &&
174 iliev 2012
175 persson 2086 ( sw_down == -1 ||
176 persson 2101 ((sw_down >= sw_lokey && (sw_hikey == -1 || sw_down <= sw_hikey)) ? (q.sw[sw_down]) : false) ) &&
177 iliev 2012
178 persson 2086 ( sw_up == -1 ||
179 persson 2101 ((sw_up >= sw_lokey && (sw_hikey == -1 || sw_up <= sw_hikey)) ? (!q.sw[sw_up]) : true) ) &&
180 iliev 2012
181 persson 2101 ((trigger & q.trig) != 0)
182 iliev 2012 );
183    
184     if (!is_triggered)
185     return false;
186    
187 persson 2072 // 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 iliev 2012 }
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 iliev 2021 bool Region::HasLoop() {
202 persson 2317 bool b = loop_mode == LOOP_UNSET ? pSample->GetLoops() :
203     (loop_mode == LOOP_CONTINUOUS || loop_mode == LOOP_SUSTAIN);
204     return b && GetLoopEnd() > GetLoopStart();
205 iliev 2021 }
206    
207     uint Region::GetLoopStart() {
208 persson 2167 return (!loop_start) ? pSample->GetLoopStart() : *loop_start;
209 iliev 2021 }
210    
211     uint Region::GetLoopEnd() {
212 persson 2167 return (!loop_end) ? pSample->GetLoopEnd() : *loop_end;
213 iliev 2021 }
214    
215     uint Region::GetLoopCount() {
216     return (!count) ? 0 : *count;
217     }
218    
219 iliev 2012 /////////////////////////////////////////////////////////////
220     // class Instrument
221    
222 schoenebeck 4018 Instrument::Instrument(File* file, std::string name, SampleManager* pSampleManager) : KeyBindings(128, false), KeySwitchBindings(128, false)
223 iliev 2012 {
224 schoenebeck 4018 this->file = file;
225 iliev 2012 this->name = name;
226     this->pSampleManager = pSampleManager ? pSampleManager : this;
227 persson 2106 pLookupTable = 0;
228 iliev 2230
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 iliev 2012 }
236    
237     Instrument::~Instrument()
238     {
239 persson 2106 for (int i = 0; i < regions.size(); i++) {
240     delete regions[i];
241 iliev 2012 }
242 persson 2106 delete pLookupTable;
243 persson 2115 for (int i = 0 ; i < 128 ; i++) {
244     delete pLookupTableCC[i];
245     }
246 iliev 2012 }
247    
248 persson 2106 void Query::search(const Instrument* pInstrument) {
249     pRegionList = &pInstrument->pLookupTable->query(*this);
250     regionIndex = 0;
251 persson 2101 }
252    
253 persson 2115 void Query::search(const Instrument* pInstrument, int triggercc) {
254     pRegionList = &pInstrument->pLookupTableCC[triggercc]->query(*this);
255     regionIndex = 0;
256     }
257    
258 persson 2101 Region* Query::next() {
259 persson 2106 for ( ; regionIndex < pRegionList->size() ; regionIndex++) {
260     if ((*pRegionList)[regionIndex]->OnKey(*this)) {
261     return (*pRegionList)[regionIndex++];
262     }
263 iliev 2012 }
264 persson 2101 return 0;
265 iliev 2012 }
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 persson 2856 // class ContainerDefinition
291 iliev 2012
292 persson 2856 ContainerDefinition::ContainerDefinition(section_type type)
293 iliev 2012 {
294     Reset();
295 persson 2856 level = type;
296 iliev 2012 }
297    
298 persson 2856 ContainerDefinition::~ContainerDefinition()
299 iliev 2012 {
300     }
301    
302     void
303 persson 2856 ContainerDefinition::Reset()
304 iliev 2012 {
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 iliev 2027 group = 0;
335 persson 2114 off_by = 0;
336 iliev 2012 off_mode = OFF_FAST;
337    
338     // sample player
339 schoenebeck 3082 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 persson 2317 end = 0;
346 schoenebeck 3082 loop_crossfade = optional<float>::nothing;
347     offset = optional<uint>::nothing;
348     offset_random = optional<int>::nothing;
349 persson 2167 loop_mode = LOOP_UNSET;
350 schoenebeck 3082 loop_start = optional<int>::nothing;
351     loop_end = optional<int>::nothing;
352     sync_beats = optional<int>::nothing;
353     sync_offset = optional<int>::nothing;
354 iliev 2012
355     // amplifier
356     volume = 0;
357 iliev 2231 volume_oncc.clear();
358     volume_curvecc.clear();
359 iliev 2232 volume_smoothcc.clear();
360 iliev 2265 volume_stepcc.clear();
361 persson 2403 amplitude = 100;
362 iliev 2012 pan = 0;
363 iliev 2237 pan_oncc.clear();
364     pan_curvecc.clear();
365     pan_smoothcc.clear();
366 iliev 2265 pan_stepcc.clear();
367 iliev 2012 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 iliev 2264
393     pitch_oncc.clear();
394     pitch_smoothcc.clear();
395     pitch_curvecc.clear();
396     pitch_stepcc.clear();
397 iliev 2012
398     // filter
399     fil_type = LPF_2P;
400 schoenebeck 3082 cutoff = optional<float>::nothing;
401 iliev 2012 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 schoenebeck 3082 cutoff2 = optional<float>::nothing;
411 iliev 2012 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 iliev 2252
419     cutoff_oncc.clear();
420     cutoff_smoothcc.clear();
421     cutoff_curvecc.clear();
422 iliev 2265 cutoff_stepcc.clear();
423 iliev 2252 cutoff2_oncc.clear();
424     cutoff2_smoothcc.clear();
425     cutoff2_curvecc.clear();
426 iliev 2265 cutoff2_stepcc.clear();
427 iliev 2252
428     resonance_oncc.clear();
429     resonance_smoothcc.clear();
430     resonance_curvecc.clear();
431 iliev 2265 resonance_stepcc.clear();
432 iliev 2252 resonance2_oncc.clear();
433     resonance2_smoothcc.clear();
434     resonance2_curvecc.clear();
435 iliev 2265 resonance2_stepcc.clear();
436 iliev 2012
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 persson 2091 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 iliev 2012
467     // sample player
468 persson 2091 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 iliev 2012
472     // amplifier
473 persson 2091 amp_velcurve.set(i, -1);
474     gain_oncc.set(i, 0);
475     xfin_locc.set(i, 0);
476     xfin_hicc.set(i, 0);
477 iliev 2236 xfout_locc.set(i, 0);
478     xfout_hicc.set(i, 0);
479 iliev 2012
480     // per voice equalizer
481 persson 2091 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 iliev 2012 }
491 iliev 2018
492 persson 2055 eg.clear();
493 iliev 2231 lfos.clear();
494 persson 2055
495 iliev 2018 // deprecated
496     ampeg_delay = 0;
497     ampeg_start = 0; //in percentage
498     ampeg_attack = 0;
499     ampeg_hold = 0;
500     ampeg_decay = 0;
501 iliev 2218 ampeg_sustain = -1; // in percentage
502 iliev 2018 ampeg_release = 0;
503    
504 persson 2176 ampeg_vel2delay = 0;
505     ampeg_vel2attack = 0;
506     ampeg_vel2hold = 0;
507     ampeg_vel2decay = 0;
508     ampeg_vel2sustain = 0;
509     ampeg_vel2release = 0;
510 iliev 2231
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 persson 2176
519 iliev 2018 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 iliev 2222 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 iliev 2249
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 iliev 2222
544 iliev 2018 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 iliev 2220 pitcheg_depth = 0;
552 persson 2072
553 iliev 2220 pitcheg_vel2delay = 0;
554     pitcheg_vel2attack = 0;
555     pitcheg_vel2hold = 0;
556     pitcheg_vel2decay = 0;
557     pitcheg_vel2sustain = 0;
558     pitcheg_vel2release = 0;
559 iliev 2249
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 iliev 2220
569 persson 2072 amplfo_delay = 0;
570     amplfo_fade = 0;
571 iliev 2229 amplfo_freq = -1; /* -1 is used to determine whether the LFO was initialized */
572 persson 2072 amplfo_depth = 0;
573 iliev 2248 amplfo_delay_oncc.clear();
574     amplfo_fade_oncc.clear();
575 iliev 2233 amplfo_depthcc.clear();
576 iliev 2231 amplfo_freqcc.clear();
577 persson 2072
578     fillfo_delay = 0;
579     fillfo_fade = 0;
580 iliev 2229 fillfo_freq = -1; /* -1 is used to determine whether the LFO was initialized */
581 persson 2072 fillfo_depth = 0;
582 iliev 2248 fillfo_delay_oncc.clear();
583     fillfo_fade_oncc.clear();
584 iliev 2233 fillfo_depthcc.clear();
585 iliev 2231 fillfo_freqcc.clear();
586 persson 2072
587     pitchlfo_delay = 0;
588     pitchlfo_fade = 0;
589 iliev 2229 pitchlfo_freq = -1; /* -1 is used to determine whether the LFO was initialized */
590 persson 2072 pitchlfo_depth = 0;
591 iliev 2248 pitchlfo_delay_oncc.clear();
592     pitchlfo_fade_oncc.clear();
593 iliev 2253 pitchlfo_depthcc.clear();
594 iliev 2231 pitchlfo_freqcc.clear();
595 iliev 2012 }
596    
597 persson 2856 void ContainerDefinition::CopyValuesToDefinition(Definition* definition)
598 iliev 2012 {
599 persson 2856 // This is where the current settings are copied to the new definition.
600 iliev 2012
601     // sample definition
602 persson 2856 definition->sample = sample;
603 iliev 2012
604     // input control
605 persson 2856 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 iliev 2012
647     // sample player
648 persson 2856 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 iliev 2012
667     // amplifier
668 persson 2856 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 schoenebeck 3819 definition->xfin_hivel = xfin_hivel;
695 persson 2856 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 iliev 2012
704     // pitch
705 persson 2856 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 iliev 2264
715 persson 2856 definition->pitch_oncc = pitch_oncc;
716     definition->pitch_smoothcc = pitch_smoothcc;
717     definition->pitch_curvecc = pitch_curvecc;
718     definition->pitch_stepcc = pitch_stepcc;
719 iliev 2012
720     // filter
721 persson 2856 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 iliev 2012
739 persson 2856 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 iliev 2012
757     // per voice equalizer
758 persson 2856 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 iliev 2012
783 persson 2055 // envelope generator
784 persson 2856 definition->eg = eg;
785 persson 2055
786 iliev 2018 // deprecated
787 persson 2856 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 iliev 2018
795 persson 2856 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 iliev 2229
802 persson 2856 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 persson 2176
810 persson 2856 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 iliev 2018
819 persson 2856 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 iliev 2249
826 persson 2856 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 iliev 2222
835 persson 2856 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 iliev 2018
844 persson 2856 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 iliev 2249
851 persson 2856 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 iliev 2220
860 persson 2856 definition->amplfo_delay = amplfo_delay;
861     definition->amplfo_fade = amplfo_fade;
862     definition->amplfo_freq = amplfo_freq;
863     definition->amplfo_depth = amplfo_depth;
864 iliev 2227
865 persson 2856 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 persson 2072
870 persson 2856 definition->fillfo_delay = fillfo_delay;
871     definition->fillfo_fade = fillfo_fade;
872     definition->fillfo_freq = fillfo_freq;
873     definition->fillfo_depth = fillfo_depth;
874 iliev 2227
875 persson 2856 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 persson 2072
880 persson 2856 definition->pitchlfo_delay = pitchlfo_delay;
881     definition->pitchlfo_fade = pitchlfo_fade;
882     definition->pitchlfo_freq = pitchlfo_freq;
883     definition->pitchlfo_depth = pitchlfo_depth;
884 iliev 2224
885 persson 2856 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 iliev 2229
890 persson 2856 definition->eg = eg;
891     definition->lfos = lfos;
892 iliev 2012 }
893    
894     /////////////////////////////////////////////////////////////
895     // class File
896    
897 persson 2856 const std::string File::MACRO_NAME_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
898     const std::string File::MACRO_VALUE_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_. /\\";
899    
900 iliev 2012 File::File(std::string file, SampleManager* pSampleManager) :
901 schoenebeck 4015 rootFile(file),
902 persson 2856 _current_section(GLOBAL),
903 schoenebeck 3034 id(0),
904 iliev 2012 default_path(""),
905     octave_offset(0),
906 schoenebeck 3034 note_offset(0)
907 iliev 2012 {
908 schoenebeck 4018 _instrument = new Instrument(this, LinuxSampler::Path::getBaseName(file), pSampleManager);
909 persson 2856 ContainerDefinition* defaultGlobalContainer = new ContainerDefinition(ContainerDefinition::GLOBAL);
910     _current_containers.push(defaultGlobalContainer);
911     pCurDef = defaultGlobalContainer;
912 schoenebeck 2529
913     parseFile(file,pSampleManager);
914    
915 persson 2091 std::set<float*> velcurves;
916 iliev 2012 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 persson 2115 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 iliev 2012 }
930    
931     // get keyswitches
932     low = pRegion->sw_lokey;
933 persson 2086 if (low < 0) low = 0;
934 iliev 2012 high = pRegion->sw_hikey;
935 persson 2086 if (high == -1) {
936 iliev 2012 // Key switches not defined, so nothing to do
937 persson 2086 } else if (low >= 0 && low <= 127 && high >= 0 && high <= 127 && high >= low) {
938 iliev 2012 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 persson 2082
943     // create velocity response curve
944 persson 2091
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 persson 2082 prevvalue += step;
965     }
966 persson 2091 } else {
967     // default curve
968     for (int v = 0 ; v < 128 ; v++) {
969     velcurve[v] = v * v / (127.0 * 127.0);
970     }
971 persson 2082 }
972     }
973 iliev 2012 }
974 persson 2106
975     _instrument->pLookupTable = new LookupTable(_instrument);
976 persson 2115
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 iliev 2230
983 iliev 2233 for (int i = 0; i < _instrument->regions.size(); i++) {
984     Region* r = _instrument->regions[i];
985 iliev 2230
986     copyCurves(r->volume_curvecc, r->volume_oncc);
987 iliev 2233 r->volume_curvecc.clear();
988    
989 iliev 2232 copySmoothValues(r->volume_smoothcc, r->volume_oncc);
990 iliev 2233 r->volume_smoothcc.clear();
991 iliev 2230
992 iliev 2265 copyStepValues(r->volume_stepcc, r->volume_oncc);
993     r->volume_stepcc.clear();
994    
995 iliev 2264 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 iliev 2237 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 iliev 2265 copyStepValues(r->pan_stepcc, r->pan_oncc);
1011     r->pan_stepcc.clear();
1012    
1013 iliev 2252 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 iliev 2265 copyStepValues(r->cutoff_stepcc, r->cutoff_oncc);
1020     r->cutoff_stepcc.clear();
1021    
1022 iliev 2252 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 iliev 2265 copyStepValues(r->cutoff2_stepcc, r->cutoff2_oncc);
1029     r->cutoff2_stepcc.clear();
1030    
1031 iliev 2252 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 iliev 2265 copyStepValues(r->resonance_stepcc, r->resonance_oncc);
1038     r->resonance_stepcc.clear();
1039    
1040 iliev 2252 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 iliev 2265 copyStepValues(r->resonance2_stepcc, r->resonance2_oncc);
1047     r->resonance2_stepcc.clear();
1048    
1049 iliev 2237 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 iliev 2233 for (int j = 0; j < r->lfos.size(); j++) {
1055 iliev 2299 r->lfos[j].copySmoothValues();
1056     r->lfos[j].copyStepValues();
1057    
1058 iliev 2233 copySmoothValues(r->lfos[j].volume_smoothcc, r->lfos[j].volume_oncc);
1059     r->lfos[j].volume_smoothcc.clear();
1060    
1061 iliev 2265 copyStepValues(r->lfos[j].volume_stepcc, r->lfos[j].volume_oncc);
1062     r->lfos[j].volume_stepcc.clear();
1063    
1064 iliev 2233 copySmoothValues(r->lfos[j].freq_smoothcc, r->lfos[j].freq_oncc);
1065     r->lfos[j].freq_smoothcc.clear();
1066    
1067 iliev 2265 copyStepValues(r->lfos[j].freq_stepcc, r->lfos[j].freq_oncc);
1068     r->lfos[j].freq_stepcc.clear();
1069    
1070 iliev 2233 copySmoothValues(r->lfos[j].pitch_smoothcc, r->lfos[j].pitch_oncc);
1071     r->lfos[j].pitch_smoothcc.clear();
1072    
1073 iliev 2265 copyStepValues(r->lfos[j].pitch_stepcc, r->lfos[j].pitch_oncc);
1074     r->lfos[j].pitch_stepcc.clear();
1075    
1076 iliev 2233 copySmoothValues(r->lfos[j].pan_smoothcc, r->lfos[j].pan_oncc);
1077     r->lfos[j].pan_smoothcc.clear();
1078    
1079 iliev 2265 copyStepValues(r->lfos[j].pan_stepcc, r->lfos[j].pan_oncc);
1080     r->lfos[j].pan_stepcc.clear();
1081    
1082 iliev 2233 copySmoothValues(r->lfos[j].cutoff_smoothcc, r->lfos[j].cutoff_oncc);
1083     r->lfos[j].cutoff_smoothcc.clear();
1084    
1085 iliev 2265 copyStepValues(r->lfos[j].cutoff_stepcc, r->lfos[j].cutoff_oncc);
1086     r->lfos[j].cutoff_stepcc.clear();
1087    
1088 iliev 2233 copySmoothValues(r->lfos[j].resonance_smoothcc, r->lfos[j].resonance_oncc);
1089     r->lfos[j].resonance_smoothcc.clear();
1090 iliev 2265
1091     copyStepValues(r->lfos[j].resonance_stepcc, r->lfos[j].resonance_oncc);
1092     r->lfos[j].resonance_stepcc.clear();
1093 iliev 2233 }
1094 iliev 2230 }
1095 iliev 2012 }
1096    
1097 persson 2533 void File::parseFile(std::string file, SampleManager* pSampleManager){
1098     enum token_type_t { HEADER, OPCODE };
1099 schoenebeck 3054 token_type_t token_type = (token_type_t) -1;
1100 persson 2533 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 schoenebeck 4016 // remember latest modification time of file
1109     checkFileModified(file);
1110    
1111 persson 2533 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 persson 2856 // #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 schoenebeck 3082 // 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 schoenebeck 3084
1216     continue;
1217 schoenebeck 3082 }
1218 persson 2533
1219     // DEFINITION
1220     std::stringstream linestream(line);
1221     int spaces = 0;
1222     while (linestream >> token)
1223     {
1224     linestream >> std::noskipws;
1225 persson 3291 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 persson 2533 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 schoenebeck 4016 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 iliev 2012 File::~File()
1337     {
1338 persson 2856 for (int i = 0; i < _current_containers.size(); i++)
1339     {
1340     delete _current_containers.top();
1341     _current_containers.pop();
1342     }
1343 iliev 2012 delete _instrument;
1344     }
1345    
1346 schoenebeck 4015 std::string File::filename() const {
1347     return rootFile;
1348     }
1349    
1350 iliev 2012 Instrument*
1351     File::GetInstrument()
1352     {
1353     return _instrument;
1354     }
1355 iliev 2230
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 iliev 2232
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 iliev 2237
1376 iliev 2264 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 iliev 2237 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 iliev 2012
1397 iliev 2237 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 iliev 2012 void
1409     File::push_header(std::string token)
1410     {
1411 persson 2856 if (token == "<global>" ||
1412     token == "<master>" ||
1413     token == "<group>")
1414 iliev 2012 {
1415 schoenebeck 3034 ContainerDefinition::section_type level = ContainerDefinition::GLOBAL; // initialized only to avoid an irrelevant compiler warning
1416    
1417 persson 2856 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 schoenebeck 3034
1433 persson 2856 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 iliev 2012 }
1450     else if (token == "<region>")
1451     {
1452     _current_section = REGION;
1453 persson 2856 _current_region = new Region();
1454     _current_region->id = id++;
1455     _current_containers.top()->CopyValuesToDefinition(_current_region);
1456 persson 2055 pCurDef = _current_region;
1457 iliev 2012 _instrument->regions.push_back(_current_region);
1458 persson 2055 _current_region->SetInstrument(_instrument);
1459 iliev 2012 }
1460     else if (token == "<control>")
1461     {
1462     _current_section = CONTROL;
1463     default_path = "";
1464     octave_offset = 0;
1465     note_offset = 0;
1466     }
1467 iliev 2230 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 iliev 2012 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 iliev 2229 int x, y, z;
1490 iliev 2230
1491 persson 2856 // 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 iliev 2230 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 iliev 2012
1526     // sample definition
1527     if ("sample" == key)
1528     {
1529 schoenebeck 3497 // 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 iliev 2012 std::string path = default_path + value;
1540     #ifndef WIN32
1541 persson 2311 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 iliev 2012 #endif
1547 persson 2311 if (!absolute) path = currentDir + LinuxSampler::File::DirSeparator + path;
1548 iliev 2012 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 schoenebeck 3054 break;
1560     default:
1561     ; // noop
1562 iliev 2012 }
1563     return;
1564     }
1565     else if ("octave_offset" == key)
1566     {
1567     switch (_current_section)
1568     {
1569     case CONTROL:
1570     octave_offset = ToInt(value);
1571 schoenebeck 3054 break;
1572     default:
1573     ; // noop
1574 iliev 2012 }
1575     return;
1576     }
1577     else if ("note_offset" == key)
1578     {
1579     switch (_current_section)
1580     {
1581     case CONTROL:
1582     note_offset = ToInt(value);
1583 schoenebeck 3054 break;
1584     default:
1585     ; // noop
1586 iliev 2012 }
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 persson 2058 else if ("lokey" == key) pCurDef->lokey = parseKey(value);
1594     else if ("hikey" == key) pCurDef->hikey = parseKey(value);
1595 iliev 2012 else if ("key" == key)
1596     {
1597 persson 2058 pCurDef->lokey = pCurDef->hikey = pCurDef->pitch_keycenter = parseKey(value);
1598 iliev 2012 }
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 persson 2106 else if ("lobpm" == key) pCurDef->lobpm = ToFloat(value);
1604     else if ("hibpm" == key) pCurDef->hibpm = ToFloat(value);
1605 iliev 2012 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 persson 2058 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 iliev 2012 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 persson 2058 else if ("off_by" == key || "offby" == key) pCurDef->off_by = ToInt(value);
1637     else if ("off_mode" == key || "offmode" == key)
1638 iliev 2012 {
1639 persson 2114 if (value == "fast") pCurDef->off_mode = OFF_FAST;
1640     else if (value == "normal") pCurDef->off_mode = OFF_NORMAL;
1641 iliev 2012 }
1642    
1643     // sample player
1644 iliev 2021 else if ("count" == key) { pCurDef->count = ToInt(value); pCurDef->loop_mode = ONE_SHOT; }
1645 iliev 2012 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 persson 2058 else if ("loop_mode" == key || "loopmode" == key)
1654 iliev 2012 {
1655     if (value == "no_loop") pCurDef->loop_mode = NO_LOOP;
1656     else if (value == "one_shot") pCurDef->loop_mode = ONE_SHOT;
1657 iliev 2021 else if (value == "loop_continuous") pCurDef->loop_mode = LOOP_CONTINUOUS;
1658 iliev 2012 else if (value == "loop_sustain") pCurDef->loop_mode = LOOP_SUSTAIN;
1659     }
1660     else if ("loop_start" == key) pCurDef->loop_start = ToInt(value);
1661 iliev 2021 else if ("loopstart" == key) pCurDef->loop_start = ToInt(value); // nonstandard
1662 iliev 2012 else if ("loop_end" == key) pCurDef->loop_end = ToInt(value);
1663 iliev 2021 else if ("loopend" == key) pCurDef->loop_end = ToInt(value); // nonstandard
1664 iliev 2216 else if ("offset" == key) pCurDef->offset = ToInt(value);
1665 iliev 2012 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 persson 2403 else if ("amplitude" == key) pCurDef->amplitude = ToFloat(value);
1671 iliev 2012 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 persson 2058 else if ("amp_keycenter" == key) pCurDef->amp_keycenter = parseKey(value);
1676 iliev 2012 else if ("amp_veltrack" == key) pCurDef->amp_veltrack = ToFloat(value);
1677     else if ("amp_random" == key) pCurDef->amp_random = ToFloat(value);
1678 iliev 2229 else if ("rt_decay" == key || "rtdecay" == key) pCurDef->rt_decay = ToFloat(value);
1679 persson 2058 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 iliev 2012 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 persson 2058 else if ("pitch_keycenter" == key) pCurDef->pitch_keycenter = parseKey(value);
1707 iliev 2012 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 persson 2058 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 iliev 2229 else if ("bend_step" == key || "bendstep" == key) pCurDef->bend_step = ToInt(value);
1713 iliev 2012
1714     // filter
1715 persson 2086 else if ("fil_type" == key || "filtype" == key)
1716 iliev 2012 {
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 iliev 2252 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 iliev 2012 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 persson 2058 else if ("fil_keycenter" == key) pCurDef->fil_keycenter = parseKey(value);
1762     else if ("fil2_keycenter" == key) pCurDef->fil2_keycenter = parseKey(value);
1763 iliev 2012 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 persson 2082 else if (sscanf(key.c_str(), "amp_velcurve_%d", &x)) {
1786 persson 2091 pCurDef->amp_velcurve.set(x, ToFloat(value));
1787 persson 2082 }
1788 iliev 2225
1789 persson 2055 // v2 envelope generators
1790     else if (sscanf(key.c_str(), "eg%d%n", &x, &y)) {
1791     const char* s = key.c_str() + y;
1792 iliev 2229 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 persson 2055 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 iliev 2235 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 persson 2055 else if (strcmp(s, "_cutoff") == 0) eg(x).cutoff = ToFloat(value);
1811 iliev 2235 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 iliev 2237 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 iliev 2299 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 persson 2055 else std::cerr << "The opcode '" << key << "' is unsupported by libsfz!" << std::endl;
1839     }
1840    
1841     // v1 envelope generators
1842 iliev 2018 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 persson 2176 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 iliev 2018 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 iliev 2222 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 iliev 2018 else if ("pitcheg_delay" == key) pCurDef->pitcheg_delay = ToFloat(value);
1870     else if ("pitcheg_start" == key) pCurDef->pitcheg_start = ToFloat(value);
1871 iliev 2220 else if ("pitcheg_attack" == key) pCurDef->pitcheg_attack = ToFloat(value);
1872     else if ("pitcheg_hold" == key) pCurDef->pitcheg_hold = ToFloat(value);
1873 iliev 2018 else if ("pitcheg_decay" == key) pCurDef->pitcheg_decay = ToFloat(value);
1874 iliev 2220 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 persson 2072
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 iliev 2253 else if ("amplfo_freqchanaft" == key) pCurDef->amplfo_freqcc.add( CC(128, check(key, -200.0f, 200.0f, ToFloat(value))) );
1890 persson 2072 else if ("amplfo_depth" == key) pCurDef->amplfo_depth = ToFloat(value);
1891 iliev 2253 else if ("amplfo_depthchanaft" == key) pCurDef->amplfo_depthcc.add( CC(128, check(key, -10.0f, 10.0f, ToFloat(value))) );
1892 persson 2072 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 iliev 2253 else if ("fillfo_freqchanaft" == key) pCurDef->fillfo_freqcc.add( CC(128, check(key, -200.0f, 200.0f, ToFloat(value))) );
1896 persson 2072 else if ("fillfo_depth" == key) pCurDef->fillfo_depth = ToFloat(value);
1897 iliev 2253 else if ("fillfo_depthchanaft" == key) pCurDef->fillfo_depthcc.add( CC(128, check(key, -1200, 1200, ToInt(value))) );
1898 persson 2072 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 iliev 2253 else if ("pitchlfo_freqchanaft" == key) pCurDef->pitchlfo_freqcc.add( CC(128, check(key, -200.0f, 200.0f, ToFloat(value))) );
1902 persson 2072 else if ("pitchlfo_depth" == key) pCurDef->pitchlfo_depth = ToInt(value);
1903 iliev 2253 else if ("pitchlfo_depthchanaft" == key) pCurDef->pitchlfo_depthcc.add( CC(128, check(key, -1200, 1200, ToInt(value))) );
1904 iliev 2218
1905 iliev 2253
1906 iliev 2218 // 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 iliev 2227 else if (sscanf(s, "_freq_oncc%d", &y)) lfo(x).freq_oncc.add( CC(y, check(key, 0.0f, 20.0f, ToFloat(value))) );
1911 iliev 2233 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 iliev 2265 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 iliev 2218 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 iliev 2233 else if (sscanf(s, "_delay_oncc%d", &y)) lfo(x).delay_oncc.add( CC(y, check(key, 0.0f, 100.0f, ToFloat(value))) );
1916 iliev 2226 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 iliev 2225 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 iliev 2221 else if (strcmp(s, "_volume") == 0) lfo(x).volume = check(key, -144.0f, 6.0f, ToFloat(value));
1921 iliev 2233 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 iliev 2265 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 iliev 2218 else if (strcmp(s, "_pitch") == 0) lfo(x).pitch = check(key, -9600, 9600, ToInt(value));
1925 iliev 2225 else if (sscanf(s, "_pitch_oncc%d", &y)) lfo(x).pitch_oncc.add( CC(y, check(key, -9600, 9600, ToInt(value))) );
1926 iliev 2233 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 iliev 2265 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 iliev 2218 else if (strcmp(s, "_cutoff") == 0) lfo(x).cutoff = check(key, -9600, 9600, ToInt(value));
1929 iliev 2233 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 iliev 2265 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 iliev 2218 else if (strcmp(s, "_resonance") == 0) lfo(x).resonance = check(key, 0.0f, 40.0f, ToFloat(value));
1933 iliev 2233 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 iliev 2265 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 iliev 2218 else if (strcmp(s, "_pan") == 0) lfo(x).pan = check(key, -100.0f, 100.0f, ToFloat(value));
1937 iliev 2233 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 iliev 2265 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 iliev 2299 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 iliev 2218 else std::cerr << "The opcode '" << key << "' is unsupported by libsfz!" << std::endl;
1977     }
1978 iliev 2230
1979 iliev 2225 // 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 iliev 2250 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 persson 2856
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 schoenebeck 3095
2003 persson 2856 int num_cc = ToInt(num_cc_str);
2004 schoenebeck 3095 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 iliev 2225
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 iliev 2250 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 iliev 2225
2024     // amplifier
2025 iliev 2250 else if ("gain" == key_cc || "gain_" == key_cc) pCurDef->gain_oncc.set(num_cc, ToFloat(value));
2026 iliev 2225 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 iliev 2264
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 iliev 2225
2037     // filter
2038 iliev 2250 else if ("cutoff" == key_cc || "cutoff_" == key_cc) {
2039 iliev 2252 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 iliev 2265 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 iliev 2252 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 iliev 2265 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 iliev 2252 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 iliev 2225
2056     // per voice equalizer
2057 iliev 2250 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 iliev 2229
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 iliev 2250 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 iliev 2249
2084 iliev 2250 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 iliev 2249
2093 iliev 2250 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 iliev 2253 else if ("pitchlfo_depth" == key_cc) pCurDef->pitchlfo_depthcc.add( CC(num_cc, check(key, -1200, 1200, ToInt(value))) );
2096 iliev 2227 else if ("pitchlfo_freq" == key_cc) pCurDef->pitchlfo_freqcc.add( CC(num_cc, check(key, -200.0f, 200.0f, ToFloat(value))) );
2097 iliev 2250 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 iliev 2233 else if ("fillfo_depth" == key_cc) pCurDef->fillfo_depthcc.add( CC(num_cc, check(key, -1200, 1200, ToInt(value))) );
2100 iliev 2227 else if ("fillfo_freq" == key_cc) pCurDef->fillfo_freqcc.add( CC(num_cc, check(key, -200.0f, 200.0f, ToFloat(value))) );
2101 iliev 2250 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 iliev 2233 else if ("amplfo_depth" == key_cc) pCurDef->amplfo_depthcc.add( CC(num_cc, check(key, -10.0f, 10.0f, ToFloat(value))) );
2104 iliev 2227 else if ("amplfo_freq" == key_cc) pCurDef->amplfo_freqcc.add( CC(num_cc, check(key, -200.0f, 200.0f, ToFloat(value))) );
2105 iliev 2250 else if ("volume" == key_cc) pCurDef->volume_oncc.add( CC(num_cc, check(key, -144.0f, 100.0f, ToFloat(value))) );
2106 iliev 2230 else if ("volume_curve" == key_cc) pCurDef->volume_curvecc.add( CC(num_cc, 0, check(key, 0, 30000, ToInt(value))) );
2107 iliev 2232 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 iliev 2265 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 persson 2382 else if ("pan" == key_cc) pCurDef->pan_oncc.add( CC(num_cc, check(key, -200.0f, 200.0f, ToFloat(value))) );
2110 iliev 2237 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 iliev 2265 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 schoenebeck 3095 else if ("set_" == key_cc) _instrument->initialCCValues[num_cc] = (num_cc < 128) ? check(key, 0, 127, ToInt(value)) : ToInt(value);
2114 iliev 2225 else std::cerr << "The opcode '" << key << "' is unsupported by libsfz!" << std::endl;
2115     }
2116    
2117 iliev 2018 else {
2118 iliev 2012 std::cerr << "The opcode '" << key << "' is unsupported by libsfz!" << std::endl;
2119     }
2120     }
2121    
2122 persson 2058 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 persson 2115 case '-': if (s == "-1") return -1;
2137 persson 2058 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 persson 2055 EGNode::EGNode() : time(0), level(0), shape(0), curve(0) {
2159     }
2160 iliev 2229
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 persson 2055
2171     EG::EG() :
2172 schoenebeck 3034 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 iliev 2235 { }
2175 iliev 2229
2176     void EG::Copy(const EG& eg) {
2177 iliev 2299 EqImpl::Copy(static_cast<const EqImpl>(eg));
2178    
2179 iliev 2229 sustain = eg.sustain;
2180     loop = eg.loop;
2181     loop_count = eg.loop_count;
2182     amplitude = eg.amplitude;
2183 iliev 2235 volume = eg.volume;
2184 iliev 2229 cutoff = eg.cutoff;
2185 iliev 2235 pitch = eg.pitch;
2186     resonance = eg.resonance;
2187 iliev 2237 pan = eg.pan;
2188     pan_curve = eg.pan_curve;
2189 iliev 2229 node = eg.node;
2190 iliev 2235
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 iliev 2237 pan_oncc = eg.pan_oncc;
2197     pan_curvecc = eg.pan_curvecc;
2198 iliev 2229 }
2199 iliev 2218
2200 schoenebeck 3034 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 iliev 2218 }
2206 schoenebeck 3034
2207 iliev 2229 void LFO::Copy(const LFO& lfo) {
2208 iliev 2299 EqSmoothStepImpl::Copy(static_cast<const EqSmoothStepImpl>(lfo));
2209    
2210 iliev 2229 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 iliev 2233
2221     delay_oncc = lfo.delay_oncc;
2222     freq_oncc = lfo.freq_oncc;
2223     freq_smoothcc = lfo.freq_smoothcc;
2224 iliev 2265 freq_stepcc = lfo.freq_stepcc;
2225 iliev 2233 fade_oncc = lfo.fade_oncc;
2226     phase_oncc = lfo.phase_oncc;
2227     pitch_oncc = lfo.pitch_oncc;
2228     pitch_smoothcc = lfo.pitch_smoothcc;
2229 iliev 2265 pitch_stepcc = lfo.pitch_stepcc;
2230 iliev 2233 volume_oncc = lfo.volume_oncc;
2231     volume_smoothcc = lfo.volume_smoothcc;
2232 iliev 2265 volume_stepcc = lfo.volume_stepcc;
2233 iliev 2233 pan_oncc = lfo.pan_oncc;
2234     pan_smoothcc = lfo.pan_smoothcc;
2235 iliev 2265 pan_stepcc = lfo.pan_stepcc;
2236 iliev 2233 cutoff_oncc = lfo.cutoff_oncc;
2237     cutoff_smoothcc = lfo.cutoff_smoothcc;
2238 iliev 2265 cutoff_stepcc = lfo.cutoff_stepcc;
2239 iliev 2233 resonance_oncc = lfo.resonance_oncc;
2240     resonance_smoothcc = lfo.resonance_smoothcc;
2241 iliev 2265 resonance_stepcc = lfo.resonance_stepcc;
2242 iliev 2229 }
2243 iliev 2299
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 persson 2055
2362 iliev 2230 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 iliev 2218 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 iliev 2012 } // !namespace sfz

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC