2015-04-19 2 views
0

Java Doc for FunctionКак использовать функцию Java MidiSystem.write()?

Я не могу понять, как использовать эту функцию. У меня есть Java.Midi.Sequence и файл, который я хочу написать, но я не могу понять, что такое «int fileType». Нет никакого статического int для ссылки в MidiSystem, Sequence или MidiFileWriter. Также не помогает 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.

EDIT: удален немой вторичный вопрос.

EDIT: функциональный код:

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

Я обнаружил, что замена моего встроенного «нового MidiMessage (...) {...}» на «ShortMessage (...)» все функционально. Тем не менее, если кто-нибудь знает, где я могу найти лучшую замену fileType, чем магическое число 0, я буду считать его полным ответом на этот вопрос. –

ответ

1

Похоже, что int соответствует Midi Тип 0, Midi Тип 1, Midi Тип 2 (more details here)

С точки зрения того, как вы идете по поводу определения, какие миди типы ваша система поддерживает это, похоже, вы можете вызвать метод MidiSystem.getMidiFileTypes(Sequence sequence).

+0

Спасибо. Я очень благодарен за это. –

0

По https://docs.oracle.com/javase/tutorial/sound/SPI-providing-MIDI.html:

Есть три стандартных форматов MIDI файлов, все из которых реализация в Java Sound API может поддерживать: Тип 0, тип 1 и тип 2. Эти форматы различаются в их внутреннее представление данных последовательности MIDI в файле и подходит для разных типов последовательностей. Если реализация сама не поддерживает все три типа, поставщик услуг может предоставить поддержку для нереализованных. Существуют также варианты стандартных форматов файлов MIDI, некоторые из которых являются собственностью, которые аналогичным образом могут поддерживаться сторонним поставщиком.

Таким образом, FILETYPE либо 0, 1 или 2. Какие типы файлов поддерживает ваши реализации можно увидеть через MidiSystem.getMidiFileTypes(). Тип файла миди-файл может быть идентифицирован с помощью MidiSystem.getMidiFileFormat() (см http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MidiSystem.html#getMidiFileFormat%28java.io.File%29 и http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MidiFileFormat.html)

Смежные вопросы