Exemplo n.º 1
0
    /// <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
    }
Exemplo n.º 2
0
    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
    }