Web Audio API ã®å ¥éãè¦ã¦ã¿ã¾ããããããã§ã¯ããã¤ãã®æ¦å¿µãçã確èªãã¦ãããç°¡å㪠boombox ã®ä¾ã§ãé³å£°ãã©ãã¯ã®èªã¿è¾¼ã¿ãåçã¨ä¸æåæ¢ãé³éãã¹ãã¬ãªä½ç½®ã®å¤æ´ã®æ¹æ³ãå¦ã³ã¾ãããã
Web Audio API 㯠<audio>
ã¡ãã£ã¢è¦ç´ ãç½®ãæãããã®ã§ã¯ãªããããããã®æ©è½ãè£å®ãããã®ã§ããã <canvas>
ã <img>
è¦ç´ ã¨ä¸¦è¡ãã¦åå¨ããã®ã¨ä¼¼ã¦ãã¾ããã©ã¡ããå©ç¨ãããã¯ããã®ç®çã«ããã¾ããé³å£°ãã©ãã¯ã®åçãå¶å¾¡ãããã ãã§ããã°ã <audio>
ã¡ãã£ã¢è¦ç´ ã®æ¹ãããããã Web Audio API ãããæ©ã解決ã§ããã§ããããåçã ãã§ãªããã£ã¨è¤éãªé³å£°å¦çãå¿
è¦ã§ããã°ã Web Audio API ã¯ã¯ããã«å¼·åãªå¶å¾¡ãè¡ããã¨ãã§ãã¾ãã
Web Audio API ã®å¼·åãªè¦ç´ ã®ä¸ã¤ã¯ã峿 ¼ãªãé³å£°ã®å¼ã³åºãã®å¶éãããªããã¨ã§ããä¾ãã°ãåæã« 32 é³ã 64 é³ãªã©ã®ä¸éã¯ããã¾ãããããã»ããµã¼ã®è½åãããã°ã1,000 以ä¸ã®é³ãè©°ã¾ããã¨ãªãåçãããã¨ãã§ãã¾ãã
ã³ã¼ãä¾boombox ã®å¤è¦ã¯æ¬¡ã®éãã§ãã
ããã¯å¤ãã«ã»ãããããã§ãåçãã¿ã³ããããé³éã¨ã¹ãã¬ãªä½ç½®ã夿´ãããã¨ãã§ããé³éã¨ãã³ã®ã¹ã©ã¤ãã¼ãããã¾ãããªãããã£ã¨è¤éã«ãããã¨ãã§ãã¾ããããã®æ®µéã§ç°¡åã«å¦ã¶ã«ã¯çæ³çãªãã®ã§ãã
ãã¡ãããæçµçãªãã¢ã Codepen ã§ç¢ºèªããããã½ã¼ã¹ã³ã¼ãã GitHub ã§è¦ãããã¦ãã ããã
ãã©ã¦ã¶ã¼ã®å¯¾å¿ææ°ã®ãã©ã¦ã¶ã¼ã¯ Web Audio API ã®ã»ã¨ãã©ã®æ©è½ã«ãã対å¿ãã¦ãã¾ãã API ã®æ©è½ã¯ããããããã¾ãã®ã§ããã£ã¨æ£ç¢ºãªæ å ±ã¯ãåãªãã¡ã¬ã³ã¹ãã¼ã¸ã®ãã©ã¦ã¶ã¼äºææ§ä¸è¦§è¡¨ããã§ãã¯ããå¿ è¦ãããã§ãããã
é³å£°ã°ã©ãWeb Audio API ã®ä¸ã«ãããã¹ã¦ã®ãã®ã¯é³å£°ã°ã©ãã®æ¦å¿µã«åºã¥ãã¦ããããã¼ãããæã£ã¦ãã¾ãã
Web Audio API ã¯é³å£°ã³ã³ããã¹ãã«å«ã¾ããé³å£°æä½ãæ±ããã¢ã¸ã¥ã¼ã©ã¼ã«ã¼ãã£ã³ã°ãä½ããããã«è¨è¨ããã¦ãã¾ããåºæ¬çãªé³å£°ã®ç·¨éã¯é³å£°ãã¼ãã§è¡ãããããã¯äºãã«çµã³ã¤ããé³å£°ã«ã¼ãã£ã³ã°ã°ã©ããæ§æãã¾ããå å·¥ããé³ãå ¥åããå ¥åãã¼ããæã¿éãã«é³ãå å·¥ããå å·¥ãã¼ããé³ãä¿åãããè´ããããããã¨ãã§ããåºåãã¼ã (åºåå ) ããæãã¾ãã
ããããã®é³å£°ã½ã¼ã¹ã¯ãåä¸ã®ã³ã³ããã¹ãã§ãã£ã¦ããç°ãªããã£ã³ãã«ã¬ã¤ã¢ã¦ãã«å¯¾å¿ãã¦ãã¾ãããã®ã¢ã¸ã¥ã©ã¼è¨è¨ã«ãã£ã¦ãåçãªå¹æãæã¤è¤éãªãªã¼ãã£ãªé¢æ°ã使ãããã¨ãã§ãã¾ãã
é³å£°ã³ã³ããã¹ãWeb Audio API ã§ä½ãããããã¨ãã§ããããã«ããã«ã¯ãé³å£°ã³ã³ããã¹ãã®ã¤ã³ã¹ã¿ã³ã¹ã使ããå¿ è¦ãããã¾ãããã®å¾ã§ã API ã®ãã¹ã¦ã®æ©è½ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
// å¤ããã©ã¦ã¶ã¼åã
const AudioContext = window.AudioContext || window.webkitAudioContext;
const audioContext = new AudioContext();
ãããå®è¡ããã¨ã©ããªãã®ã§ããããã BaseAudioContext
ãèªåçã«çæããããªã³ã©ã¤ã³é³å£°ã³ã³ããã¹ãã«æ¡å¼µããã¾ãããããè¡ãã®ã¯ãã©ã¤ããµã¦ã³ããåçãããã¨ãã¦ããããã§ãã
ã¡ã¢: é³å£°ãã¼ã¿ãå¦çãããã ããä¾ãã°ããããã¡ãªã³ã°ã¨ã¹ããªã¼ãã³ã°ã®ã¿ãè¡ãåçããã®ã§ãªããã°ã OfflineAudioContext
ã使ããããã«ããã»ããè¯ãããããã¾ããã
使ããé³å£°ã³ã³ããã¹ãã«ã¯ãããã§åçããé³å£°ãå¿
è¦ã«ãªãã¾ãããããè¡ã API ã¯å°ãããããã¾ãããç°¡åãªæ¹æ³ã§å§ãã¦ã¿ã¾ããã â boombox ã使ãã¨ãæ²ã®ãã©ãã¯å
¨ä½ãåçããã®ãæ®éã§ããã¾ããã¢ã¯ã»ã·ããªãã£ã®ããã«ããã®ãã©ãã¯ã DOM ã«å
¬éããã»ãããããããããã®ãã¼ã¸ã®æ²ãå
¬éããããã« <audio>
è¦ç´ ã使ç¨ãã¾ãã
<audio src="myCoolTrack.mp3" type="audio/mpeg"></audio>
ã¡ã¢: èªã¿è¾¼ããã¨ãã¦ããé³å£°ãã¡ã¤ã«ãå¥ãªãã¡ã¤ã³ã«ããå ´åã¯ã crossorigin
屿§ã使ç¨ããå¿
è¦ãããã§ãããã詳ããã¯ãªãªã¸ã³éãªã½ã¼ã¹å
±æ (CORS) ãåç
§ãã¦ãã ããã
Web Audio API ã使ç¨ãã¦ã§ãããã°ããããã¨ããã¹ã¦å©ç¨ããããã«ã¯ããã®è¦ç´ ã§å
¥åå
ãã¤ãã¿ã使ããã³ã³ããã¹ãã«éãè¾¼ããã¨ãå¿
è¦ã§ãã幸ãã«ãã¡ããã©ãããè¡ãã¡ã½ãã â AudioContext.createMediaElementSource
ãåå¨ãã¾ãã
// get the audio element
const audioElement = document.querySelector("audio");
// pass it into the audio context
const track = audioContext.createMediaElementSource(audioElement);
ã¡ã¢: ä¸è¨ã® <audio>
è¦ç´ 㯠DOM å
ã§ã¯ HTMLMediaElement
åã®ãªãã¸ã§ã¯ãã§è¡¨ãããããã¯ç¬èªã®æ©è½ã®ã»ãããæã£ã¦ãã¾ãããããã¯ãã¹ã¦ãã®ã¾ã¾ã§ãã Web Audio API ã§é³å£°ãå©ç¨ã§ããããã«ããã ãã§ãã
ã¦ã§ãä¸ã§é³å£°ãåçããã¨ããã¦ã¼ã¶ã¼ãå¶å¾¡ã§ããããã«ãããã¨ãéè¦ã§ããç®çã«ãã£ã¦ç¡æ°ã®é¸æè¢ãããã¾ãããããã§ã¯é³å£°ã®åçã¨ä¸æåæ¢ããã©ãã¯ã®é³éã¨å·¦å³ã®ãã³ã®å¤æ´ã®æ©è½ãæä¾ãã¾ãã
JavaScript ã³ã¼ãããããã°ã©ã çã«é³å£°ãå¶å¾¡ãããã¨ã¯ããã©ã¦ã¶ã¼ã®èªååçã®å¯¾å¿æ¹éã®å½±é¿ãåãã¾ãã®ã§ãã¦ã¼ã¶ã¼ (ã¾ãã¯ãã¯ã¤ããªã¹ã) ã®è¨±å¯ããªãã¨ãããã¯ãããå ´åãããã¾ããèªååçã®æ¹éã¯é常ãæç¤ºçãªè¨±å¯ãã¹ã¯ãªãããé³å£°ãåçã§ããããã«ãªãåã®ã¦ã¼ã¶ã¼ã®ãã¼ã¸ã¸ã®åå¿ãå¿ è¦ã¨ãã¾ãã
ãããã®ç¹å¥ãªè¦ä»¶ãåºæ¬çã«è¨å®ããã¦ããã®ã¯ãäºæ³å¤ã®é³ãè¿·æã§éªéã«ãªããã¢ã¯ã»ã·ããªãã£ã®åé¡ãå¼ãèµ·ããå¯è½æ§ãããããã§ããããã«ã¤ãã¦ã¯ãè¨äºã¡ãã£ã¢ã¨ Web Audio API ã®èªååçã¬ã¤ããã覧ãã ããã
ãã®ã¹ã¯ãªããã¯ã¦ã¼ã¶ã¼å ¥åã¤ãã³ã (ä¾ãã°åçãã¿ã³ã®ã¯ãªãã¯) ã¸ã®å¿çã§é³å£°ãåçãã¦ãããããè¯ãå½¢ã§ããèªååçãããã¯ã®åé¡ã¯ãªãã§ããããã§ããããåçã䏿忢æ©è½ã«ã¤ãã¦ã®è©±ãå§ãã¾ããããåçãã¿ã³ã¯ãã©ãã¯ã®åçä¸ã«ã¯ä¸æåæ¢ãã¿ã³ã«å¤ããã¾ãã
<button data-playing="false" role="switch" aria-checked="false">
<span>Play/Pause</span>
</button>
ãã©ãã¯ãåçããåã«ãé³å£°ã°ã©ããé³å£°ã½ã¼ã¹ã¾ãã¯å ¥åãã¼ãããåºåå ã¸æ¥ç¶ããå¿ è¦ãããã¾ãã
æ¢ã«å
¥åãã¼ãã«ã¤ãã¦ã¯ã audio è¦ç´ ã API ã«æ¸¡ããã¨ã§ä½æãã¾ãããã»ã¨ãã©ã®å ´åã¯ãåºåãã¼ã使ããå¿
è¦ã¯ãªããä»ã®ãã¼ãã BaseAudioContext.destination
ã¸æ¥ç¶ããã ãã§ãã
track.connect(audioContext.destination);
ãããã®ãã¼ããå³ç¤ºããã®ã«ããæ¹æ³ã¯ãé³å£°ã°ã©ããæç»ãããã¨ã§ããããã¯ç¾å¨ã®é³å£°ã°ã©ãã®è¦ãæ¹ã表ãã¾ãã
ããã§åçã¨ä¸æåæ¢æ©è½ã追å ã§ããããã«ãªãã¾ããã
// select our play button
const playButton = document.querySelector("button");
playButton.addEventListener(
"click",
function () {
// check if context is in suspended state (autoplay policy)
if (audioContext.state === "suspended") {
audioContext.resume();
}
// play or pause track depending on state
if (this.dataset.playing === "false") {
audioElement.play();
this.dataset.playing = "true";
} else if (this.dataset.playing === "true") {
audioElement.pause();
this.dataset.playing = "false";
}
},
false,
);
ã¾ãããã©ãã¯ã®åçãçµäºãããã©ãããããèæ
®ãã¦ããå¿
è¦ãããã¾ãã HTMLMediaElement
㯠ended
ã¤ãã³ããåççµäºæã«ä¸åº¦çºçãããã®ã§ããããå¾
ã¡åããã¦é¢é£ããã³ã¼ããå®è¡ãã¾ãã
audioElement.addEventListener(
"ended",
() => {
playButton.dataset.playing = "false";
},
false,
);
é³ã®å å·¥
åºæ¬çãªå å·¥ãã¼ãã追å ãã¦ãé³ãå¤åããã¦ã¿ã¾ãããããã㯠Web Audio API ãæ¬å½ã«å½¹ç«ã¡å§ããã¨ããã§ããã¾ãæåã«ãé³éãå¤åããã¦ã¿ã¾ããããããã¯é³ã®æ³¢ãã©ãã ã大ãããã表ã GainNode
ã使ç¨ããã°å®ç¾ã§ãã¾ãã
Web Audio API ã§ãã¼ãã使ãããã¨ãã§ããæ¹æ³ã¯äºéãããã¾ããã³ã³ããã¹ãèªèº«ã®ãã¡ã¯ããªã¡ã½ãã (ä¾ãã° audioContext.createGain()
) ã使ç¨ãããããã¼ãã®ã³ã³ã¹ãã©ã¯ã¿ã¼ (ä¾ãã° new GainNode()
) ã§ããããã§ã¯ãã¡ã¯ããªã¡ã½ããã使ç¨ãã¾ãã
const gainNode = audioContext.createGain();
é³å£°ã°ã©ãã以åã®ãã®ããæ´æ°ããå¿ è¦ããããå ¥åã gain ã«æ¥ç¶ãã¦ããã gain ãã¼ããåºåå ã«æ¥ç¶ãã¾ãã
track.connect(gainNode).connect(audioContext.destination);
ããã§é³å£°ã°ã©ãã¯ãã®ããã«ãªãã¾ãã
gain ã®æ¢å®å¤ã¯ 1 ã§ããããã¯ç¾å¨ã®é³éãåãã«ç¶æãã¾ãã gain ã¯æå°å¤ãããã-3.4 ã§æå¤§å¤ã¯ããã 3.4 ã§ããããã§ boombox 㯠gain ãæå¤§ 2 (å ã®é³éã®å)ãæå° 0 (çµæçã«é³å£°ããã¥ã¼ããã¾ã) ã®ç¯å²ã§åãããããã«ãã¾ãã
ã¦ã¼ã¶ã¼ããããå¶å¾¡ã§ããããã«ãã¾ãããã â range å ¥åã使ç¨ãã¾ãã
<input type="range" id="volume" min="0" max="2" value="1" step="0.01" />
ã¡ã¢: range å ¥åã¯ãé³å£°ãã¼ãã®å¤ãæ´æ°ããã®ã«å®ã«æè»½ãªå ¥ååã§ãã range ã®å¤ãé³å£°ãã¼ãã®å¼æ°ã«ç´æ¥è¨å®ãããã使ç¨ããããããã¨ãã§ãã¾ãã
ããã§ã¯ãã¦ã¼ã¶ã¼ãå¤ã夿´ããã¨ãã«å ¥åãããå¤ãåå¾ã㦠gain ã®å¤ãæ´æ°ããããã«ãã¾ãããã
const volumeControl = document.querySelector("#volume");
volumeControl.addEventListener(
"input",
function () {
gainNode.gain.value = this.value;
},
false,
);
ã¡ã¢: ãã¼ããªãã¸ã§ã¯ãã®å¤ (ä¾ãã° GainNode.gain
) ã¯åç´ãªå¤ã§ã¯ãªããå®éã«ã¯ AudioParam
åã®ãªãã¸ã§ã¯ã â ããã弿°ã¨å¼ã°ãã¦ãã¾ãããªããã¨ããã°ã GainNode.gain
ã® value
ããããã£ãè¨å®ããªããã°ãªããã gain
ãç´æ¥è¨å®ããã ãã§ã¯ãªãããã§ããããã«ãã£ã¦ã¯ããã«æè»ã«ãªããä¾ãã°ç¹å®ã®å¤ã®ã»ããã弿°ã§æ¸¡ãã¦ãä¸å®ã®æéã«ããã£ã¦å¤åãããããããã¨ãã§ãã¾ãã
ç´ æ´ããããã¦ã¼ã¶ã¼ããã©ãã¯ã®é³éãè¿½æ´æ°ã§ããããã«ãªãã¾ããããã¥ã¼ãæ©è½ã追å ãããå ´åã gain ãã¼ãã¯å®å ¨ãªãã¼ãã§ãã
ã¢ããªã«ã¹ãã¬ãªä½ç½®ã追åå¦ãã ãã¨ãç·´ç¿ããããã«ãããä¸ã¤ã®å å·¥ãã¼ãã追å ãã¦ã¿ã¾ãããã
ã¦ã¼ã¶ã¼ãã¹ãã¬ãªæ©è½ãæã£ã¦ããå ´åãå·¦å³ã®ã¹ãã¼ã«ã¼ã®éã§é³ã®ãã©ã³ã¹ã夿´ãã StereoPannerNode
ãã¼ããããã¾ãã
StereoPannerNode
ã¯ãå·¦å³éã®ã¹ãã¬ãªãã³ãè¡ãåç´ãªç¨éã®ããã®ãã®ã§ãã PannerNode
ã¨ãããã®ãããããã¡ãã¯ãã£ã¨è¤éãªå¹æãçæããããã®ã 3D 空éãé³å£°ã®ç©ºéåãªã©ã大å¹
ã«å¶å¾¡ãããã¨ãã§ãã¾ããããã¯ã²ã¼ã ã 3D ã¢ããªãªã©ã§ä½¿ç¨ãããä¾ãã°é ä¸ãé£ã¶é³¥ããã¦ã¼ã¶ã¼ã®èå¾ããèãããé³ãªã©ãçæãã¾ãã
å³ç¤ºããã¨ãé³å£°ã°ã©ãã¯æ¬¡ã®ããã«ãªãã¾ãã
ä»åã¯ãã¼ãã使ããã³ã³ã¹ãã©ã¯ã¿ã¼ã¡ã½ããã使ç¨ãã¾ãããããã®æ¹æ³ã§ã¯ãã³ã³ããã¹ãã¨ãã®ç¹å®ã®ãã¼ããåããªãã·ã§ã³ã渡ãå¿ è¦ãããã¾ãã
const pannerOptions = { pan: 0 };
const panner = new StereoPannerNode(audioContext, pannerOptions);
ã¡ã¢: ãã¼ãã使ããã³ã³ã¹ãã©ã¯ã¿ã¼ã¡ã½ããã¯ããã¾ã®ã¨ãããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å¯¾å¿ããã¦ãã訳ã§ã¯ããã¾ãããå¤ããã¡ã¯ããªã¡ã½ããã®æ¹ãããåºã対å¿ããã¦ãã¾ãã
åã ã®å¤ã®ç¯å²ã¯ -1 (ã¯ããå·¦) 㨠1 (ã¯ããå³) ã®éã§ããä»åã range åã®å ¥åã§ãã®å¼æ°ã夿´ã§ããããã«ãã¾ãããã
<input type="range" id="panner" min="-1" max="1" value="0" step="0.01" />
以åè¡ã£ãã®ã¨åãæ¹æ³ã§ããã®å ¥åããå¾ãå¤ã使ã£ã¦ãã³ã®å¤ã調æ´ãã¾ãã
const pannerControl = document.querySelector("#panner");
pannerControl.addEventListener(
"input",
function () {
panner.pan.value = this.value;
},
false,
);
ã¾ãé³å£°ã°ã©ãã調æ´ãã¦ããã¹ã¦ã®ãã¼ããäºãã«æ¥ç¶ãã¾ãããã
track.connect(gainNode).connect(panner).connect(audioContext.destination);
ã¢ããªã«è¡ãã¹ãæ®ãã®ä½æ¥ã¯ã«ã¤ãã¦ã¯ããã¡ããã Codepen ä¸ã§æçµçãªãã¢ã確èªãã¦ã¿ã¦ãã ããã
ã¾ã¨ãç´ æ´ãããï¼ boombox ãåºæ¥ä¸ãããããã¼ãããåçããããé³éãã¹ãã¬ãªä½ç½®ã調æ´ãããã§ããããã«ããããã«ãããªãåºæ¬çãªé³å£°ã°ã©ãã®ä½æ¥ãè¡ãã¾ããã
ããã¯ãé³å£°ãã¦ã§ããµã¤ããã¦ã§ãã¢ããªã«è¿½å ããããã«å§ããå¿ è¦ãããåºæ¬äºé ã®ããªãã®é¨åãæ§æãã¦ãã¾ãã Web Audio API ã«ã¯ããã«å¤ãã®æ©è½ãããã¾ããããã¼ãã®æ¦å¿µãææ¡ããé³å£°ã°ã©ããã¾ã¨ããã¨ãããè¤éãªæ©è½ãè¦ã«è¡ããã¨ãã§ãã¾ãã
ä»ã®ä¾Web Audio API ã«ã¤ãã¦ãã£ã¨å¦ã¶ãã¨ãã§ããä»ã®ä¾ãããã¾ãã
Voice-change-O-matic ã¯ã楽ããé³å£°å å·¥ããã³é³ã®è¦è¦åãè¡ãã¦ã§ãã¢ããªã§ãæ§ã ãªå¹æãè¦è¦åã鏿ãããã¨ãã§ãã¾ãããã®ã¢ããªã±ã¼ã·ã§ã³ã¯ããªãåæ©çã§ããã Web Audio API ã®è¤æ°ã®æ©è½ãåæã«ä½¿ç¨ããä¾ã示ãã¦ãã¾ãã (Voice-change-O-matic ãã©ã¤ãã§å®è¡)
ä»ã«ãç¹ã« Web Audio API ãç´¹ä»ããããã«éçºãããã¢ããªã±ã¼ã·ã§ã³ã¨ã㦠Violent Theremin ããããããã¯ãã¦ã¹ãã¤ã³ã¿ã¼ãåãããã¨ã§é³é«ãé³éã夿´ãããã¨ãã§ããã·ã³ãã«ãªã¦ã§ãã¢ããªã±ã¼ã·ã§ã³ã§ããããã¯ãµã¤ã±ããªãã¯ãªã©ã¤ãã·ã§ã¼ãæä¾ãã¾ãã (Violent Theremin ã®ã½ã¼ã¹ã³ã¼ããè¦ã)
ä»ã«ãä¾ã¨ãã¦ã¯ webaudio-examples ãªãã¸ããªãåç §ãã¦ãã ããã
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