--// Mobile Audio Player --// Put this LocalScript in StarterPlayer > StarterPlayerScripts local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local SoundService = game:GetService("SoundService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") --================================================== -- SETTINGS --================================================== local DEFAULT_VOLUME = 100 local DEFAULT_SPEED = 1.0 local DEFAULT_BASS = 0 local MIN_VOLUME = 0 local MAX_VOLUME = 200 local MIN_SPEED = 0.1 local MAX_SPEED = 5.0 local MIN_BASS = -10 local MAX_BASS = 10 local SEEK_AMOUNT = 5 --================================================== -- EFFECT PRESETS --================================================== -- Slowed + Reverb local SLOWED_MULTIPLIER = 0.82 local REVERB_DECAY_TIME = 3.2 local REVERB_DENSITY = 0.85 local REVERB_DIFFUSION = 0.9 local REVERB_DRY_LEVEL = -1 local REVERB_WET_LEVEL = -10 -- Sped Up local SPED_UP_MULTIPLIER = 1.20 --================================================== -- CLEAN OLD VERSION --================================================== local oldGui = playerGui:FindFirstChild("MobileAudioPlayer") if oldGui then oldGui:Destroy() end local oldSound = SoundService:FindFirstChild("MobileAudioPlayer_Sound") if oldSound then oldSound:Destroy() end --================================================== -- SOUND --================================================== local sound = Instance.new("Sound") sound.Name = "MobileAudioPlayer_Sound" sound.Looped = true sound.Volume = DEFAULT_VOLUME / 100 sound.PlaybackSpeed = DEFAULT_SPEED sound.Parent = SoundService --================================================== -- BASS EQ --================================================== local equalizer = Instance.new("EqualizerSoundEffect") equalizer.Name = "MobileAudioPlayer_Bass" equalizer.LowGain = DEFAULT_BASS equalizer.MidGain = 0 equalizer.HighGain = 0 equalizer.Enabled = true equalizer.Parent = sound --================================================== -- SLOWED + REVERB --================================================== local slowedReverb = Instance.new("ReverbSoundEffect") slowedReverb.Name = "MobileAudioPlayer_SlowedReverb" slowedReverb.DecayTime = REVERB_DECAY_TIME slowedReverb.Density = REVERB_DENSITY slowedReverb.Diffusion = REVERB_DIFFUSION slowedReverb.DryLevel = REVERB_DRY_LEVEL slowedReverb.WetLevel = REVERB_WET_LEVEL slowedReverb.Enabled = false slowedReverb.Parent = sound --================================================== -- GUI --================================================== local gui = Instance.new("ScreenGui") gui.Name = "MobileAudioPlayer" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.Parent = playerGui --================================================== -- MAIN FRAME --================================================== local main = Instance.new("Frame") main.Name = "Main" -- Taller to fit Sped Up button. main.Size = UDim2.fromOffset(300, 480) main.Position = UDim2.new(0.5, -150, 0.5, -240) main.BackgroundColor3 = Color3.fromRGB(25, 25, 30) main.BorderSizePixel = 0 main.Active = true main.Parent = gui local mainCorner = Instance.new("UICorner") mainCorner.CornerRadius = UDim.new(0, 13) mainCorner.Parent = main local stroke = Instance.new("UIStroke") stroke.Thickness = 1.5 stroke.Color = Color3.fromRGB(70, 70, 80) stroke.Parent = main --================================================== -- TITLE --================================================== local title = Instance.new("TextLabel") title.Name = "Title" title.Size = UDim2.new(1, -90, 0, 34) title.Position = UDim2.fromOffset(10, 4) title.BackgroundTransparency = 1 title.Text = "🎵 Audio Player" title.TextColor3 = Color3.fromRGB(255, 255, 255) title.TextSize = 18 title.Font = Enum.Font.GothamBold title.TextXAlignment = Enum.TextXAlignment.Left title.Parent = main --================================================== -- HIDE --================================================== local hideButton = Instance.new("TextButton") hideButton.Name = "Hide" hideButton.Size = UDim2.fromOffset(32, 28) hideButton.Position = UDim2.new(1, -70, 0, 8) hideButton.BackgroundColor3 = Color3.fromRGB(50, 50, 58) hideButton.Text = "—" hideButton.TextColor3 = Color3.fromRGB(255, 255, 255) hideButton.TextSize = 19 hideButton.Font = Enum.Font.GothamBold hideButton.Parent = main local hideCorner = Instance.new("UICorner") hideCorner.CornerRadius = UDim.new(0, 7) hideCorner.Parent = hideButton --================================================== -- DELETE --================================================== local deleteButton = Instance.new("TextButton") deleteButton.Name = "Delete" deleteButton.Size = UDim2.fromOffset(32, 28) deleteButton.Position = UDim2.new(1, -34, 0, 8) deleteButton.BackgroundColor3 = Color3.fromRGB(170, 55, 55) deleteButton.Text = "X" deleteButton.TextColor3 = Color3.fromRGB(255, 255, 255) deleteButton.TextSize = 15 deleteButton.Font = Enum.Font.GothamBold deleteButton.Parent = main local deleteCorner = Instance.new("UICorner") deleteCorner.CornerRadius = UDim.new(0, 7) deleteCorner.Parent = deleteButton --================================================== -- NOW PLAYING --================================================== local nowPlaying = Instance.new("TextLabel") nowPlaying.Name = "NowPlaying" nowPlaying.Size = UDim2.new(1, -20, 0, 22) nowPlaying.Position = UDim2.fromOffset(10, 40) nowPlaying.BackgroundTransparency = 1 nowPlaying.Text = "Now Playing: Nothing" nowPlaying.TextColor3 = Color3.fromRGB(190, 190, 200) nowPlaying.TextSize = 12 nowPlaying.Font = Enum.Font.GothamMedium nowPlaying.TextXAlignment = Enum.TextXAlignment.Left nowPlaying.TextTruncate = Enum.TextTruncate.AtEnd nowPlaying.Parent = main --================================================== -- AUDIO ID LABEL --================================================== local idLabel = Instance.new("TextLabel") idLabel.Size = UDim2.new(1, -20, 0, 18) idLabel.Position = UDim2.fromOffset(10, 63) idLabel.BackgroundTransparency = 1 idLabel.Text = "Audio ID" idLabel.TextColor3 = Color3.fromRGB(170, 170, 180) idLabel.TextSize = 12 idLabel.Font = Enum.Font.GothamMedium idLabel.TextXAlignment = Enum.TextXAlignment.Left idLabel.Parent = main --================================================== -- AUDIO ID BOX --================================================== local idBox = Instance.new("TextBox") idBox.Name = "AudioID" idBox.Size = UDim2.new(1, -20, 0, 34) idBox.Position = UDim2.fromOffset(10, 83) idBox.BackgroundColor3 = Color3.fromRGB(38, 38, 45) idBox.BorderSizePixel = 0 idBox.PlaceholderText = "Enter audio ID..." idBox.PlaceholderColor3 = Color3.fromRGB(130, 130, 140) idBox.Text = "" idBox.TextColor3 = Color3.fromRGB(255, 255, 255) idBox.TextSize = 14 idBox.Font = Enum.Font.Gotham idBox.ClearTextOnFocus = false idBox.TextXAlignment = Enum.TextXAlignment.Left idBox.Parent = main local idPadding = Instance.new("UIPadding") idPadding.PaddingLeft = UDim.new(0, 10) idPadding.PaddingRight = UDim.new(0, 10) idPadding.Parent = idBox local idCorner = Instance.new("UICorner") idCorner.CornerRadius = UDim.new(0, 8) idCorner.Parent = idBox --================================================== -- PLAY / PAUSE --================================================== local playButton = Instance.new("TextButton") playButton.Name = "PlayButton" playButton.Size = UDim2.new(1, -20, 0, 34) playButton.Position = UDim2.fromOffset(10, 123) playButton.BackgroundColor3 = Color3.fromRGB(70, 130, 255) playButton.BorderSizePixel = 0 playButton.Text = "▶ Play" playButton.TextColor3 = Color3.fromRGB(255, 255, 255) playButton.TextSize = 14 playButton.Font = Enum.Font.GothamBold playButton.Parent = main local playCorner = Instance.new("UICorner") playCorner.CornerRadius = UDim.new(0, 8) playCorner.Parent = playButton --================================================== -- TIME DISPLAY --================================================== local timeLabel = Instance.new("TextLabel") timeLabel.Name = "Time" timeLabel.Size = UDim2.new(1, -20, 0, 20) timeLabel.Position = UDim2.fromOffset(10, 163) timeLabel.BackgroundTransparency = 1 timeLabel.Text = "00:00 / 00:00" timeLabel.TextColor3 = Color3.fromRGB(190, 190, 200) timeLabel.TextSize = 12 timeLabel.Font = Enum.Font.GothamMedium timeLabel.TextXAlignment = Enum.TextXAlignment.Center timeLabel.Parent = main --================================================== -- SEEK BAR --================================================== local seekSlider = Instance.new("Frame") seekSlider.Name = "SeekSlider" seekSlider.Size = UDim2.new(1, -82, 0, 16) seekSlider.Position = UDim2.fromOffset(41, 187) seekSlider.BackgroundColor3 = Color3.fromRGB(55, 55, 65) seekSlider.BorderSizePixel = 0 seekSlider.Active = true seekSlider.Parent = main local seekCorner = Instance.new("UICorner") seekCorner.CornerRadius = UDim.new(1, 0) seekCorner.Parent = seekSlider local seekFill = Instance.new("Frame") seekFill.Name = "Fill" seekFill.Size = UDim2.new(0, 0, 1, 0) seekFill.BackgroundColor3 = Color3.fromRGB(255, 170, 70) seekFill.BorderSizePixel = 0 seekFill.Parent = seekSlider local seekFillCorner = Instance.new("UICorner") seekFillCorner.CornerRadius = UDim.new(1, 0) seekFillCorner.Parent = seekFill local seekKnob = Instance.new("Frame") seekKnob.Name = "Knob" seekKnob.Size = UDim2.fromOffset(18, 18) seekKnob.AnchorPoint = Vector2.new(0.5, 0.5) seekKnob.Position = UDim2.new(0, 0, 0.5, 0) seekKnob.BackgroundColor3 = Color3.fromRGB(255, 255, 255) seekKnob.BorderSizePixel = 0 seekKnob.ZIndex = 3 seekKnob.Parent = seekSlider local seekKnobCorner = Instance.new("UICorner") seekKnobCorner.CornerRadius = UDim.new(1, 0) seekKnobCorner.Parent = seekKnob --================================================== -- -5 --================================================== local back5Button = Instance.new("TextButton") back5Button.Name = "Back5" back5Button.Size = UDim2.fromOffset(30, 28) back5Button.Position = UDim2.fromOffset(7, 181) back5Button.BackgroundColor3 = Color3.fromRGB(55, 55, 65) back5Button.Text = "−5" back5Button.TextColor3 = Color3.fromRGB(255, 255, 255) back5Button.TextSize = 11 back5Button.Font = Enum.Font.GothamBold back5Button.Parent = main local back5Corner = Instance.new("UICorner") back5Corner.CornerRadius = UDim.new(0, 7) back5Corner.Parent = back5Button --================================================== -- +5 --================================================== local forward5Button = Instance.new("TextButton") forward5Button.Name = "Forward5" forward5Button.Size = UDim2.fromOffset(30, 28) forward5Button.Position = UDim2.new(1, -37, 0, 181) forward5Button.BackgroundColor3 = Color3.fromRGB(55, 55, 65) forward5Button.Text = "+5" forward5Button.TextColor3 = Color3.fromRGB(255, 255, 255) forward5Button.TextSize = 11 forward5Button.Font = Enum.Font.GothamBold forward5Button.Parent = main local forward5Corner = Instance.new("UICorner") forward5Corner.CornerRadius = UDim.new(0, 7) forward5Corner.Parent = forward5Button --================================================== -- VOLUME LABEL --================================================== local volumeLabel = Instance.new("TextLabel") volumeLabel.Size = UDim2.new(1, -20, 0, 19) volumeLabel.Position = UDim2.fromOffset(10, 211) volumeLabel.BackgroundTransparency = 1 volumeLabel.Text = "Volume: 100%" volumeLabel.TextColor3 = Color3.fromRGB(190, 190, 200) volumeLabel.TextSize = 12 volumeLabel.Font = Enum.Font.GothamMedium volumeLabel.TextXAlignment = Enum.TextXAlignment.Left volumeLabel.Parent = main --================================================== -- VOLUME SLIDER --================================================== local volumeSlider = Instance.new("Frame") volumeSlider.Name = "VolumeSlider" volumeSlider.Size = UDim2.new(1, -20, 0, 15) volumeSlider.Position = UDim2.fromOffset(10, 234) volumeSlider.BackgroundColor3 = Color3.fromRGB(55, 55, 65) volumeSlider.BorderSizePixel = 0 volumeSlider.Active = true volumeSlider.Parent = main local volumeSliderCorner = Instance.new("UICorner") volumeSliderCorner.CornerRadius = UDim.new(1, 0) volumeSliderCorner.Parent = volumeSlider local initialVolumePercent = DEFAULT_VOLUME / MAX_VOLUME local volumeFill = Instance.new("Frame") volumeFill.Name = "Fill" volumeFill.Size = UDim2.new(initialVolumePercent, 0, 1, 0) volumeFill.BackgroundColor3 = Color3.fromRGB(80, 145, 255) volumeFill.BorderSizePixel = 0 volumeFill.Parent = volumeSlider local volumeFillCorner = Instance.new("UICorner") volumeFillCorner.CornerRadius = UDim.new(1, 0) volumeFillCorner.Parent = volumeFill local volumeKnob = Instance.new("Frame") volumeKnob.Name = "Knob" volumeKnob.Size = UDim2.fromOffset(18, 18) volumeKnob.AnchorPoint = Vector2.new(0.5, 0.5) volumeKnob.Position = UDim2.new(initialVolumePercent, 0, 0.5, 0) volumeKnob.BackgroundColor3 = Color3.fromRGB(255, 255, 255) volumeKnob.BorderSizePixel = 0 volumeKnob.ZIndex = 3 volumeKnob.Parent = volumeSlider local volumeKnobCorner = Instance.new("UICorner") volumeKnobCorner.CornerRadius = UDim.new(1, 0) volumeKnobCorner.Parent = volumeKnob --================================================== -- SPEED LABEL --================================================== local speedLabel = Instance.new("TextLabel") speedLabel.Size = UDim2.new(1, -20, 0, 19) speedLabel.Position = UDim2.fromOffset(10, 257) speedLabel.BackgroundTransparency = 1 speedLabel.Text = "Speed: 1.0X" speedLabel.TextColor3 = Color3.fromRGB(190, 190, 200) speedLabel.TextSize = 12 speedLabel.Font = Enum.Font.GothamMedium speedLabel.TextXAlignment = Enum.TextXAlignment.Left speedLabel.Parent = main --================================================== -- SPEED SLIDER --================================================== local speedSlider = Instance.new("Frame") speedSlider.Name = "SpeedSlider" speedSlider.Size = UDim2.new(1, -20, 0, 15) speedSlider.Position = UDim2.fromOffset(10, 280) speedSlider.BackgroundColor3 = Color3.fromRGB(55, 55, 65) speedSlider.BorderSizePixel = 0 speedSlider.Active = true speedSlider.Parent = main local speedSliderCorner = Instance.new("UICorner") speedSliderCorner.CornerRadius = UDim.new(1, 0) speedSliderCorner.Parent = speedSlider local speedDefaultPercent = (DEFAULT_SPEED - MIN_SPEED) / (MAX_SPEED - MIN_SPEED) local speedFill = Instance.new("Frame") speedFill.Name = "Fill" speedFill.Size = UDim2.new(speedDefaultPercent, 0, 1, 0) speedFill.BackgroundColor3 = Color3.fromRGB(145, 95, 255) speedFill.BorderSizePixel = 0 speedFill.Parent = speedSlider local speedFillCorner = Instance.new("UICorner") speedFillCorner.CornerRadius = UDim.new(1, 0) speedFillCorner.Parent = speedFill local speedKnob = Instance.new("Frame") speedKnob.Name = "Knob" speedKnob.Size = UDim2.fromOffset(18, 18) speedKnob.AnchorPoint = Vector2.new(0.5, 0.5) speedKnob.Position = UDim2.new(speedDefaultPercent, 0, 0.5, 0) speedKnob.BackgroundColor3 = Color3.fromRGB(255, 255, 255) speedKnob.BorderSizePixel = 0 speedKnob.ZIndex = 3 speedKnob.Parent = speedSlider local speedKnobCorner = Instance.new("UICorner") speedKnobCorner.CornerRadius = UDim.new(1, 0) speedKnobCorner.Parent = speedKnob --================================================== -- BASS LABEL --================================================== local bassLabel = Instance.new("TextLabel") bassLabel.Size = UDim2.new(1, -20, 0, 19) bassLabel.Position = UDim2.fromOffset(10, 303) bassLabel.BackgroundTransparency = 1 bassLabel.Text = "Bass: 0" bassLabel.TextColor3 = Color3.fromRGB(190, 190, 200) bassLabel.TextSize = 12 bassLabel.Font = Enum.Font.GothamMedium bassLabel.TextXAlignment = Enum.TextXAlignment.Left bassLabel.Parent = main --================================================== -- BASS SLIDER --================================================== local bassSlider = Instance.new("Frame") bassSlider.Name = "BassSlider" bassSlider.Size = UDim2.new(1, -20, 0, 15) bassSlider.Position = UDim2.fromOffset(10, 326) bassSlider.BackgroundColor3 = Color3.fromRGB(55, 55, 65) bassSlider.BorderSizePixel = 0 bassSlider.Active = true bassSlider.Parent = main local bassSliderCorner = Instance.new("UICorner") bassSliderCorner.CornerRadius = UDim.new(1, 0) bassSliderCorner.Parent = bassSlider local bassDefaultPercent = (DEFAULT_BASS - MIN_BASS) / (MAX_BASS - MIN_BASS) local bassFill = Instance.new("Frame") bassFill.Name = "Fill" bassFill.Size = UDim2.new(bassDefaultPercent, 0, 1, 0) bassFill.BackgroundColor3 = Color3.fromRGB(80, 200, 150) bassFill.BorderSizePixel = 0 bassFill.Parent = bassSlider local bassFillCorner = Instance.new("UICorner") bassFillCorner.CornerRadius = UDim.new(1, 0) bassFillCorner.Parent = bassFill local bassKnob = Instance.new("Frame") bassKnob.Name = "Knob" bassKnob.Size = UDim2.fromOffset(18, 18) bassKnob.AnchorPoint = Vector2.new(0.5, 0.5) bassKnob.Position = UDim2.new(bassDefaultPercent, 0, 0.5, 0) bassKnob.BackgroundColor3 = Color3.fromRGB(255, 255, 255) bassKnob.BorderSizePixel = 0 bassKnob.ZIndex = 3 bassKnob.Parent = bassSlider local bassKnobCorner = Instance.new("UICorner") bassKnobCorner.CornerRadius = UDim.new(1, 0) bassKnobCorner.Parent = bassKnob --================================================== -- CONTROL BUTTONS --================================================== local restartButton = Instance.new("TextButton") restartButton.Name = "Restart" restartButton.Size = UDim2.fromOffset(67, 30) restartButton.Position = UDim2.fromOffset(10, 350) restartButton.BackgroundColor3 = Color3.fromRGB(55, 55, 65) restartButton.Text = "↻ Restart" restartButton.TextColor3 = Color3.fromRGB(255, 255, 255) restartButton.TextSize = 11 restartButton.Font = Enum.Font.GothamBold restartButton.Parent = main local restartCorner = Instance.new("UICorner") restartCorner.CornerRadius = UDim.new(0, 7) restartCorner.Parent = restartButton local loopButton = Instance.new("TextButton") loopButton.Name = "Loop" loopButton.Size = UDim2.fromOffset(67, 30) loopButton.Position = UDim2.fromOffset(82, 350) loopButton.BackgroundColor3 = Color3.fromRGB(80, 145, 255) loopButton.Text = "🔁 Loop: ON" loopButton.TextColor3 = Color3.fromRGB(255, 255, 255) loopButton.TextSize = 11 loopButton.Font = Enum.Font.GothamBold loopButton.Parent = main local loopCorner = Instance.new("UICorner") loopCorner.CornerRadius = UDim.new(0, 7) loopCorner.Parent = loopButton local muteButton = Instance.new("TextButton") muteButton.Name = "Mute" muteButton.Size = UDim2.fromOffset(67, 30) muteButton.Position = UDim2.fromOffset(154, 350) muteButton.BackgroundColor3 = Color3.fromRGB(55, 55, 65) muteButton.Text = "🔊 Mute" muteButton.TextColor3 = Color3.fromRGB(255, 255, 255) muteButton.TextSize = 11 muteButton.Font = Enum.Font.GothamBold muteButton.Parent = main local muteCorner = Instance.new("UICorner") muteCorner.CornerRadius = UDim.new(0, 7) muteCorner.Parent = muteButton --================================================== -- RESET BUTTON --================================================== local resetButton = Instance.new("TextButton") resetButton.Name = "Reset" resetButton.Size = UDim2.fromOffset(67, 30) resetButton.Position = UDim2.fromOffset(226, 350) resetButton.BackgroundColor3 = Color3.fromRGB(85, 85, 95) resetButton.Text = "↺ Reset" resetButton.TextColor3 = Color3.fromRGB(255, 255, 255) resetButton.TextSize = 11 resetButton.Font = Enum.Font.GothamBold resetButton.Parent = main local resetCorner = Instance.new("UICorner") resetCorner.CornerRadius = UDim.new(0, 7) resetCorner.Parent = resetButton --================================================== -- SLOWED + REVERB BUTTON --================================================== local slowedReverbButton = Instance.new("TextButton") slowedReverbButton.Name = "SlowedReverb" slowedReverbButton.Size = UDim2.new(1, -20, 0, 30) slowedReverbButton.Position = UDim2.fromOffset(10, 388) slowedReverbButton.BackgroundColor3 = Color3.fromRGB(55, 55, 65) slowedReverbButton.Text = "🌙 Slowed + Reverb: OFF" slowedReverbButton.TextColor3 = Color3.fromRGB(255, 255, 255) slowedReverbButton.TextSize = 12 slowedReverbButton.Font = Enum.Font.GothamBold slowedReverbButton.Parent = main local slowedReverbCorner = Instance.new("UICorner") slowedReverbCorner.CornerRadius = UDim.new(0, 7) slowedReverbCorner.Parent = slowedReverbButton --================================================== -- SPED UP BUTTON --================================================== local spedUpButton = Instance.new("TextButton") spedUpButton.Name = "SpedUp" spedUpButton.Size = UDim2.new(1, -20, 0, 30) spedUpButton.Position = UDim2.fromOffset(10, 426) spedUpButton.BackgroundColor3 = Color3.fromRGB(55, 55, 65) spedUpButton.Text = "⚡ Sped Up: OFF" spedUpButton.TextColor3 = Color3.fromRGB(255, 255, 255) spedUpButton.TextSize = 12 spedUpButton.Font = Enum.Font.GothamBold spedUpButton.Parent = main local spedUpCorner = Instance.new("UICorner") spedUpCorner.CornerRadius = UDim.new(0, 7) spedUpCorner.Parent = spedUpButton --================================================== -- MINI BUTTON --================================================== local miniButton = Instance.new("TextButton") miniButton.Name = "MiniButton" miniButton.Size = UDim2.fromOffset(48, 48) miniButton.Position = UDim2.new(0, 16, 0.5, -24) miniButton.BackgroundColor3 = Color3.fromRGB(45, 45, 55) miniButton.BorderSizePixel = 0 miniButton.Text = "🎵" miniButton.TextSize = 21 miniButton.Visible = false miniButton.Active = true miniButton.ZIndex = 10 miniButton.Parent = gui local miniCorner = Instance.new("UICorner") miniCorner.CornerRadius = UDim.new(1, 0) miniCorner.Parent = miniButton local miniStroke = Instance.new("UIStroke") miniStroke.Thickness = 1.5 miniStroke.Color = Color3.fromRGB(90, 90, 105) miniStroke.Parent = miniButton --================================================== -- STATE --================================================== local destroyed = false local loadedAudioId = nil local loopEnabled = true local muted = false local slowedReverbEnabled = false local spedUpEnabled = false local savedVolume = DEFAULT_VOLUME / 100 -- This is the speed selected on the -- normal speed slider BEFORE presets. local selectedSpeed = DEFAULT_SPEED local volumeDragging = false local speedDragging = false local bassDragging = false local seekDragging = false --================================================== -- HELPERS --================================================== local function formatTime(seconds) seconds = math.max( 0, math.floor(seconds) ) local minutes = math.floor(seconds / 60) local secondsOnly = seconds % 60 return string.format( "%02d:%02d", minutes, secondsOnly ) end local function getAudioId() local text = idBox.Text text = text:gsub("%s+", "") text = text:gsub( "rbxassetid://", "" ) local numericId = tonumber(text) if not numericId then return nil end numericId = math.floor(numericId) if numericId <= 0 then return nil end return "rbxassetid://" .. numericId end --================================================== -- EFFECTIVE SPEED --================================================== local function getEffectiveSpeed() local speed = selectedSpeed if slowedReverbEnabled then speed = speed * SLOWED_MULTIPLIER elseif spedUpEnabled then speed = speed * SPED_UP_MULTIPLIER end return math.clamp( speed, MIN_SPEED, MAX_SPEED ) end local function applyPlaybackSpeed() sound.PlaybackSpeed = getEffectiveSpeed() -- Display the actual speed the -- player is currently hearing. local effectiveSpeed = getEffectiveSpeed() if slowedReverbEnabled then speedLabel.Text = string.format( "Speed: %.2fX (Slowed)", effectiveSpeed ) elseif spedUpEnabled then speedLabel.Text = string.format( "Speed: %.2fX (Sped Up)", effectiveSpeed ) else speedLabel.Text = string.format( "Speed: %.1fX", selectedSpeed ) end end --================================================== -- PLAY BUTTON STATES --================================================== local function setPlayingButton() playButton.Text = "⏸ Pause" playButton.BackgroundColor3 = Color3.fromRGB( 180, 65, 65 ) end local function setPausedButton() playButton.Text = "▶ Resume" playButton.BackgroundColor3 = Color3.fromRGB( 70, 130, 255 ) end local function setIdleButton() playButton.Text = "▶ Play" playButton.BackgroundColor3 = Color3.fromRGB( 70, 130, 255 ) end --================================================== -- SLOWED + REVERB UI --================================================== local function updateSlowedReverbUI() slowedReverb.Enabled = slowedReverbEnabled applyPlaybackSpeed() if slowedReverbEnabled then slowedReverbButton.Text = "🌙 Slowed + Reverb: ON" slowedReverbButton.BackgroundColor3 = Color3.fromRGB( 105, 85, 155 ) else slowedReverbButton.Text = "🌙 Slowed + Reverb: OFF" slowedReverbButton.BackgroundColor3 = Color3.fromRGB( 55, 55, 65 ) end end --================================================== -- SPED UP UI --================================================== local function updateSpedUpUI() applyPlaybackSpeed() if spedUpEnabled then spedUpButton.Text = "⚡ Sped Up: ON" spedUpButton.BackgroundColor3 = Color3.fromRGB( 185, 125, 55 ) else spedUpButton.Text = "⚡ Sped Up: OFF" spedUpButton.BackgroundColor3 = Color3.fromRGB( 55, 55, 65 ) end end --================================================== -- DRAGGING --================================================== local function makeDraggable(object) local dragging = false local dragStart local startPosition local dragInput local function update(input) local delta = input.Position - dragStart object.Position = UDim2.new( startPosition.X.Scale, startPosition.X.Offset + delta.X, startPosition.Y.Scale, startPosition.Y.Offset + delta.Y ) end object.InputBegan:Connect(function(input) if destroyed then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPosition = object.Position dragInput = input end end) object.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end) UserInputService.InputChanged:Connect(function(input) if dragging and input == dragInput and not destroyed then update(input) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) end makeDraggable(main) makeDraggable(miniButton) --================================================== -- VOLUME --================================================== local function setVolumeFromInput(inputPosition) local position = volumeSlider.AbsolutePosition local size = volumeSlider.AbsoluteSize if size.X <= 0 then return end local percent = ( inputPosition.X - position.X ) / size.X percent = math.clamp( percent, 0, 1 ) local volumePercent = math.floor( percent * MAX_VOLUME + 0.5 ) volumePercent = math.clamp( volumePercent, MIN_VOLUME, MAX_VOLUME ) savedVolume = volumePercent / 100 if not muted then sound.Volume = savedVolume end volumeLabel.Text = "Volume: " .. volumePercent .. "%" volumeFill.Size = UDim2.new( percent, 0, 1, 0 ) volumeKnob.Position = UDim2.new( percent, 0, 0.5, 0 ) end volumeSlider.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then volumeDragging = true setVolumeFromInput( input.Position ) end end) --================================================== -- SPEED --================================================== local function setSpeedFromInput(inputPosition) local position = speedSlider.AbsolutePosition local size = speedSlider.AbsoluteSize if size.X <= 0 then return end local percent = ( inputPosition.X - position.X ) / size.X percent = math.clamp( percent, 0, 1 ) local speed = MIN_SPEED + ( percent * ( MAX_SPEED - MIN_SPEED ) ) speed = math.floor( speed * 10 + 0.5 ) / 10 speed = math.clamp( speed, MIN_SPEED, MAX_SPEED ) selectedSpeed = speed applyPlaybackSpeed() local displayPercent = ( speed - MIN_SPEED ) / ( MAX_SPEED - MIN_SPEED ) speedFill.Size = UDim2.new( displayPercent, 0, 1, 0 ) speedKnob.Position = UDim2.new( displayPercent, 0, 0.5, 0 ) end speedSlider.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then speedDragging = true setSpeedFromInput( input.Position ) end end) --================================================== -- BASS --================================================== local function setBassFromInput(inputPosition) local position = bassSlider.AbsolutePosition local size = bassSlider.AbsoluteSize if size.X <= 0 then return end local percent = ( inputPosition.X - position.X ) / size.X percent = math.clamp( percent, 0, 1 ) local bass = MIN_BASS + ( percent * ( MAX_BASS - MIN_BASS ) ) bass = math.floor( bass * 2 + 0.5 ) / 2 bass = math.clamp( bass, MIN_BASS, MAX_BASS ) equalizer.LowGain = bass if bass == 0 then bassLabel.Text = "Bass: 0" else bassLabel.Text = string.format( "Bass: %+g", bass ) end local displayPercent = ( bass - MIN_BASS ) / ( MAX_BASS - MIN_BASS ) bassFill.Size = UDim2.new( displayPercent, 0, 1, 0 ) bassKnob.Position = UDim2.new( displayPercent, 0, 0.5, 0 ) end bassSlider.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then bassDragging = true setBassFromInput( input.Position ) end end) --================================================== -- SEEK --================================================== local function setSeekFromInput(inputPosition) local length = sound.TimeLength if length <= 0 then return end local position = seekSlider.AbsolutePosition local size = seekSlider.AbsoluteSize if size.X <= 0 then return end local percent = ( inputPosition.X - position.X ) / size.X percent = math.clamp( percent, 0, 1 ) local newTime = percent * length sound.TimePosition = math.clamp( newTime, 0, math.max( 0, length - 0.01 ) ) seekFill.Size = UDim2.new( percent, 0, 1, 0 ) seekKnob.Position = UDim2.new( percent, 0, 0.5, 0 ) end seekSlider.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then seekDragging = true setSeekFromInput( input.Position ) end end) --================================================== -- GLOBAL SLIDER INPUT --================================================== UserInputService.InputChanged:Connect(function(input) if input.UserInputType ~= Enum.UserInputType.MouseMovement and input.UserInputType ~= Enum.UserInputType.Touch then return end if volumeDragging then setVolumeFromInput( input.Position ) end if speedDragging then setSpeedFromInput( input.Position ) end if bassDragging then setBassFromInput( input.Position ) end if seekDragging then setSeekFromInput( input.Position ) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then volumeDragging = false speedDragging = false bassDragging = false seekDragging = false end end) --================================================== -- PLAY / PAUSE / RESUME --================================================== playButton.MouseButton1Click:Connect(function() if destroyed then return end local enteredId = getAudioId() if not enteredId then playButton.Text = "⚠ Invalid ID" task.delay( 1.2, function() if destroyed then return end if sound.IsPlaying then setPlayingButton() elseif sound.IsPaused then setPausedButton() else setIdleButton() end end ) return end --============================================== -- PAUSE --============================================== if sound.IsPlaying and loadedAudioId == enteredId then sound:Pause() setPausedButton() return end --============================================== -- RESUME --============================================== if sound.IsPaused and loadedAudioId == enteredId then sound:Resume() setPlayingButton() return end --============================================== -- LOAD NEW AUDIO --============================================== sound:Stop() sound.TimePosition = 0 loadedAudioId = nil nowPlaying.Text = "Loading: " .. enteredId timeLabel.Text = "00:00 / 00:00" seekFill.Size = UDim2.new( 0, 0, 1, 0 ) seekKnob.Position = UDim2.new( 0, 0, 0.5, 0 ) sound.SoundId = enteredId sound.Looped = loopEnabled applyPlaybackSpeed() setPlayingButton() sound:Play() loadedAudioId = enteredId --============================================== -- WAIT FOR LOAD --============================================== task.spawn(function() local thisId = enteredId local loaded = sound.IsLoaded local connection if not loaded then connection = sound.Loaded:Connect( function() loaded = true end ) local startTime = os.clock() while not loaded and not destroyed and sound.SoundId == thisId and os.clock() - startTime < 15 do task.wait() end if connection then connection:Disconnect() end end if destroyed then return end if sound.SoundId ~= thisId then return end if sound.TimeLength > 0 then nowPlaying.Text = "Now Playing: " .. thisId else nowPlaying.Text = "Unable to load: " .. thisId end end) end) --================================================== -- RESTART --================================================== restartButton.MouseButton1Click:Connect(function() if destroyed then return end if loadedAudioId == nil or sound.SoundId == "" then return end sound:Stop() sound.TimePosition = 0 sound.Looped = loopEnabled applyPlaybackSpeed() sound:Play() setPlayingButton() nowPlaying.Text = "Now Playing: " .. loadedAudioId end) --================================================== -- LOOP --================================================== loopButton.MouseButton1Click:Connect(function() if destroyed then return end loopEnabled = not loopEnabled sound.Looped = loopEnabled if loopEnabled then loopButton.Text = "🔁 Loop: ON" loopButton.BackgroundColor3 = Color3.fromRGB( 80, 145, 255 ) else loopButton.Text = "🔁 Loop: OFF" loopButton.BackgroundColor3 = Color3.fromRGB( 55, 55, 65 ) end end) --================================================== -- MUTE --================================================== muteButton.MouseButton1Click:Connect(function() if destroyed then return end muted = not muted if muted then sound.Volume = 0 muteButton.Text = "🔇 Unmute" muteButton.BackgroundColor3 = Color3.fromRGB( 170, 65, 65 ) else sound.Volume = savedVolume muteButton.Text = "🔊 Mute" muteButton.BackgroundColor3 = Color3.fromRGB( 55, 55, 65 ) end end) --================================================== -- -5 --================================================== back5Button.MouseButton1Click:Connect(function() if destroyed then return end if sound.TimeLength <= 0 then return end sound.TimePosition = math.clamp( sound.TimePosition - SEEK_AMOUNT, 0, sound.TimeLength ) end) --================================================== -- +5 --================================================== forward5Button.MouseButton1Click:Connect(function() if destroyed then return end if sound.TimeLength <= 0 then return end sound.TimePosition = math.clamp( sound.TimePosition + SEEK_AMOUNT, 0, sound.TimeLength ) end) --================================================== -- SLOWED + REVERB TOGGLE --================================================== slowedReverbButton.MouseButton1Click:Connect(function() if destroyed then return end slowedReverbEnabled = not slowedReverbEnabled -- Slowed and Sped Up are mutually exclusive. if slowedReverbEnabled then spedUpEnabled = false end updateSlowedReverbUI() updateSpedUpUI() end) --================================================== -- SPED UP TOGGLE --================================================== spedUpButton.MouseButton1Click:Connect(function() if destroyed then return end spedUpEnabled = not spedUpEnabled -- Sped Up and Slowed + Reverb are -- mutually exclusive. if spedUpEnabled then slowedReverbEnabled = false end updateSlowedReverbUI() updateSpedUpUI() end) --================================================== -- RESET --================================================== resetButton.MouseButton1Click:Connect(function() if destroyed then return end --============================================== -- VOLUME --============================================== muted = false savedVolume = DEFAULT_VOLUME / 100 sound.Volume = savedVolume volumeLabel.Text = "Volume: 100%" local volumePercent = DEFAULT_VOLUME / MAX_VOLUME volumeFill.Size = UDim2.new( volumePercent, 0, 1, 0 ) volumeKnob.Position = UDim2.new( volumePercent, 0, 0.5, 0 ) muteButton.Text = "🔊 Mute" muteButton.BackgroundColor3 = Color3.fromRGB( 55, 55, 65 ) --============================================== -- SPEED --============================================== selectedSpeed = DEFAULT_SPEED slowedReverbEnabled = false spedUpEnabled = false applyPlaybackSpeed() speedLabel.Text = "Speed: 1.0X" local speedPercent = ( DEFAULT_SPEED - MIN_SPEED ) / ( MAX_SPEED - MIN_SPEED ) speedFill.Size = UDim2.new( speedPercent, 0, 1, 0 ) speedKnob.Position = UDim2.new( speedPercent, 0, 0.5, 0 ) --============================================== -- BASS --============================================== equalizer.LowGain = DEFAULT_BASS equalizer.MidGain = 0 equalizer.HighGain = 0 bassLabel.Text = "Bass: 0" local bassPercent = ( DEFAULT_BASS - MIN_BASS ) / ( MAX_BASS - MIN_BASS ) bassFill.Size = UDim2.new( bassPercent, 0, 1, 0 ) bassKnob.Position = UDim2.new( bassPercent, 0, 0.5, 0 ) --============================================== -- LOOP --============================================== loopEnabled = true sound.Looped = true loopButton.Text = "🔁 Loop: ON" loopButton.BackgroundColor3 = Color3.fromRGB( 80, 145, 255 ) --============================================== -- EFFECT UI --============================================== updateSlowedReverbUI() updateSpedUpUI() end) --================================================== -- AUDIO ID BOX --================================================== idBox.FocusLost:Connect(function() if destroyed then return end local enteredId = getAudioId() if not enteredId then nowPlaying.Text = "Now Playing: Nothing" return end if loadedAudioId == enteredId then nowPlaying.Text = "Now Playing: " .. enteredId else nowPlaying.Text = "Ready: " .. enteredId end end) --================================================== -- SOUND ENDED --================================================== sound.Ended:Connect(function() if destroyed then return end if not sound.Looped then setIdleButton() end end) --================================================== -- UPDATE TIME / DURATION --================================================== RunService.RenderStepped:Connect(function() if destroyed then return end if not gui.Parent then return end local length = sound.TimeLength local position = sound.TimePosition if length > 0 then position = math.clamp( position, 0, length ) local percent = math.clamp( position / length, 0, 1 ) timeLabel.Text = formatTime(position) .. " / " .. formatTime(length) if not seekDragging then seekFill.Size = UDim2.new( percent, 0, 1, 0 ) seekKnob.Position = UDim2.new( percent, 0, 0.5, 0 ) end else timeLabel.Text = "00:00 / 00:00" if not seekDragging then seekFill.Size = UDim2.new( 0, 0, 1, 0 ) seekKnob.Position = UDim2.new( 0, 0, 0.5, 0 ) end end if sound.IsPlaying then if playButton.Text ~= "⏸ Pause" then setPlayingButton() end elseif sound.IsPaused then if playButton.Text ~= "▶ Resume" then setPausedButton() end end end) --================================================== -- HIDE --================================================== hideButton.MouseButton1Click:Connect(function() if destroyed then return end main.Visible = false miniButton.Visible = true end) --================================================== -- SHOW --================================================== miniButton.MouseButton1Click:Connect(function() if destroyed then return end main.Visible = true miniButton.Visible = false end) --================================================== -- DELETE --================================================== deleteButton.MouseButton1Click:Connect(function() if destroyed then return end destroyed = true sound:Stop() sound:Destroy() gui:Destroy() end) --================================================== -- INITIAL STATE --================================================== selectedSpeed = DEFAULT_SPEED sound.Volume = DEFAULT_VOLUME / 100 sound.PlaybackSpeed = DEFAULT_SPEED sound.Looped = true equalizer.LowGain = DEFAULT_BASS equalizer.MidGain = 0 equalizer.HighGain = 0 slowedReverb.Enabled = false slowedReverbEnabled = false spedUpEnabled = false loopEnabled = true muted = false volumeLabel.Text = "Volume: 100%" speedLabel.Text = "Speed: 1.0X" bassLabel.Text = "Bass: 0" loopButton.Text = "🔁 Loop: ON" muteButton.Text = "🔊 Mute" slowedReverbButton.Text = "🌙 Slowed + Reverb: OFF" spedUpButton.Text = "⚡ Sped Up: OFF" playButton.Text = "▶ Play" timeLabel.Text = "00:00 / 00:00" nowPlaying.Text = "Now Playing: Nothing" updateSlowedReverbUI() updateSpedUpUI()