前提・実現したいこと
javaでMIDIファイルを作成するシステムを作っています。
複数のトラックを作ったMIDIを、ファイルに書き出す時にエラーメッセージが発生しました。
トラックが1つだけだった場合は問題なくMIDIファイルが作成されます。
発生している問題・エラーメッセージ
javaでMIDIファイルを作成していて、その中に複数のトラックを作成したら、MIDIファイルのタイプがサポートされていません的なことを言われました。
エラーメッセージ java.lang.IllegalArgumentException: MIDI file type is not supported at java.desktop/javax.sound.midi.MidiSystem.write(MidiSystem.java:1020) at test.main(test.java:138)``` ### 該当のソースコード //下の方の 『この部分』 と囲っているところ。 import javax.sound.midi.MetaMessage; import javax.sound.midi.MidiEvent; import javax.sound.midi.MidiSystem; import javax.sound.midi.Sequence; import javax.sound.midi.ShortMessage; import javax.sound.midi.Track; public class test { public static void main(String args[]) { try { Sequence sequence = new Sequence(Sequence.PPQ, 24); Track track = sequence.createTrack(); Track track2 = sequence.createTrack(); /* * チャンネル:0, 音の高さ:48 音の強さ:127 音色番号:6 */ int channel = 0; //パート分け(多分。仮。) //int pitch = 48; //音程:多分48でC? int[] pitch = {48,50,52,53,52,50,48/**/,52,53,55,57,55,53,52/**/,48,48,48,48/**/,48,48,50,50,52,52,53,53,52,50,48}; //音程 int[] otostart = {0,24,48,72,96,120,144/**/,192,216,240,264,288,312,336/**/,384,432,480,528/**/,576,588,600,612,624,636,648,660,672,696,720}; //長さ:音が鳴る開始位置 コードごとに同じ int[] otofini = {24,48,72,96,120,144,190/**/,216,240,264,288,312,336,384/**/,408,456,504,552/**/,588,600,612,624,636,648,660,672,696,720,744}; //長さ:音が鳴る終了位置 int[] otostart2 = { 192,216,240,264,288,312,336,384,408,432,456,480,504,528,576,624,672,720,768,780,792,804,816,828,840,852,864,888,912}; int[] otofini2 = { 216,240,264,288,312,336,360,406,432,456,480,504,528,552,600,624,672,720,768,804,816,828,840,852,864,876,888,912,936}; int velocity = 127; //音量 int instrument = 6; //音色番号 int instrument2 = 3; //音色番号 MetaMessage mmessage = new MetaMessage(); int tempo = 90; int l = 60*1000000/tempo; mmessage.setMessage(0x51, new byte[]{(byte)(l/65536), (byte)(l%65536/256), (byte)(l%256)}, 3); track.add(new MidiEvent(mmessage, 0)); track2.add(new MidiEvent(mmessage, 0)); //set instrument 『ShortMessage』に音楽情報を入れる。音符情報? ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.PROGRAM_CHANGE, channel, instrument, 0); track.add(new MidiEvent(message, 0)); ShortMessage message2 = new ShortMessage(); message2.setMessage(ShortMessage.PROGRAM_CHANGE, channel, instrument2, 0); track2.add(new MidiEvent(message2, 0)); int j=0; for(int i : pitch) { // Note on message = new ShortMessage(); message.setMessage(ShortMessage.NOTE_ON, channel, pitch[j], velocity); track.add(new MidiEvent(message, otostart[j])); // Note off after quater (24tick) message = new ShortMessage(); message.setMessage(ShortMessage.NOTE_OFF, channel, pitch[j], velocity); track.add(new MidiEvent(message, otofini[j])); j++; } j=0; for(int i : pitch) { // Note on message2 = new ShortMessage(); message2.setMessage(ShortMessage.NOTE_ON, channel, pitch[j], velocity); track2.add(new MidiEvent(message2, otostart2[j])); // Note off after quater (24tick) message2 = new ShortMessage(); message2.setMessage(ShortMessage.NOTE_OFF, channel, pitch[j], velocity); track2.add(new MidiEvent(message2, otofini2[j])); j++; } ////////////////この部分////////////////////////////////////////////////////////// //write to file MidiSystem.write(sequence, 0,new java.io.File("ファイルのパス")); ////////////////////////////////////////////////////////////////////////////////// } catch(Exception e2){ e2.printStackTrace(); } } } ```ここに言語名を入力 java
試したこと
この部分//////////////////////////////////////////////////////////
//write to file
MidiSystem.write(sequence, 0,new java.io.File("ファイルのパス"));
を、全部消して
Sequencer seq = MidiSystem.getSequencer();
seq.setSequence(sequence); seq.open(); seq.start();
とし、MIDIファイルを作成しないで直接MIDIを再生してみました。
すると思っていた通り複数のトラックが出来た状態で再生されたので、やはり問題はファイルの作成の部分らしいです。
補足情報(FW/ツールのバージョンなど)
Java → java11
eclipse → Version: 2019-03 (4.11.0)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/28 10:43
2020/08/28 10:46