mirror of
https://codeberg.org/uzu/strudel
synced 2026-07-23 21:47:16 -04:00
various fixes
This commit is contained in:
+12
-10
@@ -54,19 +54,18 @@ pub struct FilterADSR {
|
||||
pub env: f64,
|
||||
}
|
||||
|
||||
|
||||
pub fn superdough_sample(message: &WebAudioMessage, context: &mut AudioContext, audio_buffer: AudioBuffer) {
|
||||
pub fn superdough_sample(
|
||||
message: &WebAudioMessage,
|
||||
context: &mut AudioContext,
|
||||
audio_buffer: AudioBuffer,
|
||||
) {
|
||||
let now = context.current_time();
|
||||
let mut chain: Vec<&dyn AudioNode> = Vec::new();
|
||||
let compressor = context.create_dynamics_compressor();
|
||||
compressor.connect(&context.destination());
|
||||
compressor.threshold().set_value(-50.0);
|
||||
let delay = context.create_delay(1.);
|
||||
// Play synth or sample
|
||||
|
||||
|
||||
// Create nodes for sample playback
|
||||
// let audio_buffer = context.decode_audio_data_sync(file).unwrap();
|
||||
let audio_buffer_duration = audio_buffer.duration();
|
||||
let mut src = context.create_buffer_source();
|
||||
src.set_buffer(audio_buffer);
|
||||
@@ -92,7 +91,11 @@ pub fn superdough_sample(message: &WebAudioMessage, context: &mut AudioContext,
|
||||
}
|
||||
|
||||
|
||||
pub fn superdough_synth(message: &WebAudioMessage, context: &mut AudioContext) {
|
||||
pub fn superdough_synth(
|
||||
message: &WebAudioMessage,
|
||||
context: &mut AudioContext,
|
||||
|
||||
) {
|
||||
let now = context.current_time();
|
||||
let mut chain: Vec<&dyn AudioNode> = Vec::new();
|
||||
let compressor = context.create_dynamics_compressor();
|
||||
@@ -100,7 +103,6 @@ pub fn superdough_synth(message: &WebAudioMessage, context: &mut AudioContext) {
|
||||
compressor.threshold().set_value(-50.0);
|
||||
let env = context.create_gain();
|
||||
let delay = context.create_delay(1.);
|
||||
// Play synth or sample
|
||||
|
||||
let osc = context.create_oscillator();
|
||||
// Create nodes for synth playback
|
||||
@@ -139,7 +141,6 @@ fn create_delay(message: &WebAudioMessage, context: &mut AudioContext, env: &Gai
|
||||
delay.connect(&feedback);
|
||||
|
||||
let pre_gain = context.create_gain();
|
||||
// pre_gain.gain().set_value_at_time(0.0, now);
|
||||
pre_gain.gain().set_value_at_time(message.delay.wet, now + message.delay.delay_time as f64);
|
||||
pre_gain.connect(&feedback);
|
||||
|
||||
@@ -170,6 +171,7 @@ fn create_osc_type(message: &WebAudioMessage) -> OscillatorType {
|
||||
"square" => OscillatorType::Square,
|
||||
"triangle" => OscillatorType::Triangle,
|
||||
"saw" => OscillatorType::Sawtooth,
|
||||
"sawtooth" => OscillatorType::Sawtooth,
|
||||
_ => panic!("Invalid oscillator type"),
|
||||
}
|
||||
}
|
||||
@@ -295,7 +297,7 @@ fn apply_adsr(
|
||||
.set_value_at_time(0.0, now)
|
||||
.linear_ramp_to_value_at_time(message.velocity, now + attack)
|
||||
.exponential_ramp_to_value_at_time(
|
||||
sustain * message.velocity,
|
||||
(sustain + 0.00001) * message.velocity,
|
||||
now + attack + decay,
|
||||
)
|
||||
.set_value_at_time(sustain * message.velocity, now + message.duration)
|
||||
|
||||
@@ -4,7 +4,8 @@ use std::{
|
||||
};
|
||||
use std::fs::File;
|
||||
use std::path::Path;
|
||||
use mini_moka::sync::Cache;
|
||||
use quick_cache::sync::Cache;
|
||||
// use mini_moka::sync::Cache;
|
||||
use reqwest::Url;
|
||||
|
||||
use tokio::{fs, sync::{mpsc, Mutex}, time::Instant};
|
||||
@@ -70,9 +71,9 @@ pub fn init(
|
||||
|
||||
let message_queue_clone = Arc::clone(&message_queue);
|
||||
|
||||
/* ...........................................................
|
||||
Prepare audio context
|
||||
............................................................*/
|
||||
/* ...........................................................
|
||||
Prepare audio context
|
||||
............................................................*/
|
||||
let latency_hint = match std::env::var("WEB_AUDIO_LATENCY").as_deref() {
|
||||
Ok("playback") => AudioContextLatencyCategory::Playback,
|
||||
_ => AudioContextLatencyCategory::default(),
|
||||
@@ -81,7 +82,6 @@ pub fn init(
|
||||
latency_hint,
|
||||
..AudioContextOptions::default()
|
||||
});
|
||||
|
||||
tauri::async_runtime::spawn(async move {
|
||||
let cache: Cache<String, AudioBuffer> = Cache::new(10_000);
|
||||
/* ...........................................................
|
||||
@@ -97,7 +97,7 @@ pub fn init(
|
||||
};
|
||||
|
||||
match message.waveform.as_str() {
|
||||
"sine" | "square" | "triangle" | "saw" => {
|
||||
"sine" | "square" | "triangle" | "saw" | "sawtooth" => {
|
||||
superdough_synth(message.clone(), &mut audio_context);
|
||||
}
|
||||
_ => {
|
||||
@@ -109,7 +109,11 @@ pub fn init(
|
||||
let file_path = format!("samples/{}{}", message.dirname, filename);
|
||||
|
||||
if let Some(audio_buffer) = cache.get(&file_path) {
|
||||
superdough_sample(message.clone(), &mut audio_context, audio_buffer.clone());
|
||||
superdough_sample(
|
||||
message.clone(),
|
||||
&mut audio_context,
|
||||
audio_buffer.clone(),
|
||||
);
|
||||
} else if let Ok(file) = File::open(&file_path) {
|
||||
let audio_buffer = audio_context.decode_audio_data_sync(file)
|
||||
.unwrap_or_else(|_| panic!("Failed to decode audio data"));
|
||||
@@ -125,10 +129,6 @@ pub fn init(
|
||||
let bytes = response.bytes().await.unwrap();
|
||||
let path = Path::new(&file_path);
|
||||
let mut file = create_file_and_dirs(path).await;
|
||||
// let mut file = tokio::fs::File::create(&file_path)
|
||||
// .await
|
||||
// .unwrap_or_else(|_| panic!("Failed to create file"));
|
||||
|
||||
file.write_all(&bytes)
|
||||
.await
|
||||
.unwrap_or_else(|_| panic!("Failed to write to file"));
|
||||
|
||||
Reference in New Issue
Block a user