Пример #1
0
        public List <byte> createMetaBytes()
        {
            List <byte> data = new List <byte>();

            if (type.Equals("sequence_number"))
            {
                data.Add((byte)(number >> 8));
                data.Add((byte)(number & 0xff));
            }
            if (type.Equals("text") || type.Equals("copyright") || type.Equals("lyrics") || type.Equals("marker") || type.Equals("cue_marker"))
            {
                if (text == null)
                {
                    text = "";
                }
                data.AddRange(MidiExport.ascii.GetBytes(text));
            }

            if (type.Equals("track_name") || type.Equals("instrument_name") || type.Equals("device_name"))
            {
                data.AddRange(MidiExport.ascii.GetBytes(name));
            }
            if (type.Equals("channel_prefix"))
            {
                data.Add((byte)channel);
            }
            if (type.Equals("midi_port"))
            {
                data.Add((byte)port);
            }
            if (type.Equals("set_tempo"))
            {
                //return [tempo >> 16, tempo >> 8 & 0xff, tempo & 0xff]
                data.Add((byte)(tempo >> 16));
                data.Add((byte)((tempo >> 8) & 0xff));
                data.Add((byte)(tempo & 0xff));
            }

            if (type.Equals("time_signature"))
            {
                data.Add((byte)numerator);
                data.Add((byte)Math.Log(denominator, 2));
                data.Add((byte)clocks_per_click);
                data.Add((byte)notated_32nd_notes_per_beat);
            }

            if (type.Equals("key_signature"))
            {
                data.Add((byte)(key & 0xff));
                data.Add(is_major ? (byte)0x00 : (byte)0x01);
            }

            int dataLength = data.Count;

            data.InsertRange(0, MidiExport.encodeVariableInt(dataLength));
            data.Insert(0, code);
            data.Insert(0, 0xff);

            return(data);
        }
Пример #2
0
        public List <byte> createBytes()
        {
            List <byte> data = new List <byte>();
            byte        runningStatusByte = 0x00;
            bool        statusByteSet     = false;

            foreach (MidiMessage message in messages)
            {
                if (message.time < 0)
                {
                    message.time = 0;
                }
                data.AddRange(MidiExport.encodeVariableInt(message.time));
                if (message.type.Equals("sysex"))
                {
                    statusByteSet = false;
                    data.Add(0xf0);
                    data.AddRange(MidiExport.encodeVariableInt(message.data.Length + 1));
                    data.AddRange(message.data);
                    data.Add(0xf7);
                }
                else
                {
                    List <byte> raw = new List <byte>();
                    raw = message.createBytes();

                    byte temp = raw[0];
                    if (statusByteSet && !message.is_meta && raw[0] < 0xf0 && raw[0] == runningStatusByte)
                    {
                        raw.RemoveAt(0);
                        data.AddRange(raw);
                    }
                    else
                    {
                        data.AddRange(raw);
                    }
                    runningStatusByte = temp;
                    statusByteSet     = true;
                }
            }

            return(MidiExport.writeChunk("MTrk", data));
        }