Skip to content

Commit c327738

Browse files
committed
update RCModEQ to 1.2.2
1 parent 2c9b4bf commit c327738

4 files changed

Lines changed: 54 additions & 31 deletions

File tree

JSFX/Audio/RCModEQ/RCModEQ.jsfx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ JSFX Name: RCModEQ
33
Author: RCJacH
44
Release Date: Aug 2025
55
Link: https://github.com/RCJacH/ReaScripts
6-
Version: 1.2.1
6+
Version: 1.2.2
77
Provides:
88
dependencies/*
99
Reference:
@@ -16,6 +16,10 @@ About:
1616
It lets you stack up to eight filters and drive their parameters with
1717
up to eight shape-selectable and deformable LFOs.
1818
Changelog:
19+
* v1.2.2 (2026-02-21)
20+
* Fix LFO amp offset with unipolar routing
21+
* Fix LFO bar reset
22+
* Fix MIDI note on not parsed
1923
* v1.2.1 (2026-01-28)
2024
+ Fix sc rms converted value not updated when srate changes
2125
* Fix 1.1 migration function
@@ -705,7 +709,7 @@ out_pin:Right Output
705709
global()
706710
(
707711
set_SVF_type_2(idx, type);
708-
notify_touched_filter_type(idx, type, is_end);
712+
notify_touched_filter_type2(idx, type, is_end);
709713
);
710714

711715
function set_filter_spread(idx, spread, is_end)
@@ -1122,7 +1126,7 @@ out_pin:Right Output
11221126
CUR_TEMPO = tempo;
11231127
router_update_active_routes(TOTAL_LFO_COUNT);
11241128
while (midirecv(offset, msg1, msg2, msg3)) (
1125-
status = $xF0;
1129+
status = msg1 & $xF0;
11261130
(status == STATUS_NOTE_ON && msg3) ? maybe_parse_all_LFO_midi_reset(TOTAL_LFO_COUNT, offset);
11271131
);
11281132

@@ -3869,9 +3873,9 @@ out_pin:Right Output
38693873
ui_drawSliderModOverlay(
38703874
x1, y0, w1, h0,
38713875
0,
3872-
get_router_route_bipolar(g_mod_route_idx, idx, ROUTER_AMOUNT_OFFSET),
3876+
get_router_route_bipolar(g_mod_route_idx, idx, ROUTER_LFO_AMP),
38733877
mod_color_mem,
3874-
!get_router_route_bypassed(g_mod_route_idx, idx, ROUTER_AMOUNT_OFFSET),
3878+
!get_router_route_bypassed(g_mod_route_idx, idx, ROUTER_LFO_AMP),
38753879
sl_amp.v_xl,
38763880
ctrl_amp_mod.v_yl
38773881
);

JSFX/Audio/RCModEQ/dependencies/lfo.jsfx-inc

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,11 @@ LFO_RATE_MODE_BAR = 2;
7272
LFO_SYNC_TIME_LOOKUP_TABLE = 0;
7373
LFO_SYNC_TIME_LOOKUP_TABLE_COUNT = 0;
7474

75-
prev_ts_change_play_position = 0;
7675
prev_play_state = play_state & 1;
7776
prev_ts_num = ts_num;
7877
prev_ts_denom = ts_denom;
78+
prev_bar_phase = beat_position - floor(beat_position / max(0.000000001, (4. * ts_num / ts_denom))) * max(0.000000001, (4. * ts_num / ts_denom));
79+
prev_beat_position = beat_position;
7980

8081
// ───────────── HELPERS ─────────────
8182
function round(x) global() ( floor(x + .5); );
@@ -557,13 +558,18 @@ function _get_lfo_inc(rate, rate_mode)
557558
);
558559

559560
function maybe_parse_LFO_midi_reset(idx, offset)
560-
local(mem)
561-
global(LFO_TRIGGER_MODE_OFFSET, LFO_TRIGGER_MODE_MIDI_RESET)
561+
local(mem, trigger_offset)
562+
global(LFO_TRIGGER_MODE_OFFSET, LFO_TRIGGER_MODE_MIDI_RESET, LFO_MIDI_TRIG_OFFSET)
562563
(
563564
mem = get_LFO_mem_pos(idx);
564-
mem[LFO_TRIGGER_MODE_OFFSET] = (
565-
mem[LFO_TRIGGER_MODE_OFFSET] == LFO_TRIGGER_MODE_MIDI_RESET ?
566-
offset : 0;
565+
mem[LFO_TRIGGER_MODE_OFFSET] == LFO_TRIGGER_MODE_MIDI_RESET ? (
566+
// +1 so an event at sample offset 0 triggers on the first @sample frame.
567+
trigger_offset = offset + 1;
568+
mem[LFO_MIDI_TRIG_OFFSET] = (
569+
mem[LFO_MIDI_TRIG_OFFSET] ?
570+
min(mem[LFO_MIDI_TRIG_OFFSET], trigger_offset)
571+
: trigger_offset
572+
);
567573
);
568574
);
569575

@@ -587,14 +593,13 @@ function maybe_parse_all_LFO_midi_reset(lfo_count, offset)
587593
• keep its own book-keeping data.
588594
------------------------------------------------------------------------*/
589595
function maybe_reset_LFO_phase(idx)
590-
local(mem, trig, reset, beats, beatsPerBarQN, bar_idx)
596+
local(mem, trig, reset, beatsPerBarQN, bar_phase, delta_beats)
591597
global(
592-
tempo, play_state, play_position, ts_num, ts_denom,
593-
prev_ts_change_play_position,
598+
tempo, play_state, beat_position, ts_num, ts_denom,
594599

595-
prev_play_state, prev_ts_num, prev_ts_denom,
600+
prev_play_state, prev_ts_num, prev_ts_denom, prev_bar_phase, prev_beat_position,
596601

597-
LFO_TRIGGER_MODE_OFFSET, LFO_PREV_BAR_OFFSET,
602+
LFO_TRIGGER_MODE_OFFSET,
598603
LFO_MIDI_TRIG_OFFSET,
599604

600605
LFO_TRIGGER_MODE_FREERUN,
@@ -616,11 +621,17 @@ function maybe_reset_LFO_phase(idx)
616621
/*──────────────── 2. BAR_RESET (new bar or meter change) ──*/
617622
(trig == LFO_TRIGGER_MODE_BAR_RESET) ?
618623
(
619-
(ts_num != prev_ts_num) || (ts_denom != prev_ts_denom) ||
620-
(play_position < prev_ts_change_play_position) ?
621-
prev_ts_change_play_position = floor(play_position);
622-
beats = play_position - prev_ts_change_play_position;
623-
reset = (beats % ts_num) == 0;
624+
beatsPerBarQN = max(0.000000001, qn_time_to_full_measure());
625+
delta_beats = beat_position - prev_beat_position;
626+
bar_phase = beat_position - floor(beat_position / beatsPerBarQN) * beatsPerBarQN;
627+
reset = (
628+
bar_phase < prev_bar_phase
629+
|| delta_beats < 0
630+
|| delta_beats > beatsPerBarQN
631+
|| ts_num != prev_ts_num
632+
|| ts_denom != prev_ts_denom
633+
|| (play_state&1 && !prev_play_state)
634+
);
624635
);
625636

626637
/*──────────────── 3. MIDI_RESET (count down) ───────────*/
@@ -647,7 +658,7 @@ function process_LFO(idx)
647658
LFO_RATE_MODE_OFFSET, LFO_HZ_RATE_OFFSET, LFO_SYNC_RATE_OFFSET,
648659
LFO_RATE_MOD_OFFSET, LFO_SHAPE_OFFSET,
649660
LFO_START_PHASE_OFFSET, LFO_START_PHASE_MOD_OFFSET,
650-
LFO_DEFORM_OFFSET, LFO_DEFORM_MOD_OFFSET, LFO_AMP_OFFSET, LFO_AMP_MOD_OFFSET,
661+
LFO_DEFORM_OFFSET, LFO_DEFORM_MOD_OFFSET,
651662
LFO_V_OFFSET, LFO_PHASE_OFFSET, LFO_PREV_RND_OFFSET, LFO_CUR_RND_OFFSET
652663
)
653664
(
@@ -679,9 +690,7 @@ function process_LFO(idx)
679690
);
680691

