Introducing CMP - Elevate Your Game with Music!

Hey there, fellow developers! :wave:

I’m thrilled to introduce the Clippsly Music Player (CMP) - a game-changer for your projects! CMP is not just your ordinary background music player; it’s a dynamic and versatile addition to your games and experiences. :notes:

CMP Settings But first, let’s set the stage with some of CMP’s customizable settings. Tailor your music experience just the way you want it:

CMPSettings = {
    hideUI = false,   -- Hides the CMP UI.
    accentColors = false,  -- Changes the background to match the album cover.
    style = "Rotated",  -- Pick your favorite CMP style.
    connection = true  -- Choose between local or remote CMTLs.
}

For setting connection we recommend leaving it on “true” as you’ll be getting all the new tracks published by us.

How CMP Works CMP is a symphony of scripts and settings that effortlessly blends into your projects. Here’s a high-level peek at its mechanics:

  1. Track Selection: CMP boasts a collection of music tracks, organized by genre. You can easily customize genres and their tracks to suit your game’s vibe.
  2. Play and Shuffle: CMP will play music tracks based on your chosen genre. If you’re not grooving to the current tune, don’t worry - CMP can shuffle through your selected genre’s tracks for a dynamic experience.
  3. Mute and Unmute: You’re in control! Mute and unmute the music at your whim with CMP.

Customization and Genre Selection CMP’s versatility shines with the ability to filter tracks by genre. Take a look at how you can select your desired genre:

selectedGenre = "All" -- Change this to your starting genre

-- Find the genre buttons in your UI
local genreButtons = {}
for _, genre in pairs({"Rap", "Rock", "Electronic", "Dont", "Instrumental", "All"}) do
    genreButtons[genre] = musicUi:FindFirstChild(genre .. "Button")
    if genreButtons[genre] then
        genreButtons[genre].MouseButton1Click:Connect(function()
            selectedGenre = genre
            PlayNextTrack(selectedGenre)
        end)
    end
}

The Music Library CMP’s music library, showcased in the ‘CMTLs’ script, is a treasure trove of tracks across various genres. You can effortlessly expand this library with your favorite music following the provided format:

{
    {
        name = "Fallout",
        artist = "Sirfake",
        soundId = "rbxassetid://11265169150",
        accentcol = Color3.fromRGB(131, 131, 131),
        genre = "Rock"
    },
    {
        name = "Chipsy",
        artist = "Bagieta",
        soundId = "rbxassetid://11265164947",
        accentcol = Color3.fromRGB(89, 59, 44),
        genre = "Dont"
    },
}

Expanding CMP’s Musical Palette While you can’t add your own tracks to CMTLs, you have a wide array of tunes from Clippsly’s music track library to explore and enjoy. Clippsly provides an excellent selection of public tracks across various genres, allowing you to curate a unique and engaging music experience for your players.

Feel free to explore the existing tracks, choose the ones that best fit your game’s ambiance, and remember to set the appropriate genre for each track in your code. CMP’s flexibility and versatility allow you to craft memorable moments and enhance the overall atmosphere of your projects with the provided music.

If you have any questions or need assistance with using CMP effectively with Clippsly’s music track library, don’t hesitate to ask. Happy coding and happy listening! :notes::video_game:

Downloads:
Clippsly Roster Download: Here
Roblox Toolbox: Here

14 Likes

Trying not to be rude, but this topic feels like it’s written with a certain Text-Generating Artificial Intelligence, and the resource overall is just an audio player.

Plus, can we even skip the audio? Can we even seek to where we want in the playing audio?

The API is not very clear. Would appreciate if that was defined more in-detail.

1 Like

when i actully saw it, i thought it was completely generated by AI and that the resource isn’t safe and may include virus. but it turned out to be human, i think?

1 Like

The vocabulary is simply inhuman. Plus, how it’s written made me think about so as well.

I absolutely love expanding all of my posts, as you may have noticed in my older ones. I’m somewhat surprised by the comments about my writing style, but it’s quite normal for me to write more, even when discussing the smallest details.

Let me reply to some comments.

Noted, I’ll add skipping options, and for place where audio is playing you may edit the main script located in StarterGui.

