Add trace min slider

pull/53/head
James Ball 2022-03-12 22:03:11 +00:00 zatwierdzone przez James H Ball
rodzic 30b7442be1
commit 55ddfeae64
6 zmienionych plików z 150 dodań i 99 usunięć

Wyświetl plik

@ -22,8 +22,6 @@ import javax.sound.midi.ShortMessage;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import static sh.ball.gui.Gui.audioPlayer;
public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
private static final double MIN_TRACE = 0.001;
@ -75,7 +73,8 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
private DoubleProperty frequency;
private double baseFrequencyVolumeScale = 0.5;
private double baseFrequency;
private double trace = 1;
private double traceMin = 0;
private double traceMax = 1;
private int octave = 0;
private int sampleRate;
@ -125,22 +124,11 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
this.volume = volume;
}
private Vector2 generateChannels() throws InterruptedException {
Shape shape = getCurrentShape();
private void incrementShapeDrawing() {
double length = getCurrentShape().getLength();
double length = shape.getLength();
double drawingProgress = length == 0 ? 1 : shapeDrawn / length;
Vector2 nextVector = applyEffects(count, shape.nextVector(drawingProgress));
Vector2 channels = cutoff(nextVector);
writeChannels((float) channels.getX(), (float) channels.getY());
shapeDrawn += lengthIncrement;
frameDrawn += lengthIncrement;
if (++count > MAX_COUNT) {
count = 0;
}
shapeDrawn += lengthIncrement;
// Need to skip all shapes that the lengthIncrement draws over.
// This is especially an issue when there are lots of small lines being
@ -154,8 +142,25 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
}
length = getCurrentShape().getLength();
}
}
double proportionalLength = trace * frameLength;
private Vector2 generateChannels() throws InterruptedException {
Shape shape = getCurrentShape();
double length = shape.getLength();
double drawingProgress = length == 0 ? 1 : shapeDrawn / length;
Vector2 nextVector = applyEffects(count, shape.nextVector(drawingProgress));
Vector2 channels = cutoff(nextVector);
writeChannels((float) channels.getX(), (float) channels.getY());
if (++count > MAX_COUNT) {
count = 0;
}
incrementShapeDrawing();
double proportionalLength = traceMax * frameLength;
if (currentShape >= frame.size() || frameDrawn > proportionalLength) {
currentShape = 0;
@ -163,6 +168,10 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
frameLength = Shape.totalLength(frame);
shapeDrawn = 0;
frameDrawn = 0;
while (frameDrawn < traceMin * frameLength) {
incrementShapeDrawing();
}
}
updateLengthIncrement();
@ -294,7 +303,7 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
private void updateLengthIncrement() {
if (frame != null) {
double proportionalLength = trace * frameLength;
double proportionalLength = (traceMax - traceMin) * frameLength;
int sampleRate = device.sampleRate();
double actualFrequency = octaveFrequency * pitchBends[mainChannel];
lengthIncrement = Math.max(proportionalLength / (sampleRate / actualFrequency), MIN_LENGTH_INCREMENT);
@ -485,8 +494,12 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
}
public void setTrace(double trace) {
this.trace = Math.max(MIN_TRACE, Math.min(trace, 1));
public void setTraceMin(double traceMin) {
this.traceMin = Math.max(MIN_TRACE, Math.min(traceMin, traceMax - MIN_TRACE));
}
public void setTraceMax(double traceMax) {
this.traceMax = Math.max(traceMin + MIN_TRACE, Math.min(traceMax, 1));
}
@Override

Wyświetl plik

@ -0,0 +1,24 @@
package sh.ball.audio.effect;
import sh.ball.shapes.Vector2;
import java.util.function.Consumer;
public class ConsumerEffect implements SettableEffect {
private final Consumer<Double> consumer;
public ConsumerEffect(Consumer<Double> consumer) {
this.consumer = consumer;
}
@Override
public Vector2 apply(int count, Vector2 vector) {
return vector;
}
@Override
public void setValue(double trace) {
consumer.accept(trace);
}
}

Wyświetl plik

@ -8,5 +8,7 @@ public enum EffectType {
VERTICAL_DISTORT,
HORIZONTAL_DISTORT,
WOBBLE,
TRACE, SMOOTH
TRACE_MIN,
TRACE_MAX,
SMOOTH
}

Wyświetl plik

@ -1,23 +0,0 @@
package sh.ball.audio.effect;
import sh.ball.audio.ShapeAudioPlayer;
import sh.ball.shapes.Vector2;
public class TraceEffect implements SettableEffect {
private final ShapeAudioPlayer audioPlayer;
public TraceEffect(ShapeAudioPlayer audioPlayer) {
this.audioPlayer = audioPlayer;
}
@Override
public Vector2 apply(int count, Vector2 vector) {
return vector;
}
@Override
public void setValue(double trace) {
audioPlayer.setTrace(trace);
}
}

Wyświetl plik

@ -32,7 +32,8 @@ public class EffectsController implements Initializable, SubController {
private final WobbleEffect wobbleEffect;
private final EffectAnimator wobbleAnimator;
private final EffectAnimator traceAnimator;
private final EffectAnimator traceMinAnimator;
private final EffectAnimator traceMaxAnimator;
private final EffectAnimator vectorCancellingAnimator;
private final EffectAnimator bitCrushAnimator;
private final EffectAnimator smoothingAnimator;
@ -100,20 +101,31 @@ public class EffectsController implements Initializable, SubController {
@FXML
private CheckBox smoothingMic;
@FXML
private CheckBox traceCheckBox;
private CheckBox traceMinCheckBox;
@FXML
private Slider traceSlider;
private Slider traceMinSlider;
@FXML
private SVGPath traceMidi;
private SVGPath traceMinMidi;
@FXML
private ComboBox<AnimationType> traceComboBox;
private ComboBox<AnimationType> traceMinComboBox;
@FXML
private CheckBox traceMic;
private CheckBox traceMinMic;
@FXML
private CheckBox traceMaxCheckBox;
@FXML
private Slider traceMaxSlider;
@FXML
private SVGPath traceMaxMidi;
@FXML
private ComboBox<AnimationType> traceMaxComboBox;
@FXML
private CheckBox traceMaxMic;
public EffectsController() {
this.wobbleEffect = new WobbleEffect(DEFAULT_SAMPLE_RATE);
this.wobbleAnimator = new EffectAnimator(DEFAULT_SAMPLE_RATE, wobbleEffect);
this.traceAnimator = new EffectAnimator(DEFAULT_SAMPLE_RATE, new TraceEffect(audioPlayer));
this.traceMinAnimator = new EffectAnimator(DEFAULT_SAMPLE_RATE, new ConsumerEffect(audioPlayer::setTraceMin));
this.traceMaxAnimator = new EffectAnimator(DEFAULT_SAMPLE_RATE, new ConsumerEffect(audioPlayer::setTraceMax));
this.vectorCancellingAnimator = new EffectAnimator(DEFAULT_SAMPLE_RATE, new VectorCancellingEffect());
this.bitCrushAnimator = new EffectAnimator(DEFAULT_SAMPLE_RATE, new BitCrushEffect());
this.smoothingAnimator = new EffectAnimator(DEFAULT_SAMPLE_RATE, new SmoothEffect(1));
@ -128,7 +140,8 @@ public class EffectsController implements Initializable, SubController {
bitCrushMidi, bitCrushSlider,
wobbleMidi, wobbleSlider,
smoothingMidi, smoothingSlider,
traceMidi, traceSlider,
traceMinMidi, traceMinSlider,
traceMaxMidi, traceMaxSlider,
verticalDistortMidi, verticalDistortSlider,
horizontalDistortMidi, horizontalDistortSlider
);
@ -140,7 +153,8 @@ public class EffectsController implements Initializable, SubController {
bitCrushComboBox, bitCrushAnimator,
wobbleComboBox, wobbleAnimator,
smoothingComboBox, smoothingAnimator,
traceComboBox, traceAnimator,
traceMinComboBox, traceMinAnimator,
traceMaxComboBox, traceMaxAnimator,
verticalDistortComboBox, verticalDistortAnimator,
horizontalDistortComboBox, horizontalDistortAnimator
);
@ -162,8 +176,10 @@ public class EffectsController implements Initializable, SubController {
wobbleSlider,
EffectType.SMOOTH,
smoothingSlider,
EffectType.TRACE,
traceSlider
EffectType.TRACE_MIN,
traceMinSlider,
EffectType.TRACE_MAX,
traceMaxSlider
);
}
@ -220,8 +236,10 @@ public class EffectsController implements Initializable, SubController {
updateEffect(EffectType.SMOOTH, smoothingCheckBox.isSelected(), smoothingAnimator, smoothingSlider.getValue());
InvalidationListener vectorCancellingListener = e ->
updateEffect(EffectType.VECTOR_CANCELLING, vectorCancellingCheckBox.isSelected(), vectorCancellingAnimator, vectorCancellingSlider.getValue());
InvalidationListener traceListener = e ->
updateEffect(EffectType.TRACE, traceCheckBox.isSelected(), traceAnimator, traceSlider.getValue());
InvalidationListener traceMinListener = e ->
updateEffect(EffectType.TRACE_MIN, traceMinCheckBox.isSelected(), traceMinAnimator, traceMinSlider.getValue());
InvalidationListener traceMaxListener = e ->
updateEffect(EffectType.TRACE_MAX, traceMaxCheckBox.isSelected(), traceMaxAnimator, traceMaxSlider.getValue());
vectorCancellingSlider.valueProperty().addListener(vectorCancellingListener);
vectorCancellingCheckBox.selectedProperty().addListener(vectorCancellingListener);
@ -242,13 +260,23 @@ public class EffectsController implements Initializable, SubController {
smoothingSlider.valueProperty().addListener(smoothListener);
smoothingCheckBox.selectedProperty().addListener(smoothListener);
traceSlider.valueProperty().addListener(traceListener);
traceCheckBox.selectedProperty().addListener(traceListener);
traceCheckBox.selectedProperty().addListener((e, old, selected) -> {
traceMinSlider.valueProperty().addListener(traceMinListener);
traceMinCheckBox.selectedProperty().addListener(traceMinListener);
traceMinCheckBox.selectedProperty().addListener((e, old, selected) -> {
if (selected) {
traceAnimator.setValue(traceSlider.getValue());
traceMinAnimator.setValue(traceMinSlider.getValue());
} else {
traceAnimator.setValue(1.0);
traceMinAnimator.setValue(0.0);
}
});
traceMaxSlider.valueProperty().addListener(traceMaxListener);
traceMaxCheckBox.selectedProperty().addListener(traceMaxListener);
traceMaxCheckBox.selectedProperty().addListener((e, old, selected) -> {
if (selected) {
traceMaxAnimator.setValue(traceMaxSlider.getValue());
} else {
traceMaxAnimator.setValue(1.0);
}
});
@ -278,26 +306,28 @@ public class EffectsController implements Initializable, SubController {
}
private List<CheckBox> checkBoxes() {
return List.of(vectorCancellingCheckBox, bitCrushCheckBox, verticalDistortCheckBox,
horizontalDistortCheckBox, wobbleCheckBox, smoothingCheckBox, traceCheckBox);
horizontalDistortCheckBox, wobbleCheckBox, smoothingCheckBox, traceMinCheckBox,
traceMaxCheckBox);
}
private List<EffectAnimator> animators() {
return List.of(vectorCancellingAnimator, bitCrushAnimator, verticalDistortAnimator,
horizontalDistortAnimator, wobbleAnimator, smoothingAnimator, traceAnimator);
horizontalDistortAnimator, wobbleAnimator, smoothingAnimator, traceMinAnimator,
traceMaxAnimator);
}
@Override
public List<CheckBox> micCheckBoxes() {
return List.of(vectorCancellingMic, bitCrushMic, verticalDistortMic, horizontalDistortMic,
wobbleMic, smoothingMic, traceMic);
wobbleMic, smoothingMic, traceMinMic, traceMaxMic);
}
@Override
public List<Slider> sliders() {
return List.of(vectorCancellingSlider, bitCrushSlider, verticalDistortSlider,
horizontalDistortSlider, wobbleSlider, smoothingSlider, traceSlider);
horizontalDistortSlider, wobbleSlider, smoothingSlider, traceMinSlider, traceMaxSlider);
}
@Override
public List<String> labels() {
return List.of("vectorCancelling", "bitCrush", "verticalDistort", "horizontalDistort",
"wobble", "smooth", "trace");
"wobble", "smooth", "traceMin", "traceMax");
}
@Override

Wyświetl plik

@ -6,42 +6,47 @@
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.shape.SVGPath?>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="356.0" prefWidth="576.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sh.ball.gui.controller.EffectsController">
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="355.0" prefWidth="576.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sh.ball.gui.controller.EffectsController">
<children>
<CheckBox fx:id="vectorCancellingCheckBox" layoutX="14.0" layoutY="15.0" mnemonicParsing="false" text="Vector cancelling" />
<Slider fx:id="vectorCancellingSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="16.0" majorTickUnit="0.1" max="1.0" prefHeight="42.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.11111111" />
<CheckBox fx:id="bitCrushCheckBox" layoutX="14.0" layoutY="62.0" mnemonicParsing="false" text="Bit crush" />
<Slider fx:id="bitCrushSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="64.0" majorTickUnit="0.1" max="1.0" prefHeight="42.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.6666666" />
<CheckBox fx:id="verticalDistortCheckBox" layoutX="14.0" layoutY="110.0" mnemonicParsing="false" text="Vertical Distort" />
<Slider fx:id="verticalDistortSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="112.0" majorTickUnit="0.1" max="1.0" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.2" />
<CheckBox fx:id="horizontalDistortCheckBox" layoutX="14.0" layoutY="159.0" mnemonicParsing="false" text="Horizontal Distort" />
<Slider fx:id="horizontalDistortSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="161.0" majorTickUnit="0.1" max="1.0" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.2" />
<CheckBox fx:id="wobbleCheckBox" layoutX="14.0" layoutY="208.0" mnemonicParsing="false" text="Wobble" />
<Slider fx:id="wobbleSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="210.0" majorTickUnit="0.1" max="1.0" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.2" />
<CheckBox fx:id="bitCrushCheckBox" layoutX="14.0" layoutY="55.0" mnemonicParsing="false" text="Bit crush" />
<Slider fx:id="bitCrushSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="57.0" majorTickUnit="0.1" max="1.0" prefHeight="42.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.6666666" />
<CheckBox fx:id="verticalDistortCheckBox" layoutX="14.0" layoutY="96.0" mnemonicParsing="false" text="Vertical Distort" />
<Slider fx:id="verticalDistortSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="98.0" majorTickUnit="0.1" max="1.0" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.2" />
<CheckBox fx:id="horizontalDistortCheckBox" layoutX="14.0" layoutY="138.0" mnemonicParsing="false" text="Horizontal Distort" />
<Slider fx:id="horizontalDistortSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="140.0" majorTickUnit="0.1" max="1.0" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.2" />
<CheckBox fx:id="wobbleCheckBox" layoutX="14.0" layoutY="180.0" mnemonicParsing="false" text="Wobble" />
<Slider fx:id="wobbleSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="182.0" majorTickUnit="0.1" max="1.0" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.2" />
<SVGPath fx:id="vectorCancellingMidi" 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="13.0" pickOnBounds="true" />
<SVGPath fx:id="bitCrushMidi" 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="61.0" pickOnBounds="true" />
<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="108.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="157.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="206.0" pickOnBounds="true" />
<CheckBox fx:id="smoothingCheckBox" layoutX="14.0" layoutY="255.0" mnemonicParsing="false" text="Smoothing" />
<Slider fx:id="smoothingSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="257.0" majorTickUnit="0.1" max="1.0" minorTickCount="1" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.125" />
<SVGPath fx:id="smoothingMidi" 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="253.0" pickOnBounds="true" />
<CheckBox fx:id="traceCheckBox" layoutX="14.0" layoutY="304.0" mnemonicParsing="false" text="Trace" />
<Slider fx:id="traceSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="306.0" majorTickUnit="0.1" max="1.0" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.5" />
<SVGPath fx:id="traceMidi" 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="302.0" pickOnBounds="true" />
<ComboBox fx:id="wobbleComboBox" layoutX="404.0" layoutY="203.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="traceComboBox" layoutX="404.0" layoutY="299.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="smoothingComboBox" layoutX="404.0" layoutY="250.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="horizontalDistortComboBox" layoutX="404.0" layoutY="154.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="verticalDistortComboBox" layoutX="404.0" layoutY="105.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="bitCrushComboBox" layoutX="404.0" layoutY="60.0" prefHeight="26.0" prefWidth="102.0" />
<SVGPath fx:id="bitCrushMidi" 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="54.0" pickOnBounds="true" />
<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="94.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="136.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="178.0" pickOnBounds="true" />
<CheckBox fx:id="smoothingCheckBox" layoutX="14.0" layoutY="220.0" mnemonicParsing="false" text="Smoothing" />
<Slider fx:id="smoothingSlider" blockIncrement="0.005" disable="true" layoutX="154.0" layoutY="222.0" majorTickUnit="0.1" max="1.0" minorTickCount="1" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.125" />
<SVGPath fx:id="smoothingMidi" 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="218.0" pickOnBounds="true" />
<CheckBox fx:id="traceMaxCheckBox" layoutX="15.0" layoutY="302.0" mnemonicParsing="false" text="Trace Max" />
<Slider fx:id="traceMaxSlider" blockIncrement="0.005" disable="true" layoutX="155.0" layoutY="304.0" majorTickUnit="0.1" max="1.0" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.5" />
<SVGPath fx:id="traceMaxMidi" 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="374.0" layoutY="300.0" pickOnBounds="true" />
<ComboBox fx:id="wobbleComboBox" layoutX="404.0" layoutY="175.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="traceMaxComboBox" layoutX="405.0" layoutY="297.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="smoothingComboBox" layoutX="404.0" layoutY="215.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="horizontalDistortComboBox" layoutX="404.0" layoutY="133.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="verticalDistortComboBox" layoutX="404.0" layoutY="91.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="bitCrushComboBox" layoutX="404.0" layoutY="53.0" prefHeight="26.0" prefWidth="102.0" />
<ComboBox fx:id="vectorCancellingComboBox" layoutX="404.0" layoutY="12.0" prefHeight="26.0" prefWidth="102.0" />
<CheckBox fx:id="vectorCancellingMic" layoutX="517.0" layoutY="16.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="bitCrushMic" layoutX="517.0" layoutY="64.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="verticalDistortMic" layoutX="517.0" layoutY="109.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="horizontalDistortMic" layoutX="517.0" layoutY="158.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="wobbleMic" layoutX="517.0" layoutY="207.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="smoothingMic" layoutX="517.0" layoutY="254.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="traceMic" layoutX="517.0" layoutY="303.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="bitCrushMic" layoutX="517.0" layoutY="57.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="verticalDistortMic" layoutX="517.0" layoutY="95.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="horizontalDistortMic" layoutX="517.0" layoutY="137.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="wobbleMic" layoutX="517.0" layoutY="179.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="smoothingMic" layoutX="517.0" layoutY="219.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="traceMaxMic" layoutX="518.0" layoutY="301.0" mnemonicParsing="false" text="Mic" />
<CheckBox fx:id="traceMinCheckBox" layoutX="15.0" layoutY="260.0" mnemonicParsing="false" text="Trace Min" />
<Slider fx:id="traceMinSlider" blockIncrement="0.005" disable="true" layoutX="155.0" layoutY="262.0" majorTickUnit="0.1" max="1.0" prefHeight="38.0" prefWidth="219.0" showTickLabels="true" showTickMarks="true" value="0.5" />
<SVGPath fx:id="traceMinMidi" 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="374.0" layoutY="258.0" pickOnBounds="true" />
<ComboBox fx:id="traceMinComboBox" layoutX="405.0" layoutY="255.0" prefHeight="26.0" prefWidth="102.0" />
<CheckBox fx:id="traceMinMic" layoutX="518.0" layoutY="259.0" mnemonicParsing="false" text="Mic" />
</children>
</AnchorPane>