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); } } }
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]); } } }