various fixes

This commit is contained in:
Vasilii Milovidov
2023-09-26 21:30:58 +04:00
parent 9606ce0d51
commit 69a3e27eec
5 changed files with 57 additions and 150 deletions
+12 -10
View File
@@ -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)
+11 -11
View File
@@ -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"));