Advertisement
KrYn0MoRe

essential visualizer

Feb 4th, 2023 (edited)
1,047
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.52 KB | None | 0 0
  1. local plr = owner
  2. local char,root
  3.  
  4. --
  5.  
  6. function sleep(n)
  7.     return task.wait(n or 0)
  8. end
  9.  
  10. function wrap(f)
  11.     return coroutine.wrap(f)()
  12. end
  13.  
  14. -- setup bricks
  15.  
  16. local pfolder = Instance.new("Model")
  17. pfolder.Name = 'Visualizer'
  18. pfolder.Parent = script
  19.  
  20. local loudness = 0
  21.  
  22. local id = 0
  23. local volume = 1
  24. local speed = 1
  25. local timepos = 0
  26. local gradient_color = BrickColor.new("Royal purple").Color
  27.  
  28. local part_amount = 25
  29.  
  30. local bricks = {}
  31.  
  32. --[[
  33. for i = 1,part_amount do
  34.     local p = Instance.new("Part")
  35.     p.Color = Color3.new(0,0,0)
  36.     p.Material = Enum.Material.SmoothPlastic
  37.     p.CanCollide = false
  38.     p.Locked = true
  39.     p.CanTouch = false
  40.     p.CanQuery = false
  41.     p.Anchored = true
  42.     p.Parent = pfolder
  43.  
  44.     bricks[#bricks+1] = p
  45.    
  46.     if i == part_amount then
  47.         p.Name = 'main'
  48.     end
  49. end
  50. ]]
  51.  
  52. local music = Instance.new("Sound")
  53. music.Name = 'vismusic'
  54. music.SoundId = 'rbxassetid://' .. id
  55. music.Volume = volume
  56. music.Parent = bricks[#bricks]
  57.  
  58. local st = os.clock()
  59.  
  60. local avgs = {}
  61. local avg = 0
  62. local max_avg = 100
  63.  
  64. function update_average_loud()
  65.     if loudness > 10 then else return end
  66.  
  67.     avgs[#avgs+1] = loudness
  68.     local m = nil
  69.     if #avgs >= max_avg then
  70.         avgs[1] = nil
  71.         m = 1
  72.     end
  73.     local n = 0
  74.     for i,v in pairs(avgs) do
  75.         if m and i > 1 then
  76.             avgs[i-1] = v
  77.             avgs[i] = nil
  78.         end
  79.         n += v
  80.     end
  81.     n = n/#avgs
  82.     avg = n
  83. end
  84.  
  85. local t = 0
  86. local brick_i = 0
  87. local brick_clock = 0
  88.  
  89. function update()
  90.     local int = loudness/math.clamp(avg+150,0,500) -- make it divide by the average so intensity is consistent even when quiet
  91.  
  92.     local multi = 0.5 --+ int*1.5
  93.     t += 1/20 * multi
  94.    
  95.     sleep()
  96.    
  97.     local que = false
  98.     if os.clock()-brick_clock >= 0.1*(1-int) then
  99.         brick_clock = os.clock()
  100.         que = true
  101.         if brick_i == 0 then
  102.             que = 1
  103.         end
  104.         brick_i += 1
  105.         if brick_i > #bricks then
  106.             brick_i = 1
  107.         end
  108.     end
  109.    
  110.     for i = 1,part_amount do
  111.         local p = bricks[i]
  112.        
  113.         local refit = (que == 1)
  114.        
  115.         if not p then
  116.             p = Instance.new("Part")
  117.             p.Color = Color3.new(0,0,0)
  118.             p.Material = Enum.Material.SmoothPlastic
  119.             p.CanCollide = false
  120.             p.Locked = true
  121.             p.CanTouch = false
  122.             p.CanQuery = false
  123.             p.Anchored = true
  124.             p.Parent = pfolder
  125.  
  126.             bricks[i] = p
  127.            
  128.             if i == part_amount then
  129.                 p.Name = 'main'
  130.             end
  131.            
  132.             refit = true
  133.         end
  134.  
  135.         if not music or not music.Parent then
  136.             music = Instance.new("Sound")
  137.             music.SoundId = 'rbxassetid://' .. id
  138.         end
  139.         music.Name = 'vismusic'
  140.         music.Volume = volume
  141.         music.PlaybackSpeed = speed
  142.         music.Looped = true
  143.         wrap(function()
  144.             music.Parent = bricks[#bricks]
  145.         end)
  146.         if music and music.Parent and music.Playing then
  147.             timepos = music.TimePosition
  148.         end
  149.  
  150.  
  151.         local min_size = 1
  152.         local max_size = 7
  153.         local add_size = max_size-min_size
  154.         local xi = math.pi*#bricks/2
  155.         local ni = i*xi/#bricks
  156.        
  157.         add_size = math.clamp(add_size*int,0,add_size)--*math.abs(math.cos(ni/#bricks*2+t))
  158.        
  159.         local div = math.clamp(add_size/(max_size-min_size),0,1)
  160.        
  161.         local c = div
  162.         c = Color3.new(gradient_color.R*c,gradient_color.G*c,gradient_color.B*c)
  163.        
  164.         local cpos = p.CFrame
  165.         if root then
  166.             cpos = CFrame.new(root.Position)
  167.         end
  168.        
  169.         local cf = cpos*CFrame.Angles(0,math.rad(360/part_amount*i),0)*CFrame.new(min_size/2+add_size/2+0.1+5,0,0)--*CFrame.Angles(0,math.rad(90),0)
  170.         local cf2 = cpos*CFrame.Angles(0,math.rad(360/part_amount*i),0)*CFrame.new(p.Size.X/2+0.1+5,0,0)
  171.        
  172.         if (que and i == brick_i) or refit then
  173.             game:GetService("TweenService"):Create(p,TweenInfo.new(0.1),{
  174.                 CFrame = cf,
  175.                 Color = c,
  176.                 Size = Vector3.new(min_size+add_size,1,1),
  177.             }):Play()
  178.             task.delay(0.1,function()
  179.                 game:GetService("TweenService"):Create(p,TweenInfo.new(1),{
  180.                     Color = Color3.new(0,0,0),
  181.                     Size = Vector3.new(1,1,1),
  182.                 }):Play()
  183.             end)
  184.         else
  185.             game:GetService("TweenService"):Create(p,TweenInfo.new(0.1),{
  186.                 CFrame = cf2,
  187.             }):Play()
  188.         end
  189.     end
  190. end
  191.  
  192. -- nls poopy
  193.  
  194. local remote = Instance.new("RemoteEvent")
  195. remote.Parent = pfolder
  196.  
  197. local objredir = Instance.new("ObjectValue")
  198. objredir.Value = remote
  199. objredir.Parent = plr.PlayerGui
  200.  
  201. local network = {}
  202. network.funcs = {}
  203.  
  204. function network.add(n,f)
  205.     network.funcs[n] = f
  206. end
  207.  
  208. function network.run(n,...)
  209.     local f = network.funcs[n]
  210.     if f then
  211.         f(...)
  212.     end
  213. end
  214.  
  215. remote.OnServerEvent:Connect(function(lplr,n,...)
  216.     if lplr.Name == plr.Name then else
  217.         return
  218.     end
  219.     network.run(n,...)
  220. end)
  221.  
  222. network.add('loud',function(v)
  223.     loudness = v
  224. end)
  225.  
  226. local code = [[
  227.     local plr = game:GetService("Players").LocalPlayer
  228.     local char = plr.Character
  229.     local root = char:FindFirstChild("HumanoidRootPart")
  230.     local objredir = script.Parent
  231.     repeat wait() until objredir.Value
  232.     local remote = objredir.Value
  233.     local pfolder = remote.Parent
  234.     local sound = pfolder:WaitForChild("main"):WaitForChild("vismusic")
  235.  
  236.     while true do
  237.         if pfolder and pfolder.Parent then else
  238.             break
  239.         end
  240.         if not sound or not sound.Parent then
  241.             sound = pfolder:WaitForChild("main"):WaitForChild("vismusic")
  242.         end
  243.         if sound then
  244.             remote:FireServer('loud',sound.PlaybackLoudness)
  245.         end
  246.         task.wait(1/20)
  247.     end
  248. ]]
  249.  
  250. NLS = NLS or function() error('NLS fail') end
  251. NLS(code,objredir)
  252.  
  253. --
  254.  
  255. local msgs = {}
  256. msgs.funcs = {}
  257.  
  258. msgs.add = function(n,f)
  259.     msgs.funcs[n] = f
  260. end
  261.  
  262. msgs.add('play',function(n)
  263.     id = n
  264.     music.SoundId = 'rbxassetid://' .. id
  265.     music:Play()
  266. end)
  267.  
  268. msgs.add('vol',function(n)
  269.     if n then else return end
  270.     volume = n
  271.     music.Volume = volume
  272. end)
  273.  
  274. msgs.add('speed',function(n)
  275.     if n then else return end
  276.     speed = n
  277.     music.PlaybackSpeed = speed
  278. end)
  279.  
  280. msgs.add('pos',function(n)
  281.     if n then else return end
  282.     timepos = n
  283.     music.TimePosition = timepos
  284. end)
  285.  
  286. msgs.add('pause',function()
  287.     music:Pause()
  288. end)
  289.  
  290. msgs.add('resume',function()
  291.     music.TimePosition = timepos
  292.     music:Resume()
  293. end)
  294.  
  295. msgs.add('color',function(grad)
  296.     if grad and BrickColor.new(grad) then
  297.         gradient_color = BrickColor.new(grad).Color
  298.     end
  299. end)
  300.  
  301. warn([[
  302.  
  303. Commands:
  304. play/id
  305. vol/n
  306. speed/n
  307. pos/n
  308. pause/
  309. resume/
  310. color/str
  311. ]])
  312.  
  313. plr.Chatted:Connect(function(msg)
  314.     if string.sub(msg,1,3) == '/e ' then
  315.         msg = string.sub(msg,4)
  316.     end
  317.     local md = string.split(msg,'/')
  318.     if md[1] then
  319.         local f = msgs.funcs[md[1]]
  320.         if f then
  321.             table.remove(md,1)
  322.             f(table.unpack(md))
  323.         end
  324.     end
  325. end)
  326.  
  327. while true do
  328.     if pfolder and pfolder.Parent then else
  329.         break
  330.     end
  331.     task.spawn(function()
  332.         char = plr.Character
  333.         if char then
  334.             root = char:FindFirstChild("HumanoidRootPart")
  335.         end
  336.     end)
  337.     update_average_loud()
  338.     update()
  339. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement