1561
Support / Midi Volume (Not jPCT But Java)
« on: February 03, 2009, 05:48:13 pm »
I've read everything on the subject that I could find by searching Google. Figured somebody here might know. I cannot, for the life of me, change the volume of the midi playback in my program. The following is my code. The last part (before the call to start()) is my attempt at discovering which Synthesizer is attached to the Sequencer. And the very last nested loop was an attempt to change everyone's volume. By the way, if my test for synthesizer.getDefaultSoundbank() == null is valid, I'm using the software synthesizer on my computer.
Code: [Select]
private void playMidi(String fileName) {
try {
midiPlayer = MidiSystem.getSequencer(true);
Synthesizer synthesizer = MidiSystem.getSynthesizer();
midiPlayer.open();
synthesizer.open();
Transmitter transmitter = midiPlayer.getTransmitter();
if (synthesizer.getDefaultSoundbank() == null) {//MEANING "IF USING HARDWARE (NOT JRE) SYNTHESIZER"
transmitter.setReceiver(MidiSystem.getReceiver());//THIS IS RIGHT FOR HARDWARE
System.out.println("Hardware synthesizer!");
}
else {
transmitter.setReceiver(synthesizer.getReceiver());//SYNTHESIZER.GETRECEIVER() IS RIGHT FOR SOFTWARE
System.out.println("Software synthesizer in use!");
}
midiPlayer.setSequence(MidiSystem.getSequence(new File(fileName)));
ShortMessage volumeMessage = new ShortMessage();
int numberOfChannels = synthesizer.getChannels().length;
for (int i = 0; i < numberOfChannels; i++) {
volumeMessage.setMessage(ShortMessage.CONTROL_CHANGE, i, 7, 5); //7 IS MASTER VOLUME CONTROLLER, 5 IS VOLUME BETWEEN 0-127
transmitter.getReceiver().send(volumeMessage, -1);
}
System.out.println("Is the sequencer an instance of Synthesizer? "+(midiPlayer instanceof Synthesizer));
MidiDevice device = MidiSystem.getMidiDevice(midiPlayer.getDeviceInfo());
java.util.List<Transmitter> transmitters = device.getTransmitters();
Transmitter[] transmitterArray = new Transmitter[transmitters.size()];
transmitterArray = transmitters.toArray(transmitterArray);
for (int y = 0; y < transmitterArray.length; y++) {
for (int x = 0; x < 16; x++) {
volumeMessage.setMessage(ShortMessage.CONTROL_CHANGE, y, 7, 5); //7 IS MASTER VOLUME CONTROLLER, 5 IS VOLUME BETWEEN 0-127
transmitterArray[y].getReceiver().send(volumeMessage, -1);
}
}
MidiChannel[] channels = synthesizer.getChannels();
for (int i = 0; i < channels.length; i++){
channels[i].controlChange(7, 5);
System.out.println("Can we lower the volume? "+(channels[i].getController(7)!=0));}
midiPlayer.start();
}
catch (Exception e) {System.out.println("Midi File Error: "+e.getMessage());}