681692
out = _get_amp_from_shape_and_phase(shape, deform, spread_phase, prev_rnd, cur_rnd);
682-
amp = mem[LFO_AMP_OFFSET] + mem[LFO_AMP_MOD_OFFSET + chan];
683-
amp = clamp(amp, 0., 1.);
684-
mem[LFO_V_OFFSET + chan] = out * amp;
693+
mem[LFO_V_OFFSET + chan] = out;
685694
mem[LFO_PHASE_OFFSET + chan] = phase;
686695
mem[LFO_PREV_RND_OFFSET + chan] = prev_rnd;
687696
mem[LFO_CUR_RND_OFFSET + chan] = cur_rnd;
@@ -690,8 +699,8 @@ function process_LFO(idx)
690699
);
691700

692701
function process_all_LFOs(lfo_count)
693-
local(i)
694-
global(play_state, ts_num, ts_denom, prev_play_state, prev_ts_num, prev_ts_denom)
702+
local(i, beatsPerBarQN)
703+
global(play_state, beat_position, ts_num, ts_denom, prev_play_state, prev_ts_num, prev_ts_denom, prev_bar_phase, prev_beat_position)
695704
(
696705
i = 0;
697706
loop(lfo_count,
@@ -701,6 +710,9 @@ function process_all_LFOs(lfo_count)
701710
);
702711
i += 1;
703712
);
713+
beatsPerBarQN = max(0.000000001, qn_time_to_full_measure());
714+
prev_bar_phase = beat_position - floor(beat_position / beatsPerBarQN) * beatsPerBarQN;
715+
prev_beat_position = beat_position;
704716
prev_play_state = play_state & 1;
705717
prev_ts_num = ts_num;
706718
prev_ts_denom = ts_denom;

