Skip to content

Commit 6a4d14f

Browse files
committed
Finished v25.
1 parent b94f7f2 commit 6a4d14f

27 files changed

+118
-350
lines changed

DrivenByMoss-Manual.pdf

7.47 KB
Binary file not shown.

src/main/java/de/mossgrabers/bitwig/framework/daw/data/ParameterImpl.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,6 @@ public int getModulatedValue ()
151151
}
152152

153153

154-
/** {@inheritDoc} */
155-
@Override
156-
public void addValueObserver (final IValueObserver<Void> observer)
157-
{
158-
this.parameter.value ().addValueObserver (value -> observer.update (null));
159-
}
160-
161-
162154
/** {@inheritDoc} */
163155
@Override
164156
public void setIndication (final boolean enable)

src/main/java/de/mossgrabers/bitwig/framework/daw/data/ParameterListImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class ParameterListImpl implements IParameterList
3030

3131
/**
3232
* Constructor.
33-
*
33+
*
3434
* @param numMonitoredPages The number of pages t monitor
3535
* @param device A Bitwig device
3636
* @param host The controller host
@@ -48,8 +48,8 @@ public ParameterListImpl (final int numMonitoredPages, final Device device, fina
4848
{
4949
final int page = i;
5050
final CursorRemoteControlsPage remoteControls = device.createCursorRemoteControlsPage ("Page " + page, numParams, "");
51-
remoteControls.pageCount ().addValueObserver (newValue -> reAdjust (remoteControls, page), -1);
52-
remoteControls.selectedPageIndex ().addValueObserver (newValue -> reAdjust (remoteControls, page), -1);
51+
remoteControls.pageCount ().addValueObserver (newValue -> this.reAdjust (remoteControls, page), -1);
52+
remoteControls.selectedPageIndex ().addValueObserver (newValue -> this.reAdjust (remoteControls, page), -1);
5353
for (int p = 0; p < numParams; p++)
5454
this.parameters.add (new ParameterImpl (valueChanger, remoteControls.getParameter (p)));
5555
}

src/main/java/de/mossgrabers/bitwig/framework/daw/data/bank/ParameterBankImpl.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
package de.mossgrabers.bitwig.framework.daw.data.bank;
66

7+
import com.bitwig.extension.controller.api.CursorRemoteControlsPage;
8+
import com.bitwig.extension.controller.api.SettableIntegerValue;
9+
710
import de.mossgrabers.bitwig.framework.daw.data.ParameterImpl;
811
import de.mossgrabers.bitwig.framework.daw.data.Util;
912
import de.mossgrabers.framework.controller.valuechanger.IValueChanger;
@@ -12,11 +15,9 @@
1215
import de.mossgrabers.framework.daw.data.bank.AbstractItemBank;
1316
import de.mossgrabers.framework.daw.data.bank.IParameterBank;
1417
import de.mossgrabers.framework.daw.data.bank.IParameterPageBank;
18+
import de.mossgrabers.framework.observer.IValueObserver;
1519
import de.mossgrabers.framework.parameter.IParameter;
1620

17-
import com.bitwig.extension.controller.api.CursorRemoteControlsPage;
18-
import com.bitwig.extension.controller.api.SettableIntegerValue;
19-
2021

2122
/**
2223
* Encapsulates the data of a parameter bank.
@@ -179,4 +180,17 @@ public IParameterPageBank getPageBank ()
179180
{
180181
return this.pageBank;
181182
}
183+
184+
185+
/** {@inheritDoc} */
186+
@Override
187+
public void addValueObserver (final IValueObserver<Integer> observer)
188+
{
189+
for (int i = 0; i < this.getPageSize (); i++)
190+
{
191+
final IParameter parameter = this.getItem (i);
192+
final Integer index = Integer.valueOf (i);
193+
((ParameterImpl) parameter).getParameter ().value ().addValueObserver (value -> observer.update (index));
194+
}
195+
}
182196
}

