fix: ADSR logic
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
ADSR::ADSR(/* args */) {
|
||||
m_parameters.attack_time = 1.f;
|
||||
m_parameters.decay_time = 0.3f;
|
||||
m_parameters.decay_time = 0.4f;
|
||||
m_parameters.sustain_level = 0.6f;
|
||||
m_parameters.release_time = 0.8f;
|
||||
m_ramp = new Ramp(0, SAMPLE_RATE);
|
||||
@@ -33,9 +33,6 @@ bool ADSR::is_release_elapsed() {
|
||||
void ADSR::recheck_state() {
|
||||
switch (m_state)
|
||||
{
|
||||
case Off:
|
||||
m_state = Attack;
|
||||
break;
|
||||
case Attack:
|
||||
if (is_attack_elapsed()) {
|
||||
m_state = Decay;
|
||||
@@ -76,6 +73,7 @@ void ADSR::process_sample(float* sample) {
|
||||
}
|
||||
|
||||
void ADSR::OnSetNote() {
|
||||
write_log("Set ADSR\n");
|
||||
if (m_state == Off) {
|
||||
m_state = Attack;
|
||||
}
|
||||
@@ -93,7 +91,6 @@ void ADSR::OnUnsetNote() {
|
||||
}
|
||||
|
||||
void ADSR::Process(std::vector<float>& samples) {
|
||||
write_log("ADSR State: %d\n", m_state);
|
||||
for (std::size_t i = 0; i < samples.size(); i++) {
|
||||
recheck_state();
|
||||
process_sample(&samples[i]);
|
||||
|
||||
@@ -102,7 +102,7 @@ void Application::update_on_note_input() {
|
||||
//m_sound_played_count = 0;
|
||||
write_log("Note played: %s\n", m_current_note->name.c_str());
|
||||
}
|
||||
else if (is_note_up()) {
|
||||
else if (is_note_up() && m_synth.GetIsNoteTriggered()) {
|
||||
m_synth.StopSound();
|
||||
}
|
||||
// will produce 0 signal if ADSR is in off state
|
||||
@@ -112,18 +112,17 @@ void Application::update_on_note_input() {
|
||||
// Play ring-buffered audio
|
||||
void Application::play_buffered_audio() {
|
||||
if (IsAudioStreamProcessed(m_synth_stream)) {
|
||||
const float audio_frame_start_time = GetTime();
|
||||
//const float audio_frame_start_time = GetTime();
|
||||
update_on_note_input();
|
||||
UpdateAudioStream(m_synth_stream, m_synth.GetOutSignal().data(), STREAM_BUFFER_SIZE);
|
||||
const float audio_freme_duration = GetTime() - audio_frame_start_time;
|
||||
//const float audio_freme_duration = GetTime() - audio_frame_start_time;
|
||||
//write_log("Frame time: %.3f%% \n", 100.0f / ((1.0f / audio_freme_duration) / ((float)SAMPLE_RATE/STREAM_BUFFER_SIZE)));
|
||||
}
|
||||
}
|
||||
|
||||
void Application::Run() {
|
||||
// Main game loop
|
||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||
{
|
||||
while (!WindowShouldClose()) {
|
||||
play_buffered_audio();
|
||||
m_renderer.Draw(m_synth, m_synth_gui_state);
|
||||
}
|
||||
|
||||
@@ -9,10 +9,10 @@ Ramp::Ramp(float starting_level, float sample_rate) {
|
||||
Ramp::~Ramp() {
|
||||
}
|
||||
|
||||
void Ramp::RampTo(float value, float time) {
|
||||
m_increment = (value - m_level) / (m_sample_rate * time);
|
||||
void Ramp::RampTo(float val, float time) {
|
||||
m_increment = (val - m_level) / (m_sample_rate * time);
|
||||
m_counter = (int)(m_sample_rate * time);
|
||||
write_log("Ramping from: %.1f to: %.1f by: %.1f for: %d\n", m_level, value, m_increment, m_counter);
|
||||
write_log("Ramping from: %.1f to: %.1f by: %lf for: %d\n", m_level, val, m_increment, m_counter);
|
||||
}
|
||||
|
||||
float Ramp::Process() {
|
||||
|
||||
@@ -3,11 +3,15 @@
|
||||
#include "KeyBoard.h"
|
||||
#include "OscillatorType.h"
|
||||
#include "Settings.h"
|
||||
#include "Logger.h"
|
||||
|
||||
Synth::Synth(/* args */) {
|
||||
AddOscillator();
|
||||
AddEffect(new ADSR());
|
||||
m_out_signal.reserve(STREAM_BUFFER_SIZE);
|
||||
for (size_t i = 0; i < STREAM_BUFFER_SIZE; i++) {
|
||||
float sample = 0.0f;
|
||||
m_out_signal.push_back(sample);
|
||||
}
|
||||
zero_signal();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user