private Data.Intermediate.Track ConvertTrack(Data.MIDI.Track midiTrack, LinkedListNode <Data.Intermediate.Event.TimeSignature> tsNode, int trackNumber)
        {
            var pos = new Data.Intermediate.Position(1, 0);

            var    nl     = new List <Data.Intermediate.Notes>();
            var    il     = new LinkedList <Data.Intermediate.Event.Instrument>();
            var    vl     = new LinkedList <Data.Intermediate.Event.Volume>();
            var    pl     = new LinkedList <Data.Intermediate.Event.Pan>();
            string name   = string.Empty;
            var    length = new Data.Intermediate.Position(1, 0);

            foreach (Data.MIDI.Event.Event ev in midiTrack.EventList)
            {
                pos = new Data.Intermediate.Position(pos, ev.DeltaTime, tsNode);
                while (tsNode.Next != null && pos.CompareTo(tsNode.Next.Value.Position) >= 0)       // Go to proper node
                {
                    tsNode = tsNode.Next;
                }

                if (ev is Data.MIDI.Event.NoteOn)
                {
                    FuncNoteOn(nl, pos.Clone(), (Data.MIDI.Event.NoteOn)ev);
                }
                else if (ev is Data.MIDI.Event.NoteOff)
                {
                    FuncNoteOff(nl, pos.Clone(), (Data.MIDI.Event.NoteOff)ev);
                }
                else if (ev is Data.MIDI.Event.ProgramChange)
                {
                    var inst = (Data.MIDI.Event.ProgramChange)ev;
                    il.AddLast(new Data.Intermediate.Event.Instrument(pos.Clone(), inst.Number));
                }
                else if (ev is Data.MIDI.Event.Volume)
                {
                    var vol = (Data.MIDI.Event.Volume)ev;
                    vl.AddLast(new Data.Intermediate.Event.Volume(pos.Clone(), vol.Value));
                }
                else if (ev is Data.MIDI.Event.Pan)
                {
                    var pan = (Data.MIDI.Event.Pan)ev;
                    pl.AddLast(new Data.Intermediate.Event.Pan(pos.Clone(), pan.Value));
                }
                else if (ev is Data.MIDI.Event.SequenceTrackName)
                {
                    var stn = (Data.MIDI.Event.SequenceTrackName)ev;
                    name = stn.Name;
                }
                else if (ev is Data.MIDI.Event.EndOfTrack)
                {
                    length = pos.Clone();
                }
            }

            return(new Data.Intermediate.Track(nl, il, vl, pl, trackNumber, length, name));
        }
        private void ConvertConductorTrack(Data.MIDI.Track midiTrack, DataSet set, int timeDivision)
        {
            LinkedList <Data.MIDI.Event.Event> events = midiTrack.EventList;

            set.TimeSignatureList = ConvertTimeSignature(events, timeDivision);

            var pos = new Data.Intermediate.Position(1, 0);
            LinkedListNode <Data.Intermediate.Event.TimeSignature> tsNode = set.TimeSignatureList.First;

            var ksl = new LinkedList <Data.Intermediate.Event.KeySignature>();

            ksl.AddFirst(new Data.Intermediate.Event.KeySignature(pos.Clone(), Key.CMaj));      // Set default key signature
            var tl = new LinkedList <Data.Intermediate.Event.Tempo>();

            tl.AddFirst(new Data.Intermediate.Event.Tempo(pos.Clone(), 120));       // Set default tempo
            string title  = string.Empty;
            var    length = new Data.Intermediate.Position(1, 0);

            foreach (Data.MIDI.Event.Event ev in events)
            {
                pos = new Data.Intermediate.Position(pos, ev.DeltaTime, tsNode);
                while (tsNode.Next != null && pos.CompareTo(tsNode.Next.Value.Position) >= 0)       // Go to proper node
                {
                    tsNode = tsNode.Next;
                }

                if (ev is Data.MIDI.Event.SetTempo)
                {
                    var st    = (Data.MIDI.Event.SetTempo)ev;
                    var newST = new Data.Intermediate.Event.Tempo(pos.Clone(), (60000000 / st.Value));
                    if (tl.Last.Value.Position.CompareTo(newST.Position) == 0)
                    {
                        tl.RemoveLast();
                    }
                    tl.AddLast(newST);
                }
                else if (ev is Data.MIDI.Event.KeySignature)
                {
                    var ks    = (Data.MIDI.Event.KeySignature)ev;
                    var newKS = new Data.Intermediate.Event.KeySignature(pos.Clone(), Tables.KeyTable[ks.MinorFlagNumber, ks.SignatureNumber]);
                    if (ksl.Last.Value.Position.CompareTo(newKS.Position) == 0)
                    {
                        ksl.RemoveLast();
                    }
                    ksl.AddLast(newKS);
                }
                else if (ev is Data.MIDI.Event.SequenceTrackName)
                {
                    var stn = (Data.MIDI.Event.SequenceTrackName)ev;
                    title = stn.Name;
                }
                else if (ev is Data.MIDI.Event.EndOfTrack)
                {
                    length = pos.Clone();
                }
            }

            set.TrackList.Add(new Data.Intermediate.Track(
                                  new List <Data.Intermediate.Notes>(),
                                  new LinkedList <Data.Intermediate.Event.Instrument>(),
                                  new LinkedList <Data.Intermediate.Event.Volume>(),
                                  new LinkedList <Data.Intermediate.Event.Pan>(),
                                  0,
                                  length,
                                  "Conductor Track"
                                  ));
            set.TempoList        = tl;
            set.KeySignatureList = ksl;
            set.Title            = title;
        }