-
Notifications
You must be signed in to change notification settings - Fork 2
/
js-audio-advanced.html
173 lines (150 loc) · 6.92 KB
/
js-audio-advanced.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
<!DOCTYPE html>
<html>
<head>
<meta name="author" content="Jiwon Shin">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css?family=Lato:100,100i,300,300i,400,400i,700,700i,900,900i" rel="stylesheet">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
<link rel="stylesheet" href="css/style.css">
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.16/p5.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.16/addons/p5.dom.min.js"></script>
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
<title>Javascript with Audio | Advanced</title>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-110518171-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-110518171-1');
</script>
</head>
<body>
<div class="mdl-layout mdl-js-layout mdl-layout--fixed-header">
<main class="mdl-layout__content">
<div class="page-content">
<div class="full-page-content">
<h4>Javascript with Audio using <b>AudioContext</b></h4>
<p>AudioContext is a javascript object that allows you to access the actual data of the audio on the web. Using AudioContext, you can get the frequency data in relative to time of the audio element as well as get amplitudes of frequency bands. You can also control panning of the sound as well as apply other effects to the audio data that alter the overall sound.</p>
<iframe height="500" src="js-audio-analyser.html"></iframe>
<p><u><a class="p-link" href="js-audio-analyser.html">Click to view it as a full web page.</a></u></p>
<h5>Attaching AudioContext to an <audio> Tag</h5>
<p></p>
<pre>
<audio id="audio" loop controls preload="auto">
<source src="audio/1.mp3" type="audio/mpeg">
</audio>
</pre>
<pre>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
</pre>
<pre>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var audioElement = document.getElementById('audio');
var audioSource = audioCtx.createMediaElementSource(audioElement);
audioSource.connect(audioCtx.destination);
</pre>
<h5>Creating Audio Stream (Microphone Input) and Attaching Audio Context</h5>
<pre>
<audio id="audio" loop controls preload="auto"></audio>
</pre>
<pre>
var audioElement = document.getElementById('audio');
navigator.mediaDevices.getUserMedia({audio: true}).then(function(stream){
audioElement.srcObject = stream;
}).catch(function(err){
console.log(err);
});
</pre>
<pre>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
navigator.mediaDevices.getUserMedia({audio: true}).then(function(stream){
var streamSource = audioCtx.createMediaStreamSource(stream);
streamSource.connect(audioCtx.destination);
}).catch(function(err){
console.log(err);
});
</pre>
<h5>Analysing Sound</h5>
<p class="p-head"><u>Spectrum</u>: Amplitudes of Frequency Bands</p>
<pre>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var audioElement = document.getElementById('audio');
var audioSource = audioCtx.createMediaElementSource(audioElement);
var analyser = audioCtx.createAnalyser();
var bufferLength = analyser.frequencyBinCount;
var spectrumArray = new Uint8Array(bufferLength);
audioSource.connect(analyser);
analyser.connect(audioCtx.destination);
</pre>
<pre>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
navigator.mediaDevices.getUserMedia({audio: true}).then(function(stream){
var streamSource = audioCtx.createMediaStreamSource(stream);
var analyser = audioCtx.createAnalyser();
var bufferLength = analyser.frequencyBinCount;
var spectrumArray = new Uint8Array(bufferLength);
streamSource.connect(analyser);
analyser.connect(audioCtx.destination);
}).catch(function(err){
console.log(err);
});
</pre>
<pre>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var audioElement = document.getElementById('audio');
var audioSource = audioCtx.createMediaElementSource(audioElement);
var analyser = audioCtx.createAnalyser();
var bufferLength = analyser.frequencyBinCount;
var spectrumArray = new Uint8Array(bufferLength);
audioSource.connect(analyser);
analyser.connect(audioCtx.destination);
setInterval(function(){
analyser.getByteFrequencyData(spectrumArray);
}, 50);
</pre>
<p class="p-head"><u>Waveform</u>: Frequency over Time</p>
<pre>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var audioElement = document.getElementById('audio');
var audioSource = audioCtx.createMediaElementSource(audioElement);
var analyser = audioCtx.createAnalyser();
//to save waveform data
var waveArray = new Float32Array(analyser.fftSize);
audioSource.connect(analyser);
analyser.connect(audioCtx.destination);
</pre>
<pre>
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var audioElement = document.getElementById('audio');
var audioSource = audioCtx.createMediaElementSource(audioElement);
var analyser = audioCtx.createAnalyser();
//to save waveform data
var waveArray = new Float32Array(analyser.fftSize);
audioSource.connect(analyser);
analyser.connect(audioCtx.destination);
setInterval(function(){
analyser.getFloatTimeDomainData(waveArray);
}, 50);
</pre>
</div>
<footer class="mdl-mini-footer">
<div class="mdl-mini-footer__left-section">
<ul class="mdl-mini-footer__link-list">
<li><u><a class="p-link" href="index.html" target="_self">BACK TO MAIN</a></u></li>
</ul>
</div>
<div class="mdl-mini-footer__right-section">
<ul class="mdl-mini-footer__link-list">
<li>Workshops By <u><a class="p-link" href="http://jiwonshin.com" target="_blank">Jiwon Shin</a></u></li>
</ul>
</div>
</footer>
</div>
</main>
</div>
</body>
<script src="js/background.js"></script>
</html>