void Update()
    {
        bool updated = false;

        lock (_spawnLock) {
            if (toSpawn.Keys.Count > 0)
            {
                foreach (KeyValuePair <int, Vector2> entry in toSpawn)
                {
                    SpawnTimelineEvent(entry.Key, entry.Value);
                }
                toSpawn.Clear();
            }
        }

        if (heightHandle != null)
        {
            if (heightHandle.transform.localPosition.y != _gridParams.getGridHeight())
            {
                _gridParams.setTrackHeight(heightHandle.transform.localPosition.y);
                updateHeight();
                refreshGrid();
            }
        }

        if (unitSlider.switchVal != _gridParams.snapResolution)
        {
            _gridParams.updateUnitResolution(unitSlider.switchVal);
            _timelineGridRender.updateGrid(_gridParams);
        }

        overdub  = overdubSwitch.switchVal;
        notelock = notelockSwitch.switchVal;

        if (snapSwitch.switchVal != snapping)
        {
            snapping = snapSwitch.switchVal;
            for (int i = 0; i < _tlEvents.Count; i++)
            {
                _tlEvents[i].updateSnap(snapping);
            }
        }

        _timelinePlayer.looping = loopSwitch.switchVal;

        if (playInput.signal != playSignal)
        {
            playSignal = playInput.signal;
        }
        if (recInput.signal != recSignal)
        {
            recSignal = recInput.signal;
        }

        if (tailMarkerHandle.curState == manipObject.manipState.grabbed)
        {
            if (tailMarkerHandle.transform.localPosition.x < gridHandle.transform.localPosition.x)
            {
                Vector3 pos = gridHandle.transform.localPosition;
                pos.x = tailMarkerHandle.transform.localPosition.x;
                gridHandle.transform.localPosition = pos;

                if (gridHandle.curState == manipObject.manipState.grabbed)
                {
                    gridHandle.recalcOffset();
                }
                updated = true;
            }

            _gridParams.head_tail.y = Mathf.RoundToInt(_gridParams.XtoUnit(tailMarkerHandle.transform.localPosition.x));
            Vector3 p1 = tailMarkerLine.localPosition;
            p1.x = _gridParams.UnittoX(_gridParams.head_tail.y);
            tailMarkerLine.localPosition = p1;

            headMarkerHandle.xBounds.x = p1.x + _gridParams.unitSize;
        }
        else if (tailMarkerHandle.transform.localPosition.x != tailMarkerLine.localPosition.x)
        {
            Vector3 p1 = tailMarkerHandle.transform.localPosition;
            p1.x = tailMarkerLine.localPosition.x;
            tailMarkerHandle.transform.localPosition = p1;
        }

        if (headMarkerHandle.curState == manipObject.manipState.grabbed)
        {
            _gridParams.head_tail.x = Mathf.RoundToInt(_gridParams.XtoUnit(headMarkerHandle.transform.localPosition.x));

            Vector3 p1 = headMarkerLine.localPosition;
            p1.x = _gridParams.UnittoX(_gridParams.head_tail.x);
            headMarkerLine.localPosition = p1;
            tailMarkerHandle.xBounds.y   = p1.x - _gridParams.unitSize;
        }
        else if (headMarkerHandle.transform.localPosition.x != headMarkerLine.localPosition.x)
        {
            Vector3 p1 = headMarkerHandle.transform.localPosition;
            p1.x = headMarkerLine.localPosition.x;
            headMarkerHandle.transform.localPosition = p1;
        }

        if (gridHandle.curState == manipObject.manipState.grabbed)
        {
            updated = true;
        }

        if (updated)
        {
            _scrollInterface.handleUpdate(gridHandle.transform.localPosition.x);
        }
    }