AudioWorkletProcessor: process() ã¡ã½ãã
AudioWorkletProcessor ã®æ´¾çã¯ã©ã¹ã® process() ã¡ã½ããã¯ãé³å£°å¦çå¨ã¯ã¼ã¯ã¬ããã®é³å£°å¦çã¢ã«ã´ãªãºã ãå®è£
ãã¾ãã
ãã®ã¡ã½ãã㯠AudioWorkletProcessor ã¤ã³ã¿ã¼ãã§ã¤ã¹ã«ã¯å«ã¾ãã¦ãã¾ããããAudioWorkletProcessor ã®å®è£
ã¯ãã¹ã¦ process() ã¡ã½ãããç¨æããªããã°ããã¾ããã
ãã®ã¡ã½ããã¯ãå¦çå¨ã®å¯¾å¿ãã AudioWorkletNode ã«é³å£°ããã㯠(rendering quantum ã¨ãå¼ã°ãã) ãéããã¦ãããã³ã«ãé³å£°ã¬ã³ããªã³ã°ã¹ã¬ããããåæã§å¼ã°ãã¾ãã
ããªãã¡ãæ°ããé³å£°ãããã¯ãå¦çå¨ã§å¦çå¯è½ã«ãªããã³ã«ãå¦çãããããã« process() 颿°ãå¼ã°ãã¾ãã
ã¡ã¢: ç¾å¨ãé³å£°ãã¼ã¿ãããã¯ã®é·ãã¯å¸¸ã« 128 ãã¬ã¼ã ã§ããããªãã¡ãå ¥åã®ããããã®ãã£ã³ãã«ã«ã¤ã㦠128 åã® 32 ãããæµ®åå°æ°ç¹æ°ã®ãµã³ãã«ãæ ¼ç´ããã¦ãã¾ãããããããã®ä»æ§ã夿´ããç¶æ³ã«å¿ã㦠(ãã¨ãã°ãé³å£°ãã¼ãã¦ã§ã¢ã CPU ã®ä½¿ç¨ã®å¹çããããã¯ãµã¤ãºã大ããããã¨ä¸ããå ´å) é³å£°ãããã¯ã®ãµã¤ãºãå¤ãããã¨ãã§ããããã«ããè¨ç»ããã§ã«é²è¡ä¸ã§ãããã®ãããç¹å®ã®ãµã¤ãºãä»®å®ããã®ã§ã¯ãªãã常ã«ãµã³ãã«é åã®ãµã¤ãºããã§ãã¯ããªããã°ãªãã¾ããã
ãã®ãµã¤ãºã¯æéã¨ã¨ãã«å¤ãããã¨ã許ãããå¯è½æ§ãããã®ã§ãæåã®ãããã¯ã ããè¦ã¦ãµã³ãã«ãããã¡ã¼ã®ãµã¤ãºã常ã«åãã ã¨ä»®å®ãã¦ã¯ããã¾ããã
æ§æ
process(inputs, outputs, parameters)
弿°
inputs-
ãã¼ãã«æ¥ç¶ããã¦ãã å ¥å ã®é åã§ãããã®é åã®ããããã®è¦ç´ 㯠ãã£ã³ãã« ã®é åã§ããããããã® ãã£ã³ã㫠㯠128 åã®ãµã³ãã«ãå ¥ã£ã
Float32Arrayã§ãããã¨ãã°ãinputs[n][m][i]ã¯nçªç®ã®å ¥åã®mçªç®ã®ãã£ã³ãã«ã®içªç®ã®ãµã³ãã«ã«ã¢ã¯ã»ã¹ãã¾ããããããã®ãµã³ãã«ã®å¤ã¯
[-1 .. 1]ã®ç¯å²ã§ããå ¥å ã®æ°ãããã¦ãããåæ ãããã®é åã®é·ãã¯ãã¼ãã®çææã«åºå®ããã¾ãã(
AudioWorkletNodeãåç §ãã¦ãã ãã) ãã¼ãã®nçªç®ã®å ¥åã«æ´»åä¸ã®ãã¼ããæ¥ç¶ããã¦ããªãå ´åã¯ãinputs[n]ã¯ç©ºã®é åã«ãªãã¾ãã(0 åã®å ¥åãã£ã³ãã«ãå©ç¨å¯è½ã§ã)åå ¥åã® ãã£ã³ãã« ã®æ°ã¯
channelCountããã³channelCountModeããããã£ã«ãã£ã¦å¤åããå¯è½æ§ãããã¾ãã outputs-
åºå ã®é åã§ã弿°
inputsã¨ä¼¼ãæ§é ã§ããprocess()ã¡ã½ããã®å®è¡æã«å¤ãå ¥ãããããã¨ãæå³ãã¦ãã¾ããååºåãã£ã³ãã«ã¯ã¼ãã§åæåããã¾ããããªãã¡ãåºåã®é åã夿´ããªãå ´åã¯å¦çå¨ã¯ç¡é³ãåºåãã¾ãã parameters-
æååã®ãã¼ã¨
Float32Arrayã®å¤ãæã¤ãªãã¸ã§ã¯ãã§ããparameterDescriptorsã²ãã¿ã¼ã§å®ç¾©ããç¬èªã®AudioParamããããã«ã¤ãã¦ãnameããã®ãªãã¸ã§ã¯ãã®ãã¼ã¨ãªããå¤ãFloat32Arrayã¨ãªãã¾ããé åã«æ ¼ç´ããå¤ã¯ãã¹ã±ã¸ã¥ã¼ã«ãããèªååã¤ãã³ããèæ ®ãã¦è¨ç®ããã¾ãããã©ã¡ã¼ã¿ã¼ã®èªååã¬ã¼ãã
"a-rate"ã®å ´åã¯ãé åã«ã¯ 128 åã®å¤ãæ ¼ç´ãããç¾å¨ã®é³å£°ãããã¯ã®ããããã®ãã¬ã¼ã ã«å¤ã 1 åãã¤å¯¾å¿ãã¾ããç¾å¨ã®ãããã¯ã表ãæéä¸ã«èªååãè¡ããã¦ããªãå ´åã¯ãåãå¤ã 128 åæ ¼ç´ãããããã«ããããã¯å ¨ä½ã§å¤ãããªã 1 åã®å¤ãæ ¼ç´ããããã¨ãããã¾ããèªååã¬ã¼ãã
"k-rate"ã®å ´åã¯ãé åã«ã¯ 1 åã®å¤ãæ ¼ç´ããããã®å¤ã 128 åã®ãã¬ã¼ã ããããã§ç¨ãã¾ãã
è¿å¤
ã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ãã®å
é¨ãã¸ãã¯ããã¼ããã·ã£ãããã¦ã³ãã¦ãå®å
¨ã ã¨å¤æãã¦ã AudioWorkletNode ã®æ´»åãç¶ãããã表ã Boolean å¤ãè¿ãã¾ãã
ãã®è¿å¤ã«ãããå¦çå¨ã AudioWorkletProcessor ã¨ãããææãããã¼ãã®çåæéããªã·ã¼ãå¶å¾¡ãããã¨ãã§ãã¾ãããã©ã¦ã¶ã¼ãè¿å¤ã¨ãã¼ãã®ç¶æ
ã«åºã¥ãã¦ãã¼ãã忢ããã¨å¤æããã¨ãprocess() ã¯å¼ã°ããªããªãã¾ãã
true ãè¿ããã¨ã§ãã¦ã§ããªã¼ãã£ãª API ã«ãã®ãã¼ãã®æ´»åãç¶ç¶ããããã¨ãã§ãã¾ãã
false ãè¿ãã¨ãæ°ããé³å£°ãã¼ã¿ã®çæããå¦çä¸ã®å
¥åããã®ãã¼ã¿ã®åå¾ããã¦ããªãã¨ãããã©ã¦ã¶ã¼ããã¼ããçµäºããããã¨ãã§ããããã«ãªãã¾ãã
æãããã¿ãããé³å£°ãã¼ãã®ç¨®é¡ã¨ãã¦ã以ä¸ã® 3 種é¡ãããã¾ãã
- åºåå
ããã®ãããªãã¼ããå®è£
ãã¦ãã
AudioWorkletProcessorã§ã¯ãåºåãçæãã¦ããéã¯ãã£ã¨processã¡ã½ããã¯trueãè¿ãã¹ãã§ããããåºåãçæããªãã¨ãããã¨ãããã£ããããã®ã¡ã½ããã¯ã§ããã ãããã«falseãè¿ãã¹ãã§ãããã¨ãã°ãAudioBufferSourceNodeãèãã¦ã¿ã¾ãããããã®ç¨®é¡ã®ãã¼ãã®ããã®å¦çå¨ã¯ããããã¡ã¼ã®åçä¸ã¯processã¡ã½ããã¯trueãè¿ãããããã¡ã¼ã®åçãçµãã£ããfalseãè¿ãå§ããã¹ãã§ãã(åãAudioBufferSourceNodeã§åã³playãå¼ã¶ãã¨ã¯ã§ãã¾ãã) - å
¥åã夿ãããã¼ãããã®ãããªãã¼ããå®è£
ãã¦ããå¦çå¨ã¯ãæ´»åä¸ã®å
¥åãã¼ãããã¼ãã¸ã®åç
§ãããã¨ãã¬ãã¼ã¸ã³ã¬ã¯ãã®å¯¾è±¡ã«ã§ãããã©ããã夿ã§ããããã«ããããã
processã¡ã½ããã¯falseãè¿ãã¹ãã§ãããã®æåããããã¼ãã®ä¾ã¯GainNodeã§ããæ¥ç¶ããã¦ããå ¥åãç¡ããªã£ãããããåç §ã¯æ®ã£ã¦ãã¦ããã²ã¤ã³ãé©ç¨ãã対象ãç¡ãã®ã§ãå®å ¨ã«ã¬ãã¼ã¸ã³ã¬ã¯ãã®å¯¾è±¡ã«ã§ãã¾ãã - å
¥åã夿ãããããã¼ã«ã¿ã¤ã ããããã¼ããããªãã¡ãå
¥åãåæããããæ´»åã忢 (0 åã®ãã£ã³ãã«ãçæãã) ãããããå¾ããã°ããã®éåºåãçæãããã¼ãããã®ãããªãã¼ããå®è£
ãã¦ããå¦çå¨ã¯ã(å
¥åã«å«ã¾ãããã£ã³ãã«ã 0 åã«ãªãã¨ããã«å§ã¾ã) ãã¼ã«ã¿ã¤ã ã®éã¯
processã¡ã½ããã¯trueãè¿ãã¹ãã§ãããã®ãããªãã¼ãã®ä¾ã¯DelayNodeã§ãããã®ãã¼ãã«ã¯delayTimeããããã£ã«çãã ãã¼ã«ã¿ã¤ã ãããã¾ãã
ã¡ã¢:
return æãç¡ãå ´åãã¡ã½ãã㯠undefined ãè¿ããã¨ã«ãªãã¾ããããã¯å½ã¨è§£éãããå¤ãªã®ã§ãfalse ãè¿ãã®ã¨åã广ãããã¾ãã
æç¤ºç㪠return æãçç¥ããã¨ããã¼ããè¦ã¤ãã«ããåé¡ãèµ·ããå¯è½æ§ãããã¾ãã
ä¾å¤
process() ã¡ã½ããã¯ã¦ã¼ã¶ã¼ãå®è£
ããã®ã§ãä»»æã®ä¾å¤ãæãããã¨ãã§ãã¾ãã
è£è¶³ãããªãã¨ã©ã¼ãæããããå ´åã¯ããã¼ã㯠processorerror ã¤ãã³ããçæãããã®å¾ãã£ã¨ç¡é³ãåºåãã¾ãã
ä¾
ãã®ä¾ã§ã¯ãæåã®åºåã¨ãã¦ãã¯ã¤ããã¤ãºãåºåãã AudioWorkletProcessor ã使ãã¾ããã²ã¤ã³ã¯ customGain ãã©ã¡ã¼ã¿ã¼ã§å¶å¾¡ã§ãã¾ãã
class WhiteNoiseProcessor extends AudioWorkletProcessor {
process(inputs, outputs, parameters) {
// æåã®åºåãåå¾ãã
const output = outputs[0];
// åãã£ã³ãã«ã«ã©ã³ãã å¤ã«ã²ã¤ã³ãæãããã®ãå
¥ãã
output.forEach((channel) => {
for (let i = 0; i < channel.length; i++) {
// åãµã³ãã«ç¨ã®ã©ã³ãã å¤ãçæãã
// Math.random ã®å¤å㯠[0; 1) ã ããããã§ã¯ [-1; 1] ãæ¬²ãã
// 1 ã¡ããã©ã«ã¯ãªããªãããç°¡åã®ããããã§ã¯ãã
channel[i] =
(Math.random() * 2 - 1) *
// ãã®é
åã«ã¯ãèªååãé²è¡ä¸ãã
// ããã¦èªååã¬ã¼ãã k-rate ãªã®ã a-rate ãªã®ãã«ããã
// 1 åã¾ã㯠128 åã®å¤ãæ ¼ç´ããã¦ãã
(parameters["customGain"].length > 1
? parameters["customGain"][i]
: parameters["customGain"][0]);
}
});
// ããã¯èªèº«ã§åºåãçæãã鳿ºãã¼ããªã®ã§ã
// ã¡ã¤ã³ã¹ã¬ããããåç
§ããã¦ããªãã¦ãã
// ééã£ã¦ã¬ãã¼ã¸ã³ã¬ã¯ããããªãããã« true ãè¿ã
return true;
}
// process ã¡ã½ããã§ç¨ãã customGain ãã©ã¡ã¼ã¿ã¼ãå®ç¾©ãã
static get parameterDescriptors() {
return [
{
name: "customGain",
defaultValue: 1,
minValue: 0,
maxValue: 1,
automationRate: "a-rate",
},
];
}
}
仿§æ¸
| 仿§æ¸ |
|---|
| Web Audio API > # process > |
ãã©ã¦ã¶ã¼ã®äºææ§
ããã¯ãã©ã¦ã¶ã¼ãæä¾ããã¡ã½ããã§ã¯ãªããã¯ã©ã¤ã¢ã³ãã³ã¼ãã§æ¸ãå¿ è¦ãããã³ã¼ã«ããã¯ã¡ã½ããã§ãã