fix: retriggering phase problem

This commit is contained in:
2023-08-13 01:13:54 +04:00
parent 635de894ad
commit c6c2956ac0
3 changed files with 26 additions and 16 deletions

View File

@@ -9,22 +9,25 @@
class Synth { class Synth {
private: private:
bool is_note_triggered;
std::vector<Oscillator*> m_oscillators; std::vector<Oscillator*> m_oscillators;
Adder m_adder; Adder m_adder;
std::vector<Effect*> m_effects; std::vector<Effect*> m_effects;
// 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;
void get_note(int semitone, float beats); void get_note();
void apply_effects(); void apply_effects();
public: public:
Synth(/* args */); Synth(/* args */);
~Synth(); ~Synth();
void ProduceNoteSound(Note input); void TriggerNote(Note input);
void StopNoteSound(); void ProduceSound();
void StopSound();
void AddOscillator(); void AddOscillator();
void AddEffect(Effect* fx); void AddEffect(Effect* fx);
const std::vector<float>& GetOutSignal() { return m_out_signal; } const std::vector<float>& GetOutSignal() { return m_out_signal; }
const std::vector<Oscillator*>& GetOscillators() { return m_oscillators; } const std::vector<Oscillator*>& GetOscillators() { return m_oscillators; }
const bool& GetIsNoteTriggered() { return is_note_triggered; }
}; };

View File

@@ -93,13 +93,16 @@ bool Application::detect_note_pressed(Note* note) {
void Application::update_on_note_input() { void Application::update_on_note_input() {
if (detect_note_pressed(m_current_note)) { if (detect_note_pressed(m_current_note)) {
// if (detect_note_pressed(m_current_note)) { // if (detect_note_pressed(m_current_note)) {
m_synth.ProduceNoteSound((*m_current_note)); if (!m_synth.GetIsNoteTriggered()){
m_synth.TriggerNote((*m_current_note));
}
m_synth.ProduceSound();
//m_sound_played_count = 0; //m_sound_played_count = 0;
write_log("Note played: %s\n", m_current_note->name.c_str()); write_log("Note played: %s\n", m_current_note->name.c_str());
//} //}
} }
else { else {
m_synth.StopNoteSound(); m_synth.StopSound();
} }
} }

View File

@@ -19,19 +19,12 @@ Synth::~Synth() {
m_out_signal.clear(); m_out_signal.clear();
} }
void Synth::get_note(int semitone, float beats) { void Synth::get_note() {
for (size_t i = 0; i < STREAM_BUFFER_SIZE; i++) { for (size_t i = 0; i < STREAM_BUFFER_SIZE; i++) {
float sample = 0.0f; float sample = 0.0f;
m_out_signal[i] = sample; m_out_signal[i] = sample;
} }
float hz = KeyBoard::GetHzBySemitone(semitone);
// will change after oscillator starts to be more autonomous
for (Oscillator* osc : m_oscillators) {
osc->SetFreq(hz);
}
// todo: add other pipeline steps (e.g ADSR, Filters, FX); // todo: add other pipeline steps (e.g ADSR, Filters, FX);
Adder::SumOscillators(m_oscillators, m_out_signal); Adder::SumOscillators(m_oscillators, m_out_signal);
} }
@@ -44,18 +37,29 @@ void Synth::apply_effects() {
} }
} }
void Synth::ProduceNoteSound(Note input) { void Synth::TriggerNote(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);
get_note(semitone_shift, length); float hz = KeyBoard::GetHzBySemitone(semitone_shift);
// will change after oscillator starts to be more autonomous
for (Oscillator* osc : m_oscillators) {
osc->SetFreq(hz);
}
is_note_triggered = true;
}
void Synth::ProduceSound() {
get_note();
apply_effects(); apply_effects();
} }
void Synth::StopNoteSound() { void Synth::StopSound() {
for (size_t i = 0; i < STREAM_BUFFER_SIZE; i++) { for (size_t i = 0; i < STREAM_BUFFER_SIZE; i++) {
float sample = 0.0f; float sample = 0.0f;
m_out_signal[i] = sample; m_out_signal[i] = sample;
} }
is_note_triggered = false;
} }
void Synth::AddOscillator() { void Synth::AddOscillator() {