/// <summary> /// Inserts an IMidiMessage at the specified position in absolute ticks. /// </summary> /// <param name="position"> /// The position in the Track in absolute ticks in which to insert the /// IMidiMessage. /// </param> /// <param name="message"> /// The IMidiMessage to insert. /// </param> public void Insert(int position, IMidiMessage message) { #region Require if (position < 0) { throw new ArgumentOutOfRangeException("position", position, "IMidiMessage position out of range."); } else if (message == null) { throw new ArgumentNullException("message"); } #endregion MidiEvent newMidiEvent = new MidiEvent(this, position, message); if (head == null) { head = newMidiEvent; tail = newMidiEvent; } else if (position >= tail.AbsoluteTicks) { newMidiEvent.Previous = tail; tail.Next = newMidiEvent; tail = newMidiEvent; endOfTrackMidiEvent.SetAbsoluteTicks(Length); endOfTrackMidiEvent.Previous = tail; } else { MidiEvent current = head; while (current.AbsoluteTicks < position) { current = current.Next; } newMidiEvent.Next = current; newMidiEvent.Previous = current.Previous; if (current.Previous != null) { current.Previous.Next = newMidiEvent; } else { head = newMidiEvent; } current.Previous = newMidiEvent; } count++; #region Invariant AssertValid(); #endregion }
public void Move(MidiEvent e, int newPosition) { #region Require if (e.Owner != this) { throw new ArgumentException("MidiEvent does not belong to this Track."); } else if (newPosition < 0) { throw new ArgumentOutOfRangeException("newPosition"); } else if (e == endOfTrackMidiEvent) { throw new InvalidOperationException( "Cannot move end of track message. Use the EndOfTrackOffset property instead."); } #endregion MidiEvent previous = e.Previous; MidiEvent next = e.Next; if (e.Previous != null && e.Previous.AbsoluteTicks > newPosition) { e.Previous.Next = e.Next; if (e.Next != null) { e.Next.Previous = e.Previous; } while (previous != null && previous.AbsoluteTicks > newPosition) { next = previous; previous = previous.Previous; } } else if (e.Next != null && e.Next.AbsoluteTicks < newPosition) { e.Next.Previous = e.Previous; if (e.Previous != null) { e.Previous.Next = e.Next; } while (next != null && next.AbsoluteTicks < newPosition) { previous = next; next = next.Next; } } if (previous != null) { previous.Next = e; } if (next != null) { next.Previous = e; } e.Previous = previous; e.Next = next; e.SetAbsoluteTicks(newPosition); if (newPosition < head.AbsoluteTicks) { head = e; } if (newPosition > tail.AbsoluteTicks) { tail = e; } endOfTrackMidiEvent.SetAbsoluteTicks(Length); endOfTrackMidiEvent.Previous = tail; #region Invariant AssertValid(); #endregion }