/// <summary> /// Reads a midievent from a stream /// </summary> /// <param name="from">stream where to read from</param> /// <param name="to">list where to read</param> /// <returns>number of bytes read or -1 if unknown event type</returns> public static int Read(AudioStream from, List <TrackEvent> to) { int index = to.Count - 1; int eventSize = 0; // midi events are detected with high bits (first four) switch (to[index].Prefix >> 4) { case (byte)MidiEvent.MidiEventType.Controller: eventSize += ControllerEvent.Read(from, to); break; case (byte)MidiEvent.MidiEventType.NoteOn: case (byte)MidiEvent.MidiEventType.NoteOff: eventSize += NoteEvent.Read(from, to); break; case (byte)MidiEvent.MidiEventType.Instrument: case (byte)MidiEvent.MidiEventType.ChannelAT: from.Skip(1); to.RemoveAt(index); return(1); case (byte)MidiEvent.MidiEventType.PolyphonicAT: case (byte)MidiEvent.MidiEventType.PitchBend: from.Skip(2); to.RemoveAt(index); return(2); default: Console.WriteLine("Unknown midi event type 0x{0}", BitConverter.ToString(new byte[] { to[index].Prefix })); return(-1); } return(eventSize); }
/// <summary> /// Reads a controllerevent from the filestream /// </summary> /// <param name="from">stream where to read from</param> /// <param name="to">where to read event</param> /// <returns>number of bytes read</returns> public new static int Read(AudioStream from, List <TrackEvent> to) { int index = to.Count - 1; ControllerEvent c = new ControllerEvent(); c.CopyFrom(to[index]); int eventSize = from.Read(c, skipFields: new string[] { "Timing", "Prefix", "AbsoluteTiming" }); to[index] = c; return(eventSize); }