private void UpdateLipSyncFrame(bool direct)
        {
            if (_isSinging)
            {
                var       currentTime = playerControl.relativeTime;
                LipDeform deform;

                if (direct)
                {
                    deform = _currLipDeform;
                }
                else
                {
                    if (currentTime < _lipSyncStartTime + LipTransitionTime)
                    {
                        var t = (currentTime - _lipSyncStartTime) / LipTransitionTime;
                        deform = LipDeform.Lerp(_prevLipDeform, _currLipDeform, t);
                    }
                    else
                    {
                        deform = _currLipDeform;
                    }
                }

                PutLipFrame(in deform);
            }
            else
            {
                PutLipFrame(LipDeform.Silence());
            }
        }
        private void InitStates()
        {
            _currentTick = 0;

            _isSinging = true;

            _currLipDeform = LipDeform.Silence();
            _prevLipDeform = LipDeform.Silence();

            Array.Clear(_currFacialExpression, 0, _currFacialExpression.Length);
            Array.Clear(_prevFacialExpression, 0, _prevFacialExpression.Length);
            _currFacialExprKey = 0;
            _prevFacialExprKey = 0;

            _prevEyeClosed = false;
            _currEyeClosed = false;

            Array.Clear(_currBlendShapeValues, 0, _currBlendShapeValues.Length);

            AnimateFace(true);
        }