Skip to content

Commit 5a725f1

Browse files
committed
* Electra One MkI + MkII
* Requires Firmware 3.5 * New: All knobs are now relative. * New: New page for controlling project and track parameters.
1 parent 270158a commit 5a725f1

File tree

12 files changed

+262
-86
lines changed

12 files changed

+262
-86
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<artifactId>DrivenByMoss</artifactId>
77
<packaging>jar</packaging>
88
<name>DrivenByMoss</name>
9-
<version>21.4.0</version>
9+
<version>21.5.0</version>
1010
<properties>
1111
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1212
</properties>

resources/Electra.One/DrivenByMoss.eproj

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

src/main/java/de/mossgrabers/controller/electra/one/ElectraOneControllerDefinition.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,31 +49,34 @@ public ElectraOneControllerDefinition ()
4949
"Electra Controller",
5050
"MIDIOUT3 (Electra Controller)"
5151
}));
52+
for (int i = 2; i < 10; i++)
53+
{
54+
final String [] portNames = new String []
55+
{
56+
"Electra Controller #" + i,
57+
"MIDIIN" + (3 * i) + " (Electra Controller)"
58+
};
59+
pairs.add (this.addDeviceDiscoveryPair (portNames, portNames));
60+
}
5261
break;
5362

5463
case MAC:
55-
pairs.add (this.addDeviceDiscoveryPair (new String []
64+
final String [] portNamesMac = new String []
5665
{
5766
"Electra Controller Electra Port 1",
5867
ELECTRA_CONTROLLER_ELECTRA_CTRL
59-
}, new String []
60-
{
61-
"Electra Controller Electra Port 1",
62-
ELECTRA_CONTROLLER_ELECTRA_CTRL
63-
}));
68+
};
69+
pairs.add (this.addDeviceDiscoveryPair (portNamesMac, portNamesMac));
6470
break;
6571

6672
default:
6773
case LINUX:
68-
pairs.add (this.addDeviceDiscoveryPair (new String []
69-
{
70-
"Electra Controller Electra Port",
71-
ELECTRA_CONTROLLER_ELECTRA_CTRL
72-
}, new String []
74+
final String [] portNamesLinux = new String []
7375
{
7476
"Electra Controller Electra Port",
7577
ELECTRA_CONTROLLER_ELECTRA_CTRL
76-
}));
78+
};
79+
pairs.add (this.addDeviceDiscoveryPair (portNamesLinux, portNamesLinux));
7780
break;
7881
}
7982

src/main/java/de/mossgrabers/controller/electra/one/ElectraOneControllerSetup.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import de.mossgrabers.controller.electra.one.mode.DeviceMode;
1010
import de.mossgrabers.controller.electra.one.mode.EqualizerMode;
1111
import de.mossgrabers.controller.electra.one.mode.MixerMode;
12+
import de.mossgrabers.controller.electra.one.mode.ProjectTrackMode;
1213
import de.mossgrabers.controller.electra.one.mode.SendsMode;
1314
import de.mossgrabers.controller.electra.one.mode.SessionMode;
1415
import de.mossgrabers.controller.electra.one.mode.TransportMode;
@@ -129,6 +130,7 @@ protected void createModes ()
129130
modeManager.register (Modes.EQ_DEVICE_PARAMS, new EqualizerMode (surface, this.model));
130131
modeManager.register (Modes.TRANSPORT, new TransportMode (surface, this.model));
131132
modeManager.register (Modes.SESSION, new SessionMode (surface, this.model));
133+
modeManager.register (Modes.PROJECT, new ProjectTrackMode (surface, this.model));
132134
modeManager.register (Modes.DUMMY, new DummyMode<> (surface, this.model, ElectraOneControlSurface.KNOB_IDS));
133135
}
134136

