From 98c3769008436af4e7ed5e02e1cce689c2ea0290 Mon Sep 17 00:00:00 2001 From: Adam Wonak Date: Fri, 30 May 2025 03:08:31 +0000 Subject: [PATCH] Update clock.h to support uClock v2.2.1 and implement external PPQN 4 (#3) Reviewed-on: https://git.pinkduck.xyz/adam/libGravity/pulls/3 Co-authored-by: Adam Wonak Co-committed-by: Adam Wonak --- README.md | 1 + clock.h | 26 ++++++++++++++++---------- examples/clock_mod/clock_mod.ino | 29 ++++++++++++++++++++++++----- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index aac097a..58d0e58 100644 --- a/README.md +++ b/README.md @@ -111,3 +111,4 @@ void UpdateDisplay() { gravity.display.display(); } ``` + diff --git a/clock.h b/clock.h index 75f2151..6578b1f 100644 --- a/clock.h +++ b/clock.h @@ -22,6 +22,8 @@ enum Source { SOURCE_INTERNAL, SOURCE_EXTERNAL_PPQN_24, SOURCE_EXTERNAL_PPQN_4, + // SOURCE_MIDI, + SOURCE_LAST, }; class Clock { @@ -29,8 +31,8 @@ class Clock { void Init() { // Initialize the clock library uClock.init(); - uClock.setMode(uClock.INTERNAL_CLOCK); - uClock.setPPQN(uClock.PPQN_96); + uClock.setClockMode(uClock.INTERNAL_CLOCK); + uClock.setOutputPPQN(uClock.PPQN_96); uClock.setTempo(DEFAULT_TEMPO); uClock.start(); } @@ -42,30 +44,34 @@ class Clock { // Internal PPQN96 callback for all clock timer operations. void AttachIntHandler(void (*callback)(uint32_t)) { - uClock.setOnPPQN(callback); + uClock.setOnOutputPPQN(callback); } // Set the source of the clock mode. void SetSource(Source source) { + uClock.stop(); switch (source) { case SOURCE_INTERNAL: - uClock.setMode(uClock.INTERNAL_CLOCK); + uClock.setClockMode(uClock.INTERNAL_CLOCK); break; case SOURCE_EXTERNAL_PPQN_24: - uClock.setMode(uClock.EXTERNAL_CLOCK); + uClock.setClockMode(uClock.EXTERNAL_CLOCK); + uClock.setInputPPQN(uClock.PPQN_24); + break; case SOURCE_EXTERNAL_PPQN_4: - uClock.setMode(uClock.EXTERNAL_CLOCK); - default: + uClock.setClockMode(uClock.EXTERNAL_CLOCK); + uClock.setInputPPQN(uClock.PPQN_4); break; } + uClock.start(); } bool ExternalSource() { - return uClock.getMode() == uClock.EXTERNAL_CLOCK; + return uClock.getClockMode() == uClock.EXTERNAL_CLOCK; } bool InternalSource() { - return uClock.getMode() == uClock.INTERNAL_CLOCK; + return uClock.getClockMode() == uClock.INTERNAL_CLOCK; } int Tempo() { @@ -85,7 +91,7 @@ class Clock { } bool IsPaused() { - return uClock.state == uClock.PAUSED; + return uClock.clock_state == uClock.PAUSED; } }; diff --git a/examples/clock_mod/clock_mod.ino b/examples/clock_mod/clock_mod.ino index 457253b..fa6979a 100644 --- a/examples/clock_mod/clock_mod.ino +++ b/examples/clock_mod/clock_mod.ino @@ -33,6 +33,7 @@ struct AppState { bool refresh_screen = true; byte selected_param = 0; byte selected_channel = 0; // 0=tempo, 1-6=output channel + Source selected_source = SOURCE_INTERNAL; Channel channel[OUTPUT_COUNT]; }; AppState app; @@ -155,12 +156,14 @@ void HandleRotate(Direction dir, int val) { app.refresh_screen = true; break; - case 1: - if (gravity.clock.ExternalSource()) { - gravity.clock.SetSource(SOURCE_INTERNAL); + case 1: + if (static_cast(app.selected_source) == 0 && val < 0) { + app.selected_source = static_cast(SOURCE_LAST - 1); } else { - gravity.clock.SetSource(SOURCE_EXTERNAL_PPQN_24); + app.selected_source = static_cast((app.selected_source + val) % SOURCE_LAST); } + + gravity.clock.SetSource(app.selected_source); app.refresh_screen = true; break; } @@ -261,7 +264,23 @@ void DisplayMainPage() { gravity.display.setCursor(10, 10); gravity.display.print(F("Source: ")); - gravity.display.print((gravity.clock.InternalSource()) ? F("INT") : F("EXT")); + switch (app.selected_source) + { + case SOURCE_INTERNAL: + gravity.display.print(F("INT")); + break; + case SOURCE_EXTERNAL_PPQN_24: + gravity.display.print(F("EXT 24 PPQN")); + break; + case SOURCE_EXTERNAL_PPQN_4: + gravity.display.print(F("EXT 4 PPQN")); + break; + // case SOURCE_EXTERNAL_MIDI: + // gravity.display.print(F("EXT MIDI")); + // break; + default: + break; + } } void DisplayChannelPage() {