From 3619eb53f6e2c445b6966a692b72cc9c747d6222 Mon Sep 17 00:00:00 2001 From: midilab Date: Wed, 26 Mar 2025 17:53:03 -0300 Subject: [PATCH] update all mod_clock_refs to uint16_t to avoid overflow on higher PPQNs. --- src/uClock.cpp | 23 ++++++++++++----------- src/uClock.h | 27 +++++++++++++-------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/uClock.cpp b/src/uClock.cpp index 182314b..2e64054 100755 --- a/src/uClock.cpp +++ b/src/uClock.cpp @@ -155,18 +155,19 @@ uint32_t uClockClass::bpmToMicroSeconds(float bpm) void uClockClass::calculateReferencedata() { mod_clock_ref = ppqn / clock_ppqn; - mod_sync1_ref = ppqn / PPQN_1; - mod_sync2_ref = ppqn / PPQN_2; - mod_sync4_ref = ppqn / PPQN_4; - mod_sync8_ref = ppqn / PPQN_8; - mod_sync12_ref = ppqn / PPQN_12; - mod_sync24_ref = ppqn / PPQN_24; - mod_sync48_ref = ppqn / PPQN_48; - mod_step_ref = ppqn / 4; + mod_sync1_ref = ppqn / PPQN_1; + mod_sync2_ref = ppqn / PPQN_2; + mod_sync4_ref = ppqn / PPQN_4; + mod_sync8_ref = ppqn / PPQN_8; + mod_sync12_ref = ppqn / PPQN_12; + mod_sync24_ref = ppqn / PPQN_24; + mod_sync48_ref = ppqn / PPQN_48; + mod_step_ref = ppqn / 4; } void uClockClass::setPPQN(PPQNResolution resolution) { + // TODO: dont allow PPQN lower than 4(to avoid problems with mod_step_ref) ATOMIC( ppqn = resolution; calculateReferencedata(); @@ -318,10 +319,11 @@ void uClockClass::resetCounters() } } -// TODO: Tap stuff void uClockClass::tap() { - // tap me + // we can make use of mod_sync1_ref for tap + //uint8_t mod_tap_ref = ppqn / PPQN_1; + // we only set tap if SyncMode is INTERNAL_CLOCK } void uClockClass::setShuffle(bool active) @@ -409,7 +411,6 @@ bool inline uClockClass::processShuffle() return false; } -// TODO: needs to check clock signals against current phase lock parameters(based on 24ppqn sync) void uClockClass::handleExternalClock() { switch (state) { diff --git a/src/uClock.h b/src/uClock.h index ab4f4ed..ef56c4c 100755 --- a/src/uClock.h +++ b/src/uClock.h @@ -50,7 +50,7 @@ typedef struct { #define EXT_INTERVAL_BUFFER_SIZE 128 #define MIN_BPM 1 -#define MAX_BPM 300 +#define MAX_BPM 400 #define PHASE_FACTOR 16 #define PLL_X 220 @@ -200,40 +200,39 @@ class uClockClass { void (*onClockStartCallback)(); void (*onClockStopCallback)(); - // internal clock control - // uint16_t ppqn; + // clock control PPQNResolution ppqn = PPQN_96; PPQNResolution clock_ppqn = PPQN_24; + // output and internal counters, ticks and references uint32_t tick; uint32_t int_clock_tick; uint8_t mod_clock_counter; - uint8_t mod_clock_ref; + uint16_t mod_clock_ref; uint8_t mod_step_counter; uint8_t mod_step_ref; - uint32_t step_counter; // should we go uint16_t? - - // clock output counters, ticks and references + uint32_t step_counter; uint8_t mod_sync1_counter; - uint8_t mod_sync1_ref; + uint16_t mod_sync1_ref; uint32_t sync1_tick; uint8_t mod_sync2_counter; - uint8_t mod_sync2_ref; + uint16_t mod_sync2_ref; uint32_t sync2_tick; uint8_t mod_sync4_counter; - uint8_t mod_sync4_ref; + uint16_t mod_sync4_ref; uint32_t sync4_tick; uint8_t mod_sync8_counter; - uint8_t mod_sync8_ref; + uint16_t mod_sync8_ref; uint32_t sync8_tick; uint8_t mod_sync12_counter; - uint8_t mod_sync12_ref; + uint16_t mod_sync12_ref; uint32_t sync12_tick; uint8_t mod_sync24_counter; - uint8_t mod_sync24_ref; + uint16_t mod_sync24_ref; uint32_t sync24_tick; uint8_t mod_sync48_counter; - uint8_t mod_sync48_ref; + uint16_t mod_sync48_ref; uint32_t sync48_tick; + // external clock control volatile uint32_t ext_clock_us; volatile uint32_t ext_clock_tick;