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;
66 void potentiallyRenderClipLaunchPlayhead(
bool reallyNoTickSquare, int32_t sixteenthNotesRemaining);
67 void requestRendering(
UI* ui, uint32_t whichMainRows = 0xFFFFFFFF, uint32_t whichSideRows = 0xFFFFFFFF);
69 int32_t getClipPlaceOnScreen(
Clip* clip);
70 void drawStatusSquare(uint8_t yDisplay,
RGB thisImage[]);
71 void drawSectionSquare(uint8_t yDisplay,
RGB thisImage[]);
72 bool calculateZoomPinSquares(uint32_t oldScroll, uint32_t newScroll, uint32_t newZoom, uint32_t oldZoom)
override;
73 uint32_t getMaxLength()
override;
74 bool setupScroll(uint32_t oldScroll)
override;
75 uint32_t getClipLocalScroll(
Clip* loopable, uint32_t overviewScroll, uint32_t xZoom);
76 void flashPlayRoutine();
78 void modEncoderButtonAction(uint8_t whichModEncoder,
bool on)
override;
79 void modButtonAction(uint8_t whichButton,
bool on)
override;
80 void selectEncoderAction(int8_t offset)
override;
81 ActionResult timerCallback()
override;
84 void editNumRepeatsTilLaunch(int32_t offset);
85 uint32_t getGreyedOutRowsNotRepresentingOutput(
Output* output)
override;
86 bool renderMainPads(uint32_t whichRows,
RGB image[][kDisplayWidth + kSideBarWidth],
87 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth],
bool drawUndefinedArea =
true)
override;
88 void midiLearnFlash()
override;
90 void transitionToViewForClip(
Clip* clip =
nullptr);
91 void transitionToSessionView();
92 void finishedTransitioningHere();
93 void playbackEnded()
override;
94 void clipNeedsReRendering(
Clip* clip)
override;
95 void sampleNeedsReRendering(
Sample* sample)
override;
96 Clip* getClipOnScreen(int32_t yDisplay);
97 Output* getOutputFromPad(int32_t x, int32_t y);
98 void modEncoderAction(int32_t whichModEncoder, int32_t offset)
override;
99 ActionResult verticalScrollOneSquare(int32_t direction);
104 void redrawNumericDisplay();
105 void clearNumericDisplay();
106 void displayRepeatsTilLaunch();
108 uint32_t selectedClipTimePressed;
109 uint8_t selectedClipYDisplay;
110 uint8_t selectedClipPressYDisplay;
111 uint8_t selectedClipPressXDisplay;
112 bool clipWasSelectedWithShift;
113 bool performActionOnPadRelease;
114 bool performActionOnSectionPadRelease;
116 uint8_t sectionPressed;
117 uint8_t masterCompEditMode;
118 int8_t selectedMacro = -1;
120 Clip* getClipForLayout();
121 int32_t getClipIndexForLayout();
123 void copyClipName(
Clip* source,
Clip* target,
Output* targetOutput);
126 inline bool gridFirstPadActive() {
return (gridFirstPressedX != -1 && gridFirstPressedY != -1); }
127 ActionResult gridHandlePads(int32_t x, int32_t y, int32_t on);
128 ActionResult gridHandleScroll(int32_t offsetX, int32_t offsetY);
134 Clip* createNewClip(OutputType outputType, int32_t yDisplay);
135 bool createClip{
false};
136 OutputType lastTypeCreated{OutputType::NONE};
139 void enterMacrosConfigMode();
140 void exitMacrosConfigMode();
141 char const* getMacroKindString(SessionMacroKind kind);
144 void enterMidiLearnMode();
145 void exitMidiLearnMode();
148 void displayPotentialTempoChange(UI* ui);
149 void displayTempoBPM(deluge::hid::display::oled_canvas::Canvas& canvas, StringBuf& tempoBPM,
bool clearArea);
150 float lastDisplayedTempo = 0;
153 void displayCurrentRootNoteAndScaleName(deluge::hid::display::oled_canvas::Canvas& canvas,
154 StringBuf& rootNoteAndScaleName,
bool clearArea);
155 int16_t lastDisplayedRootNote = 0;
158 void replaceInstrumentClipWithAudioClip(Clip* clip);
161 void gridPulseSelectedClip();
168 void commandChangeSectionRepeats(int8_t offset);
169 void commandChangeClipPreset(int8_t offset);
170 void commandChangeCurrentSectionRepeats(int8_t offset);
171 void commandChangeLayout(int8_t offset);
175 void sectionPadAction(uint8_t y,
bool on);
176 void clipPressEnded();
177 void drawSectionRepeatNumber();
178 void beginEditingSectionRepeatsNum();
179 void goToArrangementEditor();
180 void rowNeedsRenderingDependingOnSubMode(int32_t yDisplay);
181 void setCentralLEDStates();
183 Clip* createNewAudioClip(int32_t yDisplay);
184 Clip* createNewInstrumentClip(OutputType outputType, int32_t yDisplay);
186 bool createNewTrackForAudioClip(AudioClip* newClip);
187 bool createNewTrackForInstrumentClip(OutputType type, InstrumentClip* clip,
bool copyDrumsFromClip);
189 bool insertAndResyncNewClip(Clip* newClip, int32_t yDisplay);
190 void resyncNewClip(Clip* newClip, ModelStackWithTimelineCounter* modelStackWithTimelineCounter);
194 void selectLayout(int8_t offset);
195 void renderLayoutChange(
bool displayPopup =
true);
196 void selectSpecificLayout(SessionLayoutType layout);
197 SessionLayoutType previousLayout;
198 SessionGridMode previousGridModeActive;
200 bool sessionButtonActive =
false;
201 bool sessionButtonUsed =
false;
202 bool horizontalEncoderPressed =
false;
203 bool viewingRecordArmingActive =
false;
206 bool gridRenderSidebar(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
207 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth]);
208 void gridRenderActionModes(int32_t y, RGB image[][kDisplayWidth + kSideBarWidth],
209 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth]);
210 bool gridRenderMainPads(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
211 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth],
bool drawUndefinedArea =
true);
213 RGB gridRenderClipColor(Clip* clip, int32_t x, int32_t y,
bool renderPulse =
true);
215 ActionResult gridHandlePadsEdit(int32_t x, int32_t y, int32_t on, Clip* clip);
216 ActionResult gridHandlePadsLaunch(int32_t x, int32_t y, int32_t on, Clip* clip);
217 ActionResult gridHandlePadsLaunchImmediate(int32_t x, int32_t y, int32_t on, Clip* clip);
218 ActionResult gridHandlePadsLaunchWithSelection(int32_t x, int32_t y, int32_t on, Clip* clip);
219 void gridHandlePadsWithMidiLearnPressed(int32_t x, int32_t on, Clip* clip);
220 ActionResult gridHandlePadsMacros(int32_t x, int32_t y, int32_t on, Clip* clip);
221 void gridHandlePadsLaunchToggleArming(Clip* clip,
bool immediate);
223 void gridTransitionToSessionView();
224 void gridTransitionToViewForClip(Clip* clip);
226 SessionGridMode gridModeSelected = SessionGridModeEdit;
227 SessionGridMode gridModeActive = SessionGridModeEdit;
228 bool gridActiveModeUsed =
false;
230 int32_t gridFirstPressedX = -1;
231 int32_t gridFirstPressedY = -1;
232 int32_t gridSecondPressedX = -1;
233 int32_t gridSecondPressedY = -1;
234 inline bool gridSecondPadInactive() {
return (gridSecondPressedX == -1 && gridSecondPressedY == -1); }
236 inline void gridResetPresses(
bool first =
true,
bool second =
true) {
238 gridFirstPressedX = -1;
239 gridFirstPressedY = -1;
242 gridSecondPressedX = -1;
243 gridSecondPressedY = -1;
247 Clip* gridCloneClip(Clip* sourceClip);
248 Clip* gridCreateClipInTrack(Output* targetOutput);
249 AudioClip* gridCreateAudioClipWithNewTrack();
250 InstrumentClip* gridCreateInstrumentClipWithNewTrack(OutputType type);
251 Clip* gridCreateClip(uint32_t targetSection, Output* targetOutput =
nullptr, Clip* sourceClip =
nullptr);
252 void gridClonePad(uint32_t sourceX, uint32_t sourceY, uint32_t targetX, uint32_t targetY);
253 void setupNewClip(Clip* newClip);
255 void gridStartSection(uint32_t section,
bool instant);
256 void gridToggleClipPlay(Clip* clip,
bool instant);
258 [[nodiscard]]
const size_t gridTrackCount()
const;
259 uint32_t gridClipCountForTrack(Output* track);
260 uint32_t gridTrackIndexFromTrack(Output* track, uint32_t maxTrack);
261 Output* gridTrackFromIndex(uint32_t trackIndex, uint32_t maxTrack);
262 int32_t gridYFromSection(uint32_t section);
263 int32_t gridSectionFromY(uint32_t y);
264 int32_t gridXFromTrack(uint32_t trackIndex);
265 int32_t gridTrackIndexFromX(uint32_t x, uint32_t maxTrack);
266 Output* gridTrackFromX(uint32_t x, uint32_t maxTrack);
267 Clip* gridClipFromCoords(uint32_t x, uint32_t y);
268 int32_t gridClipIndexFromCoords(uint32_t x, uint32_t y);
269 Cartesian gridXYFromClip(Clip& clip);
271 void gridSetDefaultMode() {
272 switch (FlashStorage::defaultGridActiveMode) {
273 case GridDefaultActiveModeGreen: {
274 gridModeSelected = SessionGridModeLaunch;
277 case GridDefaultActiveModeBlue: {
278 gridModeSelected = SessionGridModeEdit;
282 case GridDefaultActiveModeSelection:
283 case GridDefaultActiveModeMaxElement:;
287 void setupTrackCreation()
const;
288 void exitTrackCreation();
304 bool gridSelectedClipPulsing =
false;
305 Clip* selectedClipForPulsing =
nullptr;
306 RGB gridSelectedClipRenderedColour;
307 bool blendDirection =
false;
308 int32_t progress = 0;
310 static constexpr int32_t kMinProgress = 1;
311 static constexpr int32_t kMaxProgressFull = (65535 / 100) * 60;
312 static constexpr int32_t kMaxProgressDim = 1000;
313 static constexpr int32_t kPulseRate = 50;
314 static constexpr int32_t kBlendRate = 60;
315 static constexpr int32_t kBlendOffsetFull = kPulseRate * kBlendRate;
316 static constexpr int32_t kBlendOffsetDim = kPulseRate;