kopia lustrzana https://github.com/jameshball/osci-render
Rename decay to release
rodzic
9070262769
commit
c536b9d59c
|
@ -20,7 +20,7 @@ public interface AudioPlayer<S> extends Runnable, MidiListener {
|
|||
|
||||
void setBackingMidiVolume(double scale);
|
||||
|
||||
void setDecay(double decaySeconds);
|
||||
void setRelease(double decaySeconds);
|
||||
|
||||
void setAttack(double attackSeconds);
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ import sh.ball.audio.effect.*;
|
|||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import sh.ball.audio.engine.AudioDevice;
|
||||
|
@ -45,13 +44,12 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
|
|||
private int mainChannel = 0;
|
||||
private MidiNote baseNote = new MidiNote(60, mainChannel);
|
||||
private final double[] pitchBends = new double[MidiNote.NUM_CHANNELS];
|
||||
private int lastDecay = 0;
|
||||
private double decaySeconds = 0.2;
|
||||
private int decayFrames;
|
||||
private int lastRelease = 0;
|
||||
private double releaseSeconds = 0.2;
|
||||
private int releaseFrames;
|
||||
private int lastAttack = 0;
|
||||
private double attackSeconds = 0.1;
|
||||
private int attackFrames;
|
||||
private int totalVolume = MidiNote.MAX_VELOCITY;
|
||||
|
||||
private final Callable<AudioEngine> audioEngineBuilder;
|
||||
private final BlockingQueue<List<Shape>> frameQueue = new ArrayBlockingQueue<>(BUFFER_SIZE);
|
||||
|
@ -269,16 +267,16 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
|
|||
try {
|
||||
keyOnLock.acquire();
|
||||
|
||||
totalVolume = MidiNote.MAX_VELOCITY;
|
||||
int totalVolume = MidiNote.MAX_VELOCITY;
|
||||
|
||||
boolean resetDecay = false;
|
||||
boolean resetRelease = false;
|
||||
boolean resetAttack = false;
|
||||
|
||||
for (int i = keyOn.nextSetBit(0); i >= 0; i = keyOn.nextSetBit(i + 1)) {
|
||||
int noteVolume = keyActualVolumes[i];
|
||||
|
||||
if (lastDecay > decayFrames) {
|
||||
resetDecay = true;
|
||||
if (lastRelease > releaseFrames) {
|
||||
resetRelease = true;
|
||||
if (noteVolume > keyTargetVolumes[i]) {
|
||||
int newVolume = --keyActualVolumes[i];
|
||||
if (newVolume <= 0) {
|
||||
|
@ -316,8 +314,8 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
|
|||
}
|
||||
}
|
||||
|
||||
if (resetDecay) {
|
||||
lastDecay = 0;
|
||||
if (resetRelease) {
|
||||
lastRelease = 0;
|
||||
}
|
||||
|
||||
if (resetAttack) {
|
||||
|
@ -330,7 +328,7 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
|
|||
keyOnLock.release();
|
||||
}
|
||||
|
||||
lastDecay++;
|
||||
lastRelease++;
|
||||
lastAttack++;
|
||||
|
||||
vector = new Vector2(
|
||||
|
@ -359,9 +357,9 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setDecay(double decaySeconds) {
|
||||
this.decaySeconds = decaySeconds;
|
||||
updateDecay();
|
||||
public void setRelease(double releaseSeconds) {
|
||||
this.releaseSeconds = releaseSeconds;
|
||||
updateRelease();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -528,12 +526,12 @@ public class ShapeAudioPlayer implements AudioPlayer<List<Shape>> {
|
|||
phase.setSampleRate(sampleRate);
|
||||
}
|
||||
}
|
||||
updateDecay();
|
||||
updateRelease();
|
||||
updateAttack();
|
||||
}
|
||||
|
||||
private void updateDecay() {
|
||||
this.decayFrames = (int) (decaySeconds * sampleRate / MidiNote.MAX_VELOCITY);
|
||||
private void updateRelease() {
|
||||
this.releaseFrames = (int) (releaseSeconds * sampleRate / MidiNote.MAX_VELOCITY);
|
||||
}
|
||||
|
||||
private void updateAttack() {
|
||||
|
|
|
@ -30,7 +30,6 @@ import java.util.concurrent.*;
|
|||
import java.util.function.Consumer;
|
||||
import java.util.function.UnaryOperator;
|
||||
import java.util.logging.Level;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
|
@ -179,7 +178,7 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
|||
@FXML
|
||||
private Spinner<Double> attackSpinner;
|
||||
@FXML
|
||||
private Spinner<Double> decaySpinner;
|
||||
private Spinner<Double> releaseSpinner;
|
||||
@FXML
|
||||
private ComboBox<PrintableSlider> sliderComboBox;
|
||||
@FXML
|
||||
|
@ -491,8 +490,8 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
|||
attackSpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 10, 0.2, 0.01));
|
||||
attackSpinner.valueProperty().addListener((o, oldValue, newValue) -> audioPlayer.setAttack(newValue));
|
||||
|
||||
decaySpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 10, 0.1, 0.01));
|
||||
decaySpinner.valueProperty().addListener((o, oldValue, newValue) -> audioPlayer.setDecay(newValue));
|
||||
releaseSpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 10, 0.1, 0.01));
|
||||
releaseSpinner.valueProperty().addListener((o, oldValue, newValue) -> audioPlayer.setRelease(newValue));
|
||||
|
||||
recordLengthSpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0.1, 100000000, 2.0, 0.1));
|
||||
|
||||
|
@ -1185,7 +1184,7 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
|||
root.appendChild(midiAttack);
|
||||
|
||||
Element midiDecay = document.createElement("midiDecay");
|
||||
midiDecay.appendChild(document.createTextNode(decaySpinner.getValue().toString()));
|
||||
midiDecay.appendChild(document.createTextNode(releaseSpinner.getValue().toString()));
|
||||
root.appendChild(midiDecay);
|
||||
|
||||
Element audioSample = document.createElement("audioSample");
|
||||
|
@ -1370,9 +1369,9 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
|||
attackSpinner.getValueFactory().setValue(Double.parseDouble(midiAttack.getTextContent()));
|
||||
}
|
||||
|
||||
Element midiDecay = (Element) root.getElementsByTagName("midiDecay").item(0);
|
||||
if (midiDecay != null) {
|
||||
decaySpinner.getValueFactory().setValue(Double.parseDouble(midiDecay.getTextContent()));
|
||||
Element midiRelease = (Element) root.getElementsByTagName("midiDecay").item(0);
|
||||
if (midiRelease != null) {
|
||||
releaseSpinner.getValueFactory().setValue(Double.parseDouble(midiRelease.getTextContent()));
|
||||
}
|
||||
|
||||
Element audioSample = (Element) root.getElementsByTagName("audioSample").item(0);
|
||||
|
|
|
@ -139,12 +139,12 @@
|
|||
</AnchorPane>
|
||||
</content>
|
||||
</CustomMenuItem>
|
||||
<CustomMenuItem hideOnClick="false" mnemonicParsing="false" text="Note Decay (sec)">
|
||||
<CustomMenuItem hideOnClick="false" mnemonicParsing="false" text="Note Release (sec)">
|
||||
<content>
|
||||
<AnchorPane>
|
||||
<children>
|
||||
<Label prefHeight="25.0" text="Note Decay (sec)" textFill="WHITE" />
|
||||
<Spinner fx:id="decaySpinner" editable="true" layoutY="25.0" />
|
||||
<Label prefHeight="25.0" text="Note Release (sec)" textFill="WHITE" />
|
||||
<Spinner fx:id="releaseSpinner" editable="true" layoutY="25.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</content>
|
||||
|
|
Ładowanie…
Reference in New Issue