teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コールバック関数が呼び出されるイメージ画像を追加

2020/03/17 00:36

投稿

mozukichi
mozukichi

スコア57

answer CHANGED
@@ -12,6 +12,8 @@
12
12
 
13
13
  が実行されるタイミングで、`synth`関数の第3引数で`undefined`が渡され、意図しない結果となっていると思われます。
14
14
 
15
+ ![コールバック関数が呼び出されるイメージ](3cc06c85c9bb38107ca431686d335677.png)
16
+
15
17
  # 対処方法
16
18
 
17
19
  `fetchAsAudioBuffer`関数に渡しているコールバック関数が実行されるタイミングで`AudioBuffer`が得られているので、このタイミングで`synth`関数を呼び出すことで、とりあえずの対処ができそうです。

1

プログラムの修正例を追記

2020/03/17 00:36

投稿

mozukichi
mozukichi

スコア57

answer CHANGED
@@ -16,4 +16,18 @@
16
16
 
17
17
  `fetchAsAudioBuffer`関数に渡しているコールバック関数が実行されるタイミングで`AudioBuffer`が得られているので、このタイミングで`synth`関数を呼び出すことで、とりあえずの対処ができそうです。
18
18
 
19
- `synth`関数の第4引数に、`AudioContext.createGain()`で得られた`GainNode`のオブジェクトを渡しているので、`fetchAsAudioBuffer`関数を呼び出す前に、`GainNode`のオブジェクトを得ておく必要があります。
19
+ `synth`関数の第4引数に、`AudioContext.createGain()`で得られた`GainNode`のオブジェクトを渡しているので、`fetchAsAudioBuffer`関数を呼び出す前に、`GainNode`のオブジェクトを得ておく必要があります。
20
+
21
+ ```JavaScript
22
+ (略)
23
+ :
24
+ const sound = {};
25
+ let instrument;
26
+ sound.volume = ctx.createGain(); // 先に sound.volume の GainNode を作っておく
27
+ fetchAsAudioBuffer(ctx, 'Myaudio.wav', function(audioBuffer) {
28
+ instrument = audioBuffer;
29
+ synth(ctx, ctx.currentTime, instrument, sound.volume);
30
+ });
31
+ :
32
+ (略)
33
+ ```