No API is used here, while I’ve tried to implement our api (https://api.clippsly.com) to automatically fetch tracks, it was simply unsuccessful to me. The module which is used by the CMP called “CMTLs” is a simple track library which don’t need much explanation.

The resource “Clippsly Roster” especialy the /products is used by me to give an alternative instead of getting the model from the Toolbox and it is 100% safe. I’m human. (at least I think)

I’m going to take this as a compliment.

I am talking about the API, which is not literally a remote call, but how to use and implement the tool into my use.

Also try to protect your actual API, I called it 4273 times without getting rate limited.

This is link to Clippsly Roster’s API Documentation: https://roster.clippsly.com/api-documentation

And this is an example script which uses our api:

local HttpService = game:GetService("HttpService")
local SoundService = game:GetService("SoundService")

local API_ENDPOINT = "https://api.clippsly.com"

-- Function to retrieve and play tracks
local function playMusicTracks(queryParams)
    local url = API_ENDPOINT
    if queryParams then
        url = url .. "?" .. queryParams
    end

    local response = HttpService:GetAsync(url)
    local decodedResponse = HttpService:JSONDecode(response)

    local shuffledTracks = {}
    for _, track in pairs(decodedResponse) do
        if track.ROBLOX and track.ROBLOX ~= "" then
            local audioUrl = "rbxassetid://" .. track.ROBLOX
            table.insert(shuffledTracks, audioUrl)
        end
    end
    math.randomseed(tick()) -- Seed the random number generator
    for i = #shuffledTracks, 2, -1 do
        local j = math.random(i)
        shuffledTracks[i], shuffledTracks[j] = shuffledTracks[j], shuffledTracks[i]
    end

    local currentTrackIndex = 1
    local function playNextTrack()
        local audioUrl = shuffledTracks[currentTrackIndex]

        if audioUrl then
            local track = decodedResponse[currentTrackIndex]
            local sound = Instance.new("Sound")
            sound.SoundId = audioUrl
            sound.Parent = SoundService
            sound:Play()
            sound.Ended:Wait()
            sound:Destroy()

            currentTrackIndex = currentTrackIndex + 1
            if currentTrackIndex > #shuffledTracks then
                currentTrackIndex = 1 -- Loop back to the first track
            end

            playNextTrack() -- Play the next track
        end
    end

    playNextTrack()
end

local chooseArtist = false

if chooseArtist then
    local artist = "7SAKU7"
    playMusicTracks("Artist=" .. artist)
else
    playMusicTracks() -- No need to add "Artist" as a query parameter
end

Hope that helps!

Please consider the following:

  • Recommend the usage of protected calls in your example code,
  • Rate limit your API to a maximum of 10 calls per minute per IP (you dont need more)

Otherwise it’s fine.

1 Like

Sure, I’ve added this to my to-do list, thank you so much!

Pretty sure it was actually written by her, but it seems generated because it’s over exagerrating the use of a simple music player.

3 Likes

Ooo it looks awesome!!! I’m glad that the whole project made it through! ^^

1 Like

What is that music genre? I believe you should have called it “.”. Why is your script using wait?

Makes me feel like I should continue work on my in-game music player project. But this one seems less complex yet harder to wrap my head around. What is a “CMPStyle”? Where is this settings module API?

what?

About the music genre, you’re right; I didn’t have the most precise name for it. I could have put it under the main genre, but I wasn’t sure if people would enjoy it.

As for ‘wait’ in the script, it’s mainly used in the ‘accentColors’ part, although it doesn’t make a big difference.

“CMPStyle” refers to styles in CMPAssets, which you can find in ReplicatedStorage.

The settings module API is actually in the main script for easy access. (May be moved into ReplicatedStorage in the future.)

Sorry for any confusion earlier. I was talking about the “connection” setting, which I update manually when new music is added to the catalog. Technically, you can add your own tracks to locally delivered CMTLs in CMPAssets, but my comment about “you can’t add your own tracks” was specifically about the “connection” setting.

Hey there, fellow developers! :wave:

We’ve been working to make CMP even better for your Roblox games. Check out the latest updates:

1. Skip Button - Take Control! You asked for it, and here it is - the Skip Button! Now you can skip to the next track whenever you want. Keep the music fresh and match it to your game’s vibe effortlessly.

2. 24 New Clippsly Tracks We’ve added 24 exciting new tracks from Clippsly. More variety, more options, and more ways to set the perfect mood for your game. Discover them all here.

If you’re running CMP 1.0 your track library have been automatically updated if you’re using the connection mode.

Downloads:
Clippsly Roster Download: Here
Roblox Toolbox: Here

1 Like

Hello, is there anyway to change the volume of these songs?

Thanks.

Yes, in the main local script (MainCMPScript) where the sound is being created just add value “Volume = “ and set it at the level what would be pleasing to you.

Change from this:

		currentSound = Instance.new("Sound")
		currentSound.SoundId = currentTrack.soundId
		currentSound.Name = "CMP"
		currentSound.Parent = game.Workspace

To this:

		currentSound = Instance.new("Sound")
		currentSound.SoundId = currentTrack.soundId
		currentSound.Volume = 0.5 --your desired volume
		currentSound.Name = "CMP"
		currentSound.Parent = game.Workspace