aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/jsyn/apps
diff options
context:
space:
mode:
authorPhil Burk <[email protected]>2016-08-02 07:52:17 -0700
committerPhil Burk <[email protected]>2016-10-24 08:29:20 -0700
commit580fea450ec0982d0bd8be589f00566267e7b0d1 (patch)
tree0420f768fc7c63208b1720232c447e17af9017af /src/com/jsyn/apps
parenta6583e89166f7477a675cf3094a91b303ba7850a (diff)
Instruments: add better synth, pitch control
Diffstat (limited to 'src/com/jsyn/apps')
-rw-r--r--src/com/jsyn/apps/InstrumentTester.java93
1 files changed, 87 insertions, 6 deletions
diff --git a/src/com/jsyn/apps/InstrumentTester.java b/src/com/jsyn/apps/InstrumentTester.java
index 4186703..6e347cd 100644
--- a/src/com/jsyn/apps/InstrumentTester.java
+++ b/src/com/jsyn/apps/InstrumentTester.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.
@@ -17,12 +17,19 @@
package com.jsyn.apps;
import java.awt.BorderLayout;
+import java.io.IOException;
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Receiver;
import javax.swing.JApplet;
import com.jsyn.JSyn;
import com.jsyn.Synthesizer;
+import com.jsyn.devices.javasound.MidiDeviceTools;
import com.jsyn.instruments.JSynInstrumentLibrary;
+import com.jsyn.midi.MessageParser;
import com.jsyn.swing.InstrumentBrowser;
import com.jsyn.swing.JAppletFrame;
import com.jsyn.swing.PresetSelectionListener;
@@ -32,11 +39,14 @@ import com.jsyn.unitgen.UnitSource;
import com.jsyn.unitgen.UnitVoice;
import com.jsyn.util.PolyphonicInstrument;
import com.jsyn.util.VoiceDescription;
+import com.softsynth.math.AudioMath;
+import com.softsynth.shared.time.TimeStamp;
/**
- * Let the user select an instrument using the InstrumentBrowser and play them using the ASCII
- * keyboard. Sound parameters can be tweaked using faders.
- *
+ * Let the user select an instrument using the InstrumentBrowser and play
+ * them using the ASCII keyboard or with MIDI.
+ * Sound parameters can be tweaked using faders.
+ *
* @author Phil Burk (C) 2012 Mobileer Inc
*/
public class InstrumentTester extends JApplet {
@@ -44,6 +54,64 @@ public class InstrumentTester extends JApplet {
private Synthesizer synth;
private LineOut lineOut;
private SoundTweaker tweaker;
+ protected PolyphonicInstrument instrument;
+ private MyParser messageParser;
+
+ class MyParser extends MessageParser {
+
+ @Override
+ public void controlChange(int channel, int index, int value) {
+ }
+
+ @Override
+ public void noteOff(int channel, int noteNumber, int velocity) {
+ instrument.noteOff(noteNumber, synth.createTimeStamp());
+ }
+
+ @Override
+ public void noteOn(int channel, int noteNumber, int velocity) {
+ double frequency = AudioMath.pitchToFrequency(noteNumber);
+ double amplitude = velocity / (4 * 128.0);
+ TimeStamp timeStamp = synth.createTimeStamp();
+ instrument.noteOn(noteNumber, frequency, amplitude, timeStamp);
+ }
+
+ }
+
+ // Write a Receiver to get the messages from a Transmitter.
+ class CustomReceiver implements Receiver {
+ @Override
+ public void close() {
+ System.out.print("Closed.");
+ }
+
+ @Override
+ public void send(MidiMessage message, long timeStamp) {
+ byte[] bytes = message.getMessage();
+ messageParser.parse(bytes);
+ }
+ }
+
+ public int setupMidiKeyboard() throws MidiUnavailableException, IOException, InterruptedException {
+ messageParser = new MyParser();
+
+ int result = 2;
+ MidiDevice keyboard = MidiDeviceTools.findKeyboard();
+ Receiver receiver = new CustomReceiver();
+ // Just use default synthesizer.
+ if (keyboard != null) {
+ // If you forget to open them you will hear no sound.
+ keyboard.open();
+ // Put the receiver in the transmitter.
+ // This gives fairly low latency playing.
+ keyboard.getTransmitter().setReceiver(receiver);
+ System.out.println("Play MIDI keyboard: " + keyboard.getDeviceInfo().getDescription());
+ result = 0;
+ } else {
+ System.out.println("Could not find a keyboard.");
+ }
+ return result;
+ }
@Override
public void init() {
@@ -61,7 +129,7 @@ public class InstrumentTester extends JApplet {
for (int i = 0; i < voices.length; i++) {
voices[i] = voiceDescription.createUnitVoice();
}
- PolyphonicInstrument instrument = new PolyphonicInstrument(voices);
+ instrument = new PolyphonicInstrument(voices);
synth.add(instrument);
instrument.usePreset(presetIndex, synth.createTimeStamp());
String title = voiceDescription.getVoiceClassName() + ": "
@@ -71,6 +139,19 @@ public class InstrumentTester extends JApplet {
});
add(browser, BorderLayout.NORTH);
+ try {
+ setupMidiKeyboard();
+ } catch (MidiUnavailableException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
validate();
}