2015-04-19 32 views
0

Java Doc for Function如何使用Java的MidiSystem.write()函數?

我似乎無法弄清楚如何使用此功能。我有一個Java.Midi.Sequence和我想要寫入的文件,但我無法弄清楚「int fileType」是什麼。在MidiSystem,Sequence或MidiFileWriter中沒有可以引用的靜態int。 0也沒有幫助。

的錯誤使用零點時,我得到的是這樣:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: seph.reed.effigy.MidiLoader$1 cannot be cast to javax.sound.midi.ShortMessage 
at com.sun.media.sound.StandardMidiFileWriter.writeTrack(StandardMidiFileWriter.java:386) 
at com.sun.media.sound.StandardMidiFileWriter.getFileStream(StandardMidiFileWriter.java:204) 
at com.sun.media.sound.StandardMidiFileWriter.write(StandardMidiFileWriter.java:137) 
at com.sun.media.sound.StandardMidiFileWriter.write(StandardMidiFileWriter.java:153) 
at javax.sound.midi.MidiSystem.write(MidiSystem.java:1060) 
at seph.reed.effigy.MidiLoader.saveClipAs(MidiLoader.java:197) 
at seph.reed.effigy.EffigyMenuBar$2.onClick(EffigyMenuBar.java:47) 

引用的個人功能是:

public void saveClipAs(File selectedFile) { 
    try { 
     Sequence out = new Sequence(Sequence.PPQ, 256); 
     Track toMe = out.createTrack(); 

     Sequencer fromMe = ANCESTOR(Effigy.class).m_gui.getCurrentClip().m_sequencer; 
//traverse linked list adding notes to track 
     for(MidiEventEntity ptr = fromMe.m_head; ptr != null; ptr = ptr.m_next) { 
      byte[] midiData = new byte[3]; 
      midiData[0] = MidiToolBox.NOTE_ON; 
      midiData[1] = (byte)ptr.getNote(); 
      midiData[2] = (byte)127; 

      long tick = (long) (256 * ptr.getBeat()); //256 ticks per 1/4 note 
      MidiEvent addMe = new MidiEvent(new MidiMessage(midiData) { 
       @Override 
       public Object clone() { 
        return null; } 
      }, tick); 
      toMe.add(addMe); 
     } 

    //THIS LINE BELOW 
     MidiSystem.write(out, 0, selectedFile); 
    } 
    catch (InvalidMidiDataException e) { 
     e.printStackTrace(); } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

感謝您的幫助。我完全不知道int fileType真正需要什麼。

編輯:刪除了一個愚蠢的第二個問題。

編輯:功能代碼:

for(MidiEventEntity ptr = fromMe.m_head; ptr != null; ptr = ptr.m_next) { 
      byte status = MidiToolBox.NOTE_ON; 
      byte note = (byte)ptr.getNote(); 
      byte velocity = (byte)127; 

      long tick = (long) (256 * ptr.getBeat()); //256 ticks per 1/4 note 
      ShortMessage msg = new ShortMessage(status, note, velocity); 
      MidiEvent addMe = new MidiEvent(msg, tick); 
      toMe.add(addMe); 
     } 
+0

你不知道吧,我發佈的那一刻我意識到,那個「$ 1」一定是指我的新的MidiMessage。儘管如此,我還是需要一些幫助來找出fileType參數需要什麼。 –

+0

我發現用「ShortMessage(...)」替換我的內聯「new MidiMessage(...){...}」一切都正常。 不過,如果有人知道我可以在哪裏找到fileType比魔術數字0更好的替代品,我會認爲它是這個問題的完整答案。 –

回答

0

根據https://docs.oracle.com/javase/tutorial/sound/SPI-providing-MIDI.html

有三個標準MIDI文件格式,所有的Java聲音API的實現可以支持:0型,1型和2型。這些文件格式的不同它們在文件中的MIDI序列數據的內部表示,並適用於不同種類的序列。如果一個實現本身不支持所有這三種類型,則服務提供者可以爲未實現的提供支持。還有標準MIDI文件格式的變體,其中一些是專有的,同樣可以由第三方供應商支持。

因此文件類型爲0,1,或2 您的實現支持可以通過MidiSystem.getMidiFileTypes()可以看到什麼樣的文件類型。 MIDI文件的文件類型可以通過 MidiSystem.getMidiFileFormat()標識(見 http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MidiSystem.html#getMidiFileFormat%28java.io.File%29http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MidiFileFormat.html

相關問題