polyphony working checkpoint
This commit is contained in:
@@ -8,13 +8,8 @@
|
|||||||
#define M_PI 3.14159265358979323846
|
#define M_PI 3.14159265358979323846
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO: you get it, also in a yml config
|
|
||||||
#define SYNTH_PITCH_STANDARD 432.0f // frequency of home pitch
|
|
||||||
#define SYNTH_MIDI_HOME 69 // midi note index of home pitch
|
|
||||||
#define SYNTH_NOTES_PER_OCTAVE 12
|
|
||||||
|
|
||||||
Synth::Synth(const ParameterStore& params) : paramStore_(params) {
|
Synth::Synth(const ParameterStore& params) : paramStore_(params) {
|
||||||
|
voices_.fill(Voice(params_.data()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Synth::updateParams() {
|
void Synth::updateParams() {
|
||||||
@@ -76,13 +71,19 @@ void Synth::process(float* out, uint32_t nFrames, uint32_t sampleRate) {
|
|||||||
for(auto& p : params_) p.update(); // TODO: profile this
|
for(auto& p : params_) p.update(); // TODO: profile this
|
||||||
|
|
||||||
// assemble float array of parameters so that its easier for voices to retrieve
|
// assemble float array of parameters so that its easier for voices to retrieve
|
||||||
|
float params[PARAM_COUNT] = {0.0f};
|
||||||
|
for(int i = 0; i < PARAM_COUNT; i++) {
|
||||||
|
params[i] = params_[i].current;
|
||||||
|
}
|
||||||
|
|
||||||
// foreach voice, process...
|
// foreach voice, process...
|
||||||
float mix = 0.0f;
|
float mix = 0.0f;
|
||||||
for(Voice& v : voices_) {
|
for(Voice& v : voices_) {
|
||||||
mix += v.process(¶ms_[0].current, triggered);
|
mix += v.process(params, triggered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sampleOut = mix;
|
||||||
|
|
||||||
// write to buffer
|
// write to buffer
|
||||||
out[2*i] = sampleOut; // left
|
out[2*i] = sampleOut; // left
|
||||||
out[2*i+1] = sampleOut; // right
|
out[2*i+1] = sampleOut; // right
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "Voice.h"
|
#include "Voice.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
Voice::Voice(std::array<SmoothedParam, PARAM_COUNT>* params) : params_(params) {
|
Voice::Voice(SmoothedParam* params) : params_(params) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,6 +26,10 @@ inline float Voice::noteToFrequency(uint8_t note) {
|
|||||||
return SYNTH_PITCH_STANDARD * pow(2.0f, static_cast<float>(note - SYNTH_MIDI_HOME) / static_cast<float>(SYNTH_NOTES_PER_OCTAVE));
|
return SYNTH_PITCH_STANDARD * pow(2.0f, static_cast<float>(note - SYNTH_MIDI_HOME) / static_cast<float>(SYNTH_NOTES_PER_OCTAVE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline float Voice::getParam(ParamId id) {
|
||||||
|
return params_[static_cast<size_t>(id)].current;
|
||||||
|
}
|
||||||
|
|
||||||
void Voice::noteOn(int midiNote, float velocity) {
|
void Voice::noteOn(int midiNote, float velocity) {
|
||||||
note_ = midiNote;
|
note_ = midiNote;
|
||||||
velocity_ = velocity;
|
velocity_ = velocity;
|
||||||
@@ -43,6 +47,7 @@ void Voice::noteOff() {
|
|||||||
gainEnvelope_.noteOff();
|
gainEnvelope_.noteOff();
|
||||||
cutoffEnvelope_.noteOff();
|
cutoffEnvelope_.noteOff();
|
||||||
resonanceEnvelope_.noteOff();
|
resonanceEnvelope_.noteOff();
|
||||||
|
active_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Voice::isActive() {
|
bool Voice::isActive() {
|
||||||
@@ -71,7 +76,7 @@ float Voice::process(float* params, bool& scopeTrigger) {
|
|||||||
|
|
||||||
// TODO: make pitchOffset variable for each oscillator (maybe three values like octave, semitone offset, and pitch offset in cents)
|
// TODO: make pitchOffset variable for each oscillator (maybe three values like octave, semitone offset, and pitch offset in cents)
|
||||||
float pitchOffset = 1.0f;
|
float pitchOffset = 1.0f;
|
||||||
float phaseInc = pitchOffset * 2.0f * M_PI * frequency_ / static_cast<float>(sampleRate);
|
float phaseInc = pitchOffset * 2.0f * M_PI * frequency_ / static_cast<float>(sampleRate_);
|
||||||
|
|
||||||
float gain = gainEnv * getParam(ParamId::Osc1VolumeDepth);
|
float gain = gainEnv * getParam(ParamId::Osc1VolumeDepth);
|
||||||
float sampleOut = 0.0f;
|
float sampleOut = 0.0f;
|
||||||
@@ -109,5 +114,10 @@ float Voice::process(float* params, bool& scopeTrigger) {
|
|||||||
sampleOut = filter1_.biquadProcess(sampleOut);
|
sampleOut = filter1_.biquadProcess(sampleOut);
|
||||||
sampleOut = filter2_.biquadProcess(sampleOut);
|
sampleOut = filter2_.biquadProcess(sampleOut);
|
||||||
|
|
||||||
|
phase_ += phaseInc;
|
||||||
|
if (phase_ > 2.0f * M_PI) {
|
||||||
|
phase_ -= 2.0f * M_PI;
|
||||||
|
}
|
||||||
|
|
||||||
return sampleOut;
|
return sampleOut;
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
#include "Oscillator.h"
|
#include "Oscillator.h"
|
||||||
#include "Envelope.h"
|
#include "Envelope.h"
|
||||||
#include "Filter.h"
|
#include "Filter.h"
|
||||||
#include "ParameterStore.h"
|
#include "../ParameterStore.h"
|
||||||
|
|
||||||
#ifndef M_PI // I hate my stupid chungus life
|
#ifndef M_PI // I hate my stupid chungus life
|
||||||
#define M_PI 3.14159265358979323846
|
#define M_PI 3.14159265358979323846
|
||||||
@@ -26,7 +26,8 @@ struct SmoothedParam {
|
|||||||
class Voice {
|
class Voice {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Voice(std::array<SmoothedParam, PARAM_COUNT>* params);
|
Voice() = default;
|
||||||
|
Voice(SmoothedParam* params);
|
||||||
~Voice() = default;
|
~Voice() = default;
|
||||||
|
|
||||||
void setSampleRate(float sampleRate);
|
void setSampleRate(float sampleRate);
|
||||||
@@ -45,6 +46,7 @@ private:
|
|||||||
float sampleRate_ = 44100.0f;
|
float sampleRate_ = 44100.0f;
|
||||||
|
|
||||||
inline float noteToFrequency(uint8_t note);
|
inline float noteToFrequency(uint8_t note);
|
||||||
|
inline float getParam(ParamId id);
|
||||||
|
|
||||||
uint8_t note_ = 0;
|
uint8_t note_ = 0;
|
||||||
float velocity_ = 1.0f;
|
float velocity_ = 1.0f;
|
||||||
@@ -67,6 +69,6 @@ private:
|
|||||||
Filter filter2_;
|
Filter filter2_;
|
||||||
|
|
||||||
// paramstore pointer
|
// paramstore pointer
|
||||||
std::array<SmoothedParam, PARAM_COUNT>* params_;
|
SmoothedParam* params_;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user