wip: synth class

This commit is contained in:
2023-08-07 00:34:14 +04:00
parent 850dedb319
commit d20dbd920f
5 changed files with 174 additions and 9 deletions

View File

@@ -56,47 +56,56 @@ float Oscillator::GenerateSample(float duration)
return m_osc_function() * m_volume;
}
void Oscillator::sine_osc_phase_incr() {
void Oscillator::sine_osc_phase_incr()
{
m_phase += m_phase_dt;
if (m_phase >= TWO_PI)
m_phase -= TWO_PI;
}
void Oscillator::saw_osc_phase_incr() {
void Oscillator::saw_osc_phase_incr()
{
m_phase += m_phase_dt;
if (m_phase >= 1.0f)
m_phase -= 1.0f;
}
float Oscillator::calc_saw_phase_delta(float freq) {
float Oscillator::calc_saw_phase_delta(float freq)
{
return freq / SAMPLE_RATE;
}
float Oscillator::calc_sine_phase_delta(float freq) {
float Oscillator::calc_sine_phase_delta(float freq)
{
return (TWO_PI * freq) / SAMPLE_RATE;
}
float Oscillator::sineosc() {
float Oscillator::sineosc()
{
float result = sinf(m_phase);
sine_osc_phase_incr();
return result;
}
float Oscillator::sign(float v) {
float Oscillator::sign(float v)
{
return (v > 0.0) ? 1.f : -1.f;
}
float Oscillator::squareosc() {
float Oscillator::squareosc()
{
return sign(sineosc());
}
float Oscillator::triangleosc() {
float Oscillator::triangleosc()
{
float result = 1.f - fabsf(m_phase - 0.5f) * 4.f;
saw_osc_phase_incr();
return result;
}
float Oscillator::sawosc() {
float Oscillator::sawosc()
{
float result = m_phase * 2.f - 1.f;
saw_osc_phase_incr();
return result;

45
src/Synth.cpp Normal file
View File

@@ -0,0 +1,45 @@
#include "Synth.h"
#include "Settings.h"
#include "KeyBoard.h"
#include "OscillatorType.h"
#include "Note.h"
std::vector<float> & Synth::sum_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 : 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 duration = beats * BEAT_DURATION;
// will change after oscillator starts to be more autonomous
for (size_t i = 0; i < m_oscillators.size(); i++) {
m_oscillators[i].SetFreq(hz);
}
return sum_oscillators(duration);
}
std::vector<float> & Synth::GetNoteSound(Note input) {
float length = 1.f / input.length;
int semitone_shift = KeyBoard::GetSemitoneShift(input.name);
return note(semitone_shift, length);
}