MidiSheetMusic.MidiFile.WriteEvents C# (CSharp) Method

WriteEvents() private static method

private static WriteEvents ( Stream file, List events, int trackmode, int quarter ) : bool
file Stream
events List
trackmode int
quarter int
return bool
        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;
            }
        }