add additional external ppqn
This commit is contained in:
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
65
src/clock.h
65
src/clock.h
@ -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
|
||||||
Reference in New Issue
Block a user