kopia lustrzana https://github.com/jameshball/osci-render
Add octave slider
rodzic
410ddd59ae
commit
212b47013f
2
pom.xml
2
pom.xml
|
@ -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>
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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>
|
||||
|
|
Ładowanie…
Reference in New Issue