@@ -72,10 +72,11 @@ LFO_RATE_MODE_BAR = 2;
7272LFO_SYNC_TIME_LOOKUP_TABLE = 0;
7373LFO_SYNC_TIME_LOOKUP_TABLE_COUNT = 0;
7474
75- prev_ts_change_play_position = 0;
7675prev_play_state = play_state & 1;
7776prev_ts_num = ts_num;
7877prev_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 ─────────────
8182function round(x) global() ( floor(x + .5); );
@@ -557,13 +558,18 @@ function _get_lfo_inc(rate, rate_mode)
557558 );
558559
559560function 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------------------------------------------------------------------------*/
589595function 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
692701function 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;
0 commit comments