From 212b47013f208e5ba9cfb4fa64953f209cd61d54 Mon Sep 17 00:00:00 2001 From: James Ball Date: Tue, 20 Jul 2021 22:09:39 +0100 Subject: [PATCH] Add octave slider --- pom.xml | 2 +- src/main/java/sh/ball/audio/AudioPlayer.java | 2 ++ src/main/java/sh/ball/audio/ShapeAudioPlayer.java | 8 +++++++- src/main/java/sh/ball/gui/Controller.java | 14 +++++++++++++- src/main/resources/fxml/osci-render.fxml | 7 +++++-- 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 4371fefe..579c0816 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ sh.ball osci-render - 1.11.6 + 1.11.7 osci-render diff --git a/src/main/java/sh/ball/audio/AudioPlayer.java b/src/main/java/sh/ball/audio/AudioPlayer.java index c45e5a58..8283caa6 100644 --- a/src/main/java/sh/ball/audio/AudioPlayer.java +++ b/src/main/java/sh/ball/audio/AudioPlayer.java @@ -14,6 +14,8 @@ public interface AudioPlayer extends Runnable { boolean isPlaying(); + void setOctave(int octave); + void setBaseFrequencies(List frequency); void setPitchBendFactor(double pitchBend); diff --git a/src/main/java/sh/ball/audio/ShapeAudioPlayer.java b/src/main/java/sh/ball/audio/ShapeAudioPlayer.java index ca42b549..42f2c42a 100644 --- a/src/main/java/sh/ball/audio/ShapeAudioPlayer.java +++ b/src/main/java/sh/ball/audio/ShapeAudioPlayer.java @@ -49,6 +49,7 @@ public class ShapeAudioPlayer implements AudioPlayer> { private double mainFrequency = MIDDLE_C; private double pitchBend = 1.0; private double trace = 0.5; + private int octave = 0; private AudioDevice device; @@ -146,7 +147,7 @@ public class ShapeAudioPlayer implements AudioPlayer> { public void setBaseFrequencies(List frequencies) { this.frequencies = frequencies; double maxFrequency = frequencies.stream().max(Double::compareTo).get(); - this.mainFrequency = maxFrequency; + this.mainFrequency = maxFrequency * Math.pow(2, octave); updateLengthIncrement(); sineEffects.clear(); @@ -227,6 +228,11 @@ public class ShapeAudioPlayer implements AudioPlayer> { return audioEngine.isPlaying(); } + @Override + public void setOctave(int octave) { + this.octave = octave; + } + @Override public void addFrame(List frame) { try { diff --git a/src/main/java/sh/ball/gui/Controller.java b/src/main/java/sh/ball/gui/Controller.java index 7832d627..bacfd4f4 100644 --- a/src/main/java/sh/ball/gui/Controller.java +++ b/src/main/java/sh/ball/gui/Controller.java @@ -178,6 +178,10 @@ public class Controller implements Initializable, FrequencyListener, MidiListene @FXML private SVGPath wobbleMidi; @FXML + private Slider octaveSlider; + @FXML + private SVGPath octaveMidi; + @FXML private ComboBox deviceComboBox; @@ -211,6 +215,7 @@ public class Controller implements Initializable, FrequencyListener, MidiListene midiMap.put(vectorCancellingMidi, vectorCancellingSlider); midiMap.put(bitCrushMidi, bitCrushSlider); midiMap.put(wobbleMidi, wobbleSlider); + midiMap.put(octaveMidi, octaveSlider); midiMap.put(verticalDistortMidi, verticalDistortSlider); midiMap.put(horizontalDistortMidi, horizontalDistortSlider); return midiMap; @@ -314,6 +319,8 @@ public class Controller implements Initializable, FrequencyListener, MidiListene wobbleCheckBox.selectedProperty().addListener(wobbleListener); wobbleCheckBox.selectedProperty().addListener(e -> wobbleEffect.update()); + octaveSlider.valueProperty().addListener((e, old, octave) -> audioPlayer.setOctave(octave.intValue())); + fileChooser.setInitialFileName("out.wav"); fileChooser.getExtensionFilters().addAll( new FileChooser.ExtensionFilter("All Files", "*.*"), @@ -664,8 +671,13 @@ public class Controller implements Initializable, FrequencyListener, MidiListene } if (CCMap.containsKey(id)) { Slider slider = midiButtonMap.get(CCMap.get(id)); + double sliderValue = midiPressureToPressure(slider, value); - slider.setValue(midiPressureToPressure(slider, value)); + if (slider.isSnapToTicks()) { + double increment = slider.getMajorTickUnit() / (slider.getMinorTickCount() + 1); + sliderValue = increment * (Math.round(sliderValue / increment)); + } + slider.setValue(sliderValue); } } else if (command == ShortMessage.NOTE_ON || command == ShortMessage.NOTE_OFF) { MidiNote note = new MidiNote(message.getData1()); diff --git a/src/main/resources/fxml/osci-render.fxml b/src/main/resources/fxml/osci-render.fxml index cf4b7c4d..f3e8dcad 100644 --- a/src/main/resources/fxml/osci-render.fxml +++ b/src/main/resources/fxml/osci-render.fxml @@ -12,12 +12,12 @@ - + - + @@ -31,6 +31,9 @@ + + +