diff options
Diffstat (limited to 'src/com/jsyn/util/VoiceAllocator.java')
-rw-r--r-- | src/com/jsyn/util/VoiceAllocator.java | 44 |
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; } }); } |