Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wisp
GitHub Repository: wisp/impinj-reader-app
Path: blob/master/Sanford.Multimedia.Midi/Sequencing/RecordingSession.cs
180 views
using System;
using System.Collections.Generic;
using System.Text;

namespace Sanford.Multimedia.Midi
{
    public class RecordingSession
    {
        private IClock clock;

        private List<TimestampedMessage> buffer = new List<TimestampedMessage>();

        private Track result = new Track();

        public RecordingSession(IClock clock)
        {
            this.clock = clock;
        }

        public void Build()
        {
            result = new Track();

            buffer.Sort(new TimestampComparer());

            foreach(TimestampedMessage tm in buffer)
            {
                result.Insert(tm.ticks, tm.message);
            }
        }

        public void Clear()
        {
            buffer.Clear();
        }

        public Track Result
        {
            get
            {
                return result;
            }
        }

        public void Record(ChannelMessage message)
        {
            if(clock.IsRunning)
            {
                buffer.Add(new TimestampedMessage(clock.Ticks, message));
            }
        }

        public void Record(SysExMessage message)
        {
            if(clock.IsRunning)
            {
                buffer.Add(new TimestampedMessage(clock.Ticks, message));
            }
        }

        private struct TimestampedMessage
        {
            public int ticks;

            public IMidiMessage message;

            public TimestampedMessage(int ticks, IMidiMessage message)
            {
                this.ticks = ticks;
                this.message = message;
            }
        }

        private class TimestampComparer : IComparer<TimestampedMessage>
        {
            #region IComparer<TimestampedMessage> Members

            public int Compare(TimestampedMessage x, TimestampedMessage y)
            {
                if(x.ticks > y.ticks)
                {
                    return 1;
                }
                else if(x.ticks < y.ticks)
                {
                    return -1;
                }
                else
                {
                    return 0;
                }
            }

            #endregion
        }
    }
}