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();
}