示例#1
0
        private static void WriteMidiTrack(MidiFileFormatWriter mffw, MidiTrack track)
        {
            // Write out track marker
            mffw.WriteString(MidiFileFormat.midiTrackMarker, false);

            // Run 2 passes, one to compute the length to be written, and one to actually write out the data
            mffw.CountingMode = true;
            mffw.ResetBytesWritten();

            for (int pass = 0; pass < 2; pass++)
            {
                byte runningStatus = 0;

                // Write out all events
                for (LinkedListNode <MidiEvent> n = track.EventList.First; n != null; n = n.Next)
                {
                    runningStatus = WriteMidiEvent(mffw, n.Value, runningStatus);
                }

                // At the end of the first pass, write out the count
                if (pass == 0)
                {
                    mffw.CountingMode = false;
                    uint count = mffw.BytesWritten;
                    mffw.WriteUInt32(count);
                }
            }
        }
示例#2
0
        public static void WriteMidiFile(MidiSequence sequence, string filename)
        {
            MidiFileFormatWriter mffw = new MidiFileFormatWriter(filename);

            using (mffw)
            {
                // Write magic number
                mffw.WriteString(MidiFileFormat.midiFileMarker, false);

                // Write header size
                mffw.WriteUInt32(MidiFileFormat.midiFileHeaderLength);

                // Write header
                mffw.WriteUInt16(MidiFileFormat.midiFileVersion);
                mffw.WriteUInt16((ushort)sequence.Tracks.Count);
                mffw.WriteUInt16((ushort)((sequence.PPQN > 0) ? sequence.PPQN : (sequence.SMPTETempo | 0x8000)));

                // Write out the tracks
                for (int t = 0; t < sequence.Tracks.Count; t++)
                {
                    WriteMidiTrack(mffw, sequence.Tracks[t]);
                }
            }
        }