Пример #1
0
 public MidiMetaData(Midi midi, BmsTrackDetectionMode mode)
 {
     mChildren = new MidiTrackMetaData[16];
     switch (mode) {
         case BmsTrackDetectionMode.Manual: {
             var metaData = midi.Select(track => MidiTrackMetaData.fromTrack(track));
             Root = metaData.FirstOrDefault(t => t.TrackType == BmsTrackType.Root);
             for (var i = 0; i < 16; ++i) {
                 mChildren[i] = metaData.FirstOrDefault(t => t.TrackType == BmsTrackType.Child && t.TrackId == i);
             }
             break;
         }
         case BmsTrackDetectionMode.Auto: {
             Root = MidiTrackMetaData.fromTrack(midi.FirstOrDefault(track => track.All(midiEvent => midiEvent is MetaEvent || midiEvent is ControlChangeEvent)));
             foreach (var track in midi.Where(track => track.Any<NoteOnEvent>())) {
                 var id = track.First<ChannelEvent>().ChannelNumber;
                 if (mChildren[id] != null) {
                     MIDItoBMS.error("More than one track with ID {0}.", id);
                 }
                 mChildren[id] = MidiTrackMetaData.fromTrack(track);
             }
             break;
         }
     }
     if (Root == null) {
         MIDItoBMS.error("Failed to detect root track.");
     }
 }