I'll try to keep this a concise as I can. Please bear with me.

I'm trying to work on an animation module that uses CFrame lerp to move parts. Right now I'm just trying to get everything to work continuously in a single script before I move the code parts to the module.

All the data for the animations is in a table library. I loop through each keyframe and interpolate the part according to the given data in the keyframe table inside the library. I have a separate module with easing functions that I also use for various easing styles, but that's not the main issue.

Animation table:

local animation1 = { -- For now the animation is with a single part
	keyFrame1 = {
		CoordinateFrame = CFrame.new(1, 0, 1) * CFrame.Angles(1, .3, .4),
		timeLength = 5,
		easingStyle = "inSine"
	},
	
	keyFrame2 = {
		CoodrinateFrame = CFrame.new (10, 15, 1) * CFrame.new(0, 0, 0),
		timeLength = 5,
		easingStyle = "outSine"
	},
}

I have it so that it loops through the animation data in a continuous Heartbeat event from RunService that is shown below.

Animation Loop:

local keyFrame = 1
local v = animation1["keyFrame"..keyFrame]

local i = 0
local t = v.timeLength
local startingPartCFrame = part.CFrame -- Defines the starting CFrame for the Lerp.
	
render = runService.Heartbeat:connect(function(step)
	local x = easing.inSine(i, 0, 1, 1) -- This is what calculates the fraction from 'i' to correctly interpolate the inSine.
	local newLerp = startingPartCFrame:Lerp(v.CoordinateFrame, x) -- ERROR HERE
	part.CFrame = newLerp
	
	i = i + (step/t)
	
	if i >= 1 and animation1["keyFrame"..keyFrame + 1] then
		print (true) -- It's after it runs through this block and moves to the next keyframe that I get the error
		keyFrame = keyFrame+1
		v = animation1["keyFrame"..keyFrame]
		
		i = 0
		x = 0
		t = v.timeLength
		startingPartCFrame = part.CFrame
		newLerp = startingPartCFrame:Lerp(v.CoordinateFrame, x)
	elseif i >= 1 then
		render:Disconnect()
	end
end)

Error:

The problem is when it loops to the second keyframe, and I get this error:

Argument 2 missing or nil

Script 'ServerScriptService.Script', Line 35

(Look in the script above for the error. I marked it with a comment "ERROR HERE")

I'm not sure what the cause of the problem is, so if anyone could please help it would be appreciated. Perhaps something with the StartingPartCFrame variable?

FULL SCRIPT

local runService = game:GetService("RunService")
local part = game.Workspace.Part1
local easing = require(script.Parent:WaitForChild("MainModule")) -- Module for easing functions

wait (3)
local animation1 = { -- For now the animation is with a single part
	keyFrame1 = {
		CoordinateFrame = CFrame.new(1, 0, 1) * CFrame.Angles(1, .3, .4),
		timeLength = 5,
		easingStyle = "inSine"
	},
	
	keyFrame2 = {
		CoodrinateFrame = CFrame.new (10, 15, 1) * CFrame.new(0, 0, 0),
		timeLength = 5,
		easingStyle = "outSine"
	},
}

local keyFrame = 1
local v = animation1["keyFrame"..keyFrame]

local i = 0
local t = v.timeLength
local startingPartCFrame = part.CFrame
	
render = runService.Heartbeat:connect(function(step)
	local x = easing.inSine(i, 0, 1, 1)
	local newLerp = startingPartCFrame:Lerp(v.CoordinateFrame, x)
	part.CFrame = newLerp
	
	i = i + (step/t)
	
	if i >= 1 and animation1["keyFrame"..keyFrame + 1] then
		print (true) -- It's after it runs through this block and moves to the next keyframe that I get the error
		keyFrame = keyFrame+1
		v = animation1["keyFrame"..keyFrame]
		
		i = 0
		x = 0
		t = v.timeLength
		startingPartCFrame = part.CFrame
		newLerp = startingPartCFrame:Lerp(v.CoordinateFrame, x)
	elseif i >= 1 then
		render:Disconnect()
	end
end)

In Sine function:

inSine = function(t, b, c, d) 
	return -c * math.cos(t / d * (math.pi / 2)) + c + b 
end