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, 32 insertions, 12 deletions
diff --git a/src/com/jsyn/util/VoiceAllocator.java b/src/com/jsyn/util/VoiceAllocator.java
index af37b91..f20f7a5 100644
--- a/src/com/jsyn/util/VoiceAllocator.java
+++ b/src/com/jsyn/util/VoiceAllocator.java
@@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -25,7 +25,7 @@ import com.softsynth.shared.time.TimeStamp;
* Allocate voices based on an integer tag. The tag could, for example, be a MIDI note number. Or a
* tag could be an int that always increments. Use the same tag to refer to a voice for noteOn() and
* noteOff(). If no new voices are available then a voice in use will be stolen.
- *
+ *
* @author Phil Burk (C) 2011 Mobileer Inc
*/
public class VoiceAllocator implements Instrument {
@@ -33,12 +33,13 @@ 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
* UnitVoices that are connected to some kind of mixer.
- *
+ *
* @param voices
*/
public VoiceAllocator(UnitVoice[] voices) {
@@ -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;
@@ -121,7 +122,7 @@ public class VoiceAllocator implements Instrument {
* that tag. Next it will pick the oldest voice that is off. Next it will pick the oldest voice
* that is on. If you are using timestamps to play the voice in the future then you should use
* the noteOn() noteOff() and setPort() methods.
- *
+ *
* @param tag
* @return Voice that is most available.
*/
@@ -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,9 +250,7 @@ public class VoiceAllocator implements Instrument {
getSynthesizer().scheduleCommand(timeStamp, new ScheduledCommand() {
@Override
public void run() {
- for (VoiceTracker tracker : trackers) {
- tracker.voice.usePreset(presetIndex);
- }
+ mPresetIndex = presetIndex;
}
});
}