private DrumSequence DeleteFromIndex(int firstIndex)
    {
        DrumSequence newCopy = sequence.Clone();

        newCopy.keys.RemoveRange(firstIndex, numElements);
        newCopy.coords.RemoveRange(firstIndex, numElements);

        return(newCopy);
    }
    private DrumSequence GenerateAtIndex(int firstIndex)
    {
        //Treating these as immutable gives us quick access to Undo functionality which we probably want
        //List<DrumSequence.DrumKey> newKeys = new List<DrumSequence.DrumKey>(sequence.keys.Count);
        //List<Vector3> newCoords = new List<Vector3>(sequence.coords.Count);

        //newKeys = (List<DrumSequence.DrumKey>)sequence.keys.Select(_ => sequence.Clone().keys);
        //newCoords = (List<Vector3>)sequence.coords.Select(_ => sequence.Clone().coords);

        DrumSequence newCopy = sequence.Clone();

        for (int i = 0; i < numElements; i++)
        {
            Vector3 coordinate = startCoord + (spacing * i);
            newCopy.keys.Insert(firstIndex + i, key);
            newCopy.coords.Insert(firstIndex + i, coordinate);
        }

        return(newCopy);
    }