44class SessionView final :
public ClipNavigationTimelineView {
47 bool getGreyoutColsAndRows(uint32_t* cols, uint32_t* rows)
override;
48 bool opened()
override;
49 void focusRegained()
override;
51 ActionResult buttonAction(deluge::hid::Button b,
bool on,
bool inCardRoutine)
override;
52 ActionResult clipCreationButtonPressed(hid::Button i,
bool on,
bool routine);
53 ActionResult padAction(int32_t x, int32_t y, int32_t velocity)
override;
54 ActionResult horizontalEncoderAction(int32_t offset)
override;
55 ActionResult verticalEncoderAction(int32_t offset,
bool inCardRoutine)
override;
56 bool renderSidebar(uint32_t whichRows,
RGB image[][kDisplayWidth + kSideBarWidth],
57 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth])
override;
58 void removeClip(
Clip* clip);
59 void redrawClipsOnScreen(
bool doRender =
true);
60 uint32_t getMaxZoom()
override;
61 void cloneClip(uint8_t yDisplayFrom, uint8_t yDisplayTo);
62 bool renderRow(
ModelStack* modelStack, uint8_t yDisplay,
RGB thisImage[kDisplayWidth + kSideBarWidth],
63 uint8_t thisOccupancyMask[kDisplayWidth + kSideBarWidth],
bool drawUndefinedArea =
true);
64 void graphicsRoutine()
override;
65 void potentiallyUpdateCompressorLEDs();
67 void potentiallyRenderClipLaunchPlayhead(
bool reallyNoTickSquare, int32_t sixteenthNotesRemaining);
68 void requestRendering(
UI* ui, uint32_t whichMainRows = 0xFFFFFFFF, uint32_t whichSideRows = 0xFFFFFFFF);
70 int32_t getClipPlaceOnScreen(
Clip* clip);
71 void drawStatusSquare(uint8_t yDisplay,
RGB thisImage[]);
72 void drawSectionSquare(uint8_t yDisplay,
RGB thisImage[]);
73 bool calculateZoomPinSquares(uint32_t oldScroll, uint32_t newScroll, uint32_t newZoom, uint32_t oldZoom)
override;
74 uint32_t getMaxLength()
override;
75 bool setupScroll(uint32_t oldScroll)
override;
76 uint32_t getClipLocalScroll(
Clip* loopable, uint32_t overviewScroll, uint32_t xZoom);
77 void flashPlayRoutine();
79 void modEncoderButtonAction(uint8_t whichModEncoder,
bool on)
override;
80 void modButtonAction(uint8_t whichButton,
bool on)
override;
81 void selectEncoderAction(int8_t offset)
override;
82 ActionResult timerCallback()
override;
85 void editNumRepeatsTilLaunch(int32_t offset);
86 uint32_t getGreyedOutRowsNotRepresentingOutput(
Output* output)
override;
87 bool renderMainPads(uint32_t whichRows,
RGB image[][kDisplayWidth + kSideBarWidth],
88 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth],
bool drawUndefinedArea =
true)
override;
89 void midiLearnFlash()
override;
91 void transitionToViewForClip(
Clip* clip =
nullptr);
92 void transitionToSessionView();
93 void finishedTransitioningHere();
94 void playbackEnded()
override;
95 void clipNeedsReRendering(
Clip* clip)
override;
96 void sampleNeedsReRendering(
Sample* sample)
override;
97 Clip* getClipOnScreen(int32_t yDisplay);
98 Output* getOutputFromPad(int32_t x, int32_t y);
99 void modEncoderAction(int32_t whichModEncoder, int32_t offset)
override;
100 ActionResult verticalScrollOneSquare(int32_t direction);
105 void redrawNumericDisplay();
106 void clearNumericDisplay();
107 void displayRepeatsTilLaunch();
109 uint32_t selectedClipTimePressed;
110 uint8_t selectedClipYDisplay;
111 uint8_t selectedClipPressYDisplay;
112 uint8_t selectedClipPressXDisplay;
113 bool clipWasSelectedWithShift;
114 bool performActionOnPadRelease;
115 bool performActionOnSectionPadRelease;
117 uint8_t sectionPressed;
118 uint8_t masterCompEditMode;
119 int8_t selectedMacro = -1;
121 Clip* getClipForLayout();
122 int32_t getClipIndexForLayout();
124 void copyClipName(
Clip* source,
Clip* target,
Output* targetOutput);
127 inline bool gridFirstPadActive() {
return (gridFirstPressedX != -1 && gridFirstPressedY != -1); }
128 ActionResult gridHandlePads(int32_t x, int32_t y, int32_t on);
129 ActionResult gridHandleScroll(int32_t offsetX, int32_t offsetY);
135 Clip* createNewClip(OutputType outputType, int32_t yDisplay);
136 bool createClip{
false};
137 OutputType lastTypeCreated{OutputType::NONE};
140 void enterMacrosConfigMode();
141 void exitMacrosConfigMode();
142 char const* getMacroKindString(SessionMacroKind kind);
145 void enterMidiLearnMode();
146 void exitMidiLearnMode();
149 void displayPotentialTempoChange(UI* ui);
150 void displayTempoBPM(deluge::hid::display::oled_canvas::Canvas& canvas, StringBuf& tempoBPM,
bool clearArea);
151 float lastDisplayedTempo = 0;
154 void displayCurrentRootNoteAndScaleName(deluge::hid::display::oled_canvas::Canvas& canvas,
155 StringBuf& rootNoteAndScaleName,
bool clearArea);
156 int16_t lastDisplayedRootNote = 0;
159 void replaceInstrumentClipWithAudioClip(Clip* clip);
162 void gridPulseSelectedClip();
169 void commandChangeSectionRepeats(int8_t offset);
170 void commandChangeClipPreset(int8_t offset);
171 void commandChangeCurrentSectionRepeats(int8_t offset);
172 void commandChangeLayout(int8_t offset);
176 void sectionPadAction(uint8_t y,
bool on);
177 void clipPressEnded();
178 void drawSectionRepeatNumber();
179 void beginEditingSectionRepeatsNum();
180 void goToArrangementEditor();
181 void rowNeedsRenderingDependingOnSubMode(int32_t yDisplay);
182 void setCentralLEDStates();
184 Clip* createNewAudioClip(int32_t yDisplay);
185 Clip* createNewInstrumentClip(OutputType outputType, int32_t yDisplay);
187 bool createNewTrackForAudioClip(AudioClip* newClip);
188 bool createNewTrackForInstrumentClip(OutputType type, InstrumentClip* clip,
bool copyDrumsFromClip);
190 bool insertAndResyncNewClip(Clip* newClip, int32_t yDisplay);
191 void resyncNewClip(Clip* newClip, ModelStackWithTimelineCounter* modelStackWithTimelineCounter);
195 void selectLayout(int8_t offset);
196 void renderLayoutChange(
bool displayPopup =
true);
197 void selectSpecificLayout(SessionLayoutType layout);
198 SessionLayoutType previousLayout;
199 SessionGridMode previousGridModeActive;
201 bool sessionButtonActive =
false;
202 bool sessionButtonUsed =
false;
203 bool horizontalEncoderPressed =
false;
204 bool viewingRecordArmingActive =
false;
207 bool gridRenderSidebar(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
208 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth]);
209 void gridRenderActionModes(int32_t y, RGB image[][kDisplayWidth + kSideBarWidth],
210 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth]);
211 bool gridRenderMainPads(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
212 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth],
bool drawUndefinedArea =
true);
214 RGB gridRenderClipColor(Clip* clip, int32_t x, int32_t y,
bool renderPulse =
true);
216 ActionResult gridHandlePadsEdit(int32_t x, int32_t y, int32_t on, Clip* clip);
217 ActionResult gridHandlePadsLaunch(int32_t x, int32_t y, int32_t on, Clip* clip);
218 ActionResult gridHandlePadsLaunchImmediate(int32_t x, int32_t y, int32_t on, Clip* clip);
219 ActionResult gridHandlePadsLaunchWithSelection(int32_t x, int32_t y, int32_t on, Clip* clip);
220 void gridHandlePadsWithMidiLearnPressed(int32_t x, int32_t on, Clip* clip);
221 ActionResult gridHandlePadsMacros(int32_t x, int32_t y, int32_t on, Clip* clip);
222 void gridHandlePadsLaunchToggleArming(Clip* clip,
bool immediate);
224 void gridTransitionToSessionView();
225 void gridTransitionToViewForClip(Clip* clip);
227 SessionGridMode gridModeSelected = SessionGridModeEdit;
228 SessionGridMode gridModeActive = SessionGridModeEdit;
229 bool gridActiveModeUsed =
false;
231 int32_t gridFirstPressedX = -1;
232 int32_t gridFirstPressedY = -1;
233 int32_t gridSecondPressedX = -1;
234 int32_t gridSecondPressedY = -1;
235 inline bool gridSecondPadInactive() {
return (gridSecondPressedX == -1 && gridSecondPressedY == -1); }
237 inline void gridResetPresses(
bool first =
true,
bool second =
true) {
239 gridFirstPressedX = -1;
240 gridFirstPressedY = -1;
243 gridSecondPressedX = -1;
244 gridSecondPressedY = -1;
248 Clip* gridCloneClip(Clip* sourceClip);
249 Clip* gridCreateClipInTrack(Output* targetOutput);
250 AudioClip* gridCreateAudioClipWithNewTrack();
251 InstrumentClip* gridCreateInstrumentClipWithNewTrack(OutputType type);
252 Clip* gridCreateClip(uint32_t targetSection, Output* targetOutput =
nullptr, Clip* sourceClip =
nullptr);
253 void gridClonePad(uint32_t sourceX, uint32_t sourceY, uint32_t targetX, uint32_t targetY);
254 void setupNewClip(Clip* newClip);
256 void gridStartSection(uint32_t section,
bool instant);
257 void gridToggleClipPlay(Clip* clip,
bool instant);
259 [[nodiscard]]
const size_t gridTrackCount()
const;
260 uint32_t gridClipCountForTrack(Output* track);
261 uint32_t gridTrackIndexFromTrack(Output* track, uint32_t maxTrack);
262 Output* gridTrackFromIndex(uint32_t trackIndex, uint32_t maxTrack);
263 int32_t gridYFromSection(uint32_t section);
264 int32_t gridSectionFromY(uint32_t y);
265 int32_t gridXFromTrack(uint32_t trackIndex);
266 int32_t gridTrackIndexFromX(uint32_t x, uint32_t maxTrack);
267 Output* gridTrackFromX(uint32_t x, uint32_t maxTrack);
268 Clip* gridClipFromCoords(uint32_t x, uint32_t y);
269 int32_t gridClipIndexFromCoords(uint32_t x, uint32_t y);
270 Cartesian gridXYFromClip(Clip& clip);
272 void gridSetDefaultMode() {
273 switch (FlashStorage::defaultGridActiveMode) {
274 case GridDefaultActiveModeGreen: {
275 gridModeSelected = SessionGridModeLaunch;
278 case GridDefaultActiveModeBlue: {
279 gridModeSelected = SessionGridModeEdit;
283 case GridDefaultActiveModeSelection:
284 case GridDefaultActiveModeMaxElement:;
288 void setupTrackCreation()
const;
289 void exitTrackCreation();
305 bool gridSelectedClipPulsing =
false;
306 Clip* selectedClipForPulsing =
nullptr;
307 RGB gridSelectedClipRenderedColour;
308 bool blendDirection =
false;
309 int32_t progress = 0;
311 static constexpr int32_t kMinProgress = 1;
312 static constexpr int32_t kMaxProgressFull = (65535 / 100) * 60;
313 static constexpr int32_t kMaxProgressDim = 1000;
314 static constexpr int32_t kPulseRate = 50;
315 static constexpr int32_t kBlendRate = 60;
316 static constexpr int32_t kBlendOffsetFull = kPulseRate * kBlendRate;
317 static constexpr int32_t kBlendOffsetDim = kPulseRate;