[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[cp-patches] FYI: DSSI Soundbank support
From: |
Anthony Green |
Subject: |
[cp-patches] FYI: DSSI Soundbank support |
Date: |
Fri, 07 Oct 2005 08:46:58 -0700 |
This patch adds the start of Soundbank support to the DSSI provider, so
you can query the list of Instruments provided by the soft-synth using
the standard interfaces. I'm checking it in.
AG
2005-10-07 Anthony Green <address@hidden>
* gnu/javax/sound/midi/dssi/DSSISynthesizer.java
Doc cleanups.
(DSSISynthesizer.DSSISoundbank): New class.
(DSSISynthesizer.DSSIInstrument): New class.
(soundbanks, defaultSoundbank): New fields.
(getDefaultSoundbank): Implemented.
(getAvailableInstruments): Implemented.
(getProgramName_, getProgramBank_, getProgramProgram_): New native
methods.
(DSSISynthesizer): Create default soundbank.
* native/jni/midi-dssi/gnu_javax_sound_midi_dssi_DSSISynthesizer.c
(Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_getProgramName_1,
Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_getProgramBank_1,
Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_getProgramProgram_1):
New functions.
* include/gnu_javax_sound_midi_dssi_DSSISynthesizer.h: Rebuilt.
Index: gnu/javax/sound/midi/dssi/DSSISynthesizer.java
===================================================================
RCS file:
/cvsroot/classpath/classpath/gnu/javax/sound/midi/dssi/DSSISynthesizer.java,v
retrieving revision 1.2
diff -u -r1.2 DSSISynthesizer.java
--- gnu/javax/sound/midi/dssi/DSSISynthesizer.java 7 Oct 2005 03:21:06
-0000 1.2
+++ gnu/javax/sound/midi/dssi/DSSISynthesizer.java 7 Oct 2005 15:42:34
-0000
@@ -38,6 +38,10 @@
package gnu.javax.sound.midi.dssi;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
import javax.sound.midi.Instrument;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiMessage;
@@ -46,6 +50,7 @@
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Soundbank;
+import javax.sound.midi.SoundbankResource;
import javax.sound.midi.Synthesizer;
import javax.sound.midi.Transmitter;
import javax.sound.midi.VoiceStatus;
@@ -54,13 +59,131 @@
import javax.sound.midi.MidiDevice.Info;
/**
- * @author green
+ * DSSI soft-synth support.
+ *
+ * All DSSI soft-synths are expected to be installed in /usr/lib/dssi.
+ *
+ * @author Anthony Green (address@hidden)
*
*/
public class DSSISynthesizer implements Synthesizer
{
/**
- * @author green
+ * The DSSI Instrument class.
+ *
+ * @author Anthony Green (address@hidden)
+ *
+ */
+ class DSSIInstrument extends Instrument
+ {
+ DSSIInstrument (Soundbank soundbank, Patch patch, String name)
+ {
+ super (soundbank, patch, name, null);
+ }
+
+ /* @see javax.sound.midi.SoundbankResource#getData()
+ */
+ public Object getData()
+ {
+ return null;
+ }
+
+ }
+
+/**
+ * DSSISoundbank holds all instruments.
+ *
+ * @author Anthony Green (address@hidden)
+ *
+ */
+ class DSSISoundbank implements Soundbank
+ {
+ private String name;
+ private String description;
+ private List instruments = new ArrayList();
+ private List resources = new ArrayList();
+ private String vendor;
+ private String version;
+
+ public DSSISoundbank(String name, String description, String vendor,
String version)
+ {
+ this.name = name;
+ this.description = description;
+ this.vendor = vendor;
+ this.version = version;
+ }
+
+ void add(Instrument instrument)
+ {
+ instruments.add(instrument);
+ }
+
+ /* @see javax.sound.midi.Soundbank#getName()
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /* @see javax.sound.midi.Soundbank#getVersion()
+ */
+ public String getVersion()
+ {
+ return version;
+ }
+
+ /* @see javax.sound.midi.Soundbank#getVendor()
+ */
+ public String getVendor()
+ {
+ return vendor;
+ }
+
+ /* @see javax.sound.midi.Soundbank#getDescription()
+ */
+ public String getDescription()
+ {
+ return description;
+ }
+
+ /* @see javax.sound.midi.Soundbank#getResources()
+ */
+ public SoundbankResource[] getResources()
+ {
+ return (SoundbankResource[])
+ resources.toArray(new SoundbankResource[resources.size()]);
+ }
+
+ /* @see javax.sound.midi.Soundbank#getInstruments()
+ */
+ public Instrument[] getInstruments()
+ {
+ return (Instrument[])
+ instruments.toArray(new Instrument[instruments.size()]);
+ }
+
+ /* @see javax.sound.midi.Soundbank#getInstrument(javax.sound.midi.Patch)
+ */
+ public Instrument getInstrument(Patch patch)
+ {
+ Iterator itr = instruments.iterator();
+
+ while (itr.hasNext())
+ {
+ Instrument i = (Instrument) itr.next();
+ if (i.getPatch().equals(patch))
+ return i;
+ }
+
+ return null;
+ }
+ }
+
+/**
+ * The Receiver class receives all MIDI messages from a connected
+ * Transmitter.
+ *
+ * @author Anthony Green (address@hidden)
*
*/
class DSSIReceiver implements Receiver
@@ -113,6 +236,9 @@
static native void controlChange_(long handle, int channel, int control, int
value);
static native void open_(long handle);
static native void close_(long handle);
+ static native String getProgramName_(long handle, int index);
+ static native int getProgramBank_(long handle, int index);
+ static native int getProgramProgram_(long handle, int index);
/**
* @author Anthony Green (address@hidden)
@@ -365,8 +491,16 @@
MidiChannel channels[] = new MidiChannel[16];
+ // The list of known soundbanks, and the default one.
+ List soundbanks = new ArrayList();
+ DSSISoundbank defaultSoundbank;
+
/**
+ * Create a DSSI Synthesizer.
*
+ * @param info the DSSIInfo for this soft-synth
+ * @param soname the name of the .so file for this DSSI synth
+ * @param index the DSSI index for this soft-synth
*/
public DSSISynthesizer(Info info, String soname, long index)
{
@@ -375,6 +509,25 @@
sohandle = DSSIMidiDeviceProvider.dlopen_(soname);
handle = DSSIMidiDeviceProvider.getDSSIHandle_(sohandle, index);
channels[0] = new DSSIMidiChannel(0);
+ defaultSoundbank = new DSSISoundbank("name", "description",
+ "vendor", "version");
+ soundbanks.add(defaultSoundbank);
+
+ int i = 0;
+ String name;
+ do
+ {
+ name = getProgramName_(sohandle, i);
+ if (name != null)
+ {
+ defaultSoundbank.
+ add(new DSSIInstrument(defaultSoundbank,
+ new Patch(getProgramBank_(sohandle, i),
+ getProgramProgram_(sohandle, i)),
+ name));
+ i++;
+ }
+ } while (name != null);
}
/* (non-Javadoc)
@@ -449,22 +602,28 @@
return false;
}
- /* (non-Javadoc)
- * @see javax.sound.midi.Synthesizer#getDefaultSoundbank()
+ /* @see javax.sound.midi.Synthesizer#getDefaultSoundbank()
*/
public Soundbank getDefaultSoundbank()
{
- // TODO Auto-generated method stub
- return null;
+ return defaultSoundbank;
}
- /* (non-Javadoc)
- * @see javax.sound.midi.Synthesizer#getAvailableInstruments()
+ /* @see javax.sound.midi.Synthesizer#getAvailableInstruments()
*/
public Instrument[] getAvailableInstruments()
{
- // TODO Auto-generated method stub
- return null;
+ List instruments = new ArrayList();
+ Iterator itr = soundbanks.iterator();
+ while (itr.hasNext())
+ {
+ Soundbank sb = (Soundbank) itr.next();
+ Instrument ins[] = sb.getInstruments();
+ for (int i = 0; i < ins.length; i++)
+ instruments.add(ins[i]);
+ }
+ return (Instrument[])
+ instruments.toArray(new Instrument[instruments.size()]);
}
/* (non-Javadoc)
@@ -511,24 +670,21 @@
}
- /* (non-Javadoc)
- * @see javax.sound.midi.MidiDevice#getDeviceInfo()
+ /* @see javax.sound.midi.MidiDevice#getDeviceInfo()
*/
public Info getDeviceInfo()
{
return info;
}
- /* (non-Javadoc)
- * @see javax.sound.midi.MidiDevice#open()
+ /* @see javax.sound.midi.MidiDevice#open()
*/
public void open() throws MidiUnavailableException
{
open_(sohandle);
}
- /* (non-Javadoc)
- * @see javax.sound.midi.MidiDevice#close()
+ /* @see javax.sound.midi.MidiDevice#close()
*/
public void close()
{
@@ -553,32 +709,28 @@
return 0;
}
- /* (non-Javadoc)
- * @see javax.sound.midi.MidiDevice#getMaxReceivers()
+ /* @see javax.sound.midi.MidiDevice#getMaxReceivers()
*/
public int getMaxReceivers()
{
return 1;
}
- /* (non-Javadoc)
- * @see javax.sound.midi.MidiDevice#getMaxTransmitters()
+ /* @see javax.sound.midi.MidiDevice#getMaxTransmitters()
*/
public int getMaxTransmitters()
{
return 0;
}
- /* (non-Javadoc)
- * @see javax.sound.midi.MidiDevice#getReceiver()
+ /* @see javax.sound.midi.MidiDevice#getReceiver()
*/
public Receiver getReceiver() throws MidiUnavailableException
{
return new DSSIReceiver();
}
- /* (non-Javadoc)
- * @see javax.sound.midi.MidiDevice#getTransmitter()
+ /* @see javax.sound.midi.MidiDevice#getTransmitter()
*/
public Transmitter getTransmitter() throws MidiUnavailableException
{
Index: native/jni/midi-dssi/gnu_javax_sound_midi_dssi_DSSISynthesizer.c
===================================================================
RCS file:
/cvsroot/classpath/classpath/native/jni/midi-dssi/gnu_javax_sound_midi_dssi_DSSISynthesizer.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_javax_sound_midi_dssi_DSSISynthesizer.c
--- native/jni/midi-dssi/gnu_javax_sound_midi_dssi_DSSISynthesizer.c 7 Oct
2005 05:12:29 -0000 1.4
+++ native/jni/midi-dssi/gnu_javax_sound_midi_dssi_DSSISynthesizer.c 7 Oct
2005 15:42:49 -0000
@@ -468,3 +468,68 @@
{
}
+/* FIXME: These next three functions are really inefficient because
+ we're instantiating and cleaning up plugin instances just to query
+ values. */
+
+JNIEXPORT jstring JNICALL
+Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_getProgramName_1
+ (JNIEnv *env, jclass clazz __attribute__((unused)),
+ jlong handle, jint index)
+{
+ LADSPA_Handle lhandle;
+ jstring name = (jstring) NULL;
+ dssi_data *data = JLONG_TO_PTR(dssi_data, handle);
+ if (data->desc->get_program == NULL)
+ return NULL;
+ lhandle =
+ (data->desc->LADSPA_Plugin->instantiate)(data->desc->LADSPA_Plugin,
+ 48000);
+ const DSSI_Program_Descriptor *program =
+ (data->desc->get_program)(lhandle, (unsigned long) index);
+ if (program)
+ name = (*env)->NewStringUTF (env, program->Name);
+ (data->desc->LADSPA_Plugin->cleanup)(lhandle);
+
+ return name;
+}
+
+JNIEXPORT jint JNICALL
+Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_getProgramBank_1
+ (JNIEnv *env __attribute__((unused)), jclass clazz __attribute__((unused)),
+ jlong handle, jint index)
+{
+ LADSPA_Handle lhandle;
+ jint result = -1;
+ dssi_data *data = JLONG_TO_PTR(dssi_data, handle);
+ lhandle =
+ (data->desc->LADSPA_Plugin->instantiate)(data->desc->LADSPA_Plugin,
+ 48000);
+ const DSSI_Program_Descriptor *program =
+ (data->desc->get_program)(lhandle, (unsigned long) index);
+ if (program)
+ result = (jint) program->Bank;
+ (data->desc->LADSPA_Plugin->cleanup)(lhandle);
+ return result;
+}
+
+JNIEXPORT jint JNICALL
+Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_getProgramProgram_1
+ (JNIEnv *env __attribute__((unused)), jclass clazz __attribute__((unused)),
+ jlong handle, jint index)
+{
+ LADSPA_Handle lhandle;
+ jint result = -1;
+ dssi_data *data = JLONG_TO_PTR(dssi_data, handle);
+ lhandle =
+ (data->desc->LADSPA_Plugin->instantiate)(data->desc->LADSPA_Plugin,
+ 48000);
+ const DSSI_Program_Descriptor *program =
+ (data->desc->get_program)(lhandle, (unsigned long) index);
+ if (program)
+ result = (jint) program->Program;
+ (data->desc->LADSPA_Plugin->cleanup)(lhandle);
+ return result;
+}
+
+
Index: include/gnu_javax_sound_midi_dssi_DSSISynthesizer.h
===================================================================
RCS file:
/cvsroot/classpath/classpath/include/gnu_javax_sound_midi_dssi_DSSISynthesizer.h,v
retrieving revision 1.2
diff -u -r1.2 gnu_javax_sound_midi_dssi_DSSISynthesizer.h
--- include/gnu_javax_sound_midi_dssi_DSSISynthesizer.h 7 Oct 2005 03:21:05
-0000 1.2
+++ include/gnu_javax_sound_midi_dssi_DSSISynthesizer.h 7 Oct 2005 15:43:00
-0000
@@ -17,6 +17,9 @@
JNIEXPORT void JNICALL
Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_controlChange_1 (JNIEnv *env,
jclass, jlong, jint, jint, jint);
JNIEXPORT void JNICALL Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_open_1
(JNIEnv *env, jclass, jlong);
JNIEXPORT void JNICALL Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_close_1
(JNIEnv *env, jclass, jlong);
+JNIEXPORT jstring JNICALL
Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_getProgramName_1 (JNIEnv *env,
jclass, jlong, jint);
+JNIEXPORT jint JNICALL
Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_getProgramBank_1 (JNIEnv *env,
jclass, jlong, jint);
+JNIEXPORT jint JNICALL
Java_gnu_javax_sound_midi_dssi_DSSISynthesizer_getProgramProgram_1 (JNIEnv
*env, jclass, jlong, jint);
#ifdef __cplusplus
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cp-patches] FYI: DSSI Soundbank support,
Anthony Green <=