Пример #1
0
        /// <summary>
        /// Initializes a new instance of the SysExMessage class with the
        /// specified system exclusive type and data.
        /// </summary>
        /// <param name="type">
        /// The type of system exclusive message.
        /// </param>
        /// <param name="data">
        /// The system exclusive data.
        /// </param>
        public SysExMessage(SysExType type, byte[] data)
        {
            this.type = type;

            // If this is a regular system exclusive message.
            if (this.type == SysExType.Start)
            {
                // Create storage for message data which includes an extra byte
                // for the status value.
                message        = new StringBuilder(data.Length + 1);
                message.Length = message.Capacity;

                // Store status value.
                message[0] = (char)this.type;
            }
            // Else this is a continuation message or an escaped message.
            else
            {
                message = new StringBuilder(data.Length);
            }

            // Copy data into message.
            for (int i = 0; i < data.Length; i++)
            {
                this[i] = data[i];
            }
        }
Пример #2
0
        /// <summary>
        /// Initializes a new instance of the SysExMessage class with the
        /// specified system exclusive type and data.
        /// </summary>
        /// <param name="type">
        /// The type of system exclusive message.
        /// </param>
        /// <param name="data">
        /// The system exclusive data.
        /// </param>
        public SysExMessage(SysExType type, byte[] data)
        {
            this.type = type;

            // If this is a regular system exclusive message.
            if(this.type == SysExType.Start)
            {
                // Create storage for message data which includes an extra byte
                // for the status value.
                message = new StringBuilder(data.Length + 1);
                message.Length = message.Capacity;

                // Store status value.
                message[0] = (char)this.type;
            }
            // Else this is a continuation message or an escaped message.
            else
            {
                message = new StringBuilder(data.Length);
            }

            // Copy data into message.
            for(int i = 0; i < data.Length; i++)
            {
                this[i] = data[i];
            }
        }
Пример #3
0
        /// <summary>
        /// Initializes a new instance of the SysExMessage class with
        /// another instance of the SysExMessage class.
        /// </summary>
        /// <param name="message">
        /// The SysExMessage instance to use for initialization.
        /// </param>
        public SysExMessage(SysExMessage message)
        {
            type = message.type;

            this.message = new StringBuilder(message.Message);
        }
Пример #4
0
		/// <summary>
		/// Initializes a new instance of the SysExMessage class with 
		/// another instance of the SysExMessage class.
		/// </summary>
		/// <param name="message">
		/// The SysExMessage instance to use for initialization.
		/// </param>
		public SysExMessage(SysExMessage message)
		{
			type = message.type;

			this.message = new StringBuilder(message.Message);
		}
        /// <summary>
        /// Reads the data for the next track from the Midi file.
        /// </summary>
        /// <param name="trackNum">
        /// The track number.
        /// </param>
        private void ReadNextTrack(int trackNum)
        {
            MetaType metaType      = MetaType.TrackName;
            int      status        = 0;
            int      runningStatus = 0;

            // Read length of track.
            binReader.ReadBytes(LengthByteCount);

            // Continue reading Midi events until the end of the track.
            while (metaType != MetaType.EndOfTrack)
            {
                // Next Midi message in track.
                IMidiMessage msg = null;

                // Ticks for next Midi event.
                int ticks = ReadVariableLengthQuantity();

                // Read status byte for the next Midi message.
                status = binReader.ReadByte();

                // If this is a status byte.
                if ((status & StatusFlag) == StatusFlag)
                {
                    // If the next Midi message is a channel message.
                    if (ChannelMessage.IsChannelMessage(status))
                    {
                        // Read channel message from the Midi file.
                        msg = ReadChannelMessage(status);

                        // Update running status.
                        runningStatus = status;
                    }
                    // Else if the next Midi message is a meta message.
                    else if (MetaMessage.IsMetaMessage(status))
                    {
                        // Read the type of meta message.
                        metaType = (MetaType)binReader.ReadByte();

                        // Read the length of the meta message data.
                        int length = ReadVariableLengthQuantity();

                        // Read the meta message data.
                        byte[] data = binReader.ReadBytes(length);

                        // Create meta message.
                        msg = new MetaMessage(metaType, data);
                    }
                    // Else if the next Midi message is a system exclusive
                    // message.
                    else if (SysExMessage.IsSysExMessage(status))
                    {
                        // The type of system exclusive message.
                        SysExType type = (SysExType)status;

                        // Read the length of the system exclusive data.
                        int length = ReadVariableLengthQuantity();

                        // Read the system exclusive data.
                        byte[] data = binReader.ReadBytes(length);

                        // Create system exclusive message.
                        msg = new SysExMessage(type, data);
                    }
                }
                // Assumes running status.
                else
                {
                    // Create channel message.
                    msg = ReadChannelMessage(runningStatus, status);
                }

                // Create the next Midi event and store it in the specified
                // track.
                MidiEvent e = new MidiEvent(msg, ticks);
                tracks[trackNum].Add(e);
            }
        }