2017-03-04 28 views
0

我已經寫了一個簡單的代碼加載和播放midi:java玩midi與軟件不同嗎?

public class SoundBase { 
    Sequencer sequencer; 

    public SoundBase() throws Exception{ 
     sequencer = MidiSystem.getSequencer(); 
     sequencer.open(); 

     Sequence sequence = MidiSystem.getSequence(new File("audio/chno0902.mid")); 
     sequencer.setSequence(sequence); 
//  sequencer.getTransmitter().setReceiver(new MyReceiver()); 
     sequencer.start(); 
    } 

    public static void main(String[] args) throws Exception { 
     new SoundBase(); 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     if (sequencer != null) 
      sequencer.close(); 
     super.finalize(); 
    } 
} 

但是從這個代碼播放的MIDI是從我在預覽已經聽到我已經下載了該網站確實不同:Chopin 從另外不同我已經安裝了GarageBand(MAC OSX)的軟件播放器。 我做錯了什麼或忘記了什麼? 感謝

+1

MIDI文件不包含樂器的實際聲音(波形),而僅包含各個音符的參數(樂器,音高,長度等)。這就是爲什麼它比WAV或MP3小得多。缺點是,在不同的平臺上聽起來可能會有所不同,具體取決於儀器的實施方式。 – Henry

+0

我已經看到我可以在/Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/jre/lib/audio中添加一個soundbank我已經下載它並放在那裏但是當我加載它時我有這個錯誤javax.sound.midi.InvalidMidiDataException:不能從流 \t在javax.sound.midi.MidiSystem.getSoundbank(MidiSystem.java:604) \t在SoundBankTest.loadSoundbank(SoundBankTest.java:34) \t在SoundBankTest獲得音庫。 main(SoundBankTest.java:72) java 8從2001年有這個bug? – sefiroths

回答

0

感謝您的回答,我已加載從Oracle下載的音庫,並做了一個試驗:

import java.io.File; 
import java.io.FilenameFilter; 

import javax.sound.midi.MidiSystem; 
import javax.sound.midi.MidiUnavailableException; 
import javax.sound.midi.Soundbank; 
import javax.sound.midi.Synthesizer; 

public class SoundBankTest { 
    private static final String SOUNDBANK_PATH = (System.getProperty("java.home") + File.separator + "lib" + File.separator + "audio"); 

    private Soundbank soundbank; 
    private Synthesizer synthesizer; 

    public SoundBankTest(){ 
    } 

    public Soundbank getSoundbank() throws MidiUnavailableException{ 
     if (this.soundbank == null) {   
       this.soundbank = getSynthesizer().getDefaultSoundbank();    
     } 
     return this.soundbank; 
    }  

    public Synthesizer getSynthesizer() throws MidiUnavailableException{ 
     if (this.synthesizer == null) {       
       this.synthesizer = MidiSystem.getSynthesizer();    
       this.synthesizer.open();  
     } 
     return this.synthesizer; 
    } 

    public void loadSoundbank(File file) throws Exception{     
      Soundbank soundbank = MidiSystem.getSoundbank(file); 
      if (soundbank == null || !getSynthesizer().isSoundbankSupported(soundbank)){ 
       throw new Exception("Soundbank not loaded"); 
      } 

      //unload the current soundbank 
      if(getSoundbank() != null){       
       getSynthesizer().unloadAllInstruments(getSoundbank()); 
      } 

      //load the new soundbank 
      getSynthesizer().loadAllInstruments(soundbank); 

      this.soundbank = soundbank;    
    } 

    private void playTest() throws MidiUnavailableException, InterruptedException{ 
     Thread.sleep(1000); 
      getSynthesizer().getChannels()[0].noteOn(64,64); 
      Thread.sleep(500); 
      getSynthesizer().getChannels()[0].noteOff(64,64); 
    } 

    public static void main(String[] args){      
     try { 
      final FilenameFilter filter = new FilenameFilter() { 
       public boolean accept(File dir, String name) { 
        return (name.endsWith(".gm")); 
       } 
      }; 
      System.out.println(SOUNDBANK_PATH); 
      String[] files = new File(SOUNDBANK_PATH).list(filter); 
      if(files.length > 0){ 
        File sbFile = new File(SOUNDBANK_PATH + File.separator + files[0]); 

        SoundBankTest test = new SoundBankTest();    
        test.playTest();    
        for(int i = 0; i < 5; i ++){    
         test.loadSoundbank(sbFile); 
         System.out.println("SoundBank Loaded at index: " + i); 
         test.playTest(); 
        }    
      } 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

,並收到此錯誤 /Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/內容/首頁/ jre/lib/audio javax.sound.midi.InvalidMidiDataException:無法從流 獲取soundbank位於javax.sound.midi.MidiSystem.getSoundbank(MidiSystem.java:604) at SoundBankTest.loadSoundbank(SoundBankTest.java :34) at SoundBankTest.main(SoundBankTest.java:72)

+0

你真的要進入與此不同的問題 - 如果音符是相同的,你很好 - 對於這個給定的問題 - 加載soundbanks我不知道,但你可以開始一個新的問題 – gpasch

相關問題