@@ -191,11 +193,7 @@ protected void registerContinuousCommands ()
191193
final ContinuousID ctrlID = ElectraOneControlSurface.getContinuousID (row, col);
192194
final int colLabel = col + 1;
193195
final int cc = ElectraOneControlSurface.ELECTRA_CTRL_1 + 10 * row + col;
194-
final IHwContinuousControl ctrl;
195-
if (row > 0 && col == 5)
196-
ctrl = this.addRelativeKnob (ctrlID, "Ctrl " + rowLabel + "-" + colLabel, null, BindType.CC, 15, cc);
197-
else
198-
ctrl = this.addAbsoluteKnob (ctrlID, "Ctrl " + rowLabel + "-" + colLabel, null, BindType.CC, 15, cc);
196+
final IHwContinuousControl ctrl = this.addRelativeKnob (ctrlID, "Ctrl " + rowLabel + "-" + colLabel, null, BindType.CC, 15, cc);
199197
// Can sadly only be set at startup
200198
if (col < 6)
201199
ctrl.setIndexInGroup (row * 6 + col);

src/main/java/de/mossgrabers/controller/electra/one/controller/ElectraOneColorManager.java

Lines changed: 45 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,83 +17,92 @@
1717
public class ElectraOneColorManager extends ColorManager
1818
{
1919
/** State for button LED on. */
20-
public static final int COLOR_BUTTON_STATE_ON = 127;
20+
public static final int COLOR_BUTTON_STATE_ON = 127;
2121
/** State for button LED off. */
22-
public static final int COLOR_BUTTON_STATE_OFF = 0;
22+
public static final int COLOR_BUTTON_STATE_OFF = 0;
2323

2424
/** Color when playback is stopped. */
25-
public static final ColorEx PLAY_OFF = ColorEx.DARK_GREEN;
25+
public static final ColorEx PLAY_OFF = ColorEx.DARK_GREEN;
2626
/** Color when playback is active. */
27-
public static final ColorEx PLAY_ON = ColorEx.GREEN;
27+
public static final ColorEx PLAY_ON = ColorEx.GREEN;
2828
/** Color when recording is stopped. */
29-
public static final ColorEx RECORD_OFF = ColorEx.DARK_RED;
29+
public static final ColorEx RECORD_OFF = ColorEx.DARK_RED;
3030
/** Color when recording is active. */
31-
public static final ColorEx RECORD_ON = ColorEx.RED;
31+
public static final ColorEx RECORD_ON = ColorEx.RED;
3232

3333
/** Color when track is not armed for recording. */
34-
public static final ColorEx REC_ARM_OFF = ColorEx.DARK_GRAY;
34+
public static final ColorEx REC_ARM_OFF = ColorEx.DARK_GRAY;
3535
/** Color when track is armed for recording. */
36-
public static final ColorEx REC_ARM_ON = ColorEx.DARK_RED;
36+
public static final ColorEx REC_ARM_ON = ColorEx.DARK_RED;
3737
/** Color when track is not muted. */
38-
public static final ColorEx MUTE_OFF = ColorEx.DARK_GRAY;
38+
public static final ColorEx MUTE_OFF = ColorEx.DARK_GRAY;
3939
/** Color when track is muted. */
40-
public static final ColorEx MUTE_ON = ColorEx.ORANGE;
40+
public static final ColorEx MUTE_ON = ColorEx.ORANGE;
4141
/** Color when track is not soloed. */
42-
public static final ColorEx SOLO_OFF = ColorEx.DARK_GRAY;
42+
public static final ColorEx SOLO_OFF = ColorEx.DARK_GRAY;
4343
/** Color when track is soloed. */
44-
public static final ColorEx SOLO_ON = ColorEx.YELLOW;
44+
public static final ColorEx SOLO_ON = ColorEx.YELLOW;
4545
/** Color when track is not selected. */
46-
public static final ColorEx SELECT_OFF = ColorEx.DARK_GRAY;
46+
public static final ColorEx SELECT_OFF = ColorEx.DARK_GRAY;
4747
/** Color when track is selected. */
48-
public static final ColorEx SELECT_ON = ColorEx.CYAN;
48+
public static final ColorEx SELECT_ON = ColorEx.CYAN;
4949

5050
/** Color when device is not pinned. */
51-
public static final ColorEx PINNED_OFF = ColorEx.DARK_GRAY;
51+
public static final ColorEx PINNED_OFF = ColorEx.DARK_GRAY;
5252
/** Color when device is pinned. */
53-
public static final ColorEx PINNED_ON = ColorEx.CYAN;
53+
public static final ColorEx PINNED_ON = ColorEx.CYAN;
5454
/** Color when device is not expanded. */
55-
public static final ColorEx EXPANDED_OFF = ColorEx.DARK_GRAY;
55+
public static final ColorEx EXPANDED_OFF = ColorEx.DARK_GRAY;
5656
/** Color when device is expanded. */
57-
public static final ColorEx EXPANDED_ON = ColorEx.MINT;
57+
public static final ColorEx EXPANDED_ON = ColorEx.MINT;
5858

5959
/** Color for parameter page. */
60-
public static final ColorEx PARAM_PAGE = ColorEx.DARK_BLUE;
60+
public static final ColorEx PARAM_PAGE = ColorEx.DARK_BLUE;
6161
/** Color for selected parameter page. */
62-
public static final ColorEx PARAM_PAGE_SELECTED = ColorEx.SKY_BLUE;
62+
public static final ColorEx PARAM_PAGE_SELECTED = ColorEx.SKY_BLUE;
6363
/** Color for device. */
64-
public static final ColorEx DEVICE = ColorEx.DARK_PURPLE;
64+
public static final ColorEx DEVICE = ColorEx.DARK_PURPLE;
6565
/** Color for selected device. */
66-
public static final ColorEx DEVICE_SELECTED = ColorEx.PURPLE;
66+
public static final ColorEx DEVICE_SELECTED = ColorEx.PURPLE;
6767
/** Color for device window. */
68-
public static final ColorEx WINDOW = ColorEx.DARK_GRAY;
68+
public static final ColorEx WINDOW = ColorEx.DARK_GRAY;
6969
/** Color for device opened window. */
70-
public static final ColorEx WINDOW_OPEN = ColorEx.DARK_BROWN;
70+
public static final ColorEx WINDOW_OPEN = ColorEx.DARK_BROWN;
7171
/** Color for disabled device. */
72-
public static final ColorEx DEVICE_OFF = ColorEx.DARK_GRAY;
72+
public static final ColorEx DEVICE_OFF = ColorEx.DARK_GRAY;
7373
/** Color for enabled device window. */
74-
public static final ColorEx DEVICE_ON = ColorEx.DARK_GREEN;
74+
public static final ColorEx DEVICE_ON = ColorEx.DARK_GREEN;
75+
76+
/** Color for project parameter page. */
77+
public static final ColorEx PROJECT_PARAM_PAGE = ColorEx.DARK_PINK;
78+
/** Color for selected project parameter page. */
79+
public static final ColorEx PROJECT_PARAM_PAGE_SELECTED = ColorEx.PINK;
80+
/** Color for track parameter page. */
81+
public static final ColorEx TRACK_PARAM_PAGE = ColorEx.DARK_MINT;
82+
/** Color for selected track parameter page. */
83+
public static final ColorEx TRACK_PARAM_PAGE_SELECTED = ColorEx.MINT;
7584

7685
/** Color for a disabled equalizer band. */
77-
public static final ColorEx BAND_OFF = ColorEx.DARK_GRAY;
86+
public static final ColorEx BAND_OFF = ColorEx.DARK_GRAY;
7887
/** Color for a enabled equalizer band. */
79-
public static final ColorEx BAND_ON = ColorEx.GREEN;
88+
public static final ColorEx BAND_ON = ColorEx.GREEN;
8089

8190
/** Color for a disabled metronome. */
82-
public static final ColorEx METRONOME_OFF = ColorEx.DARK_GRAY;
91+
public static final ColorEx METRONOME_OFF = ColorEx.DARK_GRAY;
8392
/** Color for a enabled metronome. */
84-
public static final ColorEx METRONOME_ON = ColorEx.GREEN;
93+
public static final ColorEx METRONOME_ON = ColorEx.GREEN;
8594
/** Color for a disabled automation. */
86-
public static final ColorEx AUTO_OFF = ColorEx.DARK_GRAY;
95+
public static final ColorEx AUTO_OFF = ColorEx.DARK_GRAY;
8796
/** Color for a enabled automation. */
88-
public static final ColorEx AUTO_ON = ColorEx.RED;
97+
public static final ColorEx AUTO_ON = ColorEx.RED;
8998
/** Color for a disabled automation mode. */
90-
public static final ColorEx AUTO_MODE_OFF = ColorEx.DARK_GRAY;
99+
public static final ColorEx AUTO_MODE_OFF = ColorEx.DARK_GRAY;
91100
/** Color for a enabled automation mode. */
92-
public static final ColorEx AUTO_MODE_ON = ColorEx.ORANGE;
101+
public static final ColorEx AUTO_MODE_ON = ColorEx.ORANGE;
93102
/** Color for a disabled marker launch. */
94-
public static final ColorEx MARKER_LAUNCH_OFF = ColorEx.DARK_GRAY;
103+
public static final ColorEx MARKER_LAUNCH_OFF = ColorEx.DARK_GRAY;
95104
/** Color for a enabled marker launch. */
96-
public static final ColorEx MARKER_LAUNCH_ON = ColorEx.GREEN;
105+
public static final ColorEx MARKER_LAUNCH_ON = ColorEx.GREEN;
97106

98107

99108
/**

src/main/java/de/mossgrabers/controller/electra/one/controller/ElectraOneControlSurface.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ public class ElectraOneControlSurface extends AbstractControlSurface<ElectraOneC
123123
private static final int [] TOUCH_PATTERN_EQ = new int [] { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 };
124124
private static final int [] TOUCH_PATTERN_TRANSPORT = new int [] { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 };
125125
private static final int [] TOUCH_PATTERN_SESSION = new int [] { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0 };
126+
private static final int [] TOUCH_PATTERN_PROJECT = new int [] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 };
126127
private static final int [] TOUCH_PATTERN_NATIVE_DEVICE = new int [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 };
127128

128129
// @formatter:on
@@ -150,7 +151,7 @@ public class ElectraOneControlSurface extends AbstractControlSurface<ElectraOneC
150151
private static final List<Modes> MODES = new ArrayList<> ();
151152
static
152153
{
153-
Collections.addAll (MODES, Modes.VOLUME, Modes.SEND, Modes.DEVICE_PARAMS, Modes.EQ_DEVICE_PARAMS, Modes.TRANSPORT, Modes.SESSION);
154+
Collections.addAll (MODES, Modes.VOLUME, Modes.SEND, Modes.DEVICE_PARAMS, Modes.EQ_DEVICE_PARAMS, Modes.TRANSPORT, Modes.SESSION, Modes.PROJECT);
154155
}
155156

156157
private static final String SET_GROUP_TITLE = "sgt(%s,\"%s\")";
@@ -569,6 +570,8 @@ else if (Arrays.equals (this.knobStates, TOUCH_PATTERN_TRANSPORT))
569570
this.selectPage (4);
570571
else if (Arrays.equals (this.knobStates, TOUCH_PATTERN_SESSION))
571572
this.selectPage (5);
573+
else if (Arrays.equals (this.knobStates, TOUCH_PATTERN_PROJECT))
574+
this.selectPage (6);
572575
else if (Arrays.equals (this.knobStates, TOUCH_PATTERN_NATIVE_DEVICE))
573576
this.switchToSpecificDevicePreset ();
574577
else
@@ -687,10 +690,10 @@ private void checkFirmwareResult (final JsonNode root)
687690
{
688691
final int version = root.get ("versionSeq").asInt ();
689692
final String versionText = root.get ("versionText").asText ();
690-
if (version < 300000000)
691-
throw new FrameworkException ("Firmware must be at least 3.0 but is " + versionText);
692-
693-
this.host.println ("Firmware: " + versionText);
693+
if (version < 300400300)
694+
this.host.error ("Firmware must be at least 3.4.2 but is " + versionText);
695+
else
696+
this.host.println ("Firmware: " + versionText);
694697
}
695698

696699

src/main/java/de/mossgrabers/controller/electra/one/mode/AbstractElectraOneMode.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public abstract class AbstractElectraOneMode extends DefaultTrackMode<ElectraOne
3535
*/
3636
protected AbstractElectraOneMode (final int pageIndex, final String name, final ElectraOneControlSurface surface, final IModel model)
3737
{
38-
super (name, surface, model, true, ElectraOneControlSurface.KNOB_IDS);
38+
super (name, surface, model, false, ElectraOneControlSurface.KNOB_IDS);
3939

4040
this.pageCache = new PageCache (pageIndex, surface);
4141
}
@@ -64,7 +64,6 @@ public int getButtonColor (final ButtonID buttonID)
6464
public void onKnobTouch (final int index, final boolean isTouched)
6565
{
6666
this.setTouchedKnob (index, isTouched);
67-
this.pageCache.setCtrlEditing (index, isTouched);
6867
this.getParameterProvider ().get (index).touchValue (isTouched);
6968
}
7069

src/main/java/de/mossgrabers/controller/electra/one/mode/PageCache.java

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ class PageCache
2222
private static final int NUM_GROUPS = 500;
2323
private static final int GROUP_OFFSET = 500;
2424

25-
private final boolean [] [] ctrlEditing = new boolean [NUM_ROWS] [NUM_COLS];
26-
2725
private final int [] [] ctrlValueCache = new int [NUM_ROWS] [NUM_COLS];
2826
private final String [] [] ctrlValueLabelCache = new String [NUM_ROWS] [NUM_COLS];
2927
private final String [] [] ctrlLabelCache = new String [NUM_ROWS] [NUM_COLS];
@@ -57,20 +55,6 @@ public PageCache (final int page, final ElectraOneControlSurface surface)
5755
}
5856

