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

如何使用Java';MidiSystem.write()函数?,java,sequence,midi,filewriter,out,Java,Sequence,Midi,Filewriter,Out,我似乎不知道如何使用这个函数。我有一个Java.Midi.Sequence和我想写入的文件,但我不知道“int fileType”是什么。在MidiSystem、Sequence或MidiFileWriter中都没有要引用的静态int。0也没有帮助 使用zero时出现的错误如下: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: seph.reed.effigy.MidiLoader$1 cannot be

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

使用zero时出现的错误如下:

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文件类型真正需要什么

编辑:删除了一个愚蠢的次要问题

编辑:功能代码:

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类型0、Midi类型1、Midi类型2

就如何确定系统支持的midi类型而言,您似乎可以调用该方法。

根据:

有三种标准的MIDI文件格式,Java Sound API的实现可以支持这三种格式:类型0、类型1和类型2。这些文件格式在文件中MIDI序列数据的内部表示形式上有所不同,适用于不同类型的序列。如果一个实现本身不支持这三种类型,那么服务提供者可以为未实现的类型提供支持。还有一些标准MIDI文件格式的变体,其中一些是专有的,第三方供应商也同样支持这些格式

因此,文件类型为0、1或2。 可以通过
MidiSystem.getMidiFileTypes()
查看您的实现支持的文件类型。 midi文件的文件类型可以通过
MidiSystem.getMidiFileFormat()
(请参阅
而且)

你难道不知道吗,当我发帖子的时候,我意识到“$1”一定是指我的新信息。尽管如此,我还是希望得到一些帮助来弄清楚fileType参数想要什么。我发现用“ShortMessage(…){…}”替换内联的“new MidiMessage(…){…}”一切都是正常的。不过,如果有人知道我在哪里可以找到比神奇数字0更好的替代文件,我会考虑这个问题的完整答案。谢谢。我真的很感激知道这一点。