6 //
\83G
\83\93\83x
\83\8d\81[
\83v
\83p
\83\89\83\81\81[
\83^
19 Envelope(const Envelope& src) :
21 releaseNoteOff(src.releaseNoteOff),
22 attackTime(src.attackTime),
23 decayTime(src.decayTime),
24 sustainLevel(src.sustainLevel),
25 releaseTime(src.releaseTime),
29 Envelope(Envelope&& src) :
30 enable(std::move(src.enable)),
31 releaseNoteOff(std::move(src.releaseNoteOff)),
32 attackTime(std::move(src.attackTime)),
33 decayTime(std::move(src.decayTime)),
34 sustainLevel(std::move(src.sustainLevel)),
35 releaseTime(std::move(src.releaseTime)),
36 gain(std::move(src.gain))
39 Envelope& operator=(const Envelope& src)
44 releaseNoteOff = src.releaseNoteOff;
45 attackTime = src.attackTime;
46 decayTime = src.decayTime;
47 sustainLevel = src.sustainLevel;
48 releaseTime = src.releaseTime;
54 Envelope& operator=(Envelope&& src)
58 enable = std::move(src.enable);
59 releaseNoteOff = std::move(src.releaseNoteOff);
60 attackTime = std::move(src.attackTime);
61 decayTime = std::move(src.decayTime);
62 sustainLevel = std::move(src.sustainLevel);
63 releaseTime = std::move(src.releaseTime);
64 gain = std::move(src.gain);
79 enum struct OscillatorCategory
81 WaveTable,SquwareWave,SinWave
83 //
\83I
\83V
\83\8c\81[
\83^
\83C
\83\93\83^
\81[
\83t
\83F
\81[
\83X
86 typedef std::unique_ptr<Oscillator> PtrType;
87 virtual ~Oscillator(){}
88 virtual void Process(float * data,float delta,float offset) = 0;
89 virtual float SampleRate() const = 0;
90 virtual float CalcPitchDelta(float sampleRate) = 0;
91 // virtual void Init(Timber& timber) = 0;
92 virtual OscillatorCategory Category() = 0;
93 virtual PtrType Clone() = 0;
96 //
\83E
\83F
\81[
\83u
\83f
\81[
\83^
97 typedef std::vector<float> WaveData;
99 //
\83E
\83F
\81[
\83u
\83e
\81[
\83u
\83\8b
104 sampleRate(44100.0f),//
108 WaveTable(const WaveTable& src) :
110 sampleRate(src.sampleRate),//
111 basePitch(src.basePitch)
112 {waveData = src.waveData;};
114 WaveTable(WaveTable&& src) :
115 stereo(std::move(src.stereo)),
116 sampleRate(std::move(src.sampleRate)),//
117 basePitch(std::move(src.basePitch))
118 {waveData = std::move(src.waveData);};
120 WaveTable& operator=(const WaveTable& src)
125 sampleRate = src.sampleRate;//
126 basePitch = src.basePitch;
127 waveData = src.waveData;
132 WaveTable& operator=(WaveTable&& src)
136 stereo = std::move(src.stereo);
137 sampleRate = std::move(src.sampleRate);//
138 basePitch = std::move(src.basePitch);
139 waveData = std::move(src.waveData);
148 static std::vector<WaveTable> WaveTables;
162 waveForm(src.waveForm),
163 envelope(src.envelope),
164 startNoteOn(src.startNoteOn),
170 waveForm(std::move(src.waveForm)),
171 envelope(std::move(src.envelope)),
172 startNoteOn(std::move(src.startNoteOn)),
173 freq(std::move(src.freq)),
174 gain(std::move(src.gain))
177 LFO& operator=(const LFO &src)
181 waveForm = src.waveForm;
182 envelope = src.envelope;
183 startNoteOn = src.startNoteOn;
190 LFO& operator=(LFO &&src)
194 waveForm = std::move(src.waveForm);
195 envelope = std::move(src.envelope);
196 startNoteOn = std::move(src.startNoteOn);
197 freq = std::move(src.freq);
198 gain = std::move(src.gain);
211 //
\83t
\83B
\83\8b\83^
\81[
\83J
\83e
\83S
\83\8a\81[
212 enum struct FilterCategory
217 //
\83t
\83B
\83\8b\83^
\81[
220 Filter() : category(FilterCategory::LPF),level(0.0f),resonance(0.0f),cutoff(0.0f){};
221 Filter(const Filter& src) :
222 category(src.category),
225 resonance(src.resonance),
226 envelope(src.envelope),
231 Filter( Filter&& src) :
232 category(std::move(src.category)),
233 level(std::move(src.level)),
234 cutoff(std::move(src.cutoff)),
235 resonance(std::move(src.resonance)),
236 envelope(std::move(src.envelope)),
237 lfo(std::move(src.lfo))
241 Filter& operator= (const Filter& src)
245 category = src.category;
248 resonance = src.resonance;
249 envelope = src.envelope;
255 Filter& operator= (Filter&& src)
259 category = std::move(src.category);
260 level = std::move(src.level);
261 cutoff = std::move(src.cutoff);
262 resonance = std::move(src.resonance);
263 envelope = std::move(src.envelope);
264 lfo = std::move(src.lfo);
269 FilterCategory category;
277 //
\89¹
\97Ê
\83p
\83\89\83\81\81[
\83^
280 Amplitude() : gain(1.0f) {}
281 Amplitude(const Amplitude& src) :
283 envelope(src.envelope),
287 Amplitude(Amplitude&& src) :
288 gain(std::move(src.gain)),
289 envelope(std::move(src.envelope)),
290 lfo(std::move(src.lfo))
292 Amplitude& operator= (const Amplitude& src)
297 envelope = src.envelope;
303 Amplitude& operator= (Amplitude&& src)
307 gain = std::move(src.gain);
308 envelope = std::move(src.envelope);
309 lfo = std::move(src.lfo);
319 //
\8eü
\94g
\90\94\83p
\83\89\83\81\81[
\83^
321 Pitch() : pitch(1.0f){}
322 Pitch(const Pitch& src) :
324 envelope(src.envelope),
329 pitch(std::move(src.pitch)),
330 envelope(std::move(src.envelope)),
331 lfo(std::move(src.lfo))
333 Pitch& operator= (const Pitch& src)
338 envelope = src.envelope;
344 Pitch& operator= (Pitch&& src)
348 pitch = std::move(src.pitch);
349 envelope = std::move(src.envelope);
350 lfo = std::move(src.lfo);
360 //
\92è
\88Ê
\83p
\83\89\83\81\81[
\83^
362 Pan() : pan(0.5f) {};
363 Pan(const Pan& src) :
365 envelope(src.envelope),
370 pan(std::move(src.pan)),
371 envelope(std::move(src.envelope)),
372 lfo(std::move(src.lfo))
375 Pan& operator= (const Pan& src)
380 envelope = src.envelope;
387 Pan& operator= (Pan&& src)
391 pan = std::move(src.pan);
392 envelope = std::move(src.envelope);
393 lfo = std::move(src.lfo);
403 typedef std::vector<WaveTable> WaveTablesType;
405 struct WaveTableOscillator : public Oscillator
407 typedef std::function<void (float * ,float,float)> ProcessorType;
409 WaveTableOscillator() : waveTable_(nullptr),waveCounter_(0.0f)
414 explicit WaveTableOscillator(WaveTable* waveTable) : waveTable_(nullptr),waveCounter_(0.0f)
416 WaveTable(waveTable);
419 WaveTableOscillator(const WaveTableOscillator& src) : waveTable_(nullptr),
420 waveCounter_(src.waveCounter_)
422 if(src.waveTable_ != nullptr)
424 WaveTable(src.waveTable_);
429 WaveTableOscillator(WaveTableOscillator&& src) :
430 waveTable_(std::move(nullptr)),
431 waveCounter_(std::move(src.waveCounter_))
433 if(src.waveTable_ != nullptr)
435 WaveTable(src.waveTable_);
440 WaveTableOscillator& operator= (const WaveTableOscillator& src)
444 this->waveCounter_ = src.waveCounter_;
445 WaveTable(src.waveTable_);
450 WaveTableOscillator& operator= (WaveTableOscillator&& src)
454 this->waveCounter_ = std::move(src.waveCounter_);
455 WaveTable(src.waveTable_);
460 void Process(float * data,float delta,float offset)
463 //if(waveTable_->stereo)
465 // ProcessStereo(data,delta);
467 // ProcessMono(data,delta);
469 processor_(data,delta,offset);
472 void ProcessStereo(float * data,float delta,float offset)
474 waveCounter_ += delta * (offset + waveTable_->basePitch);
476 if(waveTable_->waveData.size() <= (int)(waveCounter_ * 2.0f))
478 waveCounter_ -= (float)waveTable_->waveData.size() / 2.0f;
481 int index = (float) waveCounter_;
482 float *src = &waveTable_->waveData[index * 2];
489 void ProcessMono(float * data,float delta,float offset)
491 waveCounter_ += delta * (offset + waveTable_->basePitch);
493 if(waveTable_->waveData.size() <= (int)(waveCounter_))
495 waveCounter_ -= (float)waveTable_->waveData.size();
497 int index = (int) waveCounter_;
498 float d = waveTable_->waveData[index];
504 float SampleRate() const {return waveTable_->sampleRate;}
505 float CalcPitchDelta(float sampleRate)
507 return SampleRate() * ((float)WaveTable().waveData.size() / sampleRate);
512 // //WaveTable(&(WaveTable::WaveTables[timber.waveTableNo]));
515 OscillatorCategory Category() {return OscillatorCategory::WaveTable;};
517 PtrType Clone() {return PtrType(new WaveTableOscillator(*this));}
519 Synthesizer::WaveTable& WaveTableOscillator::WaveTable() {return *waveTable_;}
520 void Synthesizer::WaveTableOscillator::WaveTable(Synthesizer::WaveTable *p);
523 Synthesizer::WaveTable *waveTable_;
525 ProcessorType processor_;
528 //
\89¹
\90F
\83p
\83\89\83\81\81[
\83^
532 Timber(const Timber& src) :
533 amplitude(src.amplitude),
538 if(src.oscillator.get() != nullptr){
539 oscillator = src.oscillator->Clone();
543 Timber(Timber&& src) :
544 // waveTableNo(std::move(src.waveTableNo)),
545 amplitude(std::move(src.amplitude)),
546 filter(std::move(src.filter)),
547 pitch(std::move(src.pitch)),
548 pan(std::move(src.pan))
550 if(src.oscillator.get() != nullptr){
551 oscillator.reset(src.oscillator.release());
555 Timber& operator= (const Timber& src)
559 // waveTableNo = src.waveTableNo;
560 if(src.oscillator.get() != nullptr){
561 oscillator = src.oscillator->Clone();
563 amplitude = src.amplitude;
572 Timber& operator= (Timber&& src)
576 // waveTableNo = std::move(src.waveTableNo);
577 if(src.oscillator.get() != nullptr){
578 oscillator.reset(src.oscillator.release());
580 amplitude = std::move(src.amplitude);
581 filter = std::move(src.filter);
582 pitch = std::move(src.pitch);
583 pan = std::move(src.pan);
588 Oscillator::PtrType oscillator;
596 //
\89¹
\90F
\83v
\83\8d\83O
\83\89\83\80\83p
\83\89\83\81\81[
\83^
599 Program(const std::wstring& name,const Timber& timber) :
600 name(name),timber(timber)
603 Program(const Program& src)
605 name(src.name),timber(src.timber)
610 Program(const Program&& src) :
611 name(std::move(src.name)),timber(std::move(src.timber))
616 Program& operator= (const Program& src)
626 Program& operator= (const Program&& src)
630 name = std::move(src.name);
631 timber = std::move(src.timber);
639 typedef std::vector<Program> ProgramsType;
640 //
\83R
\83\93\83X
\83g
\83\89\83N
\83^
642 //
\83R
\83\93\83X
\83g
\83\89\83N
\83^
643 explicit Synthesizer(WAVEFORMATEXTENSIBLE& format,int channel = 4);
644 //
\83f
\83X
\83g
\83\89\83N
\83^
646 //
\83\8a\83X
\83^
\81[
\83g
648 //
\94g
\8c`
\90¶
\90¬
\8f\88\97\9d
649 void Process(float* buffer);
650 //
\83m
\81[
\83g
\83I
\83\93\8f\88\97\9d
651 void NoteOn(int index,float pitch,float velocity);
652 //
\83m
\81[
\83g
\83I
\83t
\8f\88\97\9d
653 void NoteOff(int index);
655 //
\89¹
\90F
\83v
\83\8d\83O
\83\89\83\80
656 void AddProgram(Program&& program);
657 Program& GetProgram(int index);
659 void UpdateProgram(int index,Program&& Program);
660 size_t ProgramsSize();
662 void AssignProgramToVoice(int programNo,int voiceChannelNo);
664 size_t Voices() const;
666 //
\83E
\83F
\81[
\83u
\83e
\81[
\83u
\83\8b
667 static WaveTablesType& WaveTables();
669 bool isEnable() const ;
670 void isEnable(bool v);
676 std::unique_ptr<impl> impl_;