2016-08-23 7 views
0

私は単純なmidiファイルをJavaで書こうとしますが、私はそれを開くことができません。 私はちょうど3つのノートを同時に作ります。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 Iを++。 \t} \t \t \t \t size_new_bytes = size - i; \t \tバイト[] temp =新しいバイト[size_new_bytes]; \t {\t \t TEMP [U] =バイト[U + I](; U

+0

私はそれを正しく書くことができました、ありがとう –

0

JFugueを使用したことがありますか?場合try/catchブロックで

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

投げは、ファイルの書き込みに問題があります、とすれば完了です:あなたがした場合は、あなたのコードは次のようになります。

関連する問題