aboutsummaryrefslogtreecommitdiffstats
path: root/tests/com/jsyn/examples/UseMidiKeyboard.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/com/jsyn/examples/UseMidiKeyboard.java')
-rw-r--r--tests/com/jsyn/examples/UseMidiKeyboard.java127
1 files changed, 25 insertions, 102 deletions
diff --git a/tests/com/jsyn/examples/UseMidiKeyboard.java b/tests/com/jsyn/examples/UseMidiKeyboard.java
index 196f13c..0efa039 100644
--- a/tests/com/jsyn/examples/UseMidiKeyboard.java
+++ b/tests/com/jsyn/examples/UseMidiKeyboard.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.
@@ -26,33 +26,26 @@ import javax.sound.midi.Receiver;
import com.jsyn.JSyn;
import com.jsyn.Synthesizer;
import com.jsyn.devices.javasound.MidiDeviceTools;
-import com.jsyn.instruments.SubtractiveSynthVoice;
-import com.jsyn.midi.MessageParser;
-import com.jsyn.midi.MidiConstants;
+import com.jsyn.instruments.DualOscillatorSynthVoice;
+import com.jsyn.midi.MidiSynthesizer;
import com.jsyn.unitgen.LineOut;
-import com.jsyn.unitgen.PowerOfTwo;
-import com.jsyn.unitgen.SineOscillator;
-import com.jsyn.unitgen.UnitOscillator;
-import com.jsyn.util.VoiceAllocator;
-import com.softsynth.shared.time.TimeStamp;
+import com.jsyn.util.MultiChannelSynthesizer;
+import com.jsyn.util.VoiceDescription;
/**
* Connect a USB MIDI Keyboard to the internal MIDI Synthesizer using JavaSound.
- *
+ *
* @author Phil Burk (C) 2010 Mobileer Inc
*/
public class UseMidiKeyboard {
- private static final int MAX_VOICES = 8;
+ private static final int NUM_CHANNELS = 16;
+ private static final int VOICES_PER_CHANNEL = 3;
+
private Synthesizer synth;
- private VoiceAllocator allocator;
private LineOut lineOut;
- private double vibratoRate = 5.0;
- private double vibratoDepth = 0.0;
-
- private UnitOscillator lfo;
- private PowerOfTwo powerOfTwo;
- private MessageParser messageParser;
- private SubtractiveSynthVoice[] voices;
+ private MidiSynthesizer midiSynthesizer;
+ private VoiceDescription voiceDescription;
+ private MultiChannelSynthesizer multiSynth;
public static void main(String[] args) {
UseMidiKeyboard app = new UseMidiKeyboard();
@@ -77,15 +70,13 @@ public class UseMidiKeyboard {
@Override
public void send(MidiMessage message, long timeStamp) {
byte[] bytes = message.getMessage();
- messageParser.parse(bytes);
+ midiSynthesizer.onReceive(bytes, 0, bytes.length);
}
}
public int test() throws MidiUnavailableException, IOException, InterruptedException {
setupSynth();
- messageParser = new MyParser();
-
int result = 2;
MidiDevice keyboard = MidiDeviceTools.findKeyboard();
Receiver receiver = new CustomReceiver();
@@ -104,95 +95,27 @@ public class UseMidiKeyboard {
return result;
}
- class MyParser extends MessageParser {
- @Override
- public void controlChange(int channel, int index, int value) {
- // Mod Wheel
- if (index == 1) {
- vibratoDepth = 0.1 * value / 128.0;
- // System.out.println( "vibratoDepth = " + vibratoDepth );
- lfo.amplitude.set(vibratoDepth);
- }
- // 102 is the index of the first knob on my Axiom 25
- else if (index == 102) {
- final double bump = 0.95;
- if (value < 64) {
- vibratoRate *= bump;
- } else {
- vibratoRate *= 1.0 / bump;
- }
- System.out.println("vibratoRate = " + vibratoRate);
- lfo.frequency.set(vibratoRate);
- }
-
- }
-
- @Override
- public void noteOff(int channel, int noteNumber, int velocity) {
- allocator.noteOff(noteNumber, synth.createTimeStamp());
- }
-
- @Override
- public void noteOn(int channel, int noteNumber, int velocity) {
- double frequency = convertPitchToFrequency(noteNumber);
- double amplitude = velocity / (4 * 128.0);
- TimeStamp timeStamp = synth.createTimeStamp();
- allocator.noteOn(noteNumber, frequency, amplitude, timeStamp);
- }
-
- @Override
- public void pitchBend(int channel, int bend) {
- double fraction = (bend - MidiConstants.PITCH_BEND_CENTER)
- / ((double) MidiConstants.PITCH_BEND_CENTER);
- System.out.println("bend = " + bend + ", fraction = " + fraction);
- }
- }
-
- /**
- * Calculate frequency in Hertz based on MIDI pitch. Middle C is 60.0. You can use fractional
- * pitches so 60.5 would give you a pitch half way between C and C#.
- */
- double convertPitchToFrequency(double pitch) {
- final double concertA = 440.0;
- return concertA * Math.pow(2.0, ((pitch - 69) * (1.0 / 12.0)));
- }
private void setupSynth() {
synth = JSyn.createSynthesizer();
- // Add an output.
- synth.add(lineOut = new LineOut());
+ voiceDescription = DualOscillatorSynthVoice.getVoiceDescription();
+// voiceDescription = SubtractiveSynthVoice.getVoiceDescription();
- synth.add(powerOfTwo = new PowerOfTwo());
- synth.add(lfo = new SineOscillator());
- // Sums pitch modulation.
- lfo.output.connect(powerOfTwo.input);
- lfo.amplitude.set(vibratoDepth);
- lfo.frequency.set(vibratoRate);
-
- voices = new SubtractiveSynthVoice[MAX_VOICES];
- for (int i = 0; i < MAX_VOICES; i++) {
- SubtractiveSynthVoice voice = new SubtractiveSynthVoice();
- synth.add(voice);
- powerOfTwo.output.connect(voice.pitchModulation);
- voice.getOutput().connect(0, lineOut.input, 0);
- voice.getOutput().connect(0, lineOut.input, 1);
- voices[i] = voice;
- }
- allocator = new VoiceAllocator(voices);
+ multiSynth = new MultiChannelSynthesizer();
+ final int startChannel = 0;
+ multiSynth.setup(synth, startChannel, NUM_CHANNELS, VOICES_PER_CHANNEL, voiceDescription);
+ midiSynthesizer = new MidiSynthesizer(multiSynth);
+
+ // Create a LineOut for the entire synthesizer.
+ synth.add(lineOut = new LineOut());
+ multiSynth.getOutput().connect(0,lineOut.input, 0);
+ multiSynth.getOutput().connect(1,lineOut.input, 1);
// Start synthesizer using default stereo output at 44100 Hz.
synth.start();
- // We only need to start the LineOut. It will pull data from the
- // oscillator.
lineOut.start();
- // Get synthesizer time in seconds.
- double timeNow = synth.getCurrentTime();
-
- // Advance to a near future time so we have a clean start.
- double time = timeNow + 0.5;
-
}
}