src/main/java/de/mossgrabers/controller/melbourne/rotocontrol/RotoControlConfiguration.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ public void init (final ISettingsUI globalSettings, final ISettingsUI documentSe
4343
this.activateBehaviourOnStopSetting (globalSettings);
4444
this.activateBehaviourOnPauseSetting (globalSettings);
4545

46-
///////////////////////////
47-
// Play and Sequence
48-
49-
this.activateQuantizeAmountSetting (globalSettings);
50-
5146
///////////////////////////
5247
// Workflow
5348

src/main/java/de/mossgrabers/controller/melbourne/rotocontrol/RotoControlControllerDefinition.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class RotoControlControllerDefinition extends DefaultControllerDefinition
2121
{
2222
private static final UUID EXTENSION_ID = UUID.fromString ("CFEB4D14-B6D8-47A4-A251-E11C023CAF6F");
2323

24+
2425
/**
2526
* Constructor.
2627
*/

src/main/java/de/mossgrabers/controller/melbourne/rotocontrol/RotoControlControllerSetup.java

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@
1717
import de.mossgrabers.controller.melbourne.rotocontrol.controller.RotoControlMessage;
1818
import de.mossgrabers.controller.melbourne.rotocontrol.mode.RotoControlDeviceParameterMode;
1919
import de.mossgrabers.controller.melbourne.rotocontrol.mode.RotoControlDisplay;
20-
import de.mossgrabers.controller.melbourne.rotocontrol.mode.RotoControlMode;
21-
import de.mossgrabers.controller.melbourne.rotocontrol.mode.RotoControlSelectedTrackMode;
22-
import de.mossgrabers.controller.melbourne.rotocontrol.mode.RotoControlTrackPanMode;
23-
import de.mossgrabers.controller.melbourne.rotocontrol.mode.RotoControlTrackSendMode;
24-
import de.mossgrabers.controller.melbourne.rotocontrol.mode.RotoControlTrackVolumeMode;
2520
import de.mossgrabers.framework.command.continuous.KnobRowModeCommand;
2621
import de.mossgrabers.framework.command.trigger.clip.NewCommand;
2722
import de.mossgrabers.framework.command.trigger.mode.ButtonRowModeCommand;
@@ -51,9 +46,13 @@
5146
import de.mossgrabers.framework.featuregroup.ModeManager;
5247
import de.mossgrabers.framework.featuregroup.ViewManager;
5348
import de.mossgrabers.framework.mode.Modes;
49+
import de.mossgrabers.framework.mode.track.TrackMode;
5450
import de.mossgrabers.framework.mode.track.TrackMuteMode;
51+
import de.mossgrabers.framework.mode.track.TrackPanMode;
5552
import de.mossgrabers.framework.mode.track.TrackRecArmMode;
53+
import de.mossgrabers.framework.mode.track.TrackSendMode;
5654
import de.mossgrabers.framework.mode.track.TrackSoloMode;
55+
import de.mossgrabers.framework.mode.track.TrackVolumeMode;
5756
import de.mossgrabers.framework.view.DummyView;
5857
import de.mossgrabers.framework.view.Views;
5958

@@ -111,8 +110,10 @@ protected void createModel ()
111110
// These are used to be able to bind any parameter from any of the pages
112111
this.modelSetup.setNumListParams (8 * NUM_PARAM_PAGES);
113112

113+
// Only for creating new clips
114+
this.modelSetup.setNumScenes (16);
115+
114116
// Not used
115-
this.modelSetup.setNumScenes (0);
116117
this.modelSetup.setNumDeviceLayers (0);
117118
this.modelSetup.setNumDrumPadLayers (0);
118119
this.modelSetup.enableMainDrumDevice (false);
@@ -128,8 +129,7 @@ protected void createSurface ()
128129
final IMidiAccess midiAccess = this.factory.createMidiAccess ();
129130
final IMidiOutput output = midiAccess.createOutput ();
130131
final IMidiInput input = midiAccess.createInput (null);
131-
final RotoControlControlSurface surface = new RotoControlControlSurface (this.host, this.colorManager, this.configuration, output, input, this);
132-
this.surfaces.add (surface);
132+
this.surfaces.add (new RotoControlControlSurface (this.host, this.colorManager, this.configuration, output, input, this, this.model));
133133
}
134134

135135

@@ -139,11 +139,11 @@ protected void createModes ()
139139
{
140140
final RotoControlControlSurface surface = this.getSurface ();
141141
final ModeManager modeManager = surface.getModeManager ();
142-
modeManager.register (Modes.TRACK, new RotoControlSelectedTrackMode (surface, this.model));
143-
modeManager.register (Modes.VOLUME, new RotoControlTrackVolumeMode (surface, this.model));
144-
modeManager.register (Modes.PAN, new RotoControlTrackPanMode (surface, this.model));
142+
modeManager.register (Modes.TRACK, new TrackMode<RotoControlControlSurface, RotoControlConfiguration> (surface, this.model, true));
143+
modeManager.register (Modes.VOLUME, new TrackVolumeMode<RotoControlControlSurface, RotoControlConfiguration> (surface, this.model, true));
144+
modeManager.register (Modes.PAN, new TrackPanMode<RotoControlControlSurface, RotoControlConfiguration> (surface, this.model, true));
145145
for (int i = 0; i < this.modelSetup.getNumSends (); i++)
146-
modeManager.register (Modes.get (Modes.SEND1, i), new RotoControlTrackSendMode (i, surface, this.model));
146+
modeManager.register (Modes.get (Modes.SEND1, i), new TrackSendMode<RotoControlControlSurface, RotoControlConfiguration> (i, surface, this.model, true));
147147
final RotoControlDeviceParameterMode deviceParamsMode = new RotoControlDeviceParameterMode (surface, this.model);
148148
modeManager.register (Modes.DEVICE_PARAMS, deviceParamsMode);
149149

@@ -339,7 +339,7 @@ private void handleGeneralCommands (final RotoControlMessage message)
339339
bank.scrollTo (content[0] / pageSize * pageSize);
340340
surface.scheduleTask ( () -> {
341341
bank.getItem (content[0] % pageSize).select ();
342-
switchTracks (surface);
342+
this.switchTracks (surface);
343343
}, 100);
344344
break;
345345

@@ -471,8 +471,7 @@ private void handleMixCommands (final RotoControlMessage message)
471471
surface.errorln ("Unsupported knob mode: " + data[1]);
472472
break;
473473
}
474-
if (modeManager.getActive () instanceof final RotoControlMode rotoMode)
475-
rotoMode.flushDisplay ();
474+
surface.flushRotoDisplay ();
476475

477476
// Set the button mode
478477
switch (data[2])
@@ -490,7 +489,7 @@ private void handleMixCommands (final RotoControlMessage message)
490489
surface.errorln ("Unsupported button mode: " + data[2]);
491490
break;
492491
}
493-
switchTracks (surface);
492+
this.switchTracks (surface);
494493
break;
495494

