From cc3bf58117fc3c46eecb971a12582f86d9c25185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Clet?= Date: Wed, 10 Sep 2025 20:10:56 +0200 Subject: [PATCH] fix float numbers sent to psto not being handled properly by tc.preset --- javascript/tc.preset.js | 101 ++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/javascript/tc.preset.js b/javascript/tc.preset.js index 13ba487..bf96206 100644 --- a/javascript/tc.preset.js +++ b/javascript/tc.preset.js @@ -782,61 +782,60 @@ function text() { function recall() { var args = arrayfromargs(arguments); - if (args.length == 1) { - previous_active_slot = active_slot; - is_interpolating = 0; - set_active_slot(args[0]); - outlet(0, 'recall', args[0]); - } else if (args.length == 3) { - var src_slot = args[0]; - var trg_slot = args[1]; + var val, src_slot, trg_slot, interp; + if (args.length == 1) { + val = Math.abs(args[0]); + src_slot = Math.floor(val); + interp = val % 1; + trg_slot = interp == 0 ? src_slot : src_slot + 1; + } else if (args.length == 3) { + src_slot = Math.abs(args[0]); + trg_slot = Math.abs(args[1]); + interp = Math.min( 1, Math.max(0, args[2])); + } + for (var i = 0; i < filled_slots.length; i++) { + slots[filled_slots[i]].interp = -1; + } + if (slots[src_slot].name != null && slots[trg_slot].name != null) { - for (var i = 0; i < filled_slots.length; i++) { - slots[filled_slots[i]].interp = -1; - } - - if (slots[src_slot].name != null && slots[trg_slot].name != null) { - - if (ignore_slot_zero == 1 && src_slot == 0) { - // Set src_slot as if we were interpolating from the last recalled preset different than 0 - // This way we can monitor which preset we come from even if we used preset 0 as intermediary preset - if (previous_target != active_slot) { - // If the last target preset was through interpollation or direct recall - src_slot = previous_active_slot; - } else { - src_slot = active_slot; - } - } - var interp = Math.min( 1, Math.max(0, args[2])); - if (interp == 0.0) { - slots[src_slot].interp = -1; - slots[trg_slot].interp = -1; - is_interpolating = 0; - if (previous_target != active_slot) { - previous_active_slot = active_slot; - } else if (args[0] != 0) { - previous_active_slot = args[0]; - } else { - previous_active_slot = previous_target; - } - - set_active_slot(src_slot); - } else if (interp == 1.0) { - slots[src_slot].interp = -1; - slots[trg_slot].interp = -1; - is_interpolating = 0; - previous_target = trg_slot; - set_active_slot(trg_slot); - + if (ignore_slot_zero == 1 && src_slot == 0) { + // Set src_slot as if we were interpolating from the last recalled preset different than 0 + // This way we can monitor which preset we come from even if we used preset 0 as intermediary preset + if (previous_target != active_slot) { + // If the last target preset was through interpollation or direct recall + src_slot = previous_active_slot; } else { - slots[src_slot].interp = 1 - interp; - slots[trg_slot].interp = interp; - is_interpolating = 1; - active_slot = 0; + src_slot = active_slot; } - - outlet(0, "recall", src_slot, trg_slot, interp); } + if (interp == 0.0) { + slots[src_slot].interp = -1; + slots[trg_slot].interp = -1; + is_interpolating = 0; + if (previous_target != active_slot) { + previous_active_slot = active_slot; + } else if (src_slot != 0) { + previous_active_slot = src_slot; + } else { + previous_active_slot = previous_target; + } + + set_active_slot(src_slot); + } else if (interp == 1.0) { + slots[src_slot].interp = -1; + slots[trg_slot].interp = -1; + is_interpolating = 0; + previous_target = trg_slot; + set_active_slot(trg_slot); + + } else { + slots[src_slot].interp = 1 - interp; + slots[trg_slot].interp = interp; + is_interpolating = 1; + active_slot = 0; + } + + outlet(0, "recall", src_slot, trg_slot, interp); } mgraphics.redraw();