function UnDigify(G)if G<1 or G>61 then return""elseif G==1 then return"\049"elseif G==2 then return"\033"elseif G==3 then return"\050"elseif G==4 then return"\064"elseif G==5 then return"\051"elseif G==6 then return"\052"elseif G==7 then return"\036"elseif G==8 then return"\053"elseif G==9 then return"\037"elseif G==10 then return"\054"elseif G==11 then return"\094"elseif G==12 then return"\055"elseif G==13 then return"\056"elseif G==14 then return"\042"elseif G==15 then return"\057"elseif G==16 then return"\040"elseif G==17 then return"\048"elseif G==18 then return"\113"elseif G==19 then return"\081"elseif G==20 then return"\119"elseif G==21 then return"\087"elseif G==22 then return"\101"elseif G==23 then return"\069"elseif G==24 then return"\114"elseif G==25 then return"\116"elseif G==26 then return"\084"elseif G==27 then return"\121"elseif G==28 then return"\089"elseif G==29 then return"\117"elseif G==30 then return"\105"elseif G==31 then return"\073"elseif G==32 then return"\111"elseif G==33 then return"\079"elseif G==34 then return"\112"elseif G==35 then return"\080"elseif G==36 then return"\097"elseif G==37 then return"\115"elseif G==38 then return"\083"elseif G==39 then return"\100"elseif G==40 then return"\068"elseif G==41 then return"\102"elseif G==42 then return"\103"elseif G==43 then return"\071"elseif G==44 then return"\104"elseif G==45 then return"\072"elseif G==46 then return"\106"elseif G==47 then return"\074"elseif G==48 then return"\107"elseif G==49 then return"\108"elseif G==50 then return"\076"elseif G==51 then return"\122"elseif G==52 then return"\090"elseif G==53 then return"\120"elseif G==54 then return"\099"elseif G==55 then return"\067"elseif G==56 then return"\118"elseif G==57 then return"\086"elseif G==58 then return"\098"elseif G==59 then return"\066"elseif G==60 then return"\110"elseif G==61 then return"\109"else return"\063"end end function IsBlack(G)if G%12==2 or G%12==4 or G%12==7 or G%12==9 or G%12==11 then return true end end local G=game:GetService("\084\119\101\101\110\083\101\114\118\105\099\101")function Tween(l,E,Y,B,...)local p=TweenInfo.new(Y,...)local J=G:Create(l,p,E)J:Play()if B then J.Completed:wait()end return end local l=Piano.Case.Originals:GetChildren()function HighlightPianoKey(G,E)if not Settings.KeyAesthetics then return end local Y=math.ceil(G/12)local B=(G-1)%12+1 local p=3 local J=.2 local t=.25 local A=Keys[Y][B]local K=A:GetChildren()for G,E in pairs(K)do if G>=#K then local G=E local t={}t.Position=Vector3.new(E.Position.x,l[Y][B][E.Name].Position.y+p,E.Position.z)Tween(G,t,J,true,Enum.EasingStyle.Linear)else local G=E local t={}t.Position=Vector3.new(E.Position.x,l[Y][B][E.Name].Position.y+p,E.Position.z)Tween(G,t,J,false,Enum.EasingStyle.Linear)end end for G,E in pairs(K)do if G>=#K then local G=E local J={}J.Position=Vector3.new(E.Position.x,l[Y][B][E.Name].Position.y-p,E.Position.z)Tween(G,J,t,true,Enum.EasingStyle.Linear)else local G=E local J={}J.Position=Vector3.new(E.Position.x,l[Y][B][E.Name].Position.y-p,E.Position.z)Tween(G,J,t,false,Enum.EasingStyle.Linear)end end for G,E in pairs(K)do E.CFrame=l[Y][B][E.Name].CFrame end return end
----------------------------------
------------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 Tween(obj, Goal, Time, Wait, ...)
	local TwInfo = TweenInfo.new(Time, ...)
	local twn = TweenService:Create(obj, TwInfo, Goal)
	twn:Play()
	if Wait then
		twn.Completed:wait()
	end
	return
end

local originals = Piano.Case.Originals:GetChildren()

function HighlightPianoKey(note1, transpose)
	if not Settings.KeyAesthetics then
		return
	end
	local octave = math.ceil(note1 / 12)
	local note2 = (note1 - 1) % 12 + 1
	local yDist = 3
	local TimeUp = 0.2
	local TimeDn = 0.25
	local key = Keys[octave][note2]
	local parts = key:GetChildren()
	for i, v in pairs(parts) do
		if i >= #parts then
			local obj = v
			local Properties = {}
			Properties.Position =
				Vector3.new(v.Position.x, originals[octave][note2][v.Name].Position.y + yDist, v.Position.z)
			Tween(obj, Properties, TimeUp, true, Enum.EasingStyle.Linear)
		else
			local obj = v
			local Properties = {}
			Properties.Position =
				Vector3.new(v.Position.x, originals[octave][note2][v.Name].Position.y + yDist, v.Position.z)
			Tween(obj, Properties, TimeUp, false, Enum.EasingStyle.Linear)
		end
	end
	for i, v in pairs(parts) do
		if i >= #parts then
			local obj = v
			local Properties = {}
			Properties.Position =
				Vector3.new(v.Position.x, originals[octave][note2][v.Name].Position.y - yDist, v.Position.z)
			Tween(obj, Properties, TimeDn, true, Enum.EasingStyle.Linear)
		else
			local obj = v
			local Properties = {}
			Properties.Position =
				Vector3.new(v.Position.x, originals[octave][note2][v.Name].Position.y - yDist, v.Position.z)
			Tween(obj, Properties, TimeDn, false, Enum.EasingStyle.Linear)
		end
	end
	for i, v in pairs(parts) do
		v.CFrame = originals[octave][note2][v.Name].CFrame
	end
	return
end