496495
case RotoControlMessage.RCV_SET_MIX_TRACK_MODE:
@@ -516,7 +515,7 @@ private void handleMixCommands (final RotoControlMessage message)
516515
final ITrackBank currentTrackBank = this.model.getCurrentTrackBank ();
517516
if (currentTrackBank.getSelectedItem ().isEmpty ())
518517
currentTrackBank.getItem (0).select ();
519-
switchTracks (surface);
518+
this.switchTracks (surface);
520519
break;
521520

522521
default:
@@ -605,8 +604,7 @@ protected void handleTrackChange (final boolean isSelected)
605604
surface.sendSysex (RotoControlMessage.MIX, RotoControlMessage.TR_DAW_SELECT_TRACK, out.toByteArray ());
606605

607606
// Trigger sending device updates
608-
if (surface.getModeManager ().get (Modes.DEVICE_PARAMS) instanceof RotoControlDeviceParameterMode rotoParamMode)
609-
rotoParamMode.flushDisplay ();
607+
surface.flushRotoDisplay ();
610608
}
611609
catch (final IOException ex)
612610
{

src/main/java/de/mossgrabers/controller/melbourne/rotocontrol/controller/RotoControlControlSurface.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
import java.util.Set;
1212

1313
import de.mossgrabers.controller.melbourne.rotocontrol.RotoControlConfiguration;
14+
import de.mossgrabers.controller.melbourne.rotocontrol.mode.RotoControlDisplay;
1415
import de.mossgrabers.framework.command.core.ContinuousCommand;
1516
import de.mossgrabers.framework.controller.AbstractControlSurface;
1617
import de.mossgrabers.framework.controller.color.ColorManager;
1718
import de.mossgrabers.framework.controller.hardware.BindType;
1819
import de.mossgrabers.framework.daw.IHost;
20+
import de.mossgrabers.framework.daw.IModel;
1921
import de.mossgrabers.framework.daw.midi.IMidiInput;
2022
import de.mossgrabers.framework.daw.midi.IMidiOutput;
2123
import de.mossgrabers.framework.utils.StringUtils;
@@ -71,6 +73,7 @@ public class RotoControlControlSurface extends AbstractControlSurface<RotoContro
7173
private final IMessageCallback callback;
7274
private final int [] lastCCValues = new int [32];
7375
private final Map<Integer, ContinuousCommand> commands = new HashMap<> ();
76+
private final RotoControlDisplay rotoDisplay;
7477

7578

7679
/**
@@ -82,12 +85,14 @@ public class RotoControlControlSurface extends AbstractControlSurface<RotoContro
8285
* @param output The MIDI output
8386
* @param input The MIDI input
8487
* @param callback The callback for commands received via system exclusive
88+
* @param model The model
8589
*/
86-
public RotoControlControlSurface (final IHost host, final ColorManager colorManager, final RotoControlConfiguration configuration, final IMidiOutput output, final IMidiInput input, final IMessageCallback callback)
90+
public RotoControlControlSurface (final IHost host, final ColorManager colorManager, final RotoControlConfiguration configuration, final IMidiOutput output, final IMidiInput input, final IMessageCallback callback, final IModel model)
8791
{
8892
super (host, configuration, colorManager, output, input, null, 100, 100);
8993

9094
this.callback = callback;
95+
this.rotoDisplay = new RotoControlDisplay (this, model);
9196

9297
this.input.setSysexCallback (this::handleSysEx);
9398
}
@@ -114,6 +119,27 @@ public void sendStartupCommand ()
114119
}
115120

