add additional external ppqn

This commit is contained in:
2026-02-21 09:44:50 -08:00
parent 6d38c6b36b
commit 763d58f411
3 changed files with 153 additions and 146 deletions

View File

@ -266,6 +266,12 @@ void DisplayMainPage() {
case Clock::SOURCE_EXTERNAL_PPQN_4: case Clock::SOURCE_EXTERNAL_PPQN_4:
subText = F("4 PPQN"); subText = F("4 PPQN");
break; break;
case Clock::SOURCE_EXTERNAL_PPQN_2:
subText = F("2 PPQN");
break;
case Clock::SOURCE_EXTERNAL_PPQN_1:
subText = F("1 PPQN");
break;
case Clock::SOURCE_EXTERNAL_MIDI: case Clock::SOURCE_EXTERNAL_MIDI:
subText = F("MIDI"); subText = F("MIDI");
break; break;

View File

@ -285,6 +285,12 @@ void DisplayMainPage() {
case Clock::SOURCE_EXTERNAL_PPQN_4: case Clock::SOURCE_EXTERNAL_PPQN_4:
subText = F("4 PPQN"); subText = F("4 PPQN");
break; break;
case Clock::SOURCE_EXTERNAL_PPQN_2:
subText = F("2 PPQN");
break;
case Clock::SOURCE_EXTERNAL_PPQN_1:
subText = F("1 PPQN");
break;
case Clock::SOURCE_EXTERNAL_MIDI: case Clock::SOURCE_EXTERNAL_MIDI:
subText = F("MIDI"); subText = F("MIDI");
break; break;

View File

@ -17,7 +17,8 @@
#include "peripherials.h" #include "peripherials.h"
#include "uClock/uClock.h" #include "uClock/uClock.h"
// MIDI clock, start, stop, and continue byte definitions - based on MIDI 1.0 Standards. // MIDI clock, start, stop, and continue byte definitions - based on MIDI 1.0
// Standards.
#define MIDI_CLOCK 0xF8 #define MIDI_CLOCK 0xF8
#define MIDI_START 0xFA #define MIDI_START 0xFA
#define MIDI_STOP 0xFC #define MIDI_STOP 0xFC
@ -35,6 +36,8 @@ class Clock {
SOURCE_INTERNAL, SOURCE_INTERNAL,
SOURCE_EXTERNAL_PPQN_24, SOURCE_EXTERNAL_PPQN_24,
SOURCE_EXTERNAL_PPQN_4, SOURCE_EXTERNAL_PPQN_4,
SOURCE_EXTERNAL_PPQN_2,
SOURCE_EXTERNAL_PPQN_1,
SOURCE_EXTERNAL_MIDI, SOURCE_EXTERNAL_MIDI,
SOURCE_LAST, SOURCE_LAST,
}; };
@ -64,7 +67,8 @@ class Clock {
uClock.start(); uClock.start();
} }
// Handle external clock tick and call user callback when receiving clock trigger (PPQN_4, PPQN_24, or MIDI). // Handle external clock tick and call user callback when receiving clock
// trigger (PPQN_4, PPQN_24, or MIDI).
void AttachExtHandler(void (*callback)()) { void AttachExtHandler(void (*callback)()) {
extUserCallback = callback; extUserCallback = callback;
attachInterrupt(digitalPinToInterrupt(EXT_PIN), callback, RISING); attachInterrupt(digitalPinToInterrupt(EXT_PIN), callback, RISING);
@ -79,7 +83,8 @@ class Clock {
void SetSource(Source source) { void SetSource(Source source) {
bool was_playing = !IsPaused(); bool was_playing = !IsPaused();
uClock.stop(); uClock.stop();
// If we are changing the source from MIDI, disable the serial interrupt handler. // If we are changing the source from MIDI, disable the serial interrupt
// handler.
if (source_ == SOURCE_EXTERNAL_MIDI) { if (source_ == SOURCE_EXTERNAL_MIDI) {
NeoSerial.attachInterrupt(serialEventNoop); NeoSerial.attachInterrupt(serialEventNoop);
} }
@ -96,6 +101,14 @@ class Clock {
uClock.setClockMode(uClock.EXTERNAL_CLOCK); uClock.setClockMode(uClock.EXTERNAL_CLOCK);
uClock.setInputPPQN(uClock.PPQN_4); uClock.setInputPPQN(uClock.PPQN_4);
break; break;
case SOURCE_EXTERNAL_PPQN_2:
uClock.setClockMode(uClock.EXTERNAL_CLOCK);
uClock.setInputPPQN(uClock.PPQN_2);
break;
case SOURCE_EXTERNAL_PPQN_1:
uClock.setClockMode(uClock.EXTERNAL_CLOCK);
uClock.setInputPPQN(uClock.PPQN_1);
break;
case SOURCE_EXTERNAL_MIDI: case SOURCE_EXTERNAL_MIDI:
uClock.setClockMode(uClock.EXTERNAL_CLOCK); uClock.setClockMode(uClock.EXTERNAL_CLOCK);
uClock.setInputPPQN(uClock.PPQN_24); uClock.setInputPPQN(uClock.PPQN_24);
@ -107,7 +120,8 @@ class Clock {
} }
} }
// Return true if the current selected source is externl (PPQN_4, PPQN_24, or MIDI). // Return true if the current selected source is externl (PPQN_4, PPQN_24, or
// MIDI).
bool ExternalSource() { bool ExternalSource() {
return uClock.getClockMode() == uClock.EXTERNAL_CLOCK; return uClock.getClockMode() == uClock.EXTERNAL_CLOCK;
} }
@ -118,39 +132,26 @@ class Clock {
} }
// Returns the current BPM tempo. // Returns the current BPM tempo.
int Tempo() { int Tempo() { return uClock.getTempo(); }
return uClock.getTempo();
}
// Set the clock tempo to a int between 1 and 400. // Set the clock tempo to a int between 1 and 400.
void SetTempo(int tempo) { void SetTempo(int tempo) { return uClock.setTempo(tempo); }
return uClock.setTempo(tempo);
}
// Record an external clock tick received to process external/internal syncronization. // Record an external clock tick received to process external/internal
void Tick() { // syncronization.
uClock.clockMe(); void Tick() { uClock.clockMe(); }
}
// Start the internal clock. // Start the internal clock.
void Start() { void Start() { uClock.start(); }
uClock.start();
}
// Stop internal clock clock. // Stop internal clock clock.
void Stop() { void Stop() { uClock.stop(); }
uClock.stop();
}
// Reset all clock counters to 0. // Reset all clock counters to 0.
void Reset() { void Reset() { uClock.resetCounters(); }
uClock.resetCounters();
}
// Returns true if the clock is not running. // Returns true if the clock is not running.
bool IsPaused() { bool IsPaused() { return uClock.clock_state == uClock.PAUSED; }
return uClock.clock_state == uClock.PAUSED;
}
private: private:
Source source_ = SOURCE_INTERNAL; Source source_ = SOURCE_INTERNAL;
@ -175,17 +176,11 @@ class Clock {
} }
} }
static void sendMIDIStart() { static void sendMIDIStart() { NeoSerial.write(MIDI_START); }
NeoSerial.write(MIDI_START);
}
static void sendMIDIStop() { static void sendMIDIStop() { NeoSerial.write(MIDI_STOP); }
NeoSerial.write(MIDI_STOP);
}
static void sendMIDIClock(uint32_t tick) { static void sendMIDIClock(uint32_t tick) { NeoSerial.write(MIDI_CLOCK); }
NeoSerial.write(MIDI_CLOCK);
}
}; };
#endif #endif