371 lines
12 KiB
Rust
371 lines
12 KiB
Rust
|
mod common;
|
||
|
use common::*;
|
||
|
|
||
|
#[test]
|
||
|
fn check_node_sampl_1() {
|
||
|
let (node_conf, mut node_exec) = new_node_engine();
|
||
|
let mut matrix = Matrix::new(node_conf, 3, 3);
|
||
|
|
||
|
let smpl = NodeId::Sampl(0);
|
||
|
let out = NodeId::Out(0);
|
||
|
matrix.place(0, 0, Cell::empty(smpl)
|
||
|
.out(None, None, smpl.out("sig")));
|
||
|
matrix.place(0, 1, Cell::empty(out)
|
||
|
.input(out.inp("ch1"), None, None));
|
||
|
matrix.sync().unwrap();
|
||
|
|
||
|
let sample_p = smpl.inp_param("sample").unwrap();
|
||
|
let freq_p = smpl.inp_param("freq").unwrap();
|
||
|
matrix.set_param(sample_p, SAtom::audio_unloaded("tests/sample_sin.wav"));
|
||
|
|
||
|
let (rms, min, max) = run_and_get_l_rms_mimax(&mut node_exec, 50.0);
|
||
|
assert_float_eq!(rms, 0.505);
|
||
|
assert_float_eq!(min, -0.9998);
|
||
|
assert_float_eq!(max, 1.0);
|
||
|
|
||
|
let fft = run_and_get_fft4096(&mut node_exec, 800, 20.0);
|
||
|
assert_eq!(fft[0], (441, 940));
|
||
|
|
||
|
matrix.set_param(freq_p, SAtom::param(0.1));
|
||
|
let fft = run_and_get_fft4096(&mut node_exec, 800, 20.0);
|
||
|
assert_eq!(fft[0], (894, 988));
|
||
|
|
||
|
matrix.set_param(freq_p, SAtom::param(-0.1));
|
||
|
let fft = run_and_get_fft4096(&mut node_exec, 800, 20.0);
|
||
|
assert_eq!(fft[0], (226, 966));
|
||
|
|
||
|
matrix.set_param(freq_p, SAtom::param(-0.2));
|
||
|
let fft = run_and_get_fft4096(&mut node_exec, 800, 20.0);
|
||
|
assert_eq!(fft[0], (108, 953));
|
||
|
|
||
|
matrix.set_param(freq_p, SAtom::param(-0.4));
|
||
|
let fft = run_and_get_fft4096(&mut node_exec, 800, 20.0);
|
||
|
assert_eq!(fft[0], (22, 818));
|
||
|
|
||
|
matrix.set_param(freq_p, SAtom::param(-0.5));
|
||
|
let fft = run_and_get_fft4096(&mut node_exec, 800, 20.0);
|
||
|
assert_eq!(fft[0], (11, 964));
|
||
|
|
||
|
matrix.set_param(freq_p, SAtom::param(0.2));
|
||
|
let fft = run_and_get_fft4096(&mut node_exec, 800, 20.0);
|
||
|
assert_eq!(fft[0], (1776, 877));
|
||
|
|
||
|
matrix.set_param(freq_p, SAtom::param(0.4));
|
||
|
let fft = run_and_get_fft4096(&mut node_exec, 800, 20.0);
|
||
|
assert_eq!(fft[0], (7127, 1029));
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn check_node_sampl_reload() {
|
||
|
{
|
||
|
let (node_conf, _node_exec) = new_node_engine();
|
||
|
let mut matrix = Matrix::new(node_conf, 3, 3);
|
||
|
|
||
|
let smpl = NodeId::Sampl(0);
|
||
|
let out = NodeId::Out(0);
|
||
|
matrix.place(0, 0, Cell::empty(smpl)
|
||
|
.out(None, None, smpl.out("sig")));
|
||
|
matrix.place(0, 1, Cell::empty(out)
|
||
|
.input(out.inp("ch1"), None, None));
|
||
|
matrix.sync().unwrap();
|
||
|
|
||
|
let sample_p = smpl.inp_param("sample").unwrap();
|
||
|
matrix.set_param(sample_p, SAtom::audio_unloaded("tests/sample_sin.wav"));
|
||
|
|
||
|
hexodsp::save_patch_to_file(&mut matrix, "check_matrix_serialize.hxy")
|
||
|
.unwrap();
|
||
|
}
|
||
|
|
||
|
{
|
||
|
let (node_conf, mut node_exec) = new_node_engine();
|
||
|
let mut matrix = Matrix::new(node_conf, 3, 3);
|
||
|
|
||
|
hexodsp::load_patch_from_file(
|
||
|
&mut matrix, "check_matrix_serialize.hxy").unwrap();
|
||
|
|
||
|
|
||
|
let (rms, min, max) = run_and_get_l_rms_mimax(&mut node_exec, 50.0);
|
||
|
assert_float_eq!(rms, 0.505);
|
||
|
assert_float_eq!(min, -0.9998);
|
||
|
assert_float_eq!(max, 1.0);
|
||
|
|
||
|
let fft = run_and_get_fft4096(&mut node_exec, 800, 20.0);
|
||
|
assert_eq!(fft[0], (441, 940));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn check_node_sampl_load_err() {
|
||
|
let (node_conf, mut node_exec) = new_node_engine();
|
||
|
let mut matrix = Matrix::new(node_conf, 3, 3);
|
||
|
|
||
|
let smpl = NodeId::Sampl(0);
|
||
|
let out = NodeId::Out(0);
|
||
|
matrix.place(0, 0, Cell::empty(smpl)
|
||
|
.out(None, None, smpl.out("sig")));
|
||
|
matrix.place(0, 1, Cell::empty(out)
|
||
|
.input(out.inp("ch1"), None, None));
|
||
|
matrix.sync().unwrap();
|
||
|
|
||
|
let sample_p = smpl.inp_param("sample").unwrap();
|
||
|
matrix.set_param(sample_p, SAtom::audio_unloaded("tests/sample_NOSIN.wav"));
|
||
|
|
||
|
let (rms, min, max) = run_and_get_l_rms_mimax(&mut node_exec, 50.0);
|
||
|
assert_float_eq!(rms, 0.0);
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
assert_float_eq!(max, 0.0);
|
||
|
|
||
|
let err = matrix.pop_error();
|
||
|
assert_eq!(err.unwrap(), "Sample Loading Error\nCouldn't load sample 'tests/sample_NOSIN.wav':\nLoadError(IoError(Os { code: 2, kind: NotFound, message: \"No such file or directory\" }))");
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn check_node_sampl_trigger() {
|
||
|
let (node_conf, mut node_exec) = new_node_engine();
|
||
|
let mut matrix = Matrix::new(node_conf, 3, 3);
|
||
|
|
||
|
let smpl = NodeId::Sampl(0);
|
||
|
let out = NodeId::Out(0);
|
||
|
matrix.place(0, 0, Cell::empty(smpl)
|
||
|
.out(None, None, smpl.out("sig")));
|
||
|
matrix.place(0, 1, Cell::empty(out)
|
||
|
.input(out.inp("ch1"), None, None));
|
||
|
matrix.sync().unwrap();
|
||
|
|
||
|
let sample_p = smpl.inp_param("sample").unwrap();
|
||
|
let pmode_p = smpl.inp_param("pmode").unwrap();
|
||
|
let trig_p = smpl.inp_param("trig").unwrap();
|
||
|
matrix.set_param(sample_p, SAtom::audio_unloaded("tests/sample_sin.wav"));
|
||
|
matrix.set_param(pmode_p, SAtom::setting(1));
|
||
|
|
||
|
let (rms, min, max) = run_and_get_l_rms_mimax(&mut node_exec, 10.0);
|
||
|
assert_float_eq!(rms, 0.0);
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
assert_float_eq!(max, 0.0);
|
||
|
|
||
|
matrix.set_param(trig_p, (1.0).into());
|
||
|
let (rms, min, max) = run_and_get_first_rms_mimax(&mut node_exec, 10.0);
|
||
|
assert_float_eq!(rms, 0.1136);
|
||
|
assert_float_eq!(min, -0.9998);
|
||
|
assert_float_eq!(max, 1.0);
|
||
|
|
||
|
let (rms, min, max) = run_and_get_l_rms_mimax(&mut node_exec, 20.0);
|
||
|
assert_float_eq!(rms, 0.0);
|
||
|
assert_float_eq!(min, -0.0);
|
||
|
assert_float_eq!(max, 0.0);
|
||
|
}
|
||
|
|
||
|
fn create_1sec_ramp() -> SAtom {
|
||
|
let mut test_sample_ramp = vec![0.0; (SAMPLE_RATE_US) + 1];
|
||
|
test_sample_ramp[0] = SAMPLE_RATE;
|
||
|
for i in 0..(test_sample_ramp.len() - 1) {
|
||
|
test_sample_ramp[i + 1] =
|
||
|
(i as f32) / ((test_sample_ramp.len() - 2) as f32)
|
||
|
}
|
||
|
|
||
|
SAtom::audio(
|
||
|
"1second_ramp.wav",
|
||
|
std::sync::Arc::new(test_sample_ramp))
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn check_node_sampl_trigger_reset_phase() {
|
||
|
let (node_conf, mut node_exec) = new_node_engine();
|
||
|
let mut matrix = Matrix::new(node_conf, 3, 3);
|
||
|
|
||
|
let smpl = NodeId::Sampl(0);
|
||
|
let out = NodeId::Out(0);
|
||
|
matrix.place(0, 0, Cell::empty(smpl)
|
||
|
.out(None, None, smpl.out("sig")));
|
||
|
matrix.place(0, 1, Cell::empty(out)
|
||
|
.input(out.inp("ch1"), None, None));
|
||
|
matrix.sync().unwrap();
|
||
|
|
||
|
let sample_p = smpl.inp_param("sample").unwrap();
|
||
|
let pmode_p = smpl.inp_param("pmode").unwrap();
|
||
|
let trig_p = smpl.inp_param("trig").unwrap();
|
||
|
|
||
|
matrix.set_param(sample_p, create_1sec_ramp());
|
||
|
// One Shot Mode
|
||
|
matrix.set_param(pmode_p, SAtom::setting(1));
|
||
|
|
||
|
let (rms, min, max) = run_and_get_l_rms_mimax(&mut node_exec, 10.0);
|
||
|
assert_float_eq!(rms, 0.0);
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
assert_float_eq!(max, 0.0);
|
||
|
|
||
|
matrix.set_param(trig_p, (1.0).into());
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 100.0);
|
||
|
let (_rms, min, max) = rmsvec[0];
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
assert_float_eq!(max, 0.092496);
|
||
|
let (_rms, min, max) = rmsvec[2];
|
||
|
assert_float_eq!(min, 0.19252);
|
||
|
assert_float_eq!(max, 0.29250);
|
||
|
|
||
|
// lower trigger level, for retrigger later
|
||
|
matrix.set_param(trig_p, (0.0).into());
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 10.0);
|
||
|
|
||
|
let (_rms, min, max) = rmsvec[2];
|
||
|
assert_float_eq!(min, 0.31252);
|
||
|
assert_float_eq!(max, 0.32250);
|
||
|
|
||
|
// retrigger the phase sample
|
||
|
matrix.set_param(trig_p, (1.0).into());
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 100.0);
|
||
|
|
||
|
let (_rms, min, max) = rmsvec[0];
|
||
|
// this is the start of the phase
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
// this is the last value of the previous triggering
|
||
|
assert_float_eq!(max, 0.32998);
|
||
|
|
||
|
let (_rms, min, max) = rmsvec[1];
|
||
|
assert_float_eq!(min, 0.09251);
|
||
|
assert_float_eq!(max, 0.19249);
|
||
|
|
||
|
let (_rms, min, max) = rmsvec[2];
|
||
|
assert_float_eq!(min, 0.19252);
|
||
|
assert_float_eq!(max, 0.29250);
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn check_node_sampl_trigger_loop_reset_phase() {
|
||
|
let (node_conf, mut node_exec) = new_node_engine();
|
||
|
let mut matrix = Matrix::new(node_conf, 3, 3);
|
||
|
|
||
|
let smpl = NodeId::Sampl(0);
|
||
|
let out = NodeId::Out(0);
|
||
|
matrix.place(0, 0, Cell::empty(smpl)
|
||
|
.out(None, None, smpl.out("sig")));
|
||
|
matrix.place(0, 1, Cell::empty(out)
|
||
|
.input(out.inp("ch1"), None, None));
|
||
|
matrix.sync().unwrap();
|
||
|
|
||
|
let sample_p = smpl.inp_param("sample").unwrap();
|
||
|
let pmode_p = smpl.inp_param("pmode").unwrap();
|
||
|
let trig_p = smpl.inp_param("trig").unwrap();
|
||
|
|
||
|
matrix.set_param(sample_p, create_1sec_ramp());
|
||
|
// Loop mode:
|
||
|
matrix.set_param(pmode_p, SAtom::setting(0));
|
||
|
|
||
|
matrix.set_param(trig_p, (0.0).into());
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 100.0);
|
||
|
let (_rms, min, max) = rmsvec[0];
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
assert_float_eq!(max, 0.09999);
|
||
|
let (_rms, min, max) = rmsvec[2];
|
||
|
assert_float_eq!(min, 0.2);
|
||
|
assert_float_eq!(max, 0.2999);
|
||
|
|
||
|
matrix.set_param(trig_p, (1.0).into());
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 100.0);
|
||
|
let (_rms, min, max) = rmsvec[0];
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
assert_float_eq!(max, 0.3074);
|
||
|
let (_rms, min, max) = rmsvec[2];
|
||
|
assert_float_eq!(min, 0.1925);
|
||
|
assert_float_eq!(max, 0.2925);
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn check_node_sampl_offs_len() {
|
||
|
let (node_conf, mut node_exec) = new_node_engine();
|
||
|
let mut matrix = Matrix::new(node_conf, 3, 3);
|
||
|
|
||
|
let smpl = NodeId::Sampl(0);
|
||
|
let out = NodeId::Out(0);
|
||
|
matrix.place(0, 0, Cell::empty(smpl)
|
||
|
.out(None, None, smpl.out("sig")));
|
||
|
matrix.place(0, 1, Cell::empty(out)
|
||
|
.input(out.inp("ch1"), None, None));
|
||
|
matrix.sync().unwrap();
|
||
|
|
||
|
let sample_p = smpl.inp_param("sample").unwrap();
|
||
|
let pmode_p = smpl.inp_param("pmode").unwrap();
|
||
|
let offs_p = smpl.inp_param("offs").unwrap();
|
||
|
let len_p = smpl.inp_param("len").unwrap();
|
||
|
|
||
|
matrix.set_param(sample_p, create_1sec_ramp());
|
||
|
matrix.set_param(pmode_p, SAtom::setting(0));
|
||
|
|
||
|
// Select part 0.5 to 0.75 of the sample:
|
||
|
matrix.set_param(offs_p, SAtom::param(0.5));
|
||
|
matrix.set_param(len_p, SAtom::param(0.5));
|
||
|
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 50.0);
|
||
|
let (_rms, min, max) = rmsvec[0];
|
||
|
assert_float_eq!(min, 0.0011133);
|
||
|
assert_float_eq!(max, 0.54999);
|
||
|
let (_rms, min, max) = rmsvec[2];
|
||
|
assert_float_eq!(min, 0.6);
|
||
|
assert_float_eq!(max, 0.65);
|
||
|
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 50.0);
|
||
|
let (_rms, min, max) = rmsvec[0];
|
||
|
assert_float_eq!(min, 0.65);
|
||
|
assert_float_eq!(max, 0.6999);
|
||
|
let (_rms, min, max) = rmsvec[1];
|
||
|
assert_float_eq!(min, 0.70);
|
||
|
assert_float_eq!(max, 0.75);
|
||
|
let (_rms, min, max) = rmsvec[2];
|
||
|
assert_float_eq!(min, 0.5);
|
||
|
assert_float_eq!(max, 0.55);
|
||
|
}
|
||
|
|
||
|
|
||
|
#[test]
|
||
|
fn check_node_sampl_offs_len_zero_crash() {
|
||
|
let (node_conf, mut node_exec) = new_node_engine();
|
||
|
let mut matrix = Matrix::new(node_conf, 3, 3);
|
||
|
|
||
|
let smpl = NodeId::Sampl(0);
|
||
|
let out = NodeId::Out(0);
|
||
|
matrix.place(0, 0, Cell::empty(smpl)
|
||
|
.out(None, None, smpl.out("sig")));
|
||
|
matrix.place(0, 1, Cell::empty(out)
|
||
|
.input(out.inp("ch1"), None, None));
|
||
|
matrix.sync().unwrap();
|
||
|
|
||
|
let sample_p = smpl.inp_param("sample").unwrap();
|
||
|
let pmode_p = smpl.inp_param("pmode").unwrap();
|
||
|
let offs_p = smpl.inp_param("offs").unwrap();
|
||
|
let len_p = smpl.inp_param("len").unwrap();
|
||
|
let trig_p = smpl.inp_param("trig").unwrap();
|
||
|
|
||
|
matrix.set_param(sample_p, create_1sec_ramp());
|
||
|
matrix.set_param(pmode_p, SAtom::setting(0));
|
||
|
|
||
|
// Select part 0.5 to 0.75 of the sample:
|
||
|
matrix.set_param(offs_p, SAtom::param(1.0));
|
||
|
matrix.set_param(len_p, SAtom::param(0.0));
|
||
|
|
||
|
matrix.set_param(trig_p, (1.0).into());
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 50.0);
|
||
|
let (_rms, min, max) = rmsvec[0];
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
assert_float_eq!(max, 1.0);
|
||
|
|
||
|
// Select part 0.5 to 0.75 of the sample:
|
||
|
matrix.set_param(offs_p, SAtom::param(0.9));
|
||
|
matrix.set_param(len_p, SAtom::param(0.0));
|
||
|
|
||
|
matrix.set_param(trig_p, (1.0).into());
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 50.0);
|
||
|
let (_rms, min, max) = rmsvec[0];
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
assert_float_eq!(max, 0.0);
|
||
|
|
||
|
// Select part 0.5 to 0.75 of the sample:
|
||
|
matrix.set_param(offs_p, SAtom::param(1.0));
|
||
|
matrix.set_param(len_p, SAtom::param(0.0));
|
||
|
|
||
|
matrix.set_param(trig_p, (1.0).into());
|
||
|
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 50.0);
|
||
|
let (_rms, min, max) = rmsvec[0];
|
||
|
assert_float_eq!(min, 0.0);
|
||
|
assert_float_eq!(max, 0.0);
|
||
|
}
|