如何使用 Java 的 MidiSystem.write() 函数?

How do I use Java's MidiSystem.write() function?

Java Doc for Function

我似乎不知道如何使用这个功能。我有一个 Java.Midi.Sequence 和我要写入的文件,但我不知道 "int fileType" 是什么。在 MidiSystem、Sequence 或 MidiFileWriter 中没有要引用的静态 int。 0 也没有帮助。

我在使用零时得到的错误是这样的:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: seph.reed.effigy.MidiLoader 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.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);
        }

看起来 int 对应 Midi Type 0, Midi Type 1, Midi Type 2 (more details here)

就如何确定系统支持的 MIDI 类型而言,您可以调用 MidiSystem.getMidiFileTypes(Sequence sequence) 方法。

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

There are three standard MIDI file formats, all of which an implementation of the Java Sound API can support: Type 0, Type 1, and Type 2. These file formats differ in their internal representation of the MIDI sequence data in the file, and are appropriate for different kinds of sequences. If an implementation doesn't itself support all three types, a service provider can supply the support for the unimplemented ones. There are also variants of the standard MIDI file formats, some of them proprietary, which similarly could be supported by a third-party vendor.

因此文件类型为 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)