JSFX/Audio/RCModEQ/dependencies/router.jsfx-inc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,12 +280,13 @@ function router_update_active_routes(lfo_count)
280280

281281

282282
function process_router(process_type, lfo_count)
283-
local(i, mem, chan, v, src_idx, dest, amount, mod_mem, is_bipolar, is_dirty_mem)
283+
local(i, mem, chan, v, src_idx, dest, amount, mod_mem, is_bipolar, is_dirty_mem, lfo_mem, amp)
284284
global(
285285
g_router_active_route_count,
286286
ROUTER_IS_BYPASSED_OFFSET, ROUTER_SRC_IDX_OFFSET, ROUTER_DEST_OFFSET, ROUTER_AMOUNT_OFFSET,
287287
ROUTER_IS_DIRTY_MEM_POS_OFFSET, ROUTER_IS_BIPOLAR_OFFSET,
288-
LFO_IS_ACTIVE_OFFSET, LFO_V_OFFSET, SIDECHAIN_V_OFFSET
288+
LFO_IS_ACTIVE_OFFSET, LFO_V_OFFSET, SIDECHAIN_V_OFFSET,
289+
LFO_AMP_OFFSET, LFO_AMP_MOD_OFFSET
289290
)
290291
(
291292
i = 0;
@@ -297,13 +298,19 @@ function process_router(process_type, lfo_count)
297298
src_idx = mem[ROUTER_SRC_IDX_OFFSET];
298299
mod_mem = src_idx < lfo_count ? get_LFO_mem_pos(src_idx) + LFO_V_OFFSET
299300
: get_SideChain_mem_pos(src_idx - lfo_count) + SIDECHAIN_V_OFFSET;
301+
lfo_mem = src_idx < lfo_count ? get_LFO_mem_pos(src_idx) : 0;
300302
dest = mem[ROUTER_DEST_OFFSET];
301303
amount = mem[ROUTER_AMOUNT_OFFSET];
302304
is_bipolar = mem[ROUTER_IS_BIPOLAR_OFFSET];
303305
chan = 0;
304306
loop(2,
305307
v = mod_mem[chan];
306308
!is_bipolar ? v = (v + 1.) * .5;
309+
src_idx < lfo_count ? (
310+
amp = lfo_mem[LFO_AMP_OFFSET] + lfo_mem[LFO_AMP_MOD_OFFSET + chan];
311+
amp = max(0., min(1., amp));
312+
v *= amp;
313+
);
307314
dest[chan] += v * amount;
308315
chan += 1;
309316
);

JSFX/Audio/RCModEQ/dependencies/svf_filter.jsfx-inc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ function BW_to_Q(bw_oct)
115115
global()
116116
(
117117
// alpha = (ln 2 / 2) · BW
118-
alpha = 0.5 * log(2) * BW_oct;
118+
alpha = 0.5 * log(2) * bw_oct;
119119
// sinh(alpha) = ½ (e^α – e^–α) – rolled out to avoid a sinh()
120120
sinh_alpha = 0.5 * ( exp(alpha) - exp(-alpha) );
121121
// Guard against BW_oct = 0 → sinh_alpha = 0
@@ -124,7 +124,7 @@ function BW_to_Q(bw_oct)
124124

125125
function _svf_get_Q(static_oct, mod_pct)
126126
local(norm_static, norm_combined)
127-
global(SVF_MIN_BW, SVF_MIN_BW, SVF_MAX_BW)
127+
global(SVF_MIN_BW, SVF_MAX_BW)
128128
(
129129
norm_combined = static_oct + mod_pct * 4.;
130130
norm_combined = clamp(norm_combined, SVF_MIN_BW, SVF_MAX_BW);

0 commit comments

Comments
 (0)