replace len with mxlen instead

This commit is contained in:
Weird Constructor 2021-06-11 05:05:42 +02:00
parent e6df5039ef
commit 30b67efe70
3 changed files with 17 additions and 79 deletions

View file

@ -372,12 +372,11 @@ 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 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}
(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}
[0 sig],
// node_param_idx
// name denorm round format steps norm norm denorm

View file

@ -61,15 +61,8 @@ impl Sampl {
pub const offs : &'static str =
"Sampl offs\nStart position offset.\nRange: (0..1)\n";
pub const len : &'static str =
"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";
"Sampl len\nAdjusts the playback length of the sample in relation \
to the original length of the sample.\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 =
@ -117,13 +110,8 @@ in the 'Samples' tab.
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.
parameter and modify the playback length relative to the original
sample length using the 'len' 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
@ -186,7 +174,6 @@ impl Sampl {
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);
@ -206,7 +193,6 @@ impl Sampl {
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();
@ -246,30 +232,19 @@ 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
|| prev_mxlen != cur_mxlen
{
denorm::Sampl::len(len, frame).abs().min(1.0) as f64;
if recalc_end || prev_len != cur_len {
let max_sd_len =
((sd_len as f64 * cur_mxlen as f64)
as usize).max(1);
(sd_len as f64 * cur_len as f64).round() as usize;
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);
end_idx_plus1 = remain_s_len;
prev_mxlen = cur_mxlen;
prev_len = cur_len;
}

View file

@ -355,7 +355,7 @@ fn check_node_sampl_offs_len() {
// 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));
matrix.set_param(len_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));
@ -367,42 +367,6 @@ 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() {
let (node_conf, mut node_exec) = new_node_engine();
@ -431,7 +395,7 @@ fn check_node_sampl_offs_len_zero_crash() {
matrix.set_param(trig_p, (1.0).into());
let rmsvec = run_and_get_each_rms_mimax(&mut node_exec, 50.0);
assert_minmax_of_rms!(rmsvec[0], (0.0, 1.0));
assert_minmax_of_rms!(rmsvec[0], (0.0, 0.9979));
// Select part 0.5 to 0.75 of the sample:
matrix.set_param(offs_p, SAtom::param(0.9));
@ -554,7 +518,7 @@ fn check_node_sampl_declick_offs_len() {
matrix.set_param(dcms_p, SAtom::param(dcms_p.norm(3.14)));
matrix.set_param(trig_p, (1.0).into());
matrix.set_param(offs_p, SAtom::param(0.9));
matrix.set_param(len_p, SAtom::param(0.08));
matrix.set_param(len_p, SAtom::param(0.008));
// trigger:
run_for_ms(&mut node_exec, 7.5);