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)
(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)
(4 dcms n_declick d_declick r_ms f_ms stp_m 0.0, 1.0, 3.0)
(5 det n_det d_det r_det f_det stp_f -0.2, 0.2, 0.0)
{6 0 sample audio_unloaded("") f_def 0 0}
{7 1 pmode setting(0) fa_sampl_pmode 0 1}
{8 2 dclick setting(0) fa_sampl_dclick 0 1}
(4 mxlen n_id n_id r_id f_def stp_d 0.0, 1.0, 1.0)
(5 dcms n_declick d_declick r_ms f_ms stp_m 0.0, 1.0, 3.0)
(6 det n_det d_det r_det f_det stp_f -0.2, 0.2, 0.0)
{7 0 sample audio_unloaded("") f_def 0 0}
{8 1 pmode setting(0) fa_sampl_pmode 0 1}
{9 2 dclick setting(0) fa_sampl_dclick 0 1}
[0 sig],
// node_param_idx
// name denorm round format steps norm norm denorm

View file

@ -61,7 +61,15 @@ impl Sampl {
pub const offs : &'static str =
"Sampl offs\nStart position offset.\nRange: (0..1)\n";
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 =
"Sampl dcms\nDeclick fade time in milliseconds.\nNot audio rate!\nRange: (0..1)\n";
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'
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
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
@ -168,12 +182,13 @@ impl Sampl {
sample_data: &[f32], out: &mut ProcBuf, do_loop: bool,
declick: bool)
{
let freq = inp::Sampl::freq(inputs);
let trig = inp::Sampl::trig(inputs);
let offs = inp::Sampl::offs(inputs);
let len = inp::Sampl::len(inputs);
let dcms = inp::Sampl::dcms(inputs);
let det = inp::Sampl::det(inputs);
let freq = inp::Sampl::freq(inputs);
let trig = inp::Sampl::trig(inputs);
let offs = inp::Sampl::offs(inputs);
let len = inp::Sampl::len(inputs);
let mxlen = inp::Sampl::mxlen(inputs);
let dcms = inp::Sampl::dcms(inputs);
let det = inp::Sampl::det(inputs);
let sample_srate = sample_data[0] as f64;
let sample_data = &sample_data[1..];
@ -189,8 +204,9 @@ impl Sampl {
is_playing = true;
}
let mut prev_offs = -10.0;
let mut prev_len = -10.0;
let mut prev_offs = -10.0;
let mut prev_len = -10.0;
let mut prev_mxlen = -10.0;
let mut start_idx = 0;
let mut end_idx_plus1 = sample_data.len();
@ -230,15 +246,31 @@ impl Sampl {
false
};
let cur_mxlen =
denorm::Sampl::mxlen(mxlen, frame).abs().min(1.0)
as f64;
let cur_len =
denorm::Sampl::len(len, frame).abs().min(0.999999)
as f64;
if recalc_end || prev_len != cur_len {
let remain_s_len = sd_len - start_idx;
if recalc_end
|| 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 =
((remain_s_len as f64 * cur_len)
.ceil() as usize).min(remain_s_len);
prev_len = cur_len;
prev_mxlen = cur_mxlen;
prev_len = cur_len;
}
let sample_slice =

View file

@ -1071,7 +1071,7 @@ mod tests {
let prog = node_exec.get_prog();
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[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]
@ -1102,7 +1102,7 @@ mod tests {
let prog = node_exec.get_prog();
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[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]

View file

@ -469,7 +469,7 @@ mod tests {
let s = mr.serialize();
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();

View file

@ -367,6 +367,41 @@ fn check_node_sampl_offs_len() {
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]
fn check_node_sampl_offs_len_zero_crash() {