public void Write(Stream strm) { this.stream = strm; trackData.Clear(); stream.Write(TrackHeader, 0, TrackHeader.Length); int absTick = 0; foreach (MidiEvent e in track.AllIterator()) { WriteVariableLengthValue(e.AbsoluteTicks - absTick); absTick = e.AbsoluteTicks; switch (e.MessageType) { case MessageType.Channel: Write((ChannelMessage)e.Clone()); break; case MessageType.SystemExclusive: Write((SysExMessage)e.Clone()); break; case MessageType.Meta: { Write((MetaMessage)e.Clone()); } break; case MessageType.SystemCommon: Write((SysCommonMessage)e.Clone()); break; case MessageType.SystemRealtime: Write((SysRealtimeMessage)e.Clone()); break; } } byte[] trackLength = BitConverter.GetBytes(trackData.Count); if (BitConverter.IsLittleEndian) { Array.Reverse(trackLength); } stream.Write(trackLength, 0, trackLength.Length); foreach (byte b in trackData) { stream.WriteByte(b); } }