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); }