2016-08-23 10 views
0

Я пытаюсь написать простой MIDI-файл в java, но я не могу его открыть. Я просто создаю три ноты, которые играют одновременно.Записать midi-файл в JAVA

это мой код:

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(); 

тогда я получаю этот миди файл отображается в шестнадцатеричном формате, ведьма, кажется, соответствуют нормальному миди формат файла.

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 

Что случилось с моим файлом?

+0

Что вы подразумеваете под "неспособностью открыть его"? Не играет ли он в проигрывателе MIDI-файлов? – SamTebbs33

+0

невозможно воспроизвести или даже открыть его с помощью листового редактора, такого как MuseScore, по-видимому, есть проблема с концом файла, точная ошибка неожиданна EOF. –

ответ

0

WriteVarLen функция не работает.

Значение 160, закодированное как величина переменной длины, должно приводить к байтам 81 20.

+0

- это проблема с маленьким или большим концом? –

+0

моя функция байт [] WriteVarLen (длинное значение) \t { \t \t байт [] байт = ByteBuffer.allocate (Long.SIZE/Byte.SIZE) .putLong (значение) .array(); \t \t \t \t int size = bytes.length; \t \t int u, i = 0, size_new_bytes; \t \t \t \t в то время как (байты [я] == 0 && г <(размер-1)) \t { \t \t I ++; \t} \t \t \t \t size_new_bytes = размер - я; \t \t байт [] temp = новый байт [size_new_bytes]; \t \t для (= 0; и

+0

Я смог правильно это написать, спасибо –

0

Считаете ли вы использование 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")); 

Throw в/поймать блок Ьги в случае, если есть проблема записи файла, и вы сделали.