Deluge Firmware 1.3.0
Build date: 2025.04.16
Loading...
Searching...
No Matches
performance_view.h
1/*
2 * Copyright (c) 2023 Sean Ditny
3 *
4 * This file is part of The Synthstrom Audible Deluge Firmware.
5 *
6 * The Synthstrom Audible Deluge Firmware is free software: you can redistribute it and/or modify it under the
7 * terms of the GNU General Public License as published by the Free Software Foundation,
8 * either version 3 of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
11 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 * See the GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along with this program.
15 * If not, see <https://www.gnu.org/licenses/>.
16 */
17
18#pragma once
19
20#include "definitions_cxx.hpp"
21#include "gui/views/clip_navigation_timeline_view.h"
22#include "hid/button.h"
23#include "modulation/params/param.h"
24#include "storage/storage_manager.h"
25
26class Editor;
27class InstrumentClip;
28class Clip;
29class ModelStack;
32
33struct PadPress {
34 bool isActive;
35 int32_t xDisplay;
36 int32_t yDisplay;
38 int32_t paramID;
39};
40
42 int32_t previousKnobPosition;
43 int32_t currentKnobPosition;
44 int32_t yDisplay;
45 uint32_t timeLastPadPress;
46 bool padPressHeld;
47};
48
50 deluge::modulation::params::Kind paramKind = deluge::modulation::params::Kind::NONE;
52 int32_t xDisplay = kNoSelection;
53 int32_t yDisplay = kNoSelection;
54 RGB rowColour = deluge::gui::colours::black;
55 RGB rowTailColour = deluge::gui::colours::black;
56};
57
58class PerformanceView final : public ClipNavigationTimelineView {
59public:
60 PerformanceView();
61 bool getGreyoutColsAndRows(uint32_t* cols, uint32_t* rows) override;
62 bool opened() override;
63 void focusRegained() override;
64
65 void graphicsRoutine() override;
66 ActionResult timerCallback() override;
67
68 // ui
69 UIType getUIType() override { return UIType::PERFORMANCE; }
70 [[nodiscard]] int32_t getNavSysId() const override;
71
72 // rendering
73 bool renderMainPads(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
74 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth], bool drawUndefinedArea = true) override;
75 bool renderSidebar(uint32_t whichRows, RGB image[][kDisplayWidth + kSideBarWidth],
76 uint8_t occupancyMask[][kDisplayWidth + kSideBarWidth]) override;
77 void renderViewDisplay();
78 void renderOLED(deluge::hid::display::oled_canvas::Canvas& canvas) override;
79 // 7SEG only
80 void redrawNumericDisplay();
81 void setLedStates();
82
83 // button action
84 ActionResult buttonAction(deluge::hid::Button b, bool on, bool inCardRoutine) override;
85
86 // pad action
87 ActionResult padAction(int32_t x, int32_t y, int32_t velocity) override;
88
89 // horizontal encoder action
90 ActionResult horizontalEncoderAction(int32_t offset) override;
91
92 // vertical encoder action
93 ActionResult verticalEncoderAction(int32_t offset, bool inCardRoutine) override;
94
95 // mod encoder action
96 void modEncoderAction(int32_t whichModEncoder, int32_t offset) override;
97 void modEncoderButtonAction(uint8_t whichModEncoder, bool on) override;
98 void modButtonAction(uint8_t whichButton, bool on) override;
99
100 // select encoder action
101 void selectEncoderAction(int8_t offset) override;
102
103 // not sure why we need these...
104 uint32_t getMaxZoom() override;
105 uint32_t getMaxLength() override;
106
107 // public so soundEditor can access it
112 bool defaultEditingMode;
113 bool editingParam; // if you're not editing a param, you're editing a value
114 bool justExitedSoundEditor;
115
116 // public so Action Logger can access it
117 FXColumnPress fxPress[kDisplayWidth];
118
119 // public so view.modEncoderAction and midi follow can access it
120 PadPress lastPadPress;
121 void renderFXDisplay(deluge::modulation::params::Kind paramKind, int32_t paramID, int32_t knobPos = kNoSelection);
122 bool onFXDisplay;
123
124 uint32_t timeKeyboardShortcutPress;
125
126 // public so mod controllable audio and midi follow can access it
127 bool possiblyRefreshPerformanceViewDisplay(deluge::modulation::params::Kind kind, int32_t id, int32_t newKnobPos);
128
129private:
130 // initialize
131 void initPadPress(PadPress& padPress);
132 void initFXPress(FXColumnPress& columnPress);
133 void initLayout(ParamsForPerformance& layout);
134 void initDefaultFXValues(int32_t xDisplay);
135
136 // rendering
137 void renderRow(RGB* image, int32_t yDisplay);
138 bool isParamAssignedToFXColumn(deluge::modulation::params::Kind paramKind, int32_t paramID);
139 void setCentralLEDStates();
140
141 // pad action
142 void normalPadAction(ModelStackWithThreeMainThings* modelStack, int32_t xDisplay, int32_t yDisplay, int32_t on);
143 void paramEditorPadAction(ModelStackWithThreeMainThings* modelStack, int32_t xDisplay, int32_t yDisplay,
144 int32_t on);
145 bool isPadShortcut(int32_t xDisplay, int32_t yDisplay);
147 int32_t paramID, int32_t xDisplay, int32_t knobPos, bool renderDisplay = true);
149 int32_t paramID, int32_t xDisplay, bool renderDisplay = true);
150 void padPressAction(ModelStackWithThreeMainThings* modelStack, deluge::modulation::params::Kind paramKind,
151 int32_t paramID, int32_t xDisplay, int32_t yDisplay, bool renderDisplay = true);
152 void padReleaseAction(ModelStackWithThreeMainThings* modelStack, deluge::modulation::params::Kind paramKind,
153 int32_t paramID, int32_t xDisplay, bool renderDisplay = true);
154 void resetFXColumn(ModelStackWithThreeMainThings* modelStack, int32_t xDisplay);
156 void resetPadPressInfo();
158
160 void writeDefaultsToFile();
162 void writeDefaultFXParamToFile(Serializer& writer, int32_t xDisplay);
163 void writeDefaultFXRowValuesToFile(Serializer& writer, int32_t xDisplay);
164 void writeDefaultFXHoldStatusToFile(Serializer& writer, int32_t xDisplay);
165 void loadDefaultLayout();
168 void readDefaultFXValuesFromFile();
169 void readDefaultFXParamAndRowValuesFromFile(int32_t xDisplay);
170 void readDefaultFXParamFromFile(int32_t xDisplay);
171 void readDefaultFXRowNumberValuesFromFile(int32_t xDisplay);
172 void readDefaultFXHoldStatusFromFile(int32_t xDisplay);
173 void initializeHeldFX(int32_t xDisplay);
174 bool successfullyReadDefaultsFromFile;
175 bool anyChangesToSave;
176
181 ParamsForPerformance backupXMLDefaultLayoutForPerformance[kDisplayWidth];
182 int32_t backupXMLDefaultFXValues[kDisplayWidth][kDisplayHeight];
183
184 int32_t getKnobPosForSinglePadPress(int32_t xDisplay, int32_t yDisplay);
185 int32_t calculateKnobPosForSelectEncoderTurn(int32_t knobPos, int32_t offset);
186
187 PadPress firstPadPress;
188 ParamsForPerformance layoutForPerformance[kDisplayWidth];
189 int32_t defaultFXValues[kDisplayWidth][kDisplayHeight];
190 int32_t layoutBank; // A or B (assign a layout to the bank for cross fader action)
191 int32_t layoutVariant; // 1, 2, 3, 4, 5 (1 = Load, 2 = Synth, 3 = Kit, 4 = Midi, 5 = CV)
192
193 // backup current layout
195 bool performanceLayoutBackedUp;
196 bool shouldRestorePreviousHoldPress(int32_t xDisplay);
197 void restorePreviousHoldPress(int32_t xDisplay);
198 void logPerformanceViewPress(int32_t xDisplay, bool closeAction = true);
199 bool anyChangesToLog();
200 FXColumnPress backupFXPress[kDisplayWidth];
201
202 // Members regarding rendering different layouts
203private:
204 bool sessionButtonActive = false;
205 bool sessionButtonUsed = false;
206};
207
208extern PerformanceView performanceView;
Definition clip.h:46
Definition instrument_clip.h:48
Definition model_stack.h:269
Definition model_stack.h:231
Definition model_stack.h:123
Definition performance_view.h:58
void renderViewDisplay()
Definition performance_view.cpp:476
void writeDefaultFXValuesToFile(Serializer &writer)
Definition performance_view.cpp:1732
void readDefaultsFromFile()
read defaults from XML
Definition performance_view.cpp:1848
void renderRow(RGB *image, int32_t yDisplay)
render every column, one row at a time
Definition performance_view.cpp:384
void writeDefaultsToFile()
write/load default values
Definition performance_view.cpp:1703
void resetPerformanceView(ModelStackWithThreeMainThings *modelStack)
Definition performance_view.cpp:1332
void modEncoderButtonAction(uint8_t whichModEncoder, bool on) override
used to reset stutter if it's already active
Definition performance_view.cpp:1608
void normalPadAction(ModelStackWithThreeMainThings *modelStack, int32_t xDisplay, int32_t yDisplay, int32_t on)
process pad actions in the normal performance view or value editor
Definition performance_view.cpp:1071
void releaseViewOnExit(ModelStackWithThreeMainThings *modelStack)
Definition performance_view.cpp:1370
void getParameterValue(ModelStackWithThreeMainThings *modelStack, deluge::modulation::params::Kind paramKind, int32_t paramID, int32_t xDisplay, bool renderDisplay=true)
Definition performance_view.cpp:1454
FXColumnPress backupXMLDefaultFXPress[kDisplayWidth]
Definition performance_view.h:180
void resetFXColumn(ModelStackWithThreeMainThings *modelStack, int32_t xDisplay)
Definition performance_view.cpp:1355
void savePerformanceViewLayout()
update saved perfomance view layout and update saved changes status
Definition performance_view.cpp:1696
void writeDefaultFXParamToFile(Serializer &writer, int32_t xDisplay)
convert paramID to a paramName to write to XML
Definition performance_view.cpp:1748
void readDefaultsFromBackedUpFile()
re-read defaults from backed up XML in memory in order to reduce SD Card IO
Definition performance_view.cpp:1832
void updateLayoutChangeStatus()
Definition performance_view.cpp:1649
void loadPerformanceViewLayout()
backup current layout, load saved layout, log layout change, update change status
Definition performance_view.cpp:1814
uint32_t getMaxZoom() override
why do I need this? (code won't compile without it)
Definition performance_view.cpp:1577
void writeDefaultFXHoldStatusToFile(Serializer &writer, int32_t xDisplay)
Definition performance_view.cpp:1784
void releaseStutter(ModelStackWithThreeMainThings *modelStack)
check if stutter is active and release it if it is
Definition performance_view.cpp:1384
bool anyChangesToLog()
check if there are any changes that needed to be logged in action logger for undo/redo mechanism to w...
Definition performance_view.cpp:1306
void modEncoderAction(int32_t whichModEncoder, int32_t offset) override
Definition performance_view.cpp:1588
void resetPadPressInfo()
initialize pad press info structs
Definition performance_view.cpp:1378
bool isParamAssignedToFXColumn(deluge::modulation::params::Kind paramKind, int32_t paramID)
check if a param has been assinged to any of the FX columns
Definition performance_view.cpp:442
void writeDefaultFXRowValuesToFile(Serializer &writer, int32_t xDisplay)
Definition performance_view.cpp:1767
uint32_t getMaxLength() override
why do I need this? (code won't compile without it)
Definition performance_view.cpp:1582
void restorePreviousHoldPress(int32_t xDisplay)
re-load performance layout column press info from backup
Definition performance_view.cpp:1285
bool isPadShortcut(int32_t xDisplay, int32_t yDisplay)
check if pad press corresponds to a shortcut pad on the grid
Definition performance_view.cpp:1266
void paramEditorPadAction(ModelStackWithThreeMainThings *modelStack, int32_t xDisplay, int32_t yDisplay, int32_t on)
process pad actions in the param editor
Definition performance_view.cpp:1203
void loadDefaultLayout()
if no XML file exists, load default layout (paramKind, paramID, xDisplay, yDisplay,...
Definition performance_view.cpp:1897
void renderFXDisplay(deluge::modulation::params::Kind paramKind, int32_t paramID, int32_t knobPos=kNoSelection)
Render Parameter Name and Value set when using Performance Pads.
Definition performance_view.cpp:552
void logPerformanceViewPress(int32_t xDisplay, bool closeAction=true)
Definition performance_view.cpp:1296
bool setParameterValue(ModelStackWithThreeMainThings *modelStack, deluge::modulation::params::Kind paramKind, int32_t paramID, int32_t xDisplay, int32_t knobPos, bool renderDisplay=true)
Definition performance_view.cpp:1397
void selectEncoderAction(int8_t offset) override
Used to edit a pad's value in editing mode.
Definition performance_view.cpp:1511
int32_t getKnobPosForSinglePadPress(int32_t xDisplay, int32_t yDisplay)
Definition performance_view.cpp:1489
int32_t calculateKnobPosForSelectEncoderTurn(int32_t knobPos, int32_t offset)
used to calculate new knobPos when you turn the select encoder
Definition performance_view.cpp:1537
void backupPerformanceLayout()
backup performance layout column press info so changes can be undone / redone later
Definition performance_view.cpp:1275
void readDefaultFXParamFromFile(int32_t xDisplay)
Definition performance_view.cpp:1960
bool renderSidebar(uint32_t whichRows, RGB image[][kDisplayWidth+kSideBarWidth], uint8_t occupancyMask[][kDisplayWidth+kSideBarWidth]) override
if entered performance view using pink grid mode pad, render the pink pad
Definition performance_view.cpp:453
This class represents the colour format most used by the Deluge globally.
Definition rgb.h:14
Definition storage_manager.h:119
uint8_t ParamType
Definition param.h:65
Kind
Definition param.h:42
Definition performance_view.h:41
Definition performance_view.h:33
Definition performance_view.h:49