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 @@
+
+
+