#ifndef __SYNTH_H__ #define __SYNTH_H__ #include "voicemanager.h" #include "channel.h" #include "dsp/frame.h" //#include "dsp/reverb.h" #include "luts.h" #include "perf.h" class Synth { public: Synth() { genLUTs(); for(VoiceManager::channel_t i = 0; i < 16; ++i) { channels[i].number = i; channels[i].voiceManager = &voiceManager; channels[i].loadPreset(&DEFAULT_PRESET); } } void noteOn(int ch, int note, int vel); void noteOff(int ch, int note); void control(int ch, int cc, int val); inline void tick(float* out, const size_t bufferSize) { nano_t started = nanos(); std::fill(out, out + bufferSize, 0.f); //float reverbBus[bufferSize]; //std::fill(reverbBus, reverbBus + bufferSize, 0.f); for(auto& channel : channels) { float chOut[bufferSize]; if(!channel.tick(chOut, bufferSize)) { continue; } for(size_t i = 0; i < bufferSize; ++i) { out[i] += chOut[i]; } //for(size_t i = 0; i < bufferSize; ++i) { // reverbBus[i] += channel.settings.reverb * chOut[i]; //} } /* for(size_t i = 0; i < bufferSize; i += 2) { frame f = {reverbBus[i], reverbBus[i + 1]}; f = reverb.tick(f); out[i] += f.l; out[i + 1] += f.r; } */ for(size_t i = 0; i < bufferSize; ++i) { out[i] *= 0.125f; } nano_t finished = nanos(); perfNanos.total += finished - started; } private: VoiceManager voiceManager{}; Channel channels[16]; //Reverb reverb; }; #endif