4

I have this code:

Synthesizer synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
Instrument[] instrument = synthesizer.getDefaultSoundbank().getInstruments();
synthesizer.loadInstrument(instrument[29]);
MidiChannel[] channels = synthesizer.getChannels();
MidiChannel channel = channels[1];
channel.programChange(29);
channel.noteOn(noteNumber, 127);
Teszthang.sleep(2000);
channel.noteOff(noteNumber);

so this is an example, to play a sound in max volume (127) for 2 seconds. but i want to control the channel's volume, like after 2 seconds, the volume fade out in an another 2 seconds. How could I do that? I know these methods:

channel.controlChange(controller, value);
channel.setPolyPressure(noteNumber, pressure);

but these don't change any volume! I don't know how to use these methods. How could I change the channel's volume after the noteOn() while it has been playing?

Cœur
  • 37,241
  • 25
  • 195
  • 267
victorio
  • 6,224
  • 24
  • 77
  • 113

2 Answers2

7

You can use CC 7 for setting channel volume.

channel.controlChange(7, value);

see: http://improv.sapp.org/doc/class/MidiOutput/controllers/controllers.html

Karoly Horvath
  • 94,607
  • 11
  • 117
  • 176
0

Sometimes you have some volume events in the midi file so you cannot change channel volume. After getting the sequence, remove these events :

Track[] tracks = sequence.getTracks();
for (Track track : tracks){
for(int i = 0; i < track.size(); i++){
    if(!track.remove(track.get(i))){
        System.out.println("MIDI Event not removed");
    }
}}
Tinmarino
  • 3,693
  • 24
  • 33