38 |
|
|
39 |
package gnu.javax.sound.midi.dssi; |
package gnu.javax.sound.midi.dssi; |
40 |
|
|
41 |
|
import java.util.ArrayList; |
42 |
|
import java.util.Iterator; |
43 |
|
import java.util.List; |
44 |
|
|
45 |
import javax.sound.midi.Instrument; |
import javax.sound.midi.Instrument; |
46 |
import javax.sound.midi.MidiChannel; |
import javax.sound.midi.MidiChannel; |
47 |
import javax.sound.midi.MidiMessage; |
import javax.sound.midi.MidiMessage; |
50 |
import javax.sound.midi.Receiver; |
import javax.sound.midi.Receiver; |
51 |
import javax.sound.midi.ShortMessage; |
import javax.sound.midi.ShortMessage; |
52 |
import javax.sound.midi.Soundbank; |
import javax.sound.midi.Soundbank; |
53 |
|
import javax.sound.midi.SoundbankResource; |
54 |
import javax.sound.midi.Synthesizer; |
import javax.sound.midi.Synthesizer; |
55 |
import javax.sound.midi.Transmitter; |
import javax.sound.midi.Transmitter; |
56 |
import javax.sound.midi.VoiceStatus; |
import javax.sound.midi.VoiceStatus; |
59 |
import javax.sound.midi.MidiDevice.Info; |
import javax.sound.midi.MidiDevice.Info; |
60 |
|
|
61 |
/** |
/** |
62 |
* @author green |
* DSSI soft-synth support. |
63 |
|
* |
64 |
|
* All DSSI soft-synths are expected to be installed in /usr/lib/dssi. |
65 |
|
* |
66 |
|
* @author Anthony Green (green@redhat.com) |
67 |
* |
* |
68 |
*/ |
*/ |
69 |
public class DSSISynthesizer implements Synthesizer |
public class DSSISynthesizer implements Synthesizer |
70 |
{ |
{ |
71 |
/** |
/** |
72 |
* @author green |
* The DSSI Instrument class. |
73 |
|
* |
74 |
|
* @author Anthony Green (green@redhat.com) |
75 |
|
* |
76 |
|
*/ |
77 |
|
class DSSIInstrument extends Instrument |
78 |
|
{ |
79 |
|
DSSIInstrument (Soundbank soundbank, Patch patch, String name) |
80 |
|
{ |
81 |
|
super (soundbank, patch, name, null); |
82 |
|
} |
83 |
|
|
84 |
|
/* @see javax.sound.midi.SoundbankResource#getData() |
85 |
|
*/ |
86 |
|
public Object getData() |
87 |
|
{ |
88 |
|
return null; |
89 |
|
} |
90 |
|
|
91 |
|
} |
92 |
|
|
93 |
|
/** |
94 |
|
* DSSISoundbank holds all instruments. |
95 |
|
* |
96 |
|
* @author Anthony Green (green@redhat.com) |
97 |
|
* |
98 |
|
*/ |
99 |
|
class DSSISoundbank implements Soundbank |
100 |
|
{ |
101 |
|
private String name; |
102 |
|
private String description; |
103 |
|
private List instruments = new ArrayList(); |
104 |
|
private List resources = new ArrayList(); |
105 |
|
private String vendor; |
106 |
|
private String version; |
107 |
|
|
108 |
|
public DSSISoundbank(String name, String description, String vendor, String version) |
109 |
|
{ |
110 |
|
this.name = name; |
111 |
|
this.description = description; |
112 |
|
this.vendor = vendor; |
113 |
|
this.version = version; |
114 |
|
} |
115 |
|
|
116 |
|
void add(Instrument instrument) |
117 |
|
{ |
118 |
|
instruments.add(instrument); |
119 |
|
} |
120 |
|
|
121 |
|
/* @see javax.sound.midi.Soundbank#getName() |
122 |
|
*/ |
123 |
|
public String getName() |
124 |
|
{ |
125 |
|
return name; |
126 |
|
} |
127 |
|
|
128 |
|
/* @see javax.sound.midi.Soundbank#getVersion() |
129 |
|
*/ |
130 |
|
public String getVersion() |
131 |
|
{ |
132 |
|
return version; |
133 |
|
} |
134 |
|
|
135 |
|
/* @see javax.sound.midi.Soundbank#getVendor() |
136 |
|
*/ |
137 |
|
public String getVendor() |
138 |
|
{ |
139 |
|
return vendor; |
140 |
|
} |
141 |
|
|
142 |
|
/* @see javax.sound.midi.Soundbank#getDescription() |
143 |
|
*/ |
144 |
|
public String getDescription() |
145 |
|
{ |
146 |
|
return description; |
147 |
|
} |
148 |
|
|
149 |
|
/* @see javax.sound.midi.Soundbank#getResources() |
150 |
|
*/ |
151 |
|
public SoundbankResource[] getResources() |
152 |
|
{ |
153 |
|
return (SoundbankResource[]) |
154 |
|
resources.toArray(new SoundbankResource[resources.size()]); |
155 |
|
} |
156 |
|
|
157 |
|
/* @see javax.sound.midi.Soundbank#getInstruments() |
158 |
|
*/ |
159 |
|
public Instrument[] getInstruments() |
160 |
|
{ |
161 |
|
return (Instrument[]) |
162 |
|
instruments.toArray(new Instrument[instruments.size()]); |
163 |
|
} |
164 |
|
|
165 |
|
/* @see javax.sound.midi.Soundbank#getInstrument(javax.sound.midi.Patch) |
166 |
|
*/ |
167 |
|
public Instrument getInstrument(Patch patch) |
168 |
|
{ |
169 |
|
Iterator itr = instruments.iterator(); |
170 |
|
|
171 |
|
while (itr.hasNext()) |
172 |
|
{ |
173 |
|
Instrument i = (Instrument) itr.next(); |
174 |
|
if (i.getPatch().equals(patch)) |
175 |
|
return i; |
176 |
|
} |
177 |
|
|
178 |
|
return null; |
179 |
|
} |
180 |
|
} |
181 |
|
|
182 |
|
/** |
183 |
|
* The Receiver class receives all MIDI messages from a connected |
184 |
|
* Transmitter. |
185 |
|
* |
186 |
|
* @author Anthony Green (green@redhat.com) |
187 |
* |
* |
188 |
*/ |
*/ |
189 |
class DSSIReceiver implements Receiver |
class DSSIReceiver implements Receiver |
236 |
static native void controlChange_(long handle, int channel, int control, int value); |
static native void controlChange_(long handle, int channel, int control, int value); |
237 |
static native void open_(long handle); |
static native void open_(long handle); |
238 |
static native void close_(long handle); |
static native void close_(long handle); |
239 |
|
static native String getProgramName_(long handle, int index); |
240 |
|
static native int getProgramBank_(long handle, int index); |
241 |
|
static native int getProgramProgram_(long handle, int index); |
242 |
|
|
243 |
/** |
/** |
244 |
* @author Anthony Green (green@redhat.com) |
* @author Anthony Green (green@redhat.com) |
491 |
|
|
492 |
MidiChannel channels[] = new MidiChannel[16]; |
MidiChannel channels[] = new MidiChannel[16]; |
493 |
|
|
494 |
|
// The list of known soundbanks, and the default one. |
495 |
|
List soundbanks = new ArrayList(); |
496 |
|
DSSISoundbank defaultSoundbank; |
497 |
|
|
498 |
/** |
/** |
499 |
|
* Create a DSSI Synthesizer. |
500 |
* |
* |
501 |
|
* @param info the DSSIInfo for this soft-synth |
502 |
|
* @param soname the name of the .so file for this DSSI synth |
503 |
|
* @param index the DSSI index for this soft-synth |
504 |
*/ |
*/ |
505 |
public DSSISynthesizer(Info info, String soname, long index) |
public DSSISynthesizer(Info info, String soname, long index) |
506 |
{ |
{ |
509 |
sohandle = DSSIMidiDeviceProvider.dlopen_(soname); |
sohandle = DSSIMidiDeviceProvider.dlopen_(soname); |
510 |
handle = DSSIMidiDeviceProvider.getDSSIHandle_(sohandle, index); |
handle = DSSIMidiDeviceProvider.getDSSIHandle_(sohandle, index); |
511 |
channels[0] = new DSSIMidiChannel(0); |
channels[0] = new DSSIMidiChannel(0); |
512 |
|
defaultSoundbank = new DSSISoundbank("name", "description", |
513 |
|
"vendor", "version"); |
514 |
|
soundbanks.add(defaultSoundbank); |
515 |
|
|
516 |
|
int i = 0; |
517 |
|
String name; |
518 |
|
do |
519 |
|
{ |
520 |
|
name = getProgramName_(sohandle, i); |
521 |
|
if (name != null) |
522 |
|
{ |
523 |
|
defaultSoundbank. |
524 |
|
add(new DSSIInstrument(defaultSoundbank, |
525 |
|
new Patch(getProgramBank_(sohandle, i), |
526 |
|
getProgramProgram_(sohandle, i)), |
527 |
|
name)); |
528 |
|
i++; |
529 |
|
} |
530 |
|
} while (name != null); |
531 |
} |
} |
532 |
|
|
533 |
/* (non-Javadoc) |
/* (non-Javadoc) |
602 |
return false; |
return false; |
603 |
} |
} |
604 |
|
|
605 |
/* (non-Javadoc) |
/* @see javax.sound.midi.Synthesizer#getDefaultSoundbank() |
|
* @see javax.sound.midi.Synthesizer#getDefaultSoundbank() |
|
606 |
*/ |
*/ |
607 |
public Soundbank getDefaultSoundbank() |
public Soundbank getDefaultSoundbank() |
608 |
{ |
{ |
609 |
// TODO Auto-generated method stub |
return defaultSoundbank; |
|
return null; |
|
610 |
} |
} |
611 |
|
|
612 |
/* (non-Javadoc) |
/* @see javax.sound.midi.Synthesizer#getAvailableInstruments() |
|
* @see javax.sound.midi.Synthesizer#getAvailableInstruments() |
|
613 |
*/ |
*/ |
614 |
public Instrument[] getAvailableInstruments() |
public Instrument[] getAvailableInstruments() |
615 |
{ |
{ |
616 |
// TODO Auto-generated method stub |
List instruments = new ArrayList(); |
617 |
return null; |
Iterator itr = soundbanks.iterator(); |
618 |
|
while (itr.hasNext()) |
619 |
|
{ |
620 |
|
Soundbank sb = (Soundbank) itr.next(); |
621 |
|
Instrument ins[] = sb.getInstruments(); |
622 |
|
for (int i = 0; i < ins.length; i++) |
623 |
|
instruments.add(ins[i]); |
624 |
|
} |
625 |
|
return (Instrument[]) |
626 |
|
instruments.toArray(new Instrument[instruments.size()]); |
627 |
} |
} |
628 |
|
|
629 |
/* (non-Javadoc) |
/* (non-Javadoc) |
670 |
|
|
671 |
} |
} |
672 |
|
|
673 |
/* (non-Javadoc) |
/* @see javax.sound.midi.MidiDevice#getDeviceInfo() |
|
* @see javax.sound.midi.MidiDevice#getDeviceInfo() |
|
674 |
*/ |
*/ |
675 |
public Info getDeviceInfo() |
public Info getDeviceInfo() |
676 |
{ |
{ |
677 |
return info; |
return info; |
678 |
} |
} |
679 |
|
|
680 |
/* (non-Javadoc) |
/* @see javax.sound.midi.MidiDevice#open() |
|
* @see javax.sound.midi.MidiDevice#open() |
|
681 |
*/ |
*/ |
682 |
public void open() throws MidiUnavailableException |
public void open() throws MidiUnavailableException |
683 |
{ |
{ |
684 |
open_(sohandle); |
open_(sohandle); |
685 |
} |
} |
686 |
|
|
687 |
/* (non-Javadoc) |
/* @see javax.sound.midi.MidiDevice#close() |
|
* @see javax.sound.midi.MidiDevice#close() |
|
688 |
*/ |
*/ |
689 |
public void close() |
public void close() |
690 |
{ |
{ |
709 |
return 0; |
return 0; |
710 |
} |
} |
711 |
|
|
712 |
/* (non-Javadoc) |
/* @see javax.sound.midi.MidiDevice#getMaxReceivers() |
|
* @see javax.sound.midi.MidiDevice#getMaxReceivers() |
|
713 |
*/ |
*/ |
714 |
public int getMaxReceivers() |
public int getMaxReceivers() |
715 |
{ |
{ |
716 |
return 1; |
return 1; |
717 |
} |
} |
718 |
|
|
719 |
/* (non-Javadoc) |
/* @see javax.sound.midi.MidiDevice#getMaxTransmitters() |
|
* @see javax.sound.midi.MidiDevice#getMaxTransmitters() |
|
720 |
*/ |
*/ |
721 |
public int getMaxTransmitters() |
public int getMaxTransmitters() |
722 |
{ |
{ |
723 |
return 0; |
return 0; |
724 |
} |
} |
725 |
|
|
726 |
/* (non-Javadoc) |
/* @see javax.sound.midi.MidiDevice#getReceiver() |
|
* @see javax.sound.midi.MidiDevice#getReceiver() |
|
727 |
*/ |
*/ |
728 |
public Receiver getReceiver() throws MidiUnavailableException |
public Receiver getReceiver() throws MidiUnavailableException |
729 |
{ |
{ |
730 |
return new DSSIReceiver(); |
return new DSSIReceiver(); |
731 |
} |
} |
732 |
|
|
733 |
/* (non-Javadoc) |
/* @see javax.sound.midi.MidiDevice#getTransmitter() |
|
* @see javax.sound.midi.MidiDevice#getTransmitter() |
|
734 |
*/ |
*/ |
735 |
public Transmitter getTransmitter() throws MidiUnavailableException |
public Transmitter getTransmitter() throws MidiUnavailableException |
736 |
{ |
{ |