Add octave slider

pull/35/head
James Ball 2021-07-20 22:09:39 +01:00
rodzic 410ddd59ae
commit 212b47013f
5 zmienionych plików z 28 dodań i 5 usunięć

Wyświetl plik

@ -6,7 +6,7 @@
<groupId>sh.ball</groupId>
<artifactId>osci-render</artifactId>
<version>1.11.6</version>
<version>1.11.7</version>
<name>osci-render</name>

Wyświetl plik

@ -14,6 +14,8 @@ public interface AudioPlayer<S> extends Runnable {
boolean isPlaying();
void setOctave(int octave);
void setBaseFrequencies(List<Double> frequency);
void setPitchBendFactor(double pitchBend);

Wyświetl plik

@ -49,6 +49,7 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
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<List<Shape>> {
public void setBaseFrequencies(List<Double> 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<List<Shape>> {
return audioEngine.isPlaying();
}
@Override
public void setOctave(int octave) {
this.octave = octave;
}
@Override
public void addFrame(List<Shape> frame) {
try {

Wyświetl plik

@ -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<AudioDevice> 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());

Wyświetl plik

@ -12,12 +12,12 @@
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="539.0" prefWidth="837.0" stylesheets="@../css/main.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1">
<TitledPane animated="false" collapsible="false" layoutX="426.0" layoutY="8.0" prefHeight="303.0" prefWidth="402.0" text="Effects">
<TitledPane animated="false" collapsible="false" layoutX="426.0" layoutY="8.0" prefHeight="303.0" prefWidth="402.0" text="Audio Effects">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="262.0" prefWidth="401.0">
<children>
<CheckBox fx:id="vectorCancellingCheckBox" layoutX="14.0" layoutY="15.0" mnemonicParsing="false" text="Vector cancelling" />
<Slider fx:id="vectorCancellingSlider" blockIncrement="0.05" disable="true" layoutX="154.0" layoutY="16.0" majorTickUnit="1.0" max="10.0" min="2.0" prefHeight="42.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" snapToTicks="true" value="2.0" />
<Slider fx:id="vectorCancellingSlider" blockIncrement="0.05" disable="true" layoutX="154.0" layoutY="16.0" majorTickUnit="1.0" max="10.0" min="2.0" minorTickCount="0" prefHeight="42.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" snapToTicks="true" value="2.0" />
<CheckBox fx:id="bitCrushCheckBox" layoutX="14.0" layoutY="53.0" mnemonicParsing="false" text="Bit crush" />
<Slider fx:id="bitCrushSlider" blockIncrement="0.01" disable="true" layoutX="154.0" layoutY="55.0" majorTickUnit="0.5" max="3.0" prefHeight="42.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="2.0" />
<CheckBox fx:id="verticalDistortCheckBox" layoutX="14.0" layoutY="94.0" mnemonicParsing="false" text="Vertical Distort" />
@ -31,6 +31,9 @@
<SVGPath fx:id="verticalDistortMidi" content="M20.15 8.26H22V15.74H20.15M13 8.26H18.43C19 8.26 19.3 8.74 19.3 9.3V14.81C19.3 15.5 19 15.74 18.38 15.74H13V11H14.87V13.91H17.5V9.95H13M10.32 8.26H12.14V15.74H10.32M2 8.26H8.55C9.1 8.26 9.41 8.74 9.41 9.3V15.74H7.59V10.15H6.5V15.74H4.87V10.15H3.83V15.74H2Z" fill="WHITE" layoutX="373.0" layoutY="92.0" pickOnBounds="true" />
<SVGPath fx:id="horizontalDistortMidi" content="M20.15 8.26H22V15.74H20.15M13 8.26H18.43C19 8.26 19.3 8.74 19.3 9.3V14.81C19.3 15.5 19 15.74 18.38 15.74H13V11H14.87V13.91H17.5V9.95H13M10.32 8.26H12.14V15.74H10.32M2 8.26H8.55C9.1 8.26 9.41 8.74 9.41 9.3V15.74H7.59V10.15H6.5V15.74H4.87V10.15H3.83V15.74H2Z" fill="WHITE" layoutX="373.0" layoutY="135.0" pickOnBounds="true" />
<SVGPath fx:id="wobbleMidi" content="M20.15 8.26H22V15.74H20.15M13 8.26H18.43C19 8.26 19.3 8.74 19.3 9.3V14.81C19.3 15.5 19 15.74 18.38 15.74H13V11H14.87V13.91H17.5V9.95H13M10.32 8.26H12.14V15.74H10.32M2 8.26H8.55C9.1 8.26 9.41 8.74 9.41 9.3V15.74H7.59V10.15H6.5V15.74H4.87V10.15H3.83V15.74H2Z" fill="WHITE" layoutX="373.0" layoutY="177.0" pickOnBounds="true" />
<Slider fx:id="octaveSlider" blockIncrement="1.0" layoutX="67.0" layoutY="224.0" majorTickUnit="1.0" max="5.0" min="-5.0" minorTickCount="0" prefHeight="42.0" prefWidth="306.0" showTickLabels="true" showTickMarks="true" snapToTicks="true" />
<SVGPath fx:id="octaveMidi" content="M20.15 8.26H22V15.74H20.15M13 8.26H18.43C19 8.26 19.3 8.74 19.3 9.3V14.81C19.3 15.5 19 15.74 18.38 15.74H13V11H14.87V13.91H17.5V9.95H13M10.32 8.26H12.14V15.74H10.32M2 8.26H8.55C9.1 8.26 9.41 8.74 9.41 9.3V15.74H7.59V10.15H6.5V15.74H4.87V10.15H3.83V15.74H2Z" fill="WHITE" layoutX="373.0" layoutY="221.0" pickOnBounds="true" />
<Label layoutX="14.0" layoutY="223.0" text="Octave" />
</children>
</AnchorPane>
</content>