diff options
author | Phil Burk <[email protected]> | 2016-10-31 20:47:00 -0700 |
---|---|---|
committer | Phil Burk <[email protected]> | 2016-10-31 20:47:00 -0700 |
commit | c081ad0ff9f10c0ab530088dc73c1e7f6735c600 (patch) | |
tree | 1c2f20fc6a380d21f3a81875c8b0c1c71a87b342 | |
parent | 580fea450ec0982d0bd8be589f00566267e7b0d1 (diff) |
Instruments: add voice operation.
-rw-r--r-- | src/com/jsyn/util/VoiceAllocator.java | 44 | ||||
-rw-r--r-- | src/com/jsyn/util/VoiceOperation.java | 7 |
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); +} |