public void Play(float delay = 0)
        {
            if (state == PureDataStates.Waiting)
            {
                SetSleepTime(sleepTime);

                if (delay > 0)
                {
                    pureData.communicator.SendDelayedMessage("usequence_play", delay, Id);
                }
                else
                {
                    state         = PureDataStates.Playing;
                    NextStepIndex = -1;

                    SwitchOff();
                    SetSource(nextSources.Dequeue());
                    SetOutput(output);
                    SetVolume(volume, 0.01F);
                    SetTickSpeed(60F * steps[0].Beats / steps[0].Tempo);
                    SwitchOn();

                    pureData.sequenceManager.Activate(this);
                    pureData.communicator.SendMessage <bool>("usequence_messages" + Id, "Play");
                }
            }
        }
        public void Start()
        {
            nextSources      = new Queue();
            CurrentStepIndex = -1;
            NextStepIndex    = -1;
            state            = PureDataStates.Stopped;

            foreach (PureDataSequenceTrack track in tracks)
            {
                track.Start();
            }
        }
        public void StopImmediate()
        {
            if (state != PureDataStates.Stopped)
            {
                state            = PureDataStates.Stopped;
                NextStepIndex    = -1;
                CurrentStepIndex = -1;
                nextSources.Clear();

                SwitchOff();

                pureData.sequenceManager.Deactivate(this);
                pureData.communicator.SendMessage <bool>("usequence_messages" + Id, "Sleep");
            }
        }
        public void Stop(float delay = 0)
        {
            if (state != PureDataStates.Stopped && state != PureDataStates.Stopping)
            {
                if (delay > 0)
                {
                    pureData.communicator.SendDelayedMessage("usequence_stop", delay, Id);
                }
                else
                {
                    state = PureDataStates.Stopping;

                    SetStepperSwitch(false);
                    SetStopperSwitch(true);

                    foreach (PureDataSequenceTrack track in tracks)
                    {
                        pureData.communicator.SendBang(string.Format("utrack_pattern{0}_{1}", Id, track.Id));
                    }
                }
            }
        }