2011-02-03 12 views
8

मुझे उपकरण बदलने के लिए प्रतीत नहीं होता है। मैं उपकरण के मूल्य को स्विच करता हूं लेकिन आउटपुट पर कुछ भी अलग नहीं करता हूं। मैं केवल एक पियानो उपकरण प्राप्त करने के लिए प्राप्त कर सकता हूं इससे कोई फर्क नहीं पड़ता कि मैं किस मूल्य का प्रयास करता हूं। नीचे सरल कोड है। क्या किसी के पास कोई सुझाव है? या क्या मैं उपकरण वस्तु का मौलिक लापता हूं?जावा मिडी सिंथेसाइज़र - उपकरण बदल नहीं सकते

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

आप केवल एक उपकरण लोड नहीं कर सकते हैं, आपको एक प्रोग्राम चेंज संदेश भी भेजना होगा। मैं जावा प्रोग्रामर नहीं हूं, इसलिए मुझे नहीं पता कि यह कैसे करना है, लेकिन यही वह है जो आपको करना चाहिए। Http://download.oracle.com/javase/1.4.2/docs/api/javax/sound/midi/Synthesizer.html#loadInstrument(javax.sound.midi.Instrument) – Brad

उत्तर

10

आपको उपकरण का उपयोग करने के लिए चैनल को बताना होगा। मैं मानता हूं कि मैंने जावा में MIDI का कभी भी उपयोग नहीं किया है, लेकिन mc.programChange(instr.getPatch().getProgram()) जैसे कुछ वादा करता है।

+0

यह सही था। मुझे प्रोग्राम चेंज कमांड की आवश्यकता थी। तो, उदाहरण के लिए, मैंने एमसी [4] .programChange (0, उपकरण) का उपयोग किया; अब मैं यंत्र बदल सकता हूं लेकिन ऐसा नहीं लगता है कि पर्क्यूशन यंत्र वास्तव में खेल रहे हैं। मुझे यह देखने की ज़रूरत होगी कि उसके साथ क्या सौदा है। मुझे लगता है कि मेरे पास कुछ सेटिंग है। धन्यवाद दोस्तों! – Matt

3

पर्क्यूशन उपकरणों को चलाने के लिए आपको चैनल 10 का उपयोग करना होगा, वह चैनल केवल पर्क्यूशन उपकरणों के लिए उपयोग किया जाता है। (Http://en.wikipedia.org/wiki/General_MIDI)

उदाहरण के लिए:

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

तो हर आप जोड़ना यह टक्कर के साथ ध्वनि पड़ेगा।

संबंधित मुद्दे