示例#1
0
        public static void ExecuteCommand(SequenceCommand c, Track t, SequencePlayer p)
        {
            //Note command.
            if (c.Identifier >= 0 && c.Identifier <= 127)
            {
                //Play note.
            }

            //Switch the command type.
            switch ((CommandType)c.Identifier)
            {
            //Wait the provided amount of ticks.
            case CommandType.Wait:
                Thread.Sleep(TickTime.Ticks2Milliseconds((c as WaitCommand).Length));
                break;

            //Program change.
            case CommandType.ProgramChange:
                t.InstrumentNumber = (int)(c as ProgramChangeCommand).Program;
                break;

            //Open track.
            case CommandType.OpenTrack:
                OpenTrackCommand openTrackCommand = (c as OpenTrackCommand);
                p.TracksOpen[openTrackCommand.TrackNumber]    = true;
                p.Tracks[openTrackCommand.TrackNumber]        = new Track(p.Tracks[0]);
                p.Tracks[openTrackCommand.TrackNumber].Offset = (int)openTrackCommand.Offset.Value;
                break;

            //Jump.
            case CommandType.Jump:
                t.Offset = (int)(c as JumpCommand).Offset.Value;
                break;

            //Call.
            case CommandType.Call:
                t.ReturnToOffsets.Push(t.Offset + 1);
                t.Offset = (int)(c as CallCommand).Offset.Value;
                break;

            //Time base.
            case CommandType.TimeBase:
                t.TimeBase = (c as TimeBaseCommand).QuarterNoteLength;
                break;

            //Hold.
            case CommandType.Hold:
                t.Hold = (c as HoldCommand).Hold;
                break;

            //Monophonic.
            case CommandType.Monophonic:
                t.Monophonic = (c as MonophonicCommand).Monophonic;
                break;

            //Velocity range.
            case CommandType.VelocityRange:
                t.VelocityRange = (c as VelocityRangeCommand).VelocityRange;
                break;

            //Biquad type.
            case CommandType.BiquadType:
                t.BiquadType = (c as BiquadTypeCommand).BiquadType;
                break;

            //Biquad value.
            case CommandType.BiquadValue:
                t.BiquadValue = (c as BiquadValueCommand).BiquadValue;
                break;

            //Bank select.
            case CommandType.BankSelect:
                t.BankNumber = (c as BankSelectCommand).BankNumber;
                break;

            //TODO!

            //Sweep pitch.

            //Mod period.

            //Extended command.
            case CommandType.Extended:
                ExecuteExtendedCommand((c as ExtendedCommand).SequenceCommand, t, p);
                break;

            //Envelope reset. TODO!

            //Loop end. TODO!

            //Return from a call.
            case CommandType.Return:
                t.Offset = t.ReturnToOffsets.Pop();
                break;

            //Allocate track does nothing.

            //Fin. Close the track.
            case CommandType.Fin:
                int trackIndexToClose = Array.IndexOf(p.Tracks, t);
                p.TracksOpen[trackIndexToClose] = false;
                break;

                //Prefix commands are to do later.
            }

            //Increment the command number, if not moving.
            if ((c as OpenTrackCommand != null) || (c as JumpCommand != null) || (c as CallCommand != null))
            {
                t.Offset++;
            }
        }
 private void Serialize(OpenTrackCommand cmd)
 {
     sb.AppendFormat("opentrack {0}, {1}\n", positionLabel(cmd.target), cmd.Track);
 }