繁体   English   中英

用JAVA写MIDI文件

[英]Write midi file in JAVA

我尝试用Java编写简单的Midi文件,但无法打开它。 我只创建了三个同时演奏的音符。

这是我的代码:

    file_midi.write("MThd".getBytes());
    file_midi.write(fourToBytes(length));
    file_midi.write(formatType);
    file_midi.write(nbreVoies);
    file_midi.write(PPQN);

    file_midi.write("MTrk".getBytes());
    file_midi.write(fourToBytes(31));

    temp = (char)choix_inst[0];

    file_midi.write(zero);
    file_midi.write(c);
    file_midi.write(zero);

    num_note_midi = 50;
    velocity = 10;

    file_midi.write(zero);
    file_midi.write(non);
    file_midi.write(num_note_midi); //numéro de la note
    file_midi.write(velocity); //vélocité de la note

    num_note_midi = 60;

    file_midi.write(zero);
    file_midi.write(non);
    file_midi.write(num_note_midi); //numéro de la note
    file_midi.write(velocity); //vélocité de la note

    num_note_midi = 70;

    file_midi.write(zero);
    file_midi.write(non);
    file_midi.write(num_note_midi); //numéro de la note
    file_midi.write(velocity); //vélocité de la note

    num_note_midi = 50;
    t_note_midi = 160;

    file_midi.write(WriteVarLen(t_note_midi));
    file_midi.write(noff);
    file_midi.write(num_note_midi); //numéro de la note
    file_midi.write(velocity); //vélocité de la note

    num_note_midi = 60;

    file_midi.write(WriteVarLen(t_note_midi));
    file_midi.write(noff);
    file_midi.write(num_note_midi); //numéro de la note
    file_midi.write(velocity); //vélocité de la note

    num_note_midi = 70;

    file_midi.write(WriteVarLen(t_note_midi));
    file_midi.write(noff);
    file_midi.write(num_note_midi); //numéro de la note
    file_midi.write(velocity); //vélocité de la note

    file_midi.write(zero);
    file_midi.write(ff);
    file_midi.write(a_2f);
    file_midi.write(zero);

    file_midi.close();

然后我以十六进制格式显示此midi文件,这似乎与普通的midi文件格式相对应。

4D 54 68 64 00 00 00 06 00 01 00 01 00 A0 4D 54 72 6B 00 00 00 1F 00 C0 00 00 90 32 0A 00 90 3C 0A 00 90 46 0A A0 80 32 0A A0 80 3C 0A A0 80 46 0A 00 FF 2F 00

我的文件怎么了?

WriteVarLen函数无法正常工作。

编码为可变长度数量的值160必须导致字节81 20

您是否考虑过使用JFugue 如果这样做,您的代码将如下所示:

// Notes 50, 60, and 70, using the default of a quarter duration, on-velocity of 10
Pattern pattern = new Pattern("50a10 60a10 70a10"); 
MidiFileManager.savePatternAsMidi(pattern, new File("filename.mid"));

如果在写入文件时遇到问题,请放入try / catch块,然后完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM