aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhil Burk <[email protected]>2016-10-31 20:47:00 -0700
committerPhil Burk <[email protected]>2016-10-31 20:47:00 -0700
commitc081ad0ff9f10c0ab530088dc73c1e7f6735c600 (patch)
tree1c2f20fc6a380d21f3a81875c8b0c1c71a87b342
parent580fea450ec0982d0bd8be589f00566267e7b0d1 (diff)
Instruments: add voice operation.
-rw-r--r--src/com/jsyn/util/VoiceAllocator.java44
-rw-r--r--src/com/jsyn/util/VoiceOperation.java7
2 files changed, 35 insertions, 16 deletions
diff --git a/src/com/jsyn/util/VoiceAllocator.java b/src/com/jsyn/util/VoiceAllocator.java
index 3310b52..f20f7a5 100644
--- a/src/com/jsyn/util/VoiceAllocator.java
+++ b/src/com/jsyn/util/VoiceAllocator.java
@@ -33,7 +33,8 @@ public class VoiceAllocator implements Instrument {
private VoiceTracker[] trackers;
private long tick;
private Synthesizer synthesizer;
- private int presetIndex = -1;
+ private static final int UNASSIGNED_PRESET = -1;
+ private int mPresetIndex = UNASSIGNED_PRESET;
/**
* Create an allocator for the array of UnitVoices. The array must be full of instantiated
@@ -60,7 +61,7 @@ public class VoiceAllocator implements Instrument {
private class VoiceTracker {
UnitVoice voice;
int tag = -1;
- int presetIndex = -1;
+ int presetIndex = UNASSIGNED_PRESET;
long when;
boolean on;
@@ -158,7 +159,7 @@ public class VoiceAllocator implements Instrument {
return null;
}
- /** Turn off all the notes currently on. */
+ /** Turn off all the note currently on. */
@Override
public void allNotesOff(TimeStamp timeStamp) {
getSynthesizer().scheduleCommand(timeStamp, new ScheduledCommand() {
@@ -185,14 +186,35 @@ public class VoiceAllocator implements Instrument {
@Override
public void run() {
VoiceTracker voiceTracker = allocateTracker(tag);
- if (presetIndex != voiceTracker.presetIndex) {
- voiceTracker.voice.usePreset(presetIndex);
+ if (voiceTracker.presetIndex != mPresetIndex) {
+ voiceTracker.voice.usePreset(mPresetIndex);
+ voiceTracker.presetIndex = mPresetIndex;
}
voiceTracker.voice.noteOn(frequency, amplitude, getSynthesizer().createTimeStamp());
}
});
}
+ /**
+ * Play a note on the voice and associate it with the given tag. if needed a new voice will be
+ * allocated and an old voice may be turned off.
+ * Apply an operation to the voice.
+ */
+ public void noteOn(final int tag,
+ final double frequency,
+ final double amplitude,
+ final VoiceOperation operation,
+ TimeStamp timeStamp) {
+ getSynthesizer().scheduleCommand(timeStamp, new ScheduledCommand() {
+ @Override
+ public void run() {
+ VoiceTracker voiceTracker = allocateTracker(tag);
+ operation.operate(voiceTracker.voice);
+ voiceTracker.voice.noteOn(frequency, amplitude, getSynthesizer().createTimeStamp());
+ }
+ });
+ }
+
/** Turn off the voice associated with the given tag if allocated. */
@Override
public void noteOff(final int tag, TimeStamp timeStamp) {
@@ -228,19 +250,9 @@ public class VoiceAllocator implements Instrument {
getSynthesizer().scheduleCommand(timeStamp, new ScheduledCommand() {
@Override
public void run() {
- for (VoiceTracker tracker : trackers) {
- tracker.voice.usePreset(presetIndex);
- }
+ mPresetIndex = presetIndex;
}
});
}
- public int getPresetIndex() {
- return presetIndex;
- }
-
- public void setPresetIndex(int presetIndex) {
- this.presetIndex = presetIndex;
- }
-
}
diff --git a/src/com/jsyn/util/VoiceOperation.java b/src/com/jsyn/util/VoiceOperation.java
new file mode 100644
index 0000000..cd3b48e
--- /dev/null
+++ b/src/com/jsyn/util/VoiceOperation.java
@@ -0,0 +1,7 @@
+package com.jsyn.util;
+
+import com.jsyn.unitgen.UnitVoice;
+
+public interface VoiceOperation {
+ public void operate(UnitVoice voice);
+}