----------------------------------
------------FUNCTIONS-------------
----------------------------------



function UnDigify(digit)
	if digit < 1 or digit > 61 then
		return ""
	elseif digit == 1 then
		return "1"
	elseif digit == 2 then
		return "!"
	elseif digit == 3 then
		return "2"
	elseif digit == 4 then
		return "@"
	elseif digit == 5 then
		return "3"
	elseif digit == 6 then
		return "4"
	elseif digit == 7 then
		return "$"
	elseif digit == 8 then
		return "5"
	elseif digit == 9 then
		return "%"
	elseif digit == 10 then
		return "6"
	elseif digit == 11 then
		return "^"
	elseif digit == 12 then
		return "7"
	elseif digit == 13 then
		return "8"
	elseif digit == 14 then
		return "*"
	elseif digit == 15 then
		return "9"
	elseif digit == 16 then
		return "("
	elseif digit == 17 then
		return "0"
	elseif digit == 18 then
		return "q"
	elseif digit == 19 then
		return "Q"
	elseif digit == 20 then
		return "w"
	elseif digit == 21 then
		return "W"
	elseif digit == 22 then
		return "e"
	elseif digit == 23 then
		return "E"
	elseif digit == 24 then
		return "r"
	elseif digit == 25 then
		return "t"
	elseif digit == 26 then
		return "T"
	elseif digit == 27 then
		return "y"
	elseif digit == 28 then
		return "Y"
	elseif digit == 29 then
		return "u"
	elseif digit == 30 then
		return "i"
	elseif digit == 31 then
		return "I"
	elseif digit == 32 then
		return "o"
	elseif digit == 33 then
		return "O"
	elseif digit == 34 then
		return "p"
	elseif digit == 35 then
		return "P"
	elseif digit == 36 then
		return "a"
	elseif digit == 37 then
		return "s"
	elseif digit == 38 then
		return "S"
	elseif digit == 39 then
		return "d"
	elseif digit == 40 then
		return "D"
	elseif digit == 41 then
		return "f"
	elseif digit == 42 then
		return "g"
	elseif digit == 43 then
		return "G"
	elseif digit == 44 then
		return "h"
	elseif digit == 45 then
		return "H"
	elseif digit == 46 then
		return "j"
	elseif digit == 47 then
		return "J"
	elseif digit == 48 then
		return "k"
	elseif digit == 49 then
		return "l"
	elseif digit == 50 then
		return "L"
	elseif digit == 51 then
		return "z"
	elseif digit == 52 then
		return "Z"
	elseif digit == 53 then
		return "x"
	elseif digit == 54 then
		return "c"
	elseif digit == 55 then
		return "C"
	elseif digit == 56 then
		return "v"
	elseif digit == 57 then
		return "V"
	elseif digit == 58 then
		return "b"
	elseif digit == 59 then
		return "B"
	elseif digit == 60 then
		return "n"
	elseif digit == 61 then
		return "m"
  	else
    	return "?"
	end
end
function IsBlack(note)
	if note%12 == 2 or note%12 == 4 or note%12 == 7 or note%12 == 9 or note%12 == 11 then
		return true
	end
end
local TweenService = game:GetService("TweenService")

function fade(cln,t)
	local Goal = {}
	Goal.Transparency = 1
	local TwInfo = TweenInfo.new(t)
	local Tween = TweenService:Create(cln, TwInfo, Goal)
	Tween:Play()
	Tween.Completed:wait()
	return
end

function clone(key,sharp)
	if sharp then
		local cln = key:Clone()
		cln.Material = "Neon" --You can change / remove the neon if you want
		cln.Color = Color3.fromRGB(70,70,70) --along with the color
		cln.Anchored = true
		cln.Parent = key
		cln.Position = key.Position
		cln.CanCollide = false
		for i,v in pairs(cln:GetChildren()) do
			if v and v:IsA("MeshPart") then
				v:Destroy()
			end
		end
		local light = Instance.new("PointLight",cln) 
		light.Brightness = 2
		light.Range = 5
		light.Color = Color3.fromRGB(120, 120, 120)
		local Goal = {}
		Goal.Position = Vector3.new(cln.Position.x,cln.Position.y + 5,cln.Position.z)
		local TwInfo = TweenInfo.new(1,Enum.EasingStyle.Linear)
		local Tween = TweenService:Create(cln, TwInfo, Goal)
		coroutine.resume(coroutine.create(fade),cln,1)
		Tween:Play()
		Tween.Completed:wait()
		local l = cln:FindFirstChildOfClass("PointLight")
		if l then
			l:Destroy()
		end
		if cln.Transparency ~= 1 then cln.Transparency = 1 end
		cln:Destroy()
	else
		local cln = key:Clone() 
		cln.Material = "Neon" --You can change / remove the neon if you want
		cln.Color = Color3.fromRGB(255,255,255) --along with the color
		cln.Anchored = true
		cln.Parent = key
		cln.Position = key.Position
		cln.CanCollide = false
		for i,v in pairs(cln:GetChildren()) do
			if v and v:IsA("MeshPart") then
				v:Destroy()
			end
		end
		local light = Instance.new("PointLight",cln)
		light.Brightness = 2
		light.Range = 5
		light.Color = Color3.fromRGB(120, 120, 120)
		local Goal = {}
		Goal.Position = Vector3.new(cln.Position.x,cln.Position.y + 5,cln.Position.z)
		local TwInfo = TweenInfo.new(1,Enum.EasingStyle.Linear)
		local Tween = TweenService:Create(cln, TwInfo, Goal)
		coroutine.resume(coroutine.create(fade),cln,1)
		Tween:Play()
		Tween.Completed:wait()
		local l = cln:FindFirstChildOfClass("PointLight")
		if l then
			l:Destroy()
		end
		if cln.Transparency ~= 1 then cln.Transparency = 1 end
		cln:Destroy()
	end
	return
end

function HighlightPianoKey(note1,transpose)
	if not Settings.KeyAesthetics then return end
	local octave = math.ceil(note1/12)
	local note2 = (note1 - 1)%12 + 1
	local key = Keys[octave][note2]
	key.Material = "Neon"
	if IsBlack(note1) then
		key.Color = Color3.fromRGB(70,70,70)
		coroutine.resume(coroutine.create(clone),key,true)
		wait(.2)
		key.Color = Color3.fromRGB(10,10,10)
		key.Material = "SmoothPlastic"
	else
		
		coroutine.resume(coroutine.create(clone),key,false)
		wait(.2)
		key.Material = "SmoothPlastic"
	end
	return
end