wip: synth api && adder

This commit is contained in:
2023-08-07 02:28:06 +04:00
parent d20dbd920f
commit 66c839e2ae
5 changed files with 59 additions and 35 deletions

21
inc/Adder.h Normal file
View File

@@ -0,0 +1,21 @@
#pragma once
#include <vector>
#include "Oscillator.h"
class Adder
{
private:
/* data */
public:
Adder(/* args */);
~Adder();
std::vector<float> & SumOscillators(const std::vector<Oscillator*> & oscillators, float duration);
};
Adder::Adder(/* args */)
{
}
Adder::~Adder()
{
}

View File

@@ -5,4 +5,4 @@
struct Note { struct Note {
std::string& name; std::string& name;
int length; int length;
} };

View File

@@ -3,26 +3,29 @@
#include <vector> #include <vector>
#include "Oscillator.h" #include "Oscillator.h"
#include "Note.h" #include "Note.h"
#include "Adder.h"
#include "Settings.h"
class Synth class Synth
{ {
private: private:
std::vector<Oscillator&> m_oscillators; std::vector<Oscillator*> m_oscillators;
Adder m_adder;
//OscillatorUI* ui_oscillators; //OscillatorUI* ui_oscillators;
Note m_current_note; Note m_current_note;
std::vector<float> m_out_signal; std::vector<float> m_out_signal;
std::vector<float> & sum_oscillators(float duration); std::vector<float> & get_note(int semitone, float beats);
std::vector<float> & note(int semitone, float beats);
public: public:
Synth(/* args */); Synth(/* args */);
~Synth(); ~Synth();
std::vector<float> & GetNoteSound(Note input) void ProduceNoteSound(Note input);
const std::vector<float> & GetOutSignal() { return m_out_signal; }
}; };
Synth::Synth(/* args */) Synth::Synth(/* args */)
{ {
m_oscillators.push_back(new Oscillator(OscillatorType.Sine, 440.f, VOLUME)); m_oscillators.push_back(new Oscillator(OscillatorType::Sine, 440.f, VOLUME));
} }
Synth::~Synth() Synth::~Synth()

22
src/Adder.cpp Normal file
View File

@@ -0,0 +1,22 @@
#include "Adder.h"
std::vector<float> & Adder::SumOscillators(const std::vector<Oscillator*> & oscillators, float duration)
{
size_t sample_count = (size_t)(duration * SAMPLE_RATE);
std::vector<float> output;// = new std::vector<float>();
output.reserve(sample_count);
for (size_t i = 0; i < sample_count; i++)
{
float sample = 0.0f;
for (Oscillator* osc : oscillators)
{
sample += osc->GenerateSample(duration);
}
output.push_back(sample);
}
return output;
}

View File

@@ -2,44 +2,22 @@
#include "Settings.h" #include "Settings.h"
#include "KeyBoard.h" #include "KeyBoard.h"
#include "OscillatorType.h" #include "OscillatorType.h"
#include "Note.h"
std::vector<float> & Synth::sum_oscillators(float duration) std::vector<float> & Synth::get_note(int semitone, float beats)
{
size_t sample_count = (size_t)(duration * SAMPLE_RATE);
std::vector<float> output;// = new std::vector<float>();
output.reserve(sample_count);
for (size_t i = 0; i < sample_count; i++)
{
float sample = 0.0f;
for (Oscillator& osc : m_oscillators)
{
sample += osc.GenerateSample(duration);
}
output.push_back(sample);
}
return output;
}
std::vector<float> & Synth::note(int semitone, float beats)
{ {
float hz = KeyBoard::GetHzBySemitone(semitone); float hz = KeyBoard::GetHzBySemitone(semitone);
float duration = beats * BEAT_DURATION; float duration = beats * BEAT_DURATION;
// will change after oscillator starts to be more autonomous // will change after oscillator starts to be more autonomous
for (size_t i = 0; i < m_oscillators.size(); i++) { for (auto osc : m_oscillators) {
m_oscillators[i].SetFreq(hz); osc->SetFreq(hz);
} }
return sum_oscillators(duration); return m_adder.SumOscillators(m_oscillators, duration); //todo: add other pipeline steps (e.g ADSR, Filters, FX);
} }
std::vector<float> & Synth::GetNoteSound(Note input) { void Synth::ProduceNoteSound(Note input) {
float length = 1.f / input.length; float length = 1.f / input.length;
int semitone_shift = KeyBoard::GetSemitoneShift(input.name); int semitone_shift = KeyBoard::GetSemitoneShift(input.name);
return note(semitone_shift, length); m_out_signal = get_note(semitone_shift, length);
} }