2011-02-03 9 views
8

Non riesco a far cambiare lo strumento. Cambio il valore dello strumento ma non ottengo nulla di diverso sull'uscita. Posso suonare uno strumento per pianoforte solo a prescindere dal valore che cerco. Ecco il semplice codice qui sotto. Qualcuno ha qualche suggerimento? O mi manca una fondamentale dell'oggetto dello strumento?Sintetizzatore MIDI Java - Impossibile cambiare gli strumenti

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

Non è possibile caricare solo uno strumento, è necessario inviare anche un messaggio di cambio programma. Non sono un programmatore Java, quindi non so come farlo, ma è quello che devi fare. Vedi http://download.oracle.com/javase/1.4.2/docs/api/javax/sound/midi/Synthesizer.html#loadInstrument(javax.sound.midi.Instrument) – Brad

risposta

10

È necessario indicare al canale di utilizzare lo strumento. Ammetto di non aver mai usato il MIDI in Java, ma qualcosa come mc.programChange(instr.getPatch().getProgram()) sembra promettente.

+0

Che era corretto. Avevo bisogno del comando programChange. Quindi, per esempio, ho usato mc [4] .programChange (0, instrument); Ora posso cambiare gli strumenti ma non sembra che gli strumenti a percussione stiano effettivamente suonando. Dovrò vedere qual è l'accordo con quello. Presumo di avere un po 'di riposo. Grazie ragazzi! – Matt

3

Per suonare gli strumenti a percussione è necessario utilizzare il canale 10, quel canale è utilizzato solo per strumenti a percussione. (Http://en.wikipedia.org/wiki/General_MIDI)

Ad esempio:

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)); 

allora ogni nota si aggiunge che suonerà con le percussioni.

Problemi correlati