5957

60-
/**
61-
* Set the control to be edited.
62-
*
63-
* @param index The index of the control on the page
64-
* @param isEditing True if user is currently editing the value
65-
*/
66-
public void setCtrlEditing (final int index, final boolean isEditing)
67-
{
68-
final int row = index / 6;
69-
final int column = index % 6;
70-
this.ctrlEditing[row][column] = isEditing;
71-
}
72-
73-
7458
/**
7559
* Update a value for a control. If it is different then the value in the cache an update is
7660
* sent to the controller.
@@ -186,7 +170,7 @@ public void flush ()
186170
for (int column = 0; column < NUM_COLS; column++)
187171
{
188172
// Only update values if value is not currently edited
189-
if (this.ctrlValueCache[row][column] != this.currentCtrlValueCache[row][column] && !this.ctrlEditing[row][column])
173+
if (this.ctrlValueCache[row][column] != this.currentCtrlValueCache[row][column])
190174
{
191175
this.currentCtrlValueCache[row][column] = this.ctrlValueCache[row][column];
192176
final int midiCC = ElectraOneControlSurface.ELECTRA_CTRL_1 + 10 * row + column;
@@ -289,8 +273,6 @@ public void reset ()
289273
{
290274
synchronized (this.dataLock)
291275
{
292-
for (final boolean [] row: this.ctrlEditing)
293-
Arrays.fill (row, false);
294276
for (final int [] row: this.currentCtrlValueCache)
295277
Arrays.fill (row, -1);
296278
for (final String [] row: this.currentCtrlLabelCache)

0 commit comments

Comments
 (0)