diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index c6688467f..a32671315 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3912,8 +3912,7 @@ checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-audio-api" version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b600725f86c3caa0f8823ff5e3c42aecbdfcd4a390db2be9278eb06d16a98c1a" +source = "git+https://github.com/orottier/web-audio-api-rs.git?branch=main#ed2e8712a00a36a9481510ce757858d633d20e85" dependencies = [ "arc-swap", "arrayvec", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index f251a56e6..1a9cdb72e 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -21,7 +21,7 @@ tauri = { version = "1.4.0", features = ["fs-all"] } midir = "0.9.1" tokio = { version = "1.29.0", features = ["full"] } rosc = "0.10.1" -web-audio-api = "0.33.0" +web-audio-api = { git = "https://github.com/orottier/web-audio-api-rs.git", branch = "main" } [features] # this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. diff --git a/src-tauri/src/superdough.rs b/src-tauri/src/superdough.rs index b57e5e2b3..1390124e1 100644 --- a/src-tauri/src/superdough.rs +++ b/src-tauri/src/superdough.rs @@ -57,8 +57,8 @@ pub struct FilterADSR { pub fn superdough(message: &WebAudioMessage, context: &mut AudioContext) { let now = context.current_time(); let mut chain: Vec<&dyn AudioNode> = Vec::new(); - let env = context.create_gain(); + let env = context.create_gain(); // Play synth or sample match message.waveform.as_str() { "sine" | "square" | "triangle" | "saw" => { @@ -81,7 +81,6 @@ pub fn superdough(message: &WebAudioMessage, context: &mut AudioContext) { create_delay(message, &context, &env, &mut delays, now); } - let (sustain, velocity, release) = (message.adsr.sustain, message.velocity, message.adsr.release); // Connect nodes and play synth connect_nodes(chain, context); let osc = play_synth(&message, now, osc, filters, &env); @@ -101,7 +100,7 @@ pub fn superdough(message: &WebAudioMessage, context: &mut AudioContext) { // Create nodes for sample playback let audio_buffer = context.decode_audio_data_sync(file).unwrap(); let audio_buffer_duration = audio_buffer.duration(); - let src = context.create_buffer_source(); + let mut src = context.create_buffer_source(); src.set_buffer(audio_buffer); chain.push(&src); let filters = create_filters(context, message); @@ -159,7 +158,7 @@ fn create_delay(message: &WebAudioMessage, context: &&mut AudioContext, env: &Ga env.connect(&input); } -fn play_synth(message: &&WebAudioMessage, now: f64, osc: OscillatorNode, filters: Vec, env: &GainNode) -> OscillatorNode { +fn play_synth(message: &&WebAudioMessage, now: f64, mut osc: OscillatorNode, filters: Vec, env: &GainNode) -> OscillatorNode { osc.set_type(create_osc_type(&message)); osc.frequency().set_value(message.note); osc.start(); @@ -185,7 +184,7 @@ fn create_osc_type(message: &WebAudioMessage) -> OscillatorType { } } -fn play_sample(message: &WebAudioMessage, now: f64, audio_buffer_duration: f64, src: AudioBufferSourceNode, filters: Vec, env: &GainNode) -> AudioBufferSourceNode { +fn play_sample(message: &WebAudioMessage, now: f64, audio_buffer_duration: f64, mut src: AudioBufferSourceNode, filters: Vec, env: &GainNode) -> AudioBufferSourceNode { let (start_at, stop_at) = if message.speed < 0.0 { (audio_buffer_duration, now + message.duration + 0.2) } else { @@ -228,14 +227,14 @@ fn create_filters(context: &mut AudioContext, message: &WebAudioMessage) -> Vec< let mut filters = Vec::new(); if message.bpf.frequency > 0.0 { - let bpf = context.create_biquad_filter(); + let mut bpf = context.create_biquad_filter(); bpf.set_type(Bandpass); bpf.frequency().set_value(message.bpf.frequency); bpf.q().set_value(message.bpf.resonance); filters.push(bpf); } else if message.lpf.frequency > 0.0 && message.hpf.frequency > 0.0 { - let lpf = context.create_biquad_filter(); - let hpf = context.create_biquad_filter(); + let mut lpf = context.create_biquad_filter(); + let mut hpf = context.create_biquad_filter(); lpf.set_type(Lowpass); lpf.frequency().set_value(message.lpf.frequency); lpf.q().set_value(message.lpf.resonance); @@ -246,13 +245,13 @@ fn create_filters(context: &mut AudioContext, message: &WebAudioMessage) -> Vec< filters.push(lpf); filters.push(hpf); } else if message.lpf.frequency > 0.0 { - let lpf = context.create_biquad_filter(); + let mut lpf = context.create_biquad_filter(); lpf.set_type(Lowpass); lpf.frequency().set_value(message.lpf.frequency); lpf.q().set_value(message.lpf.resonance); filters.push(lpf); } else if message.hpf.frequency > 0.0 { - let hpf = context.create_biquad_filter(); + let mut hpf = context.create_biquad_filter(); hpf.set_type(Highpass); hpf.frequency().set_value(message.hpf.frequency); hpf.q().set_value(message.hpf.resonance); @@ -310,7 +309,7 @@ fn apply_adsr( now + attack + decay, ) .set_value_at_time(sustain * message.velocity, message.duration) - .linear_ramp_to_value_at_time(0.001, message.duration + release); + .linear_ramp_to_value_at_time(0.00, now + message.duration); } fn apply_synth_adsr(envelope: &GainNode, message: &WebAudioMessage, now: f64) { @@ -326,7 +325,7 @@ fn apply_synth_adsr(envelope: &GainNode, message: &WebAudioMessage, now: f64) { } fn apply_default_synth_adsr(envelope: &GainNode, message: &WebAudioMessage, now: f64) { - apply_adsr(envelope, message, now, 0.001, message.velocity, 0.5, 0.1); + apply_adsr(envelope, message, now, 0.001, message.velocity, 0.05, 0.1); } fn apply_drum_adsr(envelope: &GainNode, message: &WebAudioMessage, now: f64) {