18#ifndef PLAYBACKHANDLER_H
19#define PLAYBACKHANDLER_H
21#include "r_typedefs.h"
26#define MIDI_OUT_INCIDENTAL 1
27#define MIDI_OUT_MASTER 2
29#define RECORDING_OFF 0
30#define RECORDING_NORMAL 1
31#define RECORDING_ARRANGEMENT 2
33#define NUM_INPUT_TICKS_FOR_MOVING_AVERAGE 24
35#define PLAYBACK_CLOCK_INTERNAL_ACTIVE 1
36#define PLAYBACK_CLOCK_EXTERNAL_ACTIVE 2
37#define PLAYBACK_SWITCHED_ON 4
39#define PLAYBACK_CLOCK_EITHER_ACTIVE (PLAYBACK_CLOCK_INTERNAL_ACTIVE | PLAYBACK_CLOCK_EXTERNAL_ACTIVE)
50const uint8_t
metronomeValuesBPM[16] = {60, 63, 66, 69, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116};
52const uint16_t
metronomeValueBoundaries[16] = {1793, 1709, 1633, 1542, 1490, 1413, 1345, 1282, 1225, 1173, 1125, 1081, 1040, 1002, 967, 934};
64 void setupPlayback(
int newPlaybackState, int32_t playFromPos,
bool doOneLastAudioRoutineCall =
false,
bool shouldShiftAccordingToClipInstance =
true,
int buttonPressLatencyForTempolessRecord = 0);
66 void inputTick(
bool fromTriggerClock =
false, uint32_t time = 0);
71 void tempoEncoderAction(int8_t offset,
bool encoderButtonPressed,
bool shiftButtonPressed);
75 void doSongSwap(
bool preservePlayPosition =
false);
198 void finishTempolessRecording(
bool startPlaybackAgain,
int buttonLatencyForTempolessRecord,
bool shouldExitRecordMode =
true);
220 uint32_t timerTicksToOutputTicks(uint32_t timerTicks);
223 uint32_t timePerInternalTickMovingAverage;
224 uint32_t veryCurrentTimePerInternalTickInverse;
225 uint32_t stickyCurrentTimePerInternalTickInverse;
226 uint32_t lowpassedTimePerInternalTick;
227 uint32_t slowpassedTimePerInternalTick;
228 uint32_t stickyTimePerInternalTick;
231 uint16_t tapTempoNumPresses;
232 uint32_t tapTempoFirstPressTime;
234 int numOutputClocksWaitingToBeSent;
235 int numInputTicksToSkip;
238 void resetTimePerInternalTickMovingAverage();
239 void getCurrentTempoParams(int32_t *magnitude, int8_t *whichValue);
240 void displayTempoFromParams(int32_t magnitude, int8_t whichValue);
241 void displayTempoBPM(
float tempoBPM);
242 void getAnalogOutTicksToInternalTicksRatio(uint32_t* internalTicksPer, uint32_t* analogOutTicksPer);
243 void getMIDIClockOutTicksToInternalTicksRatio(uint32_t* internalTicksPer, uint32_t* midiClockOutTicksPer);
244 void getInternalTicksToInputTicksRatio(uint32_t* inputTicksPer, uint32_t* internalTicksPer);
245 void sendOutPositionViaMIDI(int32_t pos,
bool outputClocksWereSwitchedOff =
false);
247 bool startIgnoringMidiClockInputIfNecessary();
248 uint32_t setTempoFromAudioClipLength(uint64_t loopLengthSamples,
Action* action);
249 bool tryGlobalMIDICommands(
MIDIDevice* device,
int channel,
int note);
250 void decideOnCurrentPlaybackMode();
251 float getCurrentInternalTickFloatFollowingExternalClock();
252 void scheduleTriggerClockOutTickParamsKnown(uint32_t analogOutTicksPer, uint64_t fractionLastTimerTick, uint64_t fractionNextAnalogOutTick);
253 void scheduleMIDIClockOutTickParamsKnown(uint32_t midiClockOutTicksPer, uint64_t fractionLastTimerTick, uint64_t fractionNextMIDIClockOutTick);
Definition: InstrumentClip.h:54
Definition: MIDIDevice.h:74
Definition: playbackhandler.h:55
void songSelectReceived(uint8_t songId)
Definition: playbackhandler.cpp:2397
void inputTick(bool fromTriggerClock=false, uint32_t time=0)
Definition: playbackhandler.cpp:1403
void doTriggerClockOutTick()
Definition: playbackhandler.cpp:607
void setMidiOutClockMode(bool newValue)
Definition: playbackhandler.cpp:1827
void resyncAnalogOutTicksToInternalTicks()
Definition: playbackhandler.cpp:1600
float calculateBPM(float timePerInternalTick)
Definition: playbackhandler.cpp:1898
void switchToArrangement()
Definition: playbackhandler.cpp:2411
void programChangeReceived(int channel, int program)
Definition: playbackhandler.cpp:2289
int32_t getActualArrangementRecordPos()
Definition: playbackhandler.cpp:2559
void forceResetPlayPos(Song *song)
Definition: playbackhandler.cpp:2020
void noteMessageReceived(MIDIDevice *fromDevice, bool on, int channel, int note, int velocity, bool *doingMidiThru)
Definition: playbackhandler.cpp:2304
int getNumSwungTicksInSinceLastActionedSwungTick(uint32_t *timeRemainder=NULL)
Definition: playbackhandler.cpp:852
uint8_t numInputTickTimesCounted
Definition: playbackhandler.h:119
bool swungTickScheduled
Definition: playbackhandler.h:128
int32_t getArrangementRecordPosAtLastActionedSwungTick()
Definition: playbackhandler.cpp:2563
void stopAnyRecording()
Definition: playbackhandler.cpp:2195
int32_t getInternalTickTime(int64_t internalTickCount)
Definition: playbackhandler.cpp:1037
int64_t getCurrentInternalTickCount(uint32_t *remainder=NULL)
Definition: playbackhandler.cpp:935
void loopCommand(int overdubNature)
Definition: playbackhandler.cpp:2569
bool midiClockOutTickScheduled
Definition: playbackhandler.h:95
void displaySwingAmount()
Definition: playbackhandler.cpp:1621
void setupPlayback(int newPlaybackState, int32_t playFromPos, bool doOneLastAudioRoutineCall=false, bool shouldShiftAccordingToClipInstance=true, int buttonPressLatencyForTempolessRecord=0)
Definition: playbackhandler.cpp:360
void setupPlaybackUsingExternalClock(bool switchingFromInternalClock=false, bool fromContinueCommand=false)
Definition: playbackhandler.cpp:1190
int64_t lastSwungTickActioned
Definition: playbackhandler.h:136
void scheduleSwungTickFromExternalClock()
Definition: playbackhandler.cpp:1346
bool usingAnalogClockInput
Definition: playbackhandler.h:103
uint32_t scheduledSwungTickTime
Definition: playbackhandler.h:129
bool tempoMagnitudeMatchingActiveNow
Definition: playbackhandler.h:121
uint32_t analogInTicksPPQN
Definition: playbackhandler.h:144
bool isEitherClockActive()
Definition: playbackhandler.h:213
unsigned long targetedTimePerInputTick
Definition: playbackhandler.h:125
bool isCurrentlyRecording()
Definition: playbackhandler.cpp:2406
bool countInEnabled
Definition: playbackhandler.h:155
void scheduleMIDIClockOutTick()
Definition: playbackhandler.cpp:636
void routine()
Definition: playbackhandler.cpp:107
void resyncInternalTicksToInputTicks(Song *song)
Definition: playbackhandler.cpp:2006
float getTimePerInternalTickFloat()
Definition: playbackhandler.cpp:493
uint32_t timeNextTriggerClockOutTick
Definition: playbackhandler.h:140
int getNumSwungTicksInSinceLastTimerTick(uint32_t *timeRemainder=NULL)
Definition: playbackhandler.cpp:810
int64_t lastMIDIClockOutTickDone
Definition: playbackhandler.h:97
uint32_t timeNextMIDIClockOutTick
Definition: playbackhandler.h:96
void setLedStates()
Definition: playbackhandler.cpp:1976
void scheduleSwungTick()
Definition: playbackhandler.cpp:768
uint64_t getTimePerInternalTickBig()
Definition: playbackhandler.cpp:484
void doSongSwap(bool preservePlayPosition=false)
Definition: playbackhandler.cpp:1067
bool midiInClockEnabled
Definition: playbackhandler.h:153
bool analogClockInputAutoStart
Definition: playbackhandler.h:146
bool metronomeOn
Definition: playbackhandler.h:151
uint32_t timeLastMIDIStartOrContinueMessageSent
Definition: playbackhandler.h:108
uint32_t getTimePerInternalTickInverse(bool getStickyValue=false)
Definition: playbackhandler.cpp:1535
void reassessInputTickScaling()
uint32_t timePerInputTickMovingAverage
Definition: playbackhandler.h:118
void clockMessageReceived(uint32_t time)
Definition: playbackhandler.cpp:1336
int64_t nextTimerTickScheduled
Definition: playbackhandler.h:112
bool tempoMagnitudeMatchingEnabled
Definition: playbackhandler.h:154
uint32_t analogOutTicksPPQN
Definition: playbackhandler.h:143
void switchToSession()
Definition: playbackhandler.cpp:2429
unsigned long timeVeryFirstInputTick
Definition: playbackhandler.h:123
PlaybackHandler()
Definition: playbackhandler.cpp:84
void actionSwungTick()
Definition: playbackhandler.cpp:662
bool triggerClockOutTickScheduled
Definition: playbackhandler.h:139
int32_t posToNextContinuePlaybackFrom
Definition: playbackhandler.h:107
bool currentlySendingMIDIOutputClocks()
Definition: playbackhandler.cpp:319
void playButtonPressed(int buttonPressLatency)
Definition: playbackhandler.cpp:158
void scheduleNextTimerTick(uint32_t doubleSwingInterval)
Definition: playbackhandler.cpp:503
int64_t lastTriggerClockOutTickDone
Definition: playbackhandler.h:141
bool stopOutputRecordingAtLoopEnd
Definition: playbackhandler.h:202
bool songSwapShouldPreserveTempo
Definition: playbackhandler.h:148
uint32_t timeLastInputTicks[NUM_INPUT_TICKS_FOR_MOVING_AVERAGE]
Definition: playbackhandler.h:117
void finishTempolessRecording(bool startPlaybackAgain, int buttonLatencyForTempolessRecord, bool shouldExitRecordMode=true)
Definition: playbackhandler.cpp:2103
void continueMessageReceived()
Definition: playbackhandler.cpp:1307
void startMessageReceived()
Definition: playbackhandler.cpp:1277
void toggleMetronomeStatus()
Definition: playbackhandler.cpp:1996
uint32_t getTimePerInternalTick()
Definition: playbackhandler.cpp:475
uint64_t timeNextTimerTickBig
Definition: playbackhandler.h:113
uint64_t timeLastTimerTickBig
Definition: playbackhandler.h:114
void scheduleSwungTickFromInternalClock()
Definition: playbackhandler.cpp:774
int64_t lastInputTickReceived
Definition: playbackhandler.h:124
int32_t getTimeLeftInCountIn()
Definition: playbackhandler.cpp:2187
void actionTimerTickPart2()
Definition: playbackhandler.cpp:537
void displayTempoByCalculation()
Definition: playbackhandler.cpp:1893
void tapTempoAutoSwitchOff()
Definition: playbackhandler.cpp:338
void aftertouchReceived(MIDIDevice *fromDevice, int channel, int value, int noteCode, bool *doingMidiThru)
Definition: playbackhandler.cpp:2538
void recordButtonPressed()
Definition: playbackhandler.cpp:217
uint32_t timeLastAnalogClockInputRisingEdge
Definition: playbackhandler.h:145
void stopMessageReceived()
Definition: playbackhandler.cpp:1329
bool midiOutClockEnabled
Definition: playbackhandler.h:152
void actionTimerTick()
Definition: playbackhandler.cpp:516
void analogClockRisingEdge(uint32_t time)
Definition: playbackhandler.cpp:1171
void pitchBendReceived(MIDIDevice *fromDevice, uint8_t channel, uint8_t data1, uint8_t data2, bool *doingMidiThru)
Definition: playbackhandler.cpp:2448
bool ignoringMidiClockInput
Definition: playbackhandler.h:105
void resyncMIDIClockOutTicksToInternalTicks()
Definition: playbackhandler.cpp:1610
uint8_t recording
Definition: playbackhandler.h:104
int32_t ticksLeftInCountIn
Definition: playbackhandler.h:159
void midiCCReceived(MIDIDevice *fromDevice, uint8_t channel, uint8_t ccNumber, uint8_t value, bool *doingMidiThru)
Definition: playbackhandler.cpp:2489
void scheduleTriggerClockOutTick()
Definition: playbackhandler.cpp:615
int32_t arrangementPosToStartAtOnSwitch
Definition: playbackhandler.h:200
void tapTempoButtonPress()
Definition: playbackhandler.cpp:2205
int32_t swungTicksTilNextEvent
Definition: playbackhandler.h:157
void expectEvent()
Definition: playbackhandler.cpp:2381
void setupPlaybackUsingInternalClock(int buttonPressLatencyForTempolessRecord=0, bool allowCountIn=true)
Definition: playbackhandler.cpp:253
void positionPointerReceived(uint8_t data1, uint8_t data2)
Definition: playbackhandler.cpp:1254
void tempoEncoderAction(int8_t offset, bool encoderButtonPressed, bool shiftButtonPressed)
Definition: playbackhandler.cpp:1642
void endPlayback()
Definition: playbackhandler.cpp:418
bool subModeAllowsRecording()
Definition: playbackhandler.cpp:2392
int64_t getActualSwungTickCount(uint32_t *timeRemainder=NULL)
Definition: playbackhandler.cpp:861
void setMidiInClockEnabled(bool newValue)
Definition: playbackhandler.cpp:1850
uint8_t playbackState
Definition: playbackhandler.h:102
int32_t metronomeOffset
Definition: playbackhandler.h:162
bool shouldRecordNotesNow()
Definition: playbackhandler.cpp:2180
int64_t lastTimerTickActioned
Definition: playbackhandler.h:111
void slowRoutine()
Definition: playbackhandler.cpp:128
void doMIDIClockOutTick()
Definition: playbackhandler.cpp:656
int currentVisualCountForCountIn
Definition: playbackhandler.h:160
void grabTempoFromClip(Clip *clip)
Definition: playbackhandler.cpp:2036
const uint16_t metronomeValueBoundaries[16]
Definition: playbackhandler.h:52
PlaybackHandler playbackHandler
Definition: playbackhandler.cpp:70
#define NUM_INPUT_TICKS_FOR_MOVING_AVERAGE
Definition: playbackhandler.h:33
const uint8_t metronomeValuesBPM[16]
Definition: playbackhandler.h:50
#define PLAYBACK_CLOCK_EITHER_ACTIVE
Definition: playbackhandler.h:39