示例#1
0
 internal Iterator(FastList <T> ll)
 {
     _ilist = ll;
     Reset();
 }
示例#2
0
        public void ParseNextEvent(bool readOnly = false)
        {
            try
            {
                if (!readDelta)
                {
                    trackTime += ReadVariableLen();
                }
                readDelta = false;
                byte command = reader.Read();
                if (command < 0x80)
                {
                    reader.Pushback = command;
                    command         = prevCommand;
                }
                prevCommand = command;
                byte comm = (byte)(command & 0b11110000);
                if (comm == 0b10010000)
                {
                    byte channel = (byte)(command & 0b00001111);
                    byte note    = reader.Read();
                    byte vel     = reader.Read();
                    if (vel == 0)
                    {
                        if (!readOnly)
                        {
                            try
                            {
                                var  q    = UnendedNotes[note << 4 | channel];
                                var  iter = q.Iterate();
                                Note n;
                                while (iter.MoveNext(out n))
                                {
                                    n.end      = trackTime;
                                    n.hasEnded = true;
                                }
                                q.Unlink();
                            }
                            catch { }
                        }
                    }
                    else
                    {
                        Note n = new Note();
                        n.start   = trackTime;
                        n.note    = note;
                        n.track   = this;
                        n.channel = channel;
                        n.vel     = vel;
                        if (!readOnly)
                        {
                            if (UnendedNotes == null)
                            {
                                UnendedNotes = new FastList <Note> [256 * 16];
                                for (int i = 0; i < 256 * 16; i++)
                                {
                                    UnendedNotes[i] = new FastList <Note>();
                                }
                            }
                            UnendedNotes[note << 4 | channel].Add(n);
                            globalDisplayNotes.Add(n);
                        }
                    }
                }
                else if (comm == 0b10000000)
                {
                    int  channel = command & 0b00001111;
                    byte note    = reader.Read();
                    byte vel     = reader.Read();

                    if (!readOnly)
                    {
                        try
                        {
                            var  q    = UnendedNotes[note << 4 | channel];
                            var  iter = q.Iterate();
                            Note n;
                            while (iter.MoveNext(out n))
                            {
                                n.end      = trackTime;
                                n.hasEnded = true;
                            }
                            q.Unlink();
                        }
                        catch { }
                    }
                }
                else if (comm == 0b10100000)
                {
                    int  channel = command & 0b00001111;
                    byte note    = reader.Read();
                    byte vel     = reader.Read();
                }
                else if (comm == 0b10100000)
                {
                    int  channel = command & 0b00001111;
                    byte number  = reader.Read();
                    byte value   = reader.Read();
                }
                else if (comm == 0b11000000)
                {
                    int  channel = command & 0b00001111;
                    byte program = reader.Read();
                }
                else if (comm == 0b11010000)
                {
                    int  channel  = command & 0b00001111;
                    byte pressure = reader.Read();
                }
                else if (comm == 0b11100000)
                {
                    int  channel = command & 0b00001111;
                    byte l       = reader.Read();
                    byte m       = reader.Read();
                }
                else if (comm == 0b10110000)
                {
                    int  channel = command & 0b00001111;
                    byte cc      = reader.Read();
                    byte vv      = reader.Read();
                }
                else if (command == 0b11110000)
                {
                    while (reader.Read() != 0b11110111)
                    {
                        ;
                    }
                }
                else if (command == 0b11110100 || command == 0b11110001 || command == 0b11110101 || command == 0b11111001 || command == 0b11111101)
                {
                    //printf("Undefined\n");
                }
                else if (command == 0b11110010)
                {
                    int  channel = command & 0b00001111;
                    byte ll      = reader.Read();
                    byte mm      = reader.Read();
                }
                else if (command == 0b11110011)
                {
                    byte ss = reader.Read();
                }
                else if (command == 0b11110110)
                {
                }
                else if (command == 0b11110111)
                {
                }
                else if (command == 0b11111000)
                {
                }
                else if (command == 0b11111010)
                {
                }
                else if (command == 0b11111100)
                {
                }
                else if (command == 0b11111110)
                {
                }
                else if (command == 0xFF)
                {
                    command = reader.Read();
                    if (command == 0x00)
                    {
                        if (reader.Read() != 2)
                        {
                            throw new Exception("Corrupt Track");
                        }
                    }
                    else if (command == 0x01)
                    {
                        int    size = (int)ReadVariableLen();
                        char[] text = new char[size];
                        for (int i = 0; i < size; i++)
                        {
                            text[i] = (char)reader.Read();
                        }
                        string str = new string(text);
                    }
                    else if (command == 0x02)
                    {
                        int    size = (int)ReadVariableLen();
                        char[] text = new char[size];
                        for (int i = 0; i < size; i++)
                        {
                            text[i] = (char)reader.Read();
                        }
                        string str = new string(text);
                    }
                    else if (command == 0x03)
                    {
                        int    size = (int)ReadVariableLen();
                        char[] text = new char[size];
                        for (int i = 0; i < size; i++)
                        {
                            text[i] = (char)reader.Read();
                        }
                        string str = new string(text);
                    }
                    else if (command == 0x04)
                    {
                        int    size = (int)ReadVariableLen();
                        char[] text = new char[size];
                        for (int i = 0; i < size; i++)
                        {
                            text[i] = (char)reader.Read();
                        }
                        string str = new string(text);
                    }
                    else if (command == 0x05)
                    {
                        int    size = (int)ReadVariableLen();
                        char[] text = new char[size];
                        for (int i = 0; i < size; i++)
                        {
                            text[i] = (char)reader.Read();
                        }
                        string str = new string(text);
                    }
                    else if (command == 0x06)
                    {
                        int    size = (int)ReadVariableLen();
                        char[] text = new char[size];
                        for (int i = 0; i < size; i++)
                        {
                            text[i] = (char)reader.Read();
                        }
                        string str = new string(text);
                    }
                    else if (command == 0x07)
                    {
                        int    size = (int)ReadVariableLen();
                        char[] text = new char[size];
                        for (int i = 0; i < size; i++)
                        {
                            text[i] = (char)reader.Read();
                        }
                        string str = new string(text);
                    }
                    else if (command == 0x08)
                    {
                        int    size = (int)ReadVariableLen();
                        char[] text = new char[size];
                        for (int i = 0; i < size; i++)
                        {
                            text[i] = (char)reader.Read();
                        }
                        string str = new string(text);
                    }
                    else if (command == 0x09)
                    {
                        int    size = (int)ReadVariableLen();
                        char[] text = new char[size];
                        for (int i = 0; i < size; i++)
                        {
                            text[i] = (char)reader.Read();
                        }
                        string str = new string(text);
                    }
                    else if (command == 0x0A)
                    {
                        int    size = (int)ReadVariableLen();
                        byte[] data = new byte[size];
                        for (int i = 0; i < size; i++)
                        {
                            data[i] = reader.Read();
                        }
                        if (data.Length == 8 || data.Length == 12)
                        {
                            if (data[0] == 0x00 &&
                                data[1] == 0x0F)
                            {
                                Color4 col1 = new Color4(data[4], data[5], data[6], data[7]);
                                Color4 col2;
                                if (data.Length == 12)
                                {
                                    col2 = new Color4(data[8], data[9], data[10], data[11]);
                                }
                                else
                                {
                                    col2 = col1;
                                }
                                if (data[2] < 0x10 || data[2] == 0x7F)
                                {
                                    var c = new ColorChange()
                                    {
                                        pos = trackTime, col1 = col1, col2 = col2, channel = data[2], track = this
                                    };
                                    globalColorEvents.Add(c);
                                }
                            }
                        }
                    }
                    else if (command == 0x20)
                    {
                        command = reader.Read();
                        if (command != 1)
                        {
                            throw new Exception("Corrupt Track");
                        }
                        channelPrefix = reader.Read();
                    }
                    else if (command == 0x21)
                    {
                        command = reader.Read();
                        if (command != 1)
                        {
                            throw new Exception("Corrupt Track");
                        }
                        reader.Skip(1);
                        //TODO:  MIDI port
                    }
                    else if (command == 0x2F)
                    {
                        command = reader.Read();
                        if (command != 0)
                        {
                            throw new Exception("Corrupt Track");
                        }
                        EndTrack();
                    }
                    else if (command == 0x51)
                    {
                        command = reader.Read();
                        if (command != 3)
                        {
                            throw new Exception("Corrupt Track");
                        }
                        int btempo = 0;
                        for (int i = 0; i != 3; i++)
                        {
                            btempo = (int)((btempo << 8) | reader.Read());
                        }
                        Tempo t = new Tempo();
                        t.pos   = trackTime;
                        t.tempo = btempo;

                        //if (trackID <= 1)
                        {
                            if (!readOnly)
                            {
                                lock (globalTempoEvents)
                                {
                                    globalTempoEvents.Add(t);
                                }
                            }
                        }
                    }
                    else if (command == 0x54)
                    {
                        command = reader.Read();
                        if (command != 5)
                        {
                            throw new Exception("Corrupt Track");
                        }
                        reader.Skip(4);
                    }
                    else if (command == 0x58)
                    {
                        command = reader.Read();
                        if (command != 4)
                        {
                            throw new Exception("Corrupt Track");
                        }
                        reader.Skip(4);
                    }
                    else if (command == 0x59)
                    {
                        command = reader.Read();
                        if (command != 2)
                        {
                            throw new Exception("Corrupt Track");
                        }
                        reader.Skip(2);
                        //TODO: Key Signature
                    }
                    else if (command == 0x7F)
                    {
                        int    size = (int)ReadVariableLen();
                        byte[] data = new byte[size];
                        for (int i = 0; i < size; i++)
                        {
                            data[i] = reader.Read();
                        }
                    }
                    else
                    {
                        throw new Exception("Corrupt Track");
                    }
                }
                else
                {
                    throw new Exception("Corrupt Track");
                }
            }