2016-08-23 80 views
0

我嘗試在java中編寫簡單的midi文件,但是我無法打開它。 我只是創建三個音符同時播放。在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文件,whitch似乎與正常的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 

我的文件有什麼問題?

+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(字節[I] == 0 && I <(大小-1)) \t { \t \t我++; \t} \t \t \t \t size_new_bytes = size-i; \t \t byte [] temp = new byte [size_new_bytes]; \t \t 爲(U = 0; <üsize_new_bytes;Ù++) \t { \t \t溫度[U] =字節[U + I]; \t} \t return temp; \t} –

+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")); 

扔在一個try/catch塊的情況下,有書面形式的文件有問題,就大功告成了。