示例#1
0
        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);
            }
        }