Baseline Widely available
AnalyserNode
ì¸í°íì´ì¤ì getFloatFrequencyData()
ë©ìëë ì ë¬ë Float32Array
ë°°ì´ ë´ë¡ íì¬ ì£¼íì ë°ì´í°ë¥¼ ë³µì¬í©ëë¤. ì´ ë°°ì´ì ìí, ì¦ ì´ë í ìì ì ì í¸ì ê°ëì
ëë¤.
ë°°ì´ ë´ì ê° ììë í¹ì í 주íìì ëí ë°ì벨 ê°ì ëíë
ëë¤. 주íìë¤ì 0ìì ìí ë ì´í¸ì 1/2ê¹ì§ ì íì ì¼ë¡ í¼ì ¸ ììµëë¤. ì를 ë¤ìë©´, 48000
Hz ìí ë ì´í¸ì ëí´ì, ë°°ì´ì ë§ì§ë§ ììë 24000
Hzì ëí ë°ì벨 ê°ì ëíë
ëë¤.
ì ë°ì±ì´ ë¨ì´ì§ëë¼ë ì±ë¥ì´ ë ì¤ìíë¤ë©´ AnalyserNode.getByteFrequencyData()
를 ì¬ì©íì¸ì. Uint8Array
ìì ëìí©ëë¤.
getFloatFrequencyData(array)
매ê°ë³ì
array
주íì ìì ë°ì´í°ê° ë³µì¬ë Float32Array
. ìë¦¬ê° ìë 모ë ìíì ê°ì -Infinity
ì
ëë¤. ë°°ì´ì ìì ìê° AnalyserNode.frequencyBinCount
ë³´ë¤ ë ì ì¼ë©´, ì´ê³¼í ììë¤ì íë½ë©ëë¤. ë°ëë¡, ë°°ì´ì ìì ìê° ë í¬ë©´, ì´ê³¼í ììë¤ì 무ìë©ëë¤.
ìì (undefined
).
const audioCtx = new AudioContext();
const analyser = audioCtx.createAnalyser();
// Float32Arrayì 길ì´ê° frequencyBinCountì ê°ìì¼ í¨
const myDataArray = new Float32Array(analyser.frequencyBinCount);
// getFloatFrequencyData()ê° ë°íí ë°ì´í°ë¡ Float32Array ì±ì°ê¸°
analyser.getFloatFrequencyData(myDataArray);
ì¤íí¸ë¼ 그리기
ë¤ìì ìì ë AudioContext
를 ì¬ì©í´ì MediaElementAudioSourceNode
를 AnalyserNode
ì ì°ê²°íë 기본 ë°©ë²ì ë³´ì
ëë¤. ì¤ëì¤ê° ì¬ìëë ëì, ìì ììë requestAnimationFrame()
ì¼ë¡ 주íì ë°ì´í°ë¥¼ ë°ë³µí´ ìì§íê³ , "Winamp ë§ëê·¸ëí ì¤íì¼"ì <canvas>
ììì 그립ëë¤.
ë³´ë¤ ìì í ìì© ìì /ì 보를 ë³´ë ¤ë©´ Voice-change-O-matic ë°ëª¨ë¥¼ íì¸íì¸ì. (app.jsì 108-193ë²ì§¸ ì¤ìì ê´ë ¨ ì½ë íì¸)
<!doctype html>
<body>
<script>
const audioCtx = new AudioContext();
//ì¤ëì¤ ìì¤ ìì±
//ì¬ê¸°ìë ì¤ëì¤ íì¼ì ì¬ì©íì§ë§, ë§ì´í¬ ì
ë ¥ê°ì ê²ë ê°ë¥
const audioEle = new Audio();
audioEle.src = "my-audio.mp3"; //ì¬ê¸°ì íì¼ëª
ì
ë ¥
audioEle.autoplay = true;
audioEle.preload = "auto";
const audioSourceNode = audioCtx.createMediaElementSource(audioEle);
//ë¶ì ë
¸ë ìì±
const analyserNode = audioCtx.createAnalyser();
analyserNode.fftSize = 256;
const bufferLength = analyserNode.frequencyBinCount;
const dataArray = new Float32Array(bufferLength);
//ì¤ëì¤ ë
¸ë ë¤í¸ìí¬ ì¤ì
audioSourceNode.connect(analyserNode);
analyserNode.connect(audioCtx.destination);
//2D ìºë²ì¤ ìì±
const canvas = document.createElement("canvas");
canvas.style.position = "absolute";
canvas.style.top = "0";
canvas.style.left = "0";
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
document.body.appendChild(canvas);
const canvasCtx = canvas.getContext("2d");
canvasCtx.clearRect(0, 0, canvas.width, canvas.height);
function draw() {
//ë¤ì 그리기 ìì½
requestAnimationFrame(draw);
//ì¤íí¸ë¼ ë°ì´í° ê°ì ¸ì¤ê¸°
analyserNode.getFloatFrequencyData(dataArray);
//ê²ìì ë°°ê²½ 그리기
canvasCtx.fillStyle = "rgb(0, 0, 0)";
canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
//ì¤íí¸ë¼ 그리기
const barWidth = (canvas.width / bufferLength) * 2.5;
let posX = 0;
for (let i = 0; i < bufferLength; i++) {
const barHeight = (dataArray[i] + 140) * 2;
canvasCtx.fillStyle =
"rgb(" + Math.floor(barHeight + 100) + ", 50, 50)";
canvasCtx.fillRect(
posX,
canvas.height - barHeight / 2,
barWidth,
barHeight / 2,
);
posX += barWidth + 1;
}
}
draw();
</script>
</body>
ëª
ì¸ì ë¸ë¼ì°ì í¸íì± ê°ì´ 보기
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4