Skip to content

Commit b00e97e

Browse files
committed
add DAW Controller support for various Arturia controllers
MiniLab 3 Keylab Essential KeyLab Essential mk3 KeyLab mkII based on https://github.com/PrzemekBarski/arturia-keylab-essential-mk3-programming-guide Tested on a Arturia MiniLab 3 and KeyLab mkII Keylab Essential and Keylab Essential mk3 is not tested
1 parent c2dd6c6 commit b00e97e

18 files changed

Lines changed: 3239 additions & 150 deletions

README.md

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,173 @@ DreamDexed is a [MiniDexed](https://github.com/probonopd/MiniDexed) fork with th
1515
- [ ] Overlay Menu for easier parameter changes
1616
- [ ] MIDI Controller DAW integration
1717

18+
# DreamDexed Arturia fork
19+
20+
This is a fork of DreamDexed that integrates better with Arturia keyboards.
21+
22+
Maybe someday it will be part of the DreamDexed
23+
24+
## Enabling
25+
26+
This feature can be enabled in the minidexed.ini with:
27+
```
28+
DAWControllerEnabled=1
29+
```
30+
31+
## Features
32+
33+
### Controller Display, Main Encoder
34+
The controller display in DAW mode shows the DreamDexed menu.
35+
36+
With the main encoder you can navigate in the menu.
37+
38+
The Home is the shift+Main click
39+
40+
Supported:
41+
- MiniLab 3 (tested)
42+
- KeyLab mkII (tested)
43+
- Keylab Essential
44+
- Keylab Essential 3
45+
46+
### MiniLab 3 features:
47+
48+
#### Encoders
49+
50+
By holding down shift will bring up an overlay menu, where you can see and adjust what the encoders do.
51+
52+
You can use the main encoder to select the current encoding page.
53+
54+
Short pressing the shift will show the actual values.
55+
56+
Holding down the shift will goes back to the normal menu.
57+
58+
This overlay menu is context-aware, it is different if you are in the effect menu, or in a TG menu.
59+
60+
If you are in a TG menu, it only affects the selected TG.
61+
62+
If you are in the main menu, it affects the TGs on the first TG's channel.
63+
64+
- Main Overlay 1 (default)
65+
- Cutoff, Resonance, FX1Send, FX2Send
66+
- PortamentoTime, Program, Volume, MasterVolume
67+
- Faders: ChG 1 Vol, ChG 2 Vol, ChG 3 Vol, ChG 4 Vol
68+
69+
- Effect Overlay 1
70+
- MasterEQLow, MasterEQMid, MasterEQHigh, MasterEQGain
71+
- MasterEQLowMidFreq, MasterEQMidHighFreq, None, None
72+
- Faders: MasterEQLow, MasterEQMid, MasterEQHigh, MasterEQGain
73+
74+
- Effect Overlay 2
75+
- MasterCREnable, MasterCRPreGain, MasterCRAttack, MasterCRRelease
76+
- MasterCRThresh, MasterCRRatio, MasterCRHPFilter, None
77+
- Faders: MasterCRPreGain, MasterCRAttack, MasterCRRelease, MasterCRThresh
78+
79+
- Main Overlay 2
80+
- Pan1, Pan2, Pan3, Pan4
81+
- Det1, Det2, Det3, Det4
82+
- Faders: TG1 Vol, TG2 Vol, TG3 Vol, TG4 Vol
83+
84+
- Main Overlay 3
85+
- Pan5, Pan6, Pan7, Pan8
86+
- Det5, Det6, Det7, Det8
87+
- Faders: TG5 Vol, TG6 Vol, TG7 Vol, TG8 Vol
88+
89+
- TG Overlay 1
90+
- Cutoff, Resonance, FX1Send, FX2Send
91+
- MasterTune, PortamentoTime, Volume, Pan
92+
- Faders: Cutoff, FX1Send, FX2Send, Volume
93+
94+
- TG Overlay 2
95+
- MIDIChannel, Program, None, PitchBendRange
96+
- PortamentoGlissando, MonoMode, None, PitchBendStep
97+
98+
- TG Overlay 3
99+
- TGEQLow, TGEQMid, TGEQHigh, TGEQGain
100+
- TGEQLowMidFreq, TGEQMidHighFreq, None, None
101+
- Faders: TGEQLow, TGEQMid, TGEQHigh, TGEQGain
102+
103+
- TG Overlay 4
104+
- CompressorEnable, CompressorPreGain, CompressorMakeupGain, None
105+
- CompressorAttack, CompressorRelease, CompressorThresh, CompressorRatio
106+
- Faders: CompressorPreGain, CompressorAttack, CompressorRelease, CompressorThresh
107+
108+
- TG Overlay 5
109+
- MWRange, MWPitch, FCRange, FCPitch
110+
- MWEGBias, MWAmplitude, FCEGBias, FCAmplitude
111+
112+
- TG Overlay 6
113+
- BCRange, BCPitch, ATRange, ATPitch
114+
- BCEGBias, BCAmplitude, ATEGBias, ATAmplitude
115+
116+
- Voice Overlay 1
117+
- ALGORITHM, FEEDBACK, TRANSPOSE, None,
118+
- None, None, None, None
119+
120+
- Voice Overlay 2
121+
- PITCH_EG_R1, PITCH_EG_R2, PITCH_EG_R3, PITCH_EG_R4
122+
- PITCH_EG_L1, PITCH_EG_L2, PITCH_EG_L3, PITCH_EG_L4
123+
- Faders: PITCH_EG_L1, PITCH_EG_L2, PITCH_EG_L3, PITCH_EG_L4
124+
125+
- Voice Overlay 3
126+
- OSC_KEY_SYNC, LFO_SPEED, LFO_DELAY, LFO_PITCH_MOD_DEP
127+
- LFO_SYNC, LFO_WAVE, LFO_PITCH_MOD_SENS, LFO_AMP_MOD_DEP
128+
129+
- OP Overlay 1
130+
- OP_OUTPUT_LEV, OP_FREQ_COARSE, OP_FREQ_FINE, OP_OSC_DETUNE,
131+
- OP_OSC_MODE, OP_ENABLE, None, None
132+
133+
- OP Overlay 2
134+
- OP_EG_R1, OP_EG_R2, P_EG_R3, OP_EG_R4
135+
- OP_EG_L1, OP_EG_L2, OP_EG_L3, OP_EG_L4,
136+
- Faders: OP_EG_L1, OP_EG_L2, OP_EG_L3, OP_EG_L4,
137+
138+
- OP Overlay 3
139+
- OP_LEV_SCL_BRK_PT, OP_SCL_LEFT_DEPTH, OP_SCL_RGHT_DEPTH, OP_AMP_MOD_SENS
140+
- OP_OSC_RATE_SCALE, OP_SCL_LEFT_CURVE, OP_SCL_RGHT_CURVE, OP_KEY_VEL_SENS
141+
142+
In the Main overlay you can reach the TG and voice overlays also.
143+
144+
In the voice overlay there is a page for every OP control also, with the 6 operator and with an encoder which sets all.
145+
146+
#### Pads on Bank A
147+
- Mono/Poly mode
148+
- Portamento enable/disable, hard press to enable/disable Portamento Glissando
149+
- Sostenuto
150+
- Sustain
151+
- All Sound Off
152+
- Hold2
153+
- None
154+
- Channel AfterTouch Pad
155+
156+
#### Pads on Bank B
157+
- Short press a TG will enable/disable that TG
158+
- Long press will enable/disable all the TG on the TG's channel
159+
- Hard press will enable only that TG (it uses the pad's AT messsages)
160+
161+
162+
### KeyLab mkII features
163+
164+
#### Faders
165+
- The faders 1-8 adjust the volume of the MIDI channels of the current performance
166+
- The fader 9 adjusts the master volume.
167+
168+
#### Encoders
169+
- Cutoff, Resonance, Portamento Time
170+
- None, None, Dry Level, FX1 Send, FX2 Send, None
171+
172+
#### DAW buttons
173+
- Mono/Poly mode
174+
- Portamento enable/disable, hard press to enable/disable Portamento Glissando
175+
- Sostenuto
176+
- Sustain
177+
- Hold2
178+
179+
#### Track select buttons
180+
- Short press a TG will enable/disable that TG
181+
- Long press will enable only that TG
182+
183+
184+
18185
![minidexed](https://user-images.githubusercontent.com/2480569/161813414-bb156a1c-efec-44c0-802a-8926412a08e0.jpg)
19186

20187
DreamDexed is a FM synthesizer closely modeled on the famous DX7 by a well-known Japanese manufacturer running on a bare metal Raspberry Pi (without a Linux kernel or operating system). On Raspberry Pi 2 and larger, it can run 8 tone generators, not unlike the TX816/TX802 (8 DX7 instances without the keyboard in one box). [Featured by HACKADAY](https://hackaday.com/2022/04/19/bare-metal-gives-this-pi-some-classic-synths/), [Adafruit](https://blog.adafruit.com/2022/04/25/free-yamaha-dx7-synth-emulator-on-a-raspberry-pi/), [The MagPi magazine](https://magpi.raspberrypi.com/articles/mini-dexed) (Issue 142 June 2024, [PDF](https://magpi.raspberrypi.com/issues/142)) and [Synth Geekery](https://www.youtube.com/watch?v=TDSy5nnm0jA).

src/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ OBJS = main.o kernel.o minidexed.o config.o userinterface.o uimenu.o \
1212
effect.o effect_cloudseed2.o effect_platervbstereo.o effect_dreamdelay.o uibuttons.o midipin.o \
1313
../CloudSeedCore/DSP/Biquad.o ../CloudSeedCore/DSP/RandomBuffer.o ../CloudSeedCore/DSP/FastSin.o \
1414
arm_float_to_q23.o arm_zip_f32.o arm_scale_zip_f32.o \
15-
net/ftpdaemon.o net/ftpworker.o net/applemidi.o net/udpmidi.o net/mdnspublisher.o udpmididevice.o
15+
net/ftpdaemon.o net/ftpworker.o net/applemidi.o net/udpmidi.o net/mdnspublisher.o udpmididevice.o \
16+
dawcontroller.o
1617

1718
EXTRACLEAN = $(OBJS) $(OBJS:.o=.d)
1819

src/common.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#ifndef _common_h
33
#define _common_h
44

5+
#define ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0]))
6+
57
inline long maplong(long x, long in_min, long in_max, long out_min, long out_max) {
68
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
79
}
@@ -16,6 +18,12 @@ inline float32_t mapfloat(int val, int in_min, int in_max, float32_t out_min, fl
1618
return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
1719
}
1820

21+
inline long mapfloatr(int val, int in_min, int in_max, float32_t out_min, float32_t out_max)
22+
{
23+
return lround((val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min);
24+
}
25+
26+
1927
#define constrain(amt, low, high) ({ \
2028
__typeof__(amt) _amt = (amt); \
2129
__typeof__(low) _low = (low); \

src/config.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,9 @@ void CConfig::Load (void)
206206
m_MIDIButtonActionBankDown = m_Properties.GetString ("MIDIButtonActionBankDown", "");
207207
m_MIDIButtonActionTGUp = m_Properties.GetString ("MIDIButtonActionTGUp", "");
208208
m_MIDIButtonActionTGDown = m_Properties.GetString ("MIDIButtonActionTGDown", "");
209-
209+
210+
m_bDAWControllerEnabled = m_Properties.GetNumber ("DAWControllerEnabled", 0) != 0;
211+
210212
m_bEncoderEnabled = m_Properties.GetNumber ("EncoderEnabled", 0) != 0;
211213
m_nEncoderPinClock = m_Properties.GetNumber ("EncoderPinClock", 10);
212214
m_nEncoderPinData = m_Properties.GetNumber ("EncoderPinData", 9);
@@ -782,6 +784,11 @@ const char *CConfig::GetMIDIButtonActionTGDown (void) const
782784
return m_MIDIButtonActionTGDown.c_str();
783785
}
784786

787+
bool CConfig::GetDAWControllerEnabled (void) const
788+
{
789+
return m_bDAWControllerEnabled;
790+
}
791+
785792
bool CConfig::GetEncoderEnabled (void) const
786793
{
787794
return m_bEncoderEnabled;

src/config.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ class CConfig // Configuration for MiniDexed
251251
const char *GetMIDIButtonActionTGUp (void) const;
252252
const char *GetMIDIButtonActionTGDown (void) const;
253253

254+
bool GetDAWControllerEnabled (void) const;
255+
254256
// KY-040 Rotary Encoder
255257
// GPIO pin numbers are chip numbers, not header positions
256258
bool GetEncoderEnabled (void) const;
@@ -402,6 +404,8 @@ class CConfig // Configuration for MiniDexed
402404
unsigned m_nMIDIButtonTGUp;
403405
unsigned m_nMIDIButtonTGDown;
404406

407+
bool m_bDAWControllerEnabled;
408+
405409
bool m_bEncoderEnabled;
406410
unsigned m_nEncoderPinClock;
407411
unsigned m_nEncoderPinData;

0 commit comments

Comments
 (0)