如何在p5.js中当inData=RED时从歌曲数组随机选曲播放?
实现p5.js电台RED频道随机选曲播放
步骤1:创建RED频道歌曲数组
先在音频加载阶段完成数组初始化,通常放在preload函数中:
let redSounds = []; let redSong1, redSong2; // 其他频道音频变量按需定义 function preload() { redSong1 = loadSound('red_song_1.mp3'); redSong2 = loadSound('red_song_2.mp3'); // 加载其他频道音频... // 将RED频道歌曲存入数组 redSounds = [redSong1, redSong2]; }
步骤2:适配频道切换逻辑
在频道切换检测函数中,处理RED频道的随机播放逻辑——先停止当前所有播放的音频,再从数组中随机选曲播放:
function switchChannel() { // 停止RED频道所有正在播放的歌曲,防止多轨重叠 redSounds.forEach(song => { if (song.isPlaying()) song.stop(); }); // 停止其他频道的音频(根据你的项目实际情况补充) // if (blueSound.isPlaying()) blueSound.stop(); // if (greenSound.isPlaying()) greenSound.stop(); if (inData === RED) { // 从数组中随机选取一首歌曲并播放 const selectedSong = random(redSounds); selectedSong.play(); } else if (inData === BLUE) { // 原BLUE频道播放逻辑... } else if (inData === GREEN) { // 原GREEN频道播放逻辑... } }
关键说明
你之前尝试的redSounds.play(random)无效,核心原因是数组本身没有play方法,play是p5.js中p5.SoundFile对象的专属方法。必须先通过random(redSounds)从数组中取出具体的音频文件实例,再调用它的play方法。
如果希望RED频道歌曲播放完毕后自动随机切换下一首,可以在setup中给数组内的歌曲绑定结束事件:
function setup() { // ...其他初始化代码 redSounds.forEach(song => { song.onended(() => { // 随机选下一首,可选逻辑:避免重复选刚播放完的歌曲 let nextSong = random(redSounds); while (nextSong === song) { nextSong = random(redSounds); } nextSong.play(); }); }); }
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

