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

質問編集履歴

1

質問に不要な情報を修正し読みやすくしました。

2021/06/14 04:24

投稿

707
707

スコア1

title CHANGED
File without changes
body CHANGED
@@ -1,109 +1,18 @@
1
- 以下の条件を満たすことは可能でしょうか?それは、どのように書けばよいのでしょうか?
1
+ 以下の条件を満たすことは可能でしょうか?
2
-
3
2
  [1]HTMLファイルに音声データをJavaScriptで直接書く
4
3
  [2][1]のデータを参照してHTML Audioで音声を再生する
5
-
6
- 私は、この条件を満たすために、以下のように書きましたが、うまくいきませんでした。
7
-
8
4
  ```html
9
- <html><head><title>SquareWaveTest</title><head>
10
-
11
- <body>
12
-
13
- <script>
14
-
15
- function square_wav_440hz(){
5
+ function audio1(){
16
6
  let bf = new ArrayBuffer(448);
17
7
  let dv = new DataView(bf);
18
- let ad = 1;
19
- for ( let i = 0; i < 44; i++ ) {
8
+ // 音声データを書く
20
- dv.setUint8(i, parseInt("00", 16));
21
- }
22
- dv.setUint8(0, parseInt("52", 16));
23
- dv.setUint8(1, parseInt("49", 16));
24
- dv.setUint8(2, parseInt("46", 16));
25
- dv.setUint8(3, parseInt("46", 16));
26
- dv.setUint8(4, parseInt("10", 16));
27
- dv.setUint8(5, parseInt("02", 16));
28
- dv.setUint8(8, parseInt("57", 16));
29
- dv.setUint8(9, parseInt("41", 16));
30
- dv.setUint8(10, parseInt("56", 16));
31
- dv.setUint8(11, parseInt("45", 16));
32
- dv.setUint8(12, parseInt("66", 16));
33
- dv.setUint8(13, parseInt("6D", 16));
34
- dv.setUint8(14, parseInt("74", 16));
35
- dv.setUint8(15, parseInt("20", 16));
36
- dv.setUint8(16, parseInt("10", 16));
37
- dv.setUint8(20, parseInt("01", 16));
38
- dv.setUint8(22, parseInt("02", 16));
39
- dv.setUint8(24, parseInt("44", 16));
40
- dv.setUint8(25, parseInt("AC", 16));
41
- dv.setUint8(28, parseInt("10", 16));
42
- dv.setUint8(29, parseInt("B1", 16));
43
- dv.setUint8(30, parseInt("02", 16));
44
- dv.setUint8(32, parseInt("04", 16));
45
- dv.setUint8(34, parseInt("10", 16));
46
- dv.setUint8(36, parseInt("64", 16));
47
- dv.setUint8(37, parseInt("61", 16));
48
- dv.setUint8(38, parseInt("74", 16));
49
- dv.setUint8(39, parseInt("61", 16));
50
- dv.setUint8(40, parseInt("94", 16));
51
- dv.setUint8(41, parseInt("01", 16));
52
- ad = 44;
53
- for ( let i = 0; i < 102; i++ ) {
54
- dv.setUint8(ad, parseInt("27", 16));
55
- ad = ad + 1;
56
- dv.setUint8(ad, parseInt("40", 16));
57
- ad = ad + 1;
58
- }
59
- for ( let i = 0; i < 100; i++ ) {
60
- dv.setUint8(ad, parseInt("D9", 16));
61
- ad = ad + 1;
62
- dv.setUint8(ad, parseInt("BF", 16));
63
- ad = ad + 1;
64
- }
65
9
  let blob = new Blob([bf], {type: "audio/wav"}),
66
10
  bloburl = window.URL.createObjectURL(blob);
67
11
  return bloburl;
68
12
  };
69
- let url = square_wav_440hz();
13
+ let url=audio1();
70
- let square_wav = new Audio();
14
+ let audio2=new Audio();
71
- square_wav.src = "url";
15
+ audio2.src = "url";
72
- square_wav.loop = true;
16
+ audio2.loop = true;
73
-
74
- </script>
75
-
76
- <button onclick="square_wav.play()"> Square wave </button>
77
-
78
- <!--上記のボタンをクリックすると以下のエラーメッセージが返ってきます。
79
- Uncaught (in promise) DOMException: The media resource indicated by the src attribute or assigned media provider object was not suitable.
80
- -->
81
-
82
- <audio src="url" type="audio/wav" loop="true" controls>
83
- </audio>
84
-
85
- <!--上記だとエラーメッセージは返ってきませんが、コントロールの再生ボタンをクリックしても音が鳴りません。-->
86
-
87
- <audio src="square.wav" type="audio/wav" loop="true" controls>
88
- </audio>
89
-
90
- <!--上記はコントロールの再生ボタンのクリックで音が鳴ります。これは正しいパスに正しい音声ファイルのsquare.wavが存在するためです。-->
91
-
92
- </body>
93
-
94
- </html>
95
17
  ```
96
-
97
- おそらく、square_wav_440hz()自体は正常に音声ファイルを生成しています。
98
-
99
- それは、square_wav_440hz()で取得したurlをダウンロードし、square.wavとコンペアした結果が同一の内容だったからです。
100
-
101
- また、このバッファはWebAudioAPI経由であれば問題なく再生されました。
102
-
103
- 私は、エラーメッセージにもあるように、srcに指定しているものが正しくないのが原因だと考え、FetchやXMLHttpRequestなどの正しい使い方を学習している途中なのですが、
104
-
105
- 「そもそもこの条件を満たすことは可能なのか?」
106
-
107
- という疑問を払拭できず、こちらで質問させていただくに至りました。
108
-
109
- もしご存知の方いらっしゃいましたら、よろしくお願いいたします
18
+ よろしくお願いします