using System; using System.IO; using System.Text; namespace NAudio.Midi { /// /// Represents a MIDI pitch wheel change event /// public class PitchWheelChangeEvent : MidiEvent { private int pitch; /// /// Reads a pitch wheel change event from a MIDI stream /// /// The MIDI stream to read from public PitchWheelChangeEvent(BinaryReader br) { byte b1 = br.ReadByte(); byte b2 = br.ReadByte(); if((b1 & 0x80) != 0) { // TODO: might be a follow-on throw new FormatException("Invalid pitchwheelchange byte 1"); } if((b2 & 0x80) != 0) { throw new FormatException("Invalid pitchwheelchange byte 2"); } pitch = b1 + (b2 << 7); // 0x2000 is normal } /// /// Creates a new pitch wheel change event /// /// Absolute event time /// Channel /// Pitch wheel value public PitchWheelChangeEvent(long absoluteTime, int channel, int pitchWheel) : base(absoluteTime, channel, MidiCommandCode.PitchWheelChange) { Pitch = pitchWheel; } /// /// Describes this pitch wheel change event /// /// String describing this pitch wheel change event public override string ToString() { return String.Format("{0} Pitch {1} ({2})", base.ToString(), this.pitch, this.pitch - 0x2000); } /// /// Pitch Wheel Value 0 is minimum, 0x2000 (8192) is default, 0x3FFF (16383) is maximum /// public int Pitch { get { return pitch; } set { if (value < 0 || value >= 0x4000) { throw new ArgumentOutOfRangeException("value", "Pitch value must be in the range 0 - 0x3FFF"); } pitch = value; } } /// /// Gets a short message /// /// Integer to sent as short message public override int GetAsShortMessage() { return base.GetAsShortMessage() + ((pitch & 0x7f) << 8) + (((pitch >> 7) & 0x7f) << 16); } /// /// Calls base class export first, then exports the data /// specific to this event /// MidiEvent.Export /// public override void Export(ref long absoluteTime, BinaryWriter writer) { base.Export(ref absoluteTime, writer); writer.Write((byte)(pitch & 0x7f)); writer.Write((byte)((pitch >> 7) & 0x7f)); } } }