private static bool WriteEvents(Stream file, List<MidiEvent>[] events, int trackmode, int quarter)
{
try {
byte[] buf = new byte[4096];
/* Write the MThd, len = 6, track mode, number tracks, quarter note */
file.Write(ASCIIEncoding.ASCII.GetBytes("MThd"), 0, 4);
IntToBytes(6, buf, 0);
file.Write(buf, 0, 4);
buf[0] = (byte)(trackmode >> 8);
buf[1] = (byte)(trackmode & 0xFF);
file.Write(buf, 0, 2);
buf[0] = 0;
buf[1] = (byte)events.Length;
file.Write(buf, 0, 2);
buf[0] = (byte)(quarter >> 8);
buf[1] = (byte)(quarter & 0xFF);
file.Write(buf, 0, 2);
foreach (List<MidiEvent> list in events) {
/* Write the MTrk header and track length */
file.Write(ASCIIEncoding.ASCII.GetBytes("MTrk"), 0, 4);
int len = GetTrackLength(list);
IntToBytes(len, buf, 0);
file.Write(buf, 0, 4);
foreach (MidiEvent mevent in list) {
int varlen = VarlenToBytes(mevent.DeltaTime, buf, 0);
file.Write(buf, 0, varlen);
if (mevent.EventFlag == SysexEvent1 ||
mevent.EventFlag == SysexEvent2 ||
mevent.EventFlag == MetaEvent) {
buf[0] = mevent.EventFlag;
}
else {
buf[0] = (byte)(mevent.EventFlag + mevent.Channel);
}
file.Write(buf, 0, 1);
if (mevent.EventFlag == EventNoteOn) {
buf[0] = mevent.Notenumber;
buf[1] = mevent.Velocity;
file.Write(buf, 0, 2);
}
else if (mevent.EventFlag == EventNoteOff) {
buf[0] = mevent.Notenumber;
buf[1] = mevent.Velocity;
file.Write(buf, 0, 2);
}
else if (mevent.EventFlag == EventKeyPressure) {
buf[0] = mevent.Notenumber;
buf[1] = mevent.KeyPressure;
file.Write(buf, 0, 2);
}
else if (mevent.EventFlag == EventControlChange) {
buf[0] = mevent.ControlNum;
buf[1] = mevent.ControlValue;
file.Write(buf, 0, 2);
}
else if (mevent.EventFlag == EventProgramChange) {
buf[0] = mevent.Instrument;
file.Write(buf, 0, 1);
}
else if (mevent.EventFlag == EventChannelPressure) {
buf[0] = mevent.ChanPressure;
file.Write(buf, 0, 1);
}
else if (mevent.EventFlag == EventPitchBend) {
buf[0] = (byte)(mevent.PitchBend >> 8);
buf[1] = (byte)(mevent.PitchBend & 0xFF);
file.Write(buf, 0, 2);
}
else if (mevent.EventFlag == SysexEvent1) {
int offset = VarlenToBytes(mevent.Metalength, buf, 0);
Array.Copy(mevent.Value, 0, buf, offset, mevent.Value.Length);
file.Write(buf, 0, offset + mevent.Value.Length);
}
else if (mevent.EventFlag == SysexEvent2) {
int offset = VarlenToBytes(mevent.Metalength, buf, 0);
Array.Copy(mevent.Value, 0, buf, offset, mevent.Value.Length);
file.Write(buf, 0, offset + mevent.Value.Length);
}
else if (mevent.EventFlag == MetaEvent && mevent.Metaevent == MetaEventTempo) {
buf[0] = mevent.Metaevent;
buf[1] = 3;
buf[2] = (byte)((mevent.Tempo >> 16) & 0xFF);
buf[3] = (byte)((mevent.Tempo >> 8) & 0xFF);
buf[4] = (byte)(mevent.Tempo & 0xFF);
file.Write(buf, 0, 5);
}
else if (mevent.EventFlag == MetaEvent) {
buf[0] = mevent.Metaevent;
int offset = VarlenToBytes(mevent.Metalength, buf, 1) + 1;
Array.Copy(mevent.Value, 0, buf, offset, mevent.Value.Length);
file.Write(buf, 0, offset + mevent.Value.Length);
}
}
}
file.Close();
return true;
}
catch (IOException e) {
return false;
}
}