最近,我尝试复现了 musicforprogramming.net 网站上的音乐可视化效果。这个网站为程序员提供了一个独特的音乐播放体验,伴随着音乐的播放,屏幕上会显示动态的 ASCII 艺术效果。本文将详细介绍如何通过 HTML、CSS 和 JavaScript 来实现这一效果。
HTML 结构 在 index.html
文件中,我们定义了一个简单的网页结构。页面包含一个音频播放器(目前被注释掉了)和四个 <span>
元素,用于显示不同颜色的 ASCII 艺术效果。此外,还有一个播放按钮,用于控制音乐的播放和暂停。
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > musicforprogramming</title > <link rel ="stylesheet" href ="style.css" > </head > <body > <div class ="pad grey pr-0 pb-0 pt-0" > <span id ="fuschia" class ="fuschia" > </span > <br > <span id ="orange" class ="orange" > </span > <br > <span id ="yellow" class ="yellow" > </span > <br > <span id ="green" class ="green" > ________________________________</span > <br > <br > <br > <button id ="play" class ="green hover" disabled:true ="false" > [play]</button > <br > </div > <script src ="index.js" > </script > </body > </html >
JavaScript 逻辑 index.js
文件包含了实现音乐播放和可视化效果的核心逻辑。我们使用 AudioContext
和 AnalyserNode
来处理音频数据,并通过 requestAnimationFrame
实现动态的可视化效果。
const F = document .getElementById ("fuschia" ); const O = document .getElementById ("orange" ); const Y = document .getElementById ("yellow" ); const G = document .getElementById ("green" ); const play = document .getElementById ("play" ); const audioCtx = new AudioContext (); const audio = new Audio ('./daoxiang.mp3' ); play.addEventListener ('click' , () => { if (!audio.paused ) { audio.pause (); play.innerText = "[play]" ; return ; } audio.play (); play.innerText = "[pause]" ; }); const analyser = audioCtx.createAnalyser (); analyser.minDecibels = -114 ; analyser.maxDecibels = -30 ; analyser.fftSize = 2048 ; analyser.smoothingTimeConstant = .666 ; audio.type = "audio/mp3" ; audio.crossOrigin = "anonymous" ; audio.volume = .5 ; audio.autoplay = true ; audio.addEventListener ('canplaythrough' , () => { const source = audioCtx.createMediaElementSource (audio); const gainNode = audioCtx.createGain (); source.connect (analyser); source.connect (gainNode); gainNode.connect (audioCtx.destination ); const dataArray = new Uint8Array (analyser.frequencyBinCount ); visualize (dataArray); }) function visualize (dataArray ) { analyser.getByteFrequencyData (dataArray); let fuschia = "" , orange = "" , yellow = "" , green = "" , index = 0 , adjustValue = -40 , multiplier = 1.08 , offset = 1 ; for (i = 0 ; i < 32 ; i++) { index = Math .max (dataArray[~~offset + i] + adjustValue >> 3 , 0 ); offset *= multiplier; adjustValue += 1.5 ; multiplier += .01 ; fuschia += " _.-•:*^º'" [index]; orange += " _.-•:*^º' " [index]; yellow += " _.-•:*^º' " [index]; green += "_.-•:*^º' " [index]; } F.innerText = fuschia; O.innerText = orange; Y.innerText = yellow; G.innerText = green; requestAnimationFrame (() => visualize (dataArray)); }
可视化效果 在 visualize
函数中,我们通过分析音频的频率数据,动态生成 ASCII 字符并将其显示在页面上。每个 <span>
元素对应不同的颜色和字符集,从而在页面上呈现出动态的视觉效果。
总结 通过这个项目,我们成功复现了 musicforprogramming.net 的音乐可视化效果。这个项目不仅展示了如何使用 Web Audio API 处理音频数据,还展示了如何通过 JavaScript 和 HTML 实现动态的视觉效果。希望这篇文章对你有所帮助,欢迎在评论区分享你的想法和改进建议。
你可以访问 GitHub 仓库 查看完整的代码和效果展示。
Happy coding! 🎵