#region License /* Copyright (c) 2005 Leslie Sanford * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #endregion #region Contact /* * Leslie Sanford * Email: jabberdabber@hotmail.com */ #endregion using System; using System.Collections; namespace Sanford.Multimedia.Midi { /// /// Defines constants representing various system exclusive message types. /// public enum SysExType { /// /// Represents the start of system exclusive message type. /// Start = 0xF0, /// /// Represents the continuation of a system exclusive message. /// Continuation = 0xF7 } /// /// Represents MIDI system exclusive messages. /// public sealed class SysExMessage : IMidiMessage, IEnumerable { #region SysExEventMessage Members #region Constants /// /// Maximum value for system exclusive channels. /// public const int SysExChannelMaxValue = 127; #endregion #region Fields // The system exclusive data. private byte[] data; #endregion #region Construction /// /// Initializes a new instance of the SysExMessageEventArgs class with the /// specified system exclusive data. /// /// /// The system exclusive data. /// /// /// The system exclusive data's status byte, the first byte in the /// data, must have a value of 0xF0 or 0xF7. /// public SysExMessage(byte[] data) { #region Require if(data.Length < 1) { throw new ArgumentException( "System exclusive data is too short.", "data"); } else if(data[0] != (byte)SysExType.Start && data[0] != (byte)SysExType.Continuation) { throw new ArgumentException( "Unknown status value.", "data"); } #endregion this.data = new byte[data.Length]; data.CopyTo(this.data, 0); } #endregion #region Methods public byte[] GetBytes() { byte[] clone = new byte[data.Length]; data.CopyTo(clone, 0); return clone; } public void CopyTo(byte[] buffer, int index) { data.CopyTo(buffer, index); } public override bool Equals(object obj) { #region Guard if(!(obj is SysExMessage)) { return false; } #endregion SysExMessage message = (SysExMessage)obj; bool equals = true; if(this.Length != message.Length) { equals = false; } for(int i = 0; i < this.Length && equals; i++) { if(this[i] != message[i]) { equals = false; } } return equals; } public override int GetHashCode() { return data.GetHashCode(); } #endregion #region Properties /// /// Gets the element at the specified index. /// /// /// If index is less than zero or greater than or equal to the length /// of the message. /// public byte this[int index] { get { #region Require if(index < 0 || index >= Length) { throw new ArgumentOutOfRangeException("index", index, "Index into system exclusive message out of range."); } #endregion return data[index]; } } /// /// Gets the length of the system exclusive data. /// public int Length { get { return data.Length; } } /// /// Gets the system exclusive type. /// public SysExType SysExType { get { return (SysExType)data[0]; } } #endregion #endregion /// /// Gets the status value. /// public int Status { get { return (int)data[0]; } } /// /// Gets the MessageType. /// public MessageType MessageType { get { return MessageType.SystemExclusive; } } #region IEnumerable Members public IEnumerator GetEnumerator() { return data.GetEnumerator(); } #endregion } }