2011-02-03 14 views
8

Nie mogę zmusić instrumentu do zmiany. Zmieniam wartość instrumentu, ale nie otrzymuję niczego innego na wyjściu. Mogę grać tylko na fortepianie, bez względu na to, jaką próbuję. Oto prosty kod poniżej. Czy ktoś ma jakieś sugestie? Czy też brakuje mi podstawy obiektu instrumentu?Java MIDI Synthesizer - Nie można zmienić instrumentów

import javax.sound.midi.*; 
//import javax.sound.*; 

public class Drum { 
    static int instrument = 45; 
    static int note = 100; 
    static int timbre = 0; 
    static int force = 100; 
    public static void main(String[] args) {   
     Synthesizer synth = null; 
     try { 
      synth = MidiSystem.getSynthesizer(); 
      synth.open(); 
     } 
     catch (Exception e) { 
      System.out.println(e); 
     } 
     Soundbank soundbank = synth.getDefaultSoundbank(); 
     Instrument[] instr = soundbank.getInstruments(); 
     synth.loadInstrument(instr[instrument]); //Changing this int (instrument) does nothing 
     MidiChannel[] mc = synth.getChannels(); 
     mc[4].noteOn(note, force); 
     try { Thread.sleep(1000); } 
     catch(InterruptedException e) {} 
     System.out.println(instr[instrument].getName()); 

     synth.close(); 

    } 
} 
+0

Nie można po prostu załadować instrumentu, należy również wysłać komunikat zmiany programu. Nie jestem programistą Java, więc nie wiem jak to zrobić, ale to właśnie musisz zrobić. Zobacz http://download.oracle.com/javase/1.4.2/docs/api/javax/sound/midi/Synthesizer.html#loadInstrument(javax.sound.midi.Instrument) – Brad

Odpowiedz

10

Musisz poinformować kanał, aby używał instrumentu. Przyznaję, że nigdy nie korzystałem z MIDI w Javie, ale coś w stylu mc.programChange(instr.getPatch().getProgram()) brzmi obiecująco.

+0

To było poprawne. Potrzebowałem polecenia programChange. Tak na przykład użyłem mc [4] .programChange (0, instrument); Mogę teraz zmieniać instrumenty, ale nie wydaje się, że faktycznie grają instrumenty perkusyjne. Muszę zobaczyć, co to za umowa. Zakładam, że mam trochę wolnego. Dzięki chłopaki! – Matt

3

Do grania na instrumentach perkusyjnych należy użyć kanału 10, który jest używany tylko na instrumenty perkusyjne. (Http://en.wikipedia.org/wiki/General_MIDI)

Na przykład:

int instrument = 36; 

Sequence sequence = new Sequence(Sequence.PPQ, 1); 

Track track = sequence.createTrack(); 


ShortMessage sm = new ShortMessage(); 
sm.setMessage(ShortMessage.PROGRAM_CHANGE, 9, instrument, 0); //9 ==> is the channel 10. 
track.add(new MidiEvent(sm, 0)); 

następnie każda nuta dodać zabrzmi z perkusją.

Powiązane problemy