116121

122+
/**
123+
* Fully update the roto-control display state.
124+
*/
125+
public void flushRotoDisplay ()
126+
{
127+
this.rotoDisplay.flushTrackDisplay ();
128+
this.rotoDisplay.flushDeviceDisplay ();
129+
}
130+
131+
132+
/** {@inheritDoc} */
133+
@Override
134+
protected void flushHardware ()
135+
{
136+
this.rotoDisplay.updateTrackDisplay ();
137+
this.rotoDisplay.updateDeviceDisplay ();
138+
139+
super.flushHardware ();
140+
}
141+
142+
117143
/** {@inheritDoc} */
118144
@Override
119145
protected void handleCC (final int channel, final int data1, final int data2)

src/main/java/de/mossgrabers/controller/melbourne/rotocontrol/mode/ReplaceableParameterProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class ReplaceableParameterProvider extends AbstractParameterProvider
2626

2727
/**
2828
* Constructor.
29-
*
29+
*
3030
* @param numberOfParameters The number of parameters
3131
*/
3232
public ReplaceableParameterProvider (final int numberOfParameters)
@@ -48,7 +48,7 @@ public int size ()
4848

4949
/**
5050
* Set a parameter.
51-
*
51+
*
5252
* @param index The index of the parameter
5353
* @param parameter The parameter
5454
*/

src/main/java/de/mossgrabers/controller/melbourne/rotocontrol/mode/RotoControlDeviceParameterMode.java

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@
2626
*
2727
* @author Jürgen Moßgraber
2828
*/
29-
public class RotoControlDeviceParameterMode extends AbstractParameterMode<RotoControlControlSurface, RotoControlConfiguration, IParameter> implements RotoControlMode
29+
public class RotoControlDeviceParameterMode extends AbstractParameterMode<RotoControlControlSurface, RotoControlConfiguration, IParameter>
3030
{
31-
private final RotoControlDisplay rotoDisplay;
3231
private boolean learnMode;
3332
private int lastMappedParameterIndex = -1;
3433
private final ReplaceableParameterProvider parameterProvider;
@@ -49,39 +48,13 @@ public RotoControlDeviceParameterMode (final RotoControlControlSurface surface,
4948

5049
// Monitor the 'normal' selected parameter page for changes which will be used to trigger
5150
// the learn mode
52-
final IParameterBank parameterBank = this.cursorDevice.getParameterBank ();
53-
for (int i = 0; i < 8; i++)
54-
{
55-
final int index = i;
56-
parameterBank.getItem (i).addValueObserver (Void -> this.handleMapping (index));
57-
}
51+
this.cursorDevice.getParameterBank ().addValueObserver (index -> this.handleMapping (index.intValue ()));
5852

5953
// Add 8 knob and 8 button parameters
6054
this.parameterProvider = new ReplaceableParameterProvider (16);
6155
// TODO 5.3.3: use this when switched to Bitwig binding
6256
// if (this.controls != null)
6357
// this.setParameterProvider (this.parameterProvider);
64-
65-
this.rotoDisplay = new RotoControlDisplay (surface, model);
66-
67-
this.flushDisplay ();
68-
}
69-
70-
71-
/** {@inheritDoc} */
72-
@Override
73-
public void flushDisplay ()
74-
{
75-
this.rotoDisplay.flushDeviceDisplay ();
76-
}
77-
78-
79-
/** {@inheritDoc} */
80-
@Override
81-
public void updateDisplay ()
82-
{
83-
// Sends only information about devices! Parameter names are stored in the ROTO-CONTROL!
84-
this.rotoDisplay.updateDeviceDisplay ();
8558
}
8659

8760

@@ -141,7 +114,7 @@ public void setParamLearn (final boolean activateLearn)
141114

142115
/**
143116
* Bind a parameter.
144-
*
117+
*
145118
* @param paramIndex The index of the parameter across all pages
146119
* @param posInPage The position of the knob/switch
147120
* @param isSwitch True if it is a switch, false if it is a knob

0 commit comments

Comments
 (0)