Baseline Widely available
getFloatFrequencyData()
㯠AnalyserNode
ã¤ã³ã¿ã¼ãã§ã¤ã¹ã®ã¡ã½ããã§ã渡ããã Float32Array
é
åã«ç¾å¨ã®å¨æ³¢æ°ãã¼ã¿ãã³ãã¼ãã¾ããé
åã®åå¤ã¯ãµã³ãã«ã§ãããããã®æç¹ã«ãããä¿¡å·ã®å¤§ããã§ãã
é
åã®åé
ç®ã¯ãåºæã®å¨æ³¢æ°ã®ãã·ãã«å¤ã表ãã¾ãã卿³¢æ°ã¯ãµã³ãã«ã¬ã¼ãã® 0 ãã 1/2 ã¾ã§ç´ç·çã«åºããã¾ããä¾ãã°ããµã³ãã«ã¬ã¼ãã 48000
Hz ã®å ´åãé
åã®æå¾ã®é
ç®ã¯ 24000
Hz ã®ãã·ãã«å¤ã表ãã¾ãã
ããé«ãããã©ã¼ãã³ã¹ãå¿
è¦ã§ãç²¾åº¦ãæ°ã«ããªãå ´åã¯ã代ããã« Uint8Array
ã§åä½ãã AnalyserNode.getByteFrequencyData()
ã使ç¨ãããã¨ãã§ãã¾ãã
getFloatFrequencyData(array)
弿°
array
卿³¢æ°é åãã¼ã¿ã®ã³ãã¼å
ã¨ãªã Float32Array
ã§ããç¡é³ã®ãµã³ãã«ã®å ´åãå¤ã¯ -Infinity
ã§ãã é
åã®æã¤è¦ç´ ã AnalyserNode.frequencyBinCount
ããå°ãªãã£ãå ´åãä½åãªè¦ç´ ã¯åé¤ããã¾ããå¿
è¦ä»¥ä¸ã®è¦ç´ ããã£ãå ´åã¯ãä½åãªè¦ç´ ã¯ç¡è¦ããã¾ãã
ãªã (undefined
)ã
const audioCtx = new AudioContext();
const analyser = audioCtx.createAnalyser();
// Float32Array should be the same length as the frequencyBinCount
const myDataArray = new Float32Array(analyser.frequencyBinCount);
// fill the Float32Array with data returned from getFloatFrequencyData()
analyser.getFloatFrequencyData(myDataArray);
ã¹ãã¯ãã«ã®æç»
次ã®ä¾ã§ã¯ã AudioContext
ã§ MediaElementAudioSourceNode
ã使ãã requestAnimationFrame()
㨠<canvas>
ã§æå»é åã®ãã¼ã¿ãç¹°ãè¿ãåéããç¾å¨ã®é³å£°å
¥åã®ããªã·ãã¹ã³ã¼ããåºåãæç»ããåºæ¬çãªä½¿ç¨æ¹æ³ã示ãã¾ãã
ããå®å ¨ãªå¿ç¨ä¾/æ å ±ã«ã¤ãã¦ã¯ã Voice-change-O-matic ã®ãã¢ã調ã¹ã¦ãã ããï¼é¢é£ããã³ã¼ã㯠app.js ã® 108 ï½ 193 è¡ç®ãåç §ï¼ã
<!doctype html>
<body>
<script>
const audioCtx = new AudioContext();
//Create audio source
//Here, we use an audio file, but this could also be e.g. microphone input
const audioEle = new Audio();
audioEle.src = "my-audio.mp3"; //insert file name here
audioEle.autoplay = true;
audioEle.preload = "auto";
const audioSourceNode = audioCtx.createMediaElementSource(audioEle);
//Create analyser node
const analyserNode = audioCtx.createAnalyser();
analyserNode.fftSize = 256;
const bufferLength = analyserNode.frequencyBinCount;
const dataArray = new Float32Array(bufferLength);
//Set up audio node network
audioSourceNode.connect(analyserNode);
analyserNode.connect(audioCtx.destination);
//Create 2D canvas
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() {
//Schedule next redraw
requestAnimationFrame(draw);
//Get spectrum data
analyserNode.getFloatFrequencyData(dataArray);
//Draw black background
canvasCtx.fillStyle = "rgb(0, 0, 0)";
canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
//Draw spectrum
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