aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/jsyn/util/VoiceAllocator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/jsyn/util/VoiceAllocator.java')
-rw-r--r--src/com/jsyn/util/VoiceAllocator.java44
1 files changed, 28 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;
- }
-
}