2017-10-10 16 views
0

ファイル。 numTracksは1ですが、.midファイルには16トラックあります(別のMIDIエディタで開くとわかります)。ファイルタイプは0です。JavaのMIDI Sequence.getTracks()間違った番号

タイプ0のファイルは同じチャンネルの複数のトラックを持つことはできません。この場合、すべてのトラックが1つのトラックに強制されます。あれは正しいですか?どうすればそれを避けることができますか?

答えて

0

タイプ0のファイルは複数のトラックを1つだけ保持しています。 Hereあなたはいくつかの情報を持っています。

タイプ0ファイルからそれぞれのトラックを抽出することはできません。

外部MIDIエディタで複数のトラックを検出できる場合は、拡張子が一致しない場合でも、タイプ1またはタイプ2のファイルである可能性があります。

+0

タイプ#1の配列にタイプ#0のシーケンスを変換し、小さな機能をプログラムしました。 – paul

+0

これは 'sequence.getTracks()'に何の問題もないのでしょうか? タイプ0のファイルに問題があります – alseether

+0

はい、タイプ0のファイルは制限です。もう一つのツール(Reaper)は私の小さなMIDIツール(Anvil Studio)のように同じタイプです:両方ともシングルタイプ0トラックを分割し、楽器番号に応じて複数のトラックを作成します。 – paul

0

私は六角形のツールでファイルを見ました... 実際には1つのトラックしかありません。

他のエディタは、複数のトラックを単独で作成します。これは、プログラムの変更メッセージを検索し、新しいトラックにイベントを配置するようです。

1

私は他のエディタがそれ自体で複数のトラックを作成し

/** 
* Make multiple tracks from file0 track 
* @param in : Sequence with single track 
* @return Multiple track sequence 
*/ 
private Sequence extractFile0Tracks (Sequence in) throws InvalidMidiDataException 
{ 
    Track inTrack = in.getTracks()[0]; 
    HashMap<Integer, ArrayList<MidiEvent>> msgMap = new HashMap<>(); 

    // Distribute events per channel to ArrayList map 
    for (int i = 0; i < inTrack.size(); i++) 
    { 
     MidiEvent event = inTrack.get(i); 
     MidiMessage message = event.getMessage(); 
     if (message instanceof ShortMessage) 
     { 
      ShortMessage sm = (ShortMessage) message; 
      int channel = sm.getChannel() + 1; 
      ArrayList<MidiEvent> msgList = msgMap.computeIfAbsent(channel, k -> new ArrayList<>()); 
      msgList.add(event); 
     } 
    } 

    // Create sequence with multiple tracks 
    Sequence newSeq = new Sequence(in.getDivisionType(), in.getResolution()); 
    for (ArrayList<MidiEvent> msgList : msgMap.values()) 
    { 
     Track tr = newSeq.createTrack(); 
     for (MidiEvent m1 : msgList) 
      tr.add(m1); 
    } 

    return newSeq; 
} 
関連する問題