Viewmodel bobbing working wrong when switching between idle and not idle

local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")

local camera = game.Workspace.CurrentCamera

local framework = {
	inventory = {
		"K98";
	};
	
	module = nil;
	viewmodel = nil;
	currentSlot = 1;
}

local IsWalking = false
local stopped = false
local ready = false

function loadSlot(Item)
	local viewmodelFolder = game.ReplicatedStorage.Viewmodels
	local moduleFolder = game.ReplicatedStorage.Modules
	
	
	if moduleFolder:FindFirstChild(Item) then
		framework.module = require(moduleFolder:FindFirstChild(Item))
		
		if viewmodelFolder:FindFirstChild(Item) then
			framework.viewmodel = viewmodelFolder:FindFirstChild(Item):Clone()
			framework.viewmodel.Parent = camera
		end
	end
end

RunService.RenderStepped:Connect(function()
	local viewmodel = framework.viewmodel
	local paused = false
	local idle = script.Idle
	local walk = script.Walk
	for i, v in pairs(camera:GetChildren()) do
		if v:IsA("Model") then
			v:PivotTo(camera.CFrame)
		end
	end
	
	local amplitude = 0
	local frequency = 0
	
	if IsWalking == true then
		paused = false
		stopped = false
		amplitude = 0.15
		
		frequency = 1
		if ready == false then
			
			viewmodel:PivotTo(viewmodel:GetPivot())
			stopped = true
		end
		
		if stopped == true and frequency ~= 2 then
			frequency = frequency + 0.1
		end
		
		local phase = 0
		local currentTime = tick()
		local viewmodel = framework.viewmodel
		local newPosition = Vector3.new(0, amplitude * math.sin(currentTime * frequency + phase) , 0)
		ready = true
		viewmodel:PivotTo(viewmodel:GetPivot() + newPosition)
	
	else
		amplitude = 0.15
		
		if paused == false then

			viewmodel:PivotTo(viewmodel:GetPivot())
			paused = true
		end
		frequency = 2
		if paused == true and frequency ~= 1 then
			frequency = frequency - 0.1
		end
		local phase = 0
		local currentTime = tick()
		
		local newPosition = Vector3.new(0, amplitude * math.sin(currentTime * frequency + phase) , 0)
		ready = false
		
		viewmodel:PivotTo(viewmodel:GetPivot() + newPosition)
	end
	
	 
	
end)

UserInputService.InputBegan:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.W then
		IsWalking = true
		stopped = false
	end
end)

UserInputService.InputEnded:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.W then
		IsWalking = false
		stopped = true
	end
end)




loadSlot(framework.inventory[1])



Result

(Also some parts of the script might not even be related to the functions because its the remains of my attempts to fix it)
I spent over 2 hours trying to fix this please help