Deluge Firmware 1.3.0
Build date: 2025.04.16
Loading...
Searching...
No Matches
midi_device_lumi_keys.h
1/*
2 * Copyright (c) 2023 Aria Burrell (litui)
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 "gui/colour/colour.h"
21#include "io/midi/cable_types/usb_hosted.h"
22#include "model/scale/note_set.h"
23
24#define MIDI_DEVICE_LUMI_KEYS_VP_COUNT 1
25
26#define MIDI_DEVICE_LUMI_KEYS_SYSEX_START 0xF0
27#define MIDI_DEVICE_LUMI_KEYS_SYSEX_END 0xF7
28#define MIDI_DEVICE_LUMI_KEYS_SYSEX_SPACER 0x77
29#define MIDI_DEVICE_LUMI_KEYS_DEVICE 0x00 // All Devices
30
31// Config codes, counts, and counter offsets
32#define MIDI_DEVICE_LUMI_KEYS_CONFIG_PREFIX 0x10
33
34#define MIDI_DEVICE_LUMI_KEYS_MPE_ZONE_PREFIX 0x00
35#define MIDI_DEVICE_LUMI_KEYS_MPE_ZONE_OFFSET 5
36#define MIDI_DEVICE_LUMI_KEYS_MPE_ZONE_COUNT 2
37
38#define MIDI_DEVICE_LUMI_KEYS_MPE_CHANNELS_PREFIX 0x10
39#define MIDI_DEVICE_LUMI_KEYS_MPE_CHANNELS_OFFSET 1
40#define MIDI_DEVICE_LUMI_KEYS_MPE_CHANNELS_COUNT 15
41
42#define MIDI_DEVICE_LUMI_KEYS_MIDI_MODE_PREFIX 0x20
43#define MIDI_DEVICE_LUMI_KEYS_MIDI_MODE_OFFSET 0
44#define MIDI_DEVICE_LUMI_KEYS_MIDI_MODE_COUNT 3
45
46#define MIDI_DEVICE_LUMI_KEYS_BEND_RANGE_PREFIX 0x30
47#define MIDI_DEVICE_LUMI_KEYS_BEND_RANGE_OFFSET 0
48#define MIDI_DEVICE_LUMI_KEYS_BEND_RANGE_COUNT 97
49
50#define MIDI_DEVICE_LUMI_KEYS_ROOT_NOTE_PREFIX 0x30
51#define MIDI_DEVICE_LUMI_KEYS_ROOT_NOTE_OFFSET 3
52#define MIDI_DEVICE_LUMI_KEYS_ROOT_NOTE_COUNT 12
53
54#define MIDI_DEVICE_LUMI_KEYS_SCALE_PREFIX 0x60
55#define MIDI_DEVICE_LUMI_KEYS_SCALE_OFFSET 2
56#define MIDI_DEVICE_LUMI_KEYS_SCALE_COUNT 19
57
58#define MIDI_DEVICE_LUMI_KEYS_CONFIG_ROOT_COLOUR_PREFIX 0x30
59#define MIDI_DEVICE_LUMI_KEYS_CONFIG_GLOBAL_COLOUR_PREFIX 0x20
60
61#define MIDI_DEVICE_LUMI_SCALE_MAJOR 0b101010110101
62#define MIDI_DEVICE_LUMI_SCALE_MINOR 0b010110101101
63#define MIDI_DEVICE_LUMI_SCALE_HARMONIC_MINOR 0b100110101101
64#define MIDI_DEVICE_LUMI_SCALE_PENTATONIC_NEUTRAL 0b010010100101
65#define MIDI_DEVICE_LUMI_SCALE_PENTATONIC_MAJOR 0b001010010101
66#define MIDI_DEVICE_LUMI_SCALE_PENTATONIC_MINOR 0b010010101001
67#define MIDI_DEVICE_LUMI_SCALE_BLUES 0b010011101001
68#define MIDI_DEVICE_LUMI_SCALE_DORIAN 0b011010101101
69#define MIDI_DEVICE_LUMI_SCALE_PHRYGIAN 0b010110101011
70#define MIDI_DEVICE_LUMI_SCALE_LYDIAN 0b101011010101
71#define MIDI_DEVICE_LUMI_SCALE_MIXOLYDIAN 0b011010110101
72#define MIDI_DEVICE_LUMI_SCALE_LOCRIAN 0b010101101011
73#define MIDI_DEVICE_LUMI_SCALE_WHOLE_TONE 0b010101010101
74#define MIDI_DEVICE_LUMI_SCALE_ARABIC_A 0b101101101101
75#define MIDI_DEVICE_LUMI_SCALE_ARABIC_B 0b010101110101
76#define MIDI_DEVICE_LUMI_SCALE_JAPANESE 0b100011010001
77#define MIDI_DEVICE_LUMI_SCALE_RYUKYU 0b100010110001
78#define MIDI_DEVICE_LUMI_SCALE_8TONE_SPANISH 0b010101111011
79#define MIDI_DEVICE_LUMI_SCALE_CHROMATIC 0b111111111111
80
81class MIDIDeviceLumiKeys final : public MIDICableUSBHosted {
82public:
83 static constexpr uint16_t lumiKeysVendorProductPairs[MIDI_DEVICE_LUMI_KEYS_VP_COUNT][2] = {{0x2af4, 0xe00}};
84
85 static constexpr uint8_t sysexManufacturer[3] = {0x00, 0x21, 0x10};
86
87 enum class MIDIMode { MULTI = 0, MPE, SINGLE };
88
89 enum class MPEZone { LOWER = 0, UPPER };
90
91 enum class Scale {
92 MAJOR = 0, // IONIAN
93 MINOR, // AEOLIAN
94 HARMONIC_MINOR,
95 PENTATONIC_NEUTRAL,
96 PENTATONIC_MAJOR,
97 PENTATONIC_MINOR,
98 BLUES,
99 DORIAN,
100 PHRYGIAN,
101 LYDIAN,
102 MIXOLYDIAN,
103 LOCRIAN,
104 WHOLE_TONE,
105 ARABIC_A,
106 ARABIC_B,
107 JAPANESE,
108 RYUKYU,
109 EIGHT_TONE_SPANISH,
110 CHROMATIC
111 };
112
113 static constexpr uint16_t scaleNotes[MIDI_DEVICE_LUMI_KEYS_SCALE_COUNT] = {
114 MIDI_DEVICE_LUMI_SCALE_MAJOR,
115 MIDI_DEVICE_LUMI_SCALE_MINOR,
116 MIDI_DEVICE_LUMI_SCALE_HARMONIC_MINOR,
117 MIDI_DEVICE_LUMI_SCALE_PENTATONIC_NEUTRAL,
118 MIDI_DEVICE_LUMI_SCALE_PENTATONIC_MAJOR,
119 MIDI_DEVICE_LUMI_SCALE_PENTATONIC_MINOR,
120 MIDI_DEVICE_LUMI_SCALE_BLUES,
121 MIDI_DEVICE_LUMI_SCALE_DORIAN,
122 MIDI_DEVICE_LUMI_SCALE_PHRYGIAN,
123 MIDI_DEVICE_LUMI_SCALE_LYDIAN,
124 MIDI_DEVICE_LUMI_SCALE_MIXOLYDIAN,
125 MIDI_DEVICE_LUMI_SCALE_LOCRIAN,
126 MIDI_DEVICE_LUMI_SCALE_WHOLE_TONE,
127 MIDI_DEVICE_LUMI_SCALE_ARABIC_A,
128 MIDI_DEVICE_LUMI_SCALE_ARABIC_B,
129 MIDI_DEVICE_LUMI_SCALE_JAPANESE,
130 MIDI_DEVICE_LUMI_SCALE_RYUKYU,
131 MIDI_DEVICE_LUMI_SCALE_8TONE_SPANISH,
132 MIDI_DEVICE_LUMI_SCALE_CHROMATIC};
133
134 enum class ColourZone { ROOT = 0, GLOBAL };
135
136 static bool matchesVendorProduct(uint16_t vendorId, uint16_t productId);
137 void hookOnConnected() override;
138 void hookOnChangeRootNote() override;
139 void hookOnChangeScale() override;
140 void hookOnEnterScaleMode() override;
141 void hookOnExitScaleMode() override;
142 void hookOnMIDILearn() override;
143 void hookOnRecalculateColour() override;
144 void hookOnTransitionToSessionView() override;
145 void hookOnTransitionToClipView() override;
146 void hookOnTransitionToArrangerView() override;
147 void hookOnWriteHostedDeviceToFile() override;
148
149private:
150 uint8_t sysexChecksum(uint8_t* chkBytes, uint8_t size);
151 void sendLumiCommand(uint8_t* command, uint8_t length);
152
153 // Calculates the two sysex codes aligning with a given index, for ranges
154 void getCounterCodes(uint8_t* destination, int32_t index, uint8_t valueOffset = 0);
155
156 void enumerateLumi();
157
158 void setMIDIMode(MIDIMode midiMode);
159 void setMPEZone(MPEZone mpeZone);
160 void setMPENumChannels(uint8_t numChannels);
161 void setRootNote(int16_t rootNote);
162 Scale determineScaleAndRootNoteOffsetFromNotes(NoteSet& modeNotes);
163 void setScale(Scale scale);
164 void setColour(ColourZone zone, RGB rgb);
165};
Definition midi_device_lumi_keys.h:81
void getCounterCodes(uint8_t *destination, int32_t index, uint8_t valueOffset=0)
Fills the first 6 values at the pointer location with a 7-bit, offset representation of the 32-bit si...
Definition midi_device_lumi_keys.cpp:186
void enumerateLumi()
Enumeration command - responds with Lumi topology dump.
Definition midi_device_lumi_keys.cpp:197
Definition note_set.h:20
This class represents the colour format most used by the Deluge globally.
Definition rgb.h:14