fixed test after out.gain had been added

This commit is contained in:
Weird Constructor 2021-06-11 05:01:19 +02:00
parent 384274aadf
commit e6df5039ef
5 changed files with 88 additions and 20 deletions

View file

@ -372,11 +372,12 @@ macro_rules! node_list {
(1 trig n_id n_id r_id f_def stp_d -1.0, 1.0, 0.0) (1 trig n_id n_id r_id f_def stp_d -1.0, 1.0, 0.0)
(2 offs n_id n_id r_id f_def stp_d 0.0, 1.0, 0.0) (2 offs n_id n_id r_id f_def stp_d 0.0, 1.0, 0.0)
(3 len n_id n_id r_id f_def stp_d 0.0, 1.0, 1.0) (3 len n_id n_id r_id f_def stp_d 0.0, 1.0, 1.0)
(4 dcms n_declick d_declick r_ms f_ms stp_m 0.0, 1.0, 3.0) (4 mxlen n_id n_id r_id f_def stp_d 0.0, 1.0, 1.0)
(5 det n_det d_det r_det f_det stp_f -0.2, 0.2, 0.0) (5 dcms n_declick d_declick r_ms f_ms stp_m 0.0, 1.0, 3.0)
{6 0 sample audio_unloaded("") f_def 0 0} (6 det n_det d_det r_det f_det stp_f -0.2, 0.2, 0.0)
{7 1 pmode setting(0) fa_sampl_pmode 0 1} {7 0 sample audio_unloaded("") f_def 0 0}
{8 2 dclick setting(0) fa_sampl_dclick 0 1} {8 1 pmode setting(0) fa_sampl_pmode 0 1}
{9 2 dclick setting(0) fa_sampl_dclick 0 1}
[0 sig], [0 sig],
// node_param_idx // node_param_idx
// name denorm round format steps norm norm denorm // name denorm round format steps norm norm denorm

View file

@ -61,7 +61,15 @@ impl Sampl {
pub const offs : &'static str = pub const offs : &'static str =
"Sampl offs\nStart position offset.\nRange: (0..1)\n"; "Sampl offs\nStart position offset.\nRange: (0..1)\n";
pub const len : &'static str = pub const len : &'static str =
"Sampl len\nLength of the sample, after the offset has been applied.\nRange: (0..1)\n"; "Sampl len\nAdjusts the remaining length of the sample, after the \
offset has been applied. This means the absolute length in seconds \
depends on the offset and this ratio.\
\nRange: (0..1)\n";
pub const mxlen : &'static str =
"Sampl mxlen\nLimits the remaining length of the sample relative to the \
original length of the sample. In constrast to 'len' this paramter \
modifies the length independently to the 'offs' parameter. \
\nRange: (0..1)\n";
pub const dcms : &'static str = pub const dcms : &'static str =
"Sampl dcms\nDeclick fade time in milliseconds.\nNot audio rate!\nRange: (0..1)\n"; "Sampl dcms\nDeclick fade time in milliseconds.\nNot audio rate!\nRange: (0..1)\n";
pub const det : &'static str = pub const det : &'static str =
@ -111,6 +119,12 @@ You can adjust the playback speed of the sample either by the 'freq' parameter
or the 'det' parameter. You can offset into the sample using the 'offs' or the 'det' parameter. You can offset into the sample using the 'offs'
parameter and modify the remaining length using the 'len' parameter. parameter and modify the remaining length using the 'len' parameter.
The maximum length can be modified using the 'mxlen' parameter.
It limits the maximum of the remaining length, but relative to the original
length of the sample and not to the length after the offset has been applied.
If you apply length modification using the 'len' parameter,
then the playback length of the sample will change with the 'offs' parameter.
Even though you are advised to use an envelope for controlling the playback Even though you are advised to use an envelope for controlling the playback
volume of the sample to prevent clicks a simple in and out ramp is provided volume of the sample to prevent clicks a simple in and out ramp is provided
using by the 'dclick' setting. The length of these ramps can be controlled using by the 'dclick' setting. The length of these ramps can be controlled
@ -168,12 +182,13 @@ impl Sampl {
sample_data: &[f32], out: &mut ProcBuf, do_loop: bool, sample_data: &[f32], out: &mut ProcBuf, do_loop: bool,
declick: bool) declick: bool)
{ {
let freq = inp::Sampl::freq(inputs); let freq = inp::Sampl::freq(inputs);
let trig = inp::Sampl::trig(inputs); let trig = inp::Sampl::trig(inputs);
let offs = inp::Sampl::offs(inputs); let offs = inp::Sampl::offs(inputs);
let len = inp::Sampl::len(inputs); let len = inp::Sampl::len(inputs);
let dcms = inp::Sampl::dcms(inputs); let mxlen = inp::Sampl::mxlen(inputs);
let det = inp::Sampl::det(inputs); let dcms = inp::Sampl::dcms(inputs);
let det = inp::Sampl::det(inputs);
let sample_srate = sample_data[0] as f64; let sample_srate = sample_data[0] as f64;
let sample_data = &sample_data[1..]; let sample_data = &sample_data[1..];
@ -189,8 +204,9 @@ impl Sampl {
is_playing = true; is_playing = true;
} }
let mut prev_offs = -10.0; let mut prev_offs = -10.0;
let mut prev_len = -10.0; let mut prev_len = -10.0;
let mut prev_mxlen = -10.0;
let mut start_idx = 0; let mut start_idx = 0;
let mut end_idx_plus1 = sample_data.len(); let mut end_idx_plus1 = sample_data.len();
@ -230,15 +246,31 @@ impl Sampl {
false false
}; };
let cur_mxlen =
denorm::Sampl::mxlen(mxlen, frame).abs().min(1.0)
as f64;
let cur_len = let cur_len =
denorm::Sampl::len(len, frame).abs().min(0.999999) denorm::Sampl::len(len, frame).abs().min(0.999999)
as f64; as f64;
if recalc_end || prev_len != cur_len { if recalc_end
let remain_s_len = sd_len - start_idx; || prev_len != cur_len
|| prev_mxlen != cur_mxlen
{
let max_sd_len =
((sd_len as f64 * cur_mxlen as f64)
as usize).max(1);
let remain_s_len =
if start_idx <= sd_len {
(sd_len - start_idx).min(max_sd_len)
} else { 0 };
end_idx_plus1 = end_idx_plus1 =
((remain_s_len as f64 * cur_len) ((remain_s_len as f64 * cur_len)
.ceil() as usize).min(remain_s_len); .ceil() as usize).min(remain_s_len);
prev_len = cur_len;
prev_mxlen = cur_mxlen;
prev_len = cur_len;
} }
let sample_slice = let sample_slice =

View file

@ -1071,7 +1071,7 @@ mod tests {
let prog = node_exec.get_prog(); let prog = node_exec.get_prog();
assert_eq!(prog.prog.len(), 2); assert_eq!(prog.prog.len(), 2);
assert_eq!(prog.prog[0].to_string(), "Op(i=0 out=(0-1) in=(0-2) at=(0-0))"); assert_eq!(prog.prog[0].to_string(), "Op(i=0 out=(0-1) in=(0-2) at=(0-0))");
assert_eq!(prog.prog[1].to_string(), "Op(i=1 out=(1-1) in=(2-4) at=(0-1) cpy=(o0 => i2))"); assert_eq!(prog.prog[1].to_string(), "Op(i=1 out=(1-1) in=(2-5) at=(0-1) cpy=(o0 => i2))");
} }
#[test] #[test]
@ -1102,7 +1102,7 @@ mod tests {
let prog = node_exec.get_prog(); let prog = node_exec.get_prog();
assert_eq!(prog.prog.len(), 2); assert_eq!(prog.prog.len(), 2);
assert_eq!(prog.prog[0].to_string(), "Op(i=2 out=(2-3) in=(4-6) at=(0-0))"); assert_eq!(prog.prog[0].to_string(), "Op(i=2 out=(2-3) in=(4-6) at=(0-0))");
assert_eq!(prog.prog[1].to_string(), "Op(i=3 out=(3-3) in=(6-8) at=(0-1) cpy=(o2 => i6))"); assert_eq!(prog.prog[1].to_string(), "Op(i=3 out=(3-3) in=(6-9) at=(0-1) cpy=(o2 => i6))");
} }
#[test] #[test]

