adsr tests

This commit is contained in:
Vasilii Milovidov
2023-09-19 10:37:34 +04:00
parent 78a8ca2b4f
commit 12d8e22b46
2 changed files with 24 additions and 8 deletions
+2 -2
View File
@@ -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,
+22 -6
View File
@@ -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) {