tracktion-engine 3.0-10-g034fdde4aa5
Tracktion Engine — High level data model for audio applications

« « « Anklang Documentation
Loading...
Searching...
No Matches
tracktion_CustomControlSurface.h
Go to the documentation of this file.
1 /*
2 ,--. ,--. ,--. ,--.
3 ,-' '-.,--.--.,--,--.,---.| |,-.,-' '-.`--' ,---. ,--,--, Copyright 2024
4 '-. .-'| .--' ,-. | .--'| /'-. .-',--.| .-. || \ Tracktion Software
5 | | | | \ '-' \ `--.| \ \ | | | |' '-' '| || | Corporation
6 `---' `--' `--`--'`---'`--'`--' `---' `--' `---' `--''--' www.tracktion.com
7
8 Tracktion Engine uses a GPL/commercial licence - see LICENCE.md for details.
9*/
10
11namespace tracktion { inline namespace engine
12{
13
17 private juce::AsyncUpdater,
18 private juce::OSCReceiver::Listener<juce::OSCReceiver::MessageLoopCallback>,
19 private juce::Timer
20{
21public:
22 //==============================================================================
25 {
26 playId = 1,
27 stopId = 2,
28 recordId = 3,
29 homeId = 4,
30 endId = 5,
31 rewindId = 6,
32 fastForwardId = 7,
33 markInId = 10,
34 markOutId = 11,
35 automationReadId = 12,
36 automationRecordId = 23,
37 addMarkerId = 17,
38 nextMarkerId = 13,
39 previousMarkerId = 14,
40 nudgeLeftId = 15,
41 nudgeRightId = 16,
42 abortId = 18,
43 abortRestartId = 19,
44 jogId = 20,
45 jumpToMarkInId = 21,
46 jumpToMarkOutId = 22,
47 timecodeId = 25,
48
49 marker1Id = 400,
50 marker2Id = 401,
51 marker3Id = 402,
52 marker4Id = 403,
53 marker5Id = 404,
54 marker6Id = 405,
55 marker7Id = 406,
56 marker8Id = 407,
57
58 toggleBeatsSecondsModeId = 50,
59 toggleLoopId = 51,
60 togglePunchId = 52,
61 toggleClickId = 53,
62 toggleSnapId = 54,
63 toggleSlaveId = 55,
64 toggleEtoEId = 56,
65 toggleScrollId = 57,
66 toggleAllArmId = 58,
67
68 masterVolumeId = 8,
69 masterVolumeTextId = 26,
70 masterPanId = 9,
71 quickParamId = 24,
72 paramTrackId = 1600,
73 paramNameTrackId = 2500,
74 paramTextTrackId = 2600,
75 clearAllSoloId = 27,
76
77 nameTrackId = 2100,
78 numberTrackId = 2700,
79 volTrackId = 1800,
80 volTextTrackId = 2200,
81 panTrackId = 1700,
82 panTextTrackId = 2400,
83 muteTrackId = 1100,
84 soloTrackId = 1200,
85 armTrackId = 1300,
86 selectTrackId = 1400,
87 auxTrackId = 1500,
88 auxTextTrackId = 2300,
89
90 clip1TrackId = 3100,
91 clip2TrackId = 3200,
92 clip3TrackId = 3300,
93 clip4TrackId = 3400,
94 clip5TrackId = 3500,
95 clip6TrackId = 3600,
96 clip7TrackId = 3700,
97 clip8TrackId = 3800,
98 stopClipsTrackId = 3900,
99 sceneId = 4000,
100 clipBankUp1Id = 320,
101 clipBankUp4Id = 321,
102 clipBankUp8Id = 322,
103 clipBankDown1Id = 323,
104 clipBankDown4Id = 324,
105 clipBankDown8Id = 325,
106
107 zoomInId = 100,
108 zoomOutId = 101,
109 scrollTracksUpId = 102,
110 scrollTracksDownId = 103,
111 scrollTracksLeftId = 104,
112 scrollTracksRightId = 105,
113 zoomTracksInId = 106,
114 zoomTracksOutId = 107,
115 toggleSelectionModeId = 108,
116 selectLeftId = 109,
117 selectRightId = 110,
118 selectUpId = 111,
119 selectDownId = 112,
120 selectClipInTrackId = 1900,
121 selectPluginInTrackId = 2000,
122 selectedPluginNameId = 113,
123
124 faderBankLeftId = 208,
125 faderBankLeft1Id = 200,
126 faderBankLeft4Id = 201,
127 faderBankLeft8Id = 202,
128 faderBankLeft16Id = 206,
129 faderBankRightId = 209,
130 faderBankRight1Id = 203,
131 faderBankRight4Id = 204,
132 faderBankRight8Id = 205,
133 faderBankRight16Id = 207,
134
135 paramBankLeftId = 220,
136 paramBankLeft1Id = 221,
137 paramBankLeft4Id = 222,
138 paramBankLeft8Id = 223,
139 paramBankLeft16Id = 224,
140 paramBankLeft24Id = 225,
141 paramBankRightId = 226,
142 paramBankRight1Id = 227,
143 paramBankRight4Id = 228,
144 paramBankRight8Id = 229,
145 paramBankRight16Id = 230,
146 paramBankRight24Id = 231,
147
148 userAction1Id = 300,
149 userAction2Id = 301,
150 userAction3Id = 302,
151 userAction4Id = 303,
152 userAction5Id = 304,
153 userAction6Id = 305,
154 userAction7Id = 306,
155 userAction8Id = 307,
156 userAction9Id = 308,
157 userAction10Id = 309,
158 userAction11Id = 310,
159 userAction12Id = 311,
160 userAction13Id = 312,
161 userAction14Id = 313,
162 userAction15Id = 314,
163 userAction16Id = 315,
164 userAction17Id = 316,
165 userAction18Id = 317,
166 userAction19Id = 318,
167 userAction20Id = 319,
168
169 emptyTextId = 9998,
170 none = 9999
171 };
172
174 {
175 MappingSet() {}
176 MappingSet (const MappingSet&) = default;
177 MappingSet& operator= (const MappingSet&) = default;
178
179 ActionID id = none;
180 juce::String addr;
181 int controllerID = -1, note = -1, channel = -1;
182 juce::Colour colour { juce::Colours::transparentWhite };
183 juce::String surfaceName;
184 };
185
186 //==============================================================================
187 CustomControlSurface (ExternalControllerManager&, const juce::String& name, ExternalControllerManager::Protocol);
189 ~CustomControlSurface() override;
190
191 //==============================================================================
192 static juce::String getNameForActionID (ExternalControllerManager&, ActionID);
194 static juce::Array<MappingSet> getMappingSetsForID (ExternalControllerManager&, ActionID);
195 static int getControllerNumberFromId (int) noexcept;
196
197 //==============================================================================
198 void initialiseDevice (bool connect) override;
199 void shutDownDevice() override;
200
201 void updateOSCSettings (int oscInputPort, int oscOutputPort, juce::String oscOutputAddr) override;
202
204 static void saveAllSettings (Engine& engine);
205
206 void updateMiscFeatures() override;
207 void acceptMidiMessage (int, const juce::MidiMessage&) override;
208 bool wantsMessage(int, const juce::MidiMessage&) override;
209 bool eatsAllMessages() override;
210 bool canSetEatsAllMessages() override;
211 void setEatsAllMessages(bool eatAll) override;
212 void moveFader (int channelNum, float newSliderPos) override;
213 void moveMasterLevelFader (float newSliderPos) override;
214 void moveMasterPanPot (float newPos) override;
215 void movePanPot (int channelNum, float newPan) override;
216 void moveAux (int channel, int auxNum, const char* bus, float newPos) override;
217 void updateSoloAndMute (int channelNum, Track::MuteAndSoloLightState, bool isBright) override;
218 void soloCountChanged (bool) override;
219 void playStateChanged (bool isPlaying) override;
220 void recordStateChanged (bool isRecording) override;
221 void automationReadModeChanged (bool isReading) override;
222 void automationWriteModeChanged (bool isWriting) override;
223 void faderBankChanged (int newStartChannelNumber, const juce::StringArray& trackNames) override;
224 void channelLevelChanged (int channel, float l, float r) override;
225 void trackSelectionChanged (int channel, bool isSelected) override;
226 void trackRecordEnabled (int channel, bool isEnabled) override;
227 void masterLevelsChanged (float leftLevel, float rightLevel) override;
228 void timecodeChanged (int barsOrHours, int beatsOrMinutes, int ticksOrSeconds, int millisecs, bool isBarsBeats, bool isFrames) override;
229 void clickOnOffChanged (bool isClickOn) override;
230 void snapOnOffChanged (bool isSnapOn) override;
231 void loopOnOffChanged (bool isLoopOn) override;
232 void slaveOnOffChanged (bool isSlaving) override;
233 void punchOnOffChanged (bool isPunching) override;
234 void scrollOnOffChanged (bool isPunching) override;
235 void parameterChanged (int parameterNumber, const ParameterSetting& newValue) override;
236 void clearParameter (int parameterNumber) override;
237 bool canChangeSelectedPlugin() override;
238 void currentSelectionChanged (juce::String) override;
239 void deleteController() override;
240 void markerChanged (int parameterNumber, const MarkerSetting& newValue) override;
241 void clearMarker (int parameterNumber) override;
242
243 //==============================================================================
244 bool removeMapping (ActionID, int controllerID, int note, int channel);
245
250
251 //==============================================================================
252 struct Mapping
253 {
254 bool isControllerAssigned()
255 {
256 return id != 0 || addr.isNotEmpty() || note != -1;
257 }
258
259 int id = 0;
260 juce::String addr;
261 int note = -1;
262 int channel = 0;
263 int function = 0;
264 };
265
266 int getNumMappings() const;
267 void listenToRow (int);
268 int getRowBeingListenedTo() const;
269 bool allowsManualEditing() const { return needsOSCSocket; }
270 void showMappingsListForRow (int);
271 void setLearntParam (bool keepListening);
272 void removeMapping (int index);
273 Mapping* getMappingForRow (int) const;
274 std::pair<juce::String, juce::String> getTextForRow (int) const;
275
276 //==============================================================================
277 // transport
278 virtual void play (float val, int param);
279 virtual void stop (float val, int param);
280 virtual void record (float val, int param);
281 virtual void home (float val, int param);
282 virtual void end (float val, int param);
283 virtual void rewind (float val, int param);
284 virtual void fastForward (float val, int param);
285 virtual void markIn (float val, int param);
286 virtual void markOut (float val, int param);
287 virtual void automationReading (float val, int param);
288 virtual void automationWriting (float val, int param);
289 virtual void addMarker (float val, int param);
290 virtual void prevMarker (float val, int param);
291 virtual void nextMarker (float val, int param);
292 virtual void marker1 (float val, int param);
293 virtual void marker2 (float val, int param);
294 virtual void marker3 (float val, int param);
295 virtual void marker4 (float val, int param);
296 virtual void marker5 (float val, int param);
297 virtual void marker6 (float val, int param);
298 virtual void marker7 (float val, int param);
299 virtual void marker8 (float val, int param);
300 virtual void nudgeLeft (float val, int param);
301 virtual void nudgeRight (float val, int param);
302 virtual void abort (float val, int param);
303 virtual void abortRestart (float val, int param);
304 virtual void jog (float val, int param);
305 virtual void jumpToMarkIn (float val, int param);
306 virtual void jumpToMarkOut (float val, int param);
307 virtual void clearAllSolo (float val, int param);
308
309 // options
310 virtual void toggleBeatsSecondsMode (float val, int param);
311 virtual void toggleLoop (float val, int param);
312 virtual void togglePunch (float val, int param);
313 virtual void toggleClick (float val, int param);
314 virtual void toggleSnap (float val, int param);
315 virtual void toggleSlave (float val, int param);
316 virtual void toggleEtoE (float val, int param);
317 virtual void toggleScroll (float val, int param);
318 virtual void toggleAllArm (float val, int param);
319
320 // plugins
321 virtual void masterVolume (float val, int param);
322 virtual void masterPan (float val, int param);
323 virtual void quickParam (float val, int param);
324 virtual void paramTrack (float val, int param);
325
326 // track
327 virtual void volTrack (float val, int param);
328 virtual void panTrack (float val, int param);
329 virtual void muteTrack (float val, int param);
330 virtual void soloTrack (float val, int param);
331 virtual void armTrack (float val, int param);
332 virtual void selectTrack (float val, int param);
333 virtual void auxTrack (float val, int param);
334
335 // clip launcher
336 virtual void launchClip1 (float val, int param);
337 virtual void launchClip2 (float val, int param);
338 virtual void launchClip3 (float val, int param);
339 virtual void launchClip4 (float val, int param);
340 virtual void launchClip5 (float val, int param);
341 virtual void launchClip6 (float val, int param);
342 virtual void launchClip7 (float val, int param);
343 virtual void launchClip8 (float val, int param);
344 virtual void stopClips (float val, int param);
345
346 virtual void launchScene (float val, int param);
347 virtual void clipBankUp1 (float val, int param);
348 virtual void clipBankUp4 (float val, int param);
349 virtual void clipBankUp8 (float val, int param);
350 virtual void clipBankDown1 (float val, int param);
351 virtual void clipBankDown4 (float val, int param);
352 virtual void clipBankDown8 (float val, int param);
353
354 // navigation
355 virtual void zoomIn (float val, int param);
356 virtual void zoomOut (float val, int param);
357 virtual void scrollTracksUp (float val, int param);
358 virtual void scrollTracksDown (float val, int param);
359 virtual void scrollTracksLeft (float val, int param);
360 virtual void scrollTracksRight (float val, int param);
361 virtual void zoomTracksIn (float val, int param);
362 virtual void zoomTracksOut (float val, int param);
363 virtual void toggleSelectionMode (float val, int param);
364 virtual void selectLeft (float val, int param);
365 virtual void selectRight (float val, int param);
366 virtual void selectUp (float val, int param);
367 virtual void selectDown (float val, int param);
368 virtual void selectClipInTrack (float val, int param);
369 virtual void selectFilterInTrack (float val, int param);
370
371 // bank
372 virtual void faderBankLeft (float val, int param);
373 virtual void faderBankLeft1 (float val, int param);
374 virtual void faderBankLeft4 (float val, int param);
375 virtual void faderBankLeft8 (float val, int param);
376 virtual void faderBankLeft16 (float val, int param);
377 virtual void faderBankRight (float val, int param);
378 virtual void faderBankRight1 (float val, int param);
379 virtual void faderBankRight4 (float val, int param);
380 virtual void faderBankRight8 (float val, int param);
381 virtual void faderBankRight16 (float val, int param);
382
383 virtual void paramBankLeft (float val, int param);
384 virtual void paramBankLeft1 (float val, int param);
385 virtual void paramBankLeft4 (float val, int param);
386 virtual void paramBankLeft8 (float val, int param);
387 virtual void paramBankLeft16 (float val, int param);
388 virtual void paramBankLeft24 (float val, int param);
389 virtual void paramBankRight (float val, int param);
390 virtual void paramBankRight1 (float val, int param);
391 virtual void paramBankRight4 (float val, int param);
392 virtual void paramBankRight8 (float val, int param);
393 virtual void paramBankRight16 (float val, int param);
394 virtual void paramBankRight24 (float val, int param);
395
396 // User functions
397 virtual void userFunction1 (float val, int param);
398 virtual void userFunction2 (float val, int param);
399 virtual void userFunction3 (float val, int param);
400 virtual void userFunction4 (float val, int param);
401 virtual void userFunction5 (float val, int param);
402 virtual void userFunction6 (float val, int param);
403 virtual void userFunction7 (float val, int param);
404 virtual void userFunction8 (float val, int param);
405 virtual void userFunction9 (float val, int param);
406 virtual void userFunction10 (float val, int param);
407 virtual void userFunction11 (float val, int param);
408 virtual void userFunction12 (float val, int param);
409 virtual void userFunction13 (float val, int param);
410 virtual void userFunction14 (float val, int param);
411 virtual void userFunction15 (float val, int param);
412 virtual void userFunction16 (float val, int param);
413 virtual void userFunction17 (float val, int param);
414 virtual void userFunction18 (float val, int param);
415 virtual void userFunction19 (float val, int param);
416 virtual void userFunction20 (float val, int param);
417
418 void null (float, int) {} // null action for outgoing only actions
419
420 virtual void loadFunctions();
421
422 virtual juce::XmlElement* createXml();
423 virtual void importSettings (const juce::File&);
424 virtual void importSettings (const juce::String&);
425 virtual void exportSettings (const juce::File&);
426
427 int getPacketsIn() { return packetsIn; }
428 int getPacketsOut() { return packetsOut; }
429
430private:
431 //==============================================================================
432 typedef void (CustomControlSurface::* ActionFunction) (float val, int param);
433
434 struct ActionFunctionInfo
435 {
436 juce::String name, group;
437 int id = 0;
438 int param = 0;
439 ActionFunction actionFunc {};
440 };
441
442 //==============================================================================
443 ExternalControllerManager::Protocol protocol;
446 int nextCmdGroupIndex = 50000;
447
448 juce::String lastControllerAddr;
449 int lastControllerNote = -1;
450 int lastControllerID = 0;
451 float lastControllerValue = 0;
452 int lastControllerChannel = 0;
453 int listeningOnRow = -1;
454
455 juce::OwnedArray<ActionFunctionInfo> actionFunctionList;
456 juce::PopupMenu contextMenu;
457 bool pluginMoveMode = true;
458 bool eatsAllMidi = false;
459 bool online = false;
460 int oscInputPort = 0, oscOutputPort = 0;
461 int packetsIn = 0, packetsOut = 0;
462 juce::String oscOutputAddr, oscActiveAddr;
463 std::map<juce::String, bool> oscControlTouched;
464 std::map<juce::String, int> oscControlTapsWhileTouched;
466 std::map<juce::String, double> oscLastUsedTime;
467
470
471 //==============================================================================
472 void timerCallback() override;
473
474 //==============================================================================
475 struct RPNParser
476 {
477 void parseControllerMessage (const juce::MidiMessage& m, int& paramID,
478 int& chan, int& val) noexcept
479 {
480 jassert (m.isController());
481
482 const int number = m.getControllerNumber();
483 const int value = m.getControllerValue();
484
485 lastParamNumber = 0x10000 + number;
486 paramID = lastParamNumber;
487 chan = m.getChannel();
488 val = value;
489 }
490
491 int lastParamNumber = 0;
492 int lastRPNCoarse = 0;
493 int lastRPNFine = 0;
494 int lastNRPNCoarse = 0;
495 int lastNRPNFine = 0;
496 bool wasNRPN = false;
497 };
498
499 RPNParser rpnParser;
500
501 //==============================================================================
502 struct CustomControlSurfaceManager
503 {
504 void registerSurface (CustomControlSurface*);
505 void unregisterSurface (CustomControlSurface*);
506 void saveAllSettings (Engine&);
507
509 };
510
512
513 //==============================================================================
514 virtual void oscMessageReceived (const juce::OSCMessage&) override;
515 virtual void oscBundleReceived (const juce::OSCBundle&) override;
516
517 bool isTextAction (ActionID);
518
519 //==============================================================================
520 virtual void addFunction (juce::PopupMenu&, juce::SortedSet<int>& commandSet, const juce::String& group, const juce::String& name, ActionID id, ActionFunction);
521 virtual void addTrackFunction (juce::PopupMenu&, const juce::String& group, const juce::String& name, ActionID id, ActionFunction);
522 virtual void addPluginFunction (juce::PopupMenu&, const juce::String& group, const juce::String& name, ActionID id, ActionFunction);
523 virtual void addSceneFunction (juce::PopupMenu&, const juce::String& group, const juce::String& name, ActionID id, ActionFunction);
524 virtual void addAllCommandItem (juce::PopupMenu&);
525
526 virtual void sendCommandToControllerForActionID (int actionID, bool);
527 virtual void sendCommandToControllerForActionID (int actionID, float value);
528 virtual void sendCommandToControllerForActionID (int actionID, juce::String);
529
530 virtual juce::String controllerIDToString (int id, int channelid) const;
531 virtual juce::String noteIDToString (int note, int channelid) const;
532 virtual juce::String getFunctionName (int id) const;
533
534 virtual void init();
535 virtual bool loadFromXml (const juce::XmlElement&);
536 virtual void clearCommandGroups();
537
538 virtual bool isPendingEventAssignable();
539 virtual void updateOrCreateMappingForID (int id, juce::String addr, int channel, int noteNum, int controllerID);
540 virtual void addMappingSetsForID (ActionID, juce::Array<MappingSet>& mappingSet);
541
542 virtual void handleAsyncUpdate() override;
543 virtual void recreateOSCSockets();
544
545 virtual bool shouldActOnValue (float v);
546
547 //==============================================================================
549};
550
551}} // namespace tracktion { inline namespace engine
bool isNotEmpty() const noexcept
Base class for types of control surface.
static void saveAllSettings(Engine &engine)
Saves the settings of all open custom surfaces.
ActionID
enum used to determine the action type.
void showMappingsEditor(juce::DialogWindow::LaunchOptions &)
This will put the surface in listen and assign mode, launching the given dialog window.
The Engine is the central class for all tracktion sessions.
Keeps a list of external controllers and keeps them connected to the right MIDI in/out devices.
MuteAndSoloLightState
Determines the status of the mute and solo indicators.
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
typedef int
typedef float
bool isRecording(EditPlaybackContext &epc)
Returns true if any inputs are currently recording.