tests: reverb

This commit is contained in:
Vasilii Milovidov
2023-10-02 22:11:25 +04:00
parent 18a198df9b
commit c2fc2272c5
2 changed files with 42 additions and 14 deletions
+5 -4
View File
@@ -136,6 +136,9 @@ export const desktopAudio = async (value, deadline, hapDuration) => {
}
let ir_path;
let url;
if (ir !== undefined) {
if (getSound(ir).data.baseUrl !== undefined) {
baseUrl = getSound(ir).data.baseUrl;
if (baseUrl === './piano/') {
@@ -146,17 +149,14 @@ export const desktopAudio = async (value, deadline, hapDuration) => {
ir_path = '';
}
}
let url;
if (ir !== undefined) {
let ir_samples = getSound(ir);
if (Array.isArray(ir_samples)) {
url =
ir_path !== undefined
? ir_path + ir_samples[n % ir_samples.length].replace('./', '')
: ir_samples[n % ir_samples.length].replace('./', '');
// url = ir_samples.data.samples[i % ir_samples.data.samples.length];
} else if (typeof ir_samples === 'object') {
console.log('obk', Object.values(ir_samples.data.samples)[i & Object.values(ir_samples.data.samples).length].replace('./', ''))
url =
ir_path !== undefined
? ir_path +
@@ -164,6 +164,7 @@ export const desktopAudio = async (value, deadline, hapDuration) => {
: Object.values(ir_samples.data.samples)[i & Object.values(ir_samples.data.samples).length].replace('./', '');
}
}
console.log('url', url);
let folder;
+37 -10
View File
@@ -120,8 +120,8 @@ pub fn init(
..AudioContextOptions::default()
});
let _ = audio_context.create_buffer_source();
let mut delays: HashMap<usize, Delay> = HashMap::new();
let mut reverbs: HashMap<usize, ConvolverNode> = HashMap::new();
let mut delays: HashMap<usize, Delay> = HashMap::new();
let mut reverbs: HashMap<usize, ConvolverNode> = HashMap::new();
let compressor = audio_context.create_dynamics_compressor();
compressor.threshold().set_value(-50.0);
compressor.connect(&audio_context.destination());
@@ -141,9 +141,9 @@ pub fn init(
synth.set_waveform(&message.waveform);
let filters = synth.set_filters(&mut audio_context, &message);
if message.delay.wet.is_some() {
delays.entry(message.orbit).or_insert({
Delay::new(&audio_context, &compressor)
});
delays.entry(message.orbit).or_insert({
Delay::new(&audio_context, &compressor)
});
let delay = delays.get(&message.orbit).unwrap();
synth.envelope.connect(&delay.input);
delay.delay.delay_time().set_value(message.delay.delay_time.unwrap_or(0.25));
@@ -160,8 +160,11 @@ pub fn init(
}
}
_ => {
// CREATE FILEPATHS
let (url, file_path, file_path_clone) = create_filepath(&message);
// DOWNLOAD FILE IS IT DOESN'T EXIST
tokio::spawn(async move {
if tokio::fs::metadata(&file_path.clone()).await.is_err() {
let response = reqwest::get(url)
@@ -177,10 +180,13 @@ pub fn init(
}
});
// IF BUFFER IS CACHED - PLAY IT
if let Some(audio_buffer) = cache.get(&file_path_clone) {
let t = audio_context.current_time();
let audio_buffer_duration = audio_buffer.duration();
let mut sampler = Sampler::new(&mut audio_context, audio_buffer);
// PLAYBACK SPEED
match message.unit {
Some(_) => {
sampler.sample.playback_rate().set_value(message.speed * audio_buffer_duration as f32 * 1.0);
@@ -189,13 +195,19 @@ pub fn init(
sampler.sample.playback_rate().set_value(message.speed * message.playbackrate);
}
}
// ADSR
sampler.set_adsr(t, &message.adsr, message.velocity, message.duration);
// FILTERS
let filters = sampler.set_filters(&mut audio_context, &message);
if is_filter_envelope_on(&message.lpenv) || is_filter_envelope_on(&message.hpenv) || is_filter_envelope_on(&message.bpenv) {
for f in &filters {
apply_filter_adsr(f, &message, &f.type_(), t);
}
}
// DELAY
if message.delay.wet.is_some() {
delays.entry(message.orbit).or_insert({
Delay::new(&audio_context, &compressor)
@@ -207,8 +219,13 @@ pub fn init(
delay.pre_gain.gain().set_value_at_time(message.delay.wet.unwrap_or(0.25), t + message.delay.delay_time.unwrap_or(0.5) as f64);
};
// REVERB
if message.reverb.ir.is_some() {
// CREATE FILEPATHS
let (ir_url, ir_file_path, ir_file_path_clone) = create_ir_filepath(&message);
// DOWNLOAD FILE IS IT DOESN'T EXIST
tokio::spawn(async move {
if tokio::fs::metadata(&ir_file_path.clone()).await.is_err() {
let response = reqwest::get(ir_url)
@@ -224,22 +241,32 @@ pub fn init(
}
});
// IF BUFFER IS CACHED - PLAY IT
if let Some(ir_buffer) = cache.get(&ir_file_path_clone) {
reverbs.entry(message.orbit).or_insert({
let mut reverb = audio_context.create_convolver();
reverb.set_buffer(ir_buffer.clone());
reverb
});
// IF REVERB IS NOT CREATED - CREATE IT
reverbs.entry(message.orbit).or_insert({
let mut reverb = audio_context.create_convolver();
reverb.connect(&compressor);
reverb.set_buffer(ir_buffer.clone());
reverb
});
// GET AND CONNECT REVERB
let reverb = reverbs.get(&message.orbit).unwrap();
sampler.envelope.connect(reverb);
} else if let Ok(file) = File::open(&ir_file_path_clone) {
println!("Loading IR file {}", &ir_file_path_clone);
let ir_buffer = audio_context.decode_audio_data_sync(file).unwrap_or_else(|_| panic!("Failed to decode audio data"));
cache.insert(ir_file_path_clone.clone(), ir_buffer);
}
}
// CONNECT SAMPLER TO OUTPUT AND PLAY
sampler.envelope.connect(&compressor);
sampler.play(t, &message, audio_buffer_duration);
// IF FILE EXIST - DECODE IT
} else if let Ok(file) = File::open(&file_path_clone) {
let audio_buffer = audio_context.decode_audio_data_sync(file)
.unwrap_or_else(|_| panic!("Failed to decode audio data"));