Nanook.TheGhost.ProjectSong.setLength C# (CSharp) Method

setLength() private method

private setLength ( QbItemArray a, int msSongLength, int blockSize, int frets, bool bindToFret ) : void
a Nanook.QueenBee.Parser.QbItemArray
msSongLength int
blockSize int
frets int
bindToFret bool
return void
        private void setLength(QbItemArray a, int msSongLength, int blockSize, int[] frets, bool bindToFret)
        {
            uint val;
            uint lastVal = uint.MaxValue;

            if (a.ItemCount != 0)
            {
                if (a.Items[0].QbItemType == QbItemType.Floats)
                {
                    //nothing to edit
                }
                else if (a.Items[0].QbItemType == QbItemType.ArrayArray)
                {
                    QbItemArray arr = (QbItemArray)a.Items[0];
                    int idx = arr.Items.Count - 1;
                    while (idx >= 0)
                    {
                        val = ((QbItemInteger)arr.Items[idx]).Values[0];
                        if (bindToFret)
                            val = findNearestFret(val, frets);

                        if (val == lastVal || val < 0 || val > msSongLength)
                            arr.RemoveItem(arr.Items[idx]);
                        else if (bindToFret)
                            ((QbItemInteger)arr.Items[idx]).Values[0] = val;

                        if (bindToFret)
                            lastVal = val;

                        idx--;
                    }
                }
                else if (a.Items[0].QbItemType == QbItemType.ArrayStruct)
                {
                    QbItemStructArray arr = (QbItemStructArray)a.Items[0];
                    int idx = arr.Items.Count - 1;
                    while (idx >= 0)
                    {
                        val = ((QbItemInteger)((QbItemStruct)arr.Items[idx]).Items[0]).Values[0];
                        if (bindToFret)
                            val = findNearestFret(val, frets);

                        if (val == lastVal || val < 0 || val > msSongLength)
                            arr.RemoveItem(arr.Items[idx]);
                        else if (bindToFret)
                            ((QbItemInteger)((QbItemStruct)arr.Items[idx]).Items[0]).Values[0] = val;

                        if (bindToFret)
                            lastVal = val;
                        idx--;
                    }
                }
                else
                {
                    int start = 0;
                    uint[] arr = ((QbItemInteger)a.Items[0]).Values;
                    int idx = arr.Length - blockSize;
                    while (start < arr.Length)
                    {
                        if (arr[start] >= 0)
                            break;
                        idx += blockSize;
                    }

                    while (idx >= 0)
                    {
                        if (arr[idx] < msSongLength)
                            break;
                        idx -= blockSize;
                    }
                    uint[] arr2 = new uint[(idx + blockSize) - start];
                    Array.Copy(arr, start, arr2, 0, arr2.Length - start);
                    ((QbItemInteger)a.Items[0]).Values = arr2;
                }
            }

            a.Root.AlignPointers();
        }