From 12d8e22b461cd440a0b418672a065456506da7af Mon Sep 17 00:00:00 2001 From: Vasilii Milovidov Date: Tue, 19 Sep 2023 10:37:34 +0400 Subject: [PATCH] adsr tests --- packages/desktopbridge/webaudiobridge.mjs | 4 ++-- src-tauri/src/superdough.rs | 28 ++++++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/desktopbridge/webaudiobridge.mjs b/packages/desktopbridge/webaudiobridge.mjs index ad5ba9cef..e047e62e9 100644 --- a/packages/desktopbridge/webaudiobridge.mjs +++ b/packages/desktopbridge/webaudiobridge.mjs @@ -50,8 +50,8 @@ export const desktopAudio = async (value, deadline, hapDuration) => { loopBegin = 0, loopEnd = 1, attack = 0.0001, - decay = 0.2, - sustain = 0.6, + decay = 0.5, + sustain = 0.5, release = 0.2, lpattack = 0.0001, lpdecay = 0.2, diff --git a/src-tauri/src/superdough.rs b/src-tauri/src/superdough.rs index a3bd1c94d..3f4272772 100644 --- a/src-tauri/src/superdough.rs +++ b/src-tauri/src/superdough.rs @@ -83,28 +83,41 @@ pub fn superdough(message: &WebAudioMessage, context: &mut AudioContext) { let src = context.create_buffer_source(); src.set_buffer(audio_buffer); src.connect(filters.get(0).unwrap()); - connect_filters_to_envelope(&env, message, filters.get(1).unwrap(), filters.get(2).unwrap()); + connect_filters_to_envelope( + &env, + message, + filters.get(1).unwrap(), + filters.get(2).unwrap(), + ); src.playback_rate().set_value(message.speed); if message.looper.is_loop > 0 { src.set_loop(true); src.set_loop_start(message.looper.loop_start); src.set_loop_end(message.looper.loop_end); - src.start_at_with_offset_and_duration(now, src.loop_start(), audio_buffer_duration / message.speed as f64); + src.start_at_with_offset_and_duration( + now, + src.loop_start(), + audio_buffer_duration / message.speed as f64, + ); apply_adsr(&env, message, now); for f in filters { apply_filter_adsr(&f, message, &f.type_(), now); } src.stop_at(now + message.duration + message.adsr.release); } else { - src.start_at_with_offset_and_duration(now, message.begin * audio_buffer_duration, audio_buffer_duration / message.speed as f64); + src.start_at_with_offset_and_duration( + now, + message.begin * audio_buffer_duration, + audio_buffer_duration / message.speed as f64, + ); apply_adsr(&env, message, now); for f in filters { apply_filter_adsr(&f, message, &f.type_(), now); } src.stop_at(now + message.duration + 0.2); } - }, + } Err(e) => eprintln!("Failed to open file: {:?}", e), } } @@ -155,8 +168,11 @@ fn apply_adsr(envelope: &GainNode, message: &WebAudioMessage, now: f64) { envelope.gain() .set_value_at_time(0., now) .linear_ramp_to_value_at_time(message.velocity, now + message.adsr.attack) - .linear_ramp_to_value_at_time(message.adsr.sustain, now + message.adsr.attack + message.adsr.decay) - .exponential_ramp_to_value_at_time(0.0001, now + message.duration + message.adsr.release); + .linear_ramp_to_value_at_time( + message.adsr.sustain * message.velocity, + now + message.adsr.attack + message.adsr.decay + ) + .linear_ramp_to_value_at_time(0.0, now + message.duration + message.adsr.release); } fn apply_filter_adsr(filter_node: &BiquadFilterNode, message: &WebAudioMessage, filter: &BiquadFilterType, now: f64) {