View file

@ -469,7 +469,7 @@ mod tests {
let s = mr.serialize(); let s = mr.serialize();
assert_eq!(s, assert_eq!(s,
"{\"VERSION\":1,\"atoms\":[[\"out\",0,\"mono\",[\"i\",0]]],\"cells\":[[\"sin\",2,0,0,[-1,-1,-1],[-1,0,-1]],[\"out\",0,1,0,[-1,0,-1],[-1,-1,0]]],\"params\":[[\"out\",0,\"ch1\",0.0],[\"out\",0,\"ch2\",0.0],[\"sin\",0,\"det\",0.0],[\"sin\",1,\"det\",0.0],[\"sin\",2,\"det\",0.0],[\"sin\",0,\"freq\",0.0],[\"sin\",1,\"freq\",0.0],[\"sin\",2,\"freq\",-0.10000000149011612]],\"patterns\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]}"); "{\"VERSION\":1,\"atoms\":[[\"out\",0,\"mono\",[\"i\",0]]],\"cells\":[[\"sin\",2,0,0,[-1,-1,-1],[-1,0,-1]],[\"out\",0,1,0,[-1,0,-1],[-1,-1,0]]],\"params\":[[\"out\",0,\"ch1\",0.0],[\"out\",0,\"ch2\",0.0],[\"sin\",0,\"det\",0.0],[\"sin\",1,\"det\",0.0],[\"sin\",2,\"det\",0.0],[\"sin\",0,\"freq\",0.0],[\"sin\",1,\"freq\",0.0],[\"sin\",2,\"freq\",-0.10000000149011612],[\"out\",0,\"gain\",0.7071067690849304]],\"patterns\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]}");
let mut mr2 = MatrixRepr::deserialize(&s).unwrap(); let mut mr2 = MatrixRepr::deserialize(&s).unwrap();

View file

@ -367,6 +367,41 @@ fn check_node_sampl_offs_len() {
assert_minmax_of_rms!(rmsvec[2], (0.5, 0.55)); assert_minmax_of_rms!(rmsvec[2], (0.5, 0.55));
} }
#[test]
fn check_node_sampl_offs_mxlen() {
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 mxlen_p = smpl.inp_param("mxlen").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(mxlen_p, SAtom::param(0.25));
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 50.0);
assert_minmax_of_rms!(rmsvec[0], (0.001113, 0.54999));
assert_minmax_of_rms!(rmsvec[2], (0.6, 0.65));
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 50.0);
assert_minmax_of_rms!(rmsvec[0], (0.65, 0.6999));
assert_minmax_of_rms!(rmsvec[1], (0.70, 0.75));
assert_minmax_of_rms!(rmsvec[2], (0.5, 0.55));
}
#[test] #[test]
fn check_node_sampl_offs_len_zero_crash() { fn check_node_sampl_offs_len_zero_crash() {