diff --git a/src/main/java/sh/ball/audio/midi/MidiNote.java b/src/main/java/sh/ball/audio/midi/MidiNote.java index 604ab92..50cc545 100644 --- a/src/main/java/sh/ball/audio/midi/MidiNote.java +++ b/src/main/java/sh/ball/audio/midi/MidiNote.java @@ -26,12 +26,12 @@ public class MidiNote { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; MidiNote midiNote = (MidiNote) o; - return key == midiNote.key && octave == midiNote.octave && name.equals(midiNote.name); + return key == midiNote.key; } @Override public int hashCode() { - return Objects.hash(name, key, octave); + return Objects.hash(key); } @Override diff --git a/src/main/java/sh/ball/gui/Controller.java b/src/main/java/sh/ball/gui/Controller.java index 121597a..005e55e 100644 --- a/src/main/java/sh/ball/gui/Controller.java +++ b/src/main/java/sh/ball/gui/Controller.java @@ -5,6 +5,9 @@ import javafx.animation.Timeline; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.scene.control.*; +import javafx.scene.paint.Color; +import javafx.scene.paint.Paint; +import javafx.scene.shape.SVGPath; import javafx.stage.DirectoryChooser; import javafx.util.Duration; import sh.ball.audio.*; @@ -54,6 +57,8 @@ public class Controller implements Initializable, FrequencyListener, MidiListene private final DirectoryChooser folderChooser = new DirectoryChooser(); private final AudioPlayer> audioPlayer; private final ExecutorService executor = Executors.newSingleThreadExecutor(); + private final Map midiMap = new HashMap<>(); + private Map midiButtonMap; private final RotateEffect rotateEffect; private final TranslateEffect translateEffect; @@ -65,6 +70,8 @@ public class Controller implements Initializable, FrequencyListener, MidiListene private final AudioDevice defaultDevice; private boolean recording = false; private Timeline recordingTimeline; + private Paint armedMidiPaint; + private SVGPath armedMidi; private FrameProducer> producer; private final List>> frameSets = new ArrayList<>(); @@ -100,16 +107,26 @@ public class Controller implements Initializable, FrequencyListener, MidiListene @FXML private Slider weightSlider; @FXML + private SVGPath weightMidi; + @FXML private Slider rotateSpeedSlider; @FXML + private SVGPath rotateSpeedMidi; + @FXML private Slider translationSpeedSlider; @FXML + private SVGPath translationSpeedMidi; + @FXML private Slider scaleSlider; @FXML + private SVGPath scaleMidi; + @FXML private TitledPane objTitledPane; @FXML private Slider focalLengthSlider; @FXML + private SVGPath focalLengthMidi; + @FXML private TextField cameraXTextField; @FXML private TextField cameraYTextField; @@ -118,28 +135,40 @@ public class Controller implements Initializable, FrequencyListener, MidiListene @FXML private Slider objectRotateSpeedSlider; @FXML + private SVGPath objectRotateSpeedMidi; + @FXML private CheckBox rotateCheckBox; @FXML private CheckBox vectorCancellingCheckBox; @FXML private Slider vectorCancellingSlider; @FXML + private SVGPath vectorCancellingMidi; + @FXML private CheckBox bitCrushCheckBox; @FXML private Slider bitCrushSlider; @FXML + private SVGPath bitCrushMidi; + @FXML private CheckBox verticalDistortCheckBox; @FXML private Slider verticalDistortSlider; @FXML + private SVGPath verticalDistortMidi; + @FXML private CheckBox horizontalDistortCheckBox; @FXML private Slider horizontalDistortSlider; @FXML + private SVGPath horizontalDistortMidi; + @FXML private CheckBox wobbleCheckBox; @FXML private Slider wobbleSlider; @FXML + private SVGPath wobbleMidi; + @FXML private ComboBox deviceComboBox; public Controller(AudioPlayer> audioPlayer) throws IOException { @@ -161,20 +190,30 @@ public class Controller implements Initializable, FrequencyListener, MidiListene this.scaleEffect = new ScaleEffect(); } + private Map initializeMidiButtonMap() { + Map midiMap = new HashMap<>(); + midiMap.put(weightMidi, weightSlider); + midiMap.put(rotateSpeedMidi, rotateSpeedSlider); + midiMap.put(translationSpeedMidi, translationSpeedSlider); + midiMap.put(scaleMidi, scaleSlider); + midiMap.put(focalLengthMidi, focalLengthSlider); + midiMap.put(objectRotateSpeedMidi, objectRotateSpeedSlider); + midiMap.put(vectorCancellingMidi, vectorCancellingSlider); + midiMap.put(bitCrushMidi, bitCrushSlider); + midiMap.put(wobbleMidi, wobbleSlider); + midiMap.put(verticalDistortMidi, verticalDistortSlider); + midiMap.put(horizontalDistortMidi, horizontalDistortSlider); + return midiMap; + } + private Map> initializeSliderMap() { return Map.of( - weightSlider, - audioPlayer::setQuality, - rotateSpeedSlider, - rotateEffect::setSpeed, - translationSpeedSlider, - translateEffect::setSpeed, - scaleSlider, - scaleEffect::setScale, - focalLengthSlider, - d -> updateFocalLength(), - objectRotateSpeedSlider, - d -> updateObjectRotateSpeed() + weightSlider, audioPlayer::setQuality, + rotateSpeedSlider, rotateEffect::setSpeed, + translationSpeedSlider, translateEffect::setSpeed, + scaleSlider, scaleEffect::setScale, + focalLengthSlider, d -> updateFocalLength(), + objectRotateSpeedSlider, d -> updateObjectRotateSpeed() ); } @@ -197,6 +236,25 @@ public class Controller implements Initializable, FrequencyListener, MidiListene @Override public void initialize(URL url, ResourceBundle resourceBundle) { + this.midiButtonMap = initializeMidiButtonMap(); + + midiButtonMap.keySet().forEach(midi -> midi.setOnMouseClicked(e -> { + if (armedMidi == midi) { + // we are already armed, so we should unarm + midi.setFill(armedMidiPaint); + armedMidiPaint = null; + armedMidi = null; + } else { + // not yet armed + if (armedMidi != null) { + armedMidi.setFill(armedMidiPaint); + } + armedMidiPaint = midi.getFill(); + armedMidi = midi; + midi.setFill(Color.color(1, 0, 0)); + } + })); + Map> sliders = initializeSliderMap(); initializeEffectTypes(); @@ -560,14 +618,24 @@ public class Controller implements Initializable, FrequencyListener, MidiListene @Override public void sendMidiMessage(int status, MidiNote note, int pressure) { - if (note.key() == 1) { - double max = weightSlider.getMax(); - double min = weightSlider.getMin(); - double range = max - min; - weightSlider.setValue(min + (pressure / 127.0) * range); + if (armedMidi != null) { + if (midiMap.containsValue(armedMidi)) { + midiMap.values().remove(armedMidi); + } + if (midiMap.containsKey(note)) { + midiMap.get(note).setFill(Color.color(1, 1, 1)); + } + midiMap.put(note, armedMidi); + armedMidi.setFill(Color.color(0, 1, 0)); + armedMidiPaint = null; + armedMidi = null; + } + if (midiMap.containsKey(note)) { + Slider slider = midiButtonMap.get(midiMap.get(note)); + double max = slider.getMax(); + double min = slider.getMin(); + double range = max - min; + slider.setValue(min + (pressure / 127.0) * range); } - System.out.println(status); - System.out.println(note); - System.out.println(pressure); } } diff --git a/src/main/resources/fxml/osci-render.fxml b/src/main/resources/fxml/osci-render.fxml index 7bc3f94..1c933f1 100644 --- a/src/main/resources/fxml/osci-render.fxml +++ b/src/main/resources/fxml/osci-render.fxml @@ -8,30 +8,36 @@ + - + - + - + - + - + - + + + + + + - + @@ -64,19 +72,19 @@ - + - + - +