-
Notifications
You must be signed in to change notification settings - Fork 2
/
gaussian.js
58 lines (47 loc) · 1.28 KB
/
gaussian.js
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
/**
* Is it real that gaussian shape in time domain === gaussian in spectral domain?
*
* Not sure, it is only analytically provable.
* But in practice, normally distanced gaussians are the same noise pattern.
* Probably we need some autocorrelation in generating distance?
*
* BTW sounds like a brass
*/
var Spectrum = require('audio-spectrum');
var Waveform = require('audio-waveform');
var Generator = require('audio-generator');
var Speaker = require('audio-speaker');
var rand = require('distributions-normal-random/lib/number')
var spectrum = Spectrum({
fftSize: 1024,
smoothingTimeConstant: .8
});
var waveform = Waveform({
size: 256
});
document.body.appendChild(spectrum.canvas);
document.body.appendChild(waveform.canvas);
function gaussian (x, mean, stdDev) {
if (!stdDev) return mean;
return Math.exp(- (x - mean)*(x - mean) / (2*stdDev*stdDev) );
}
var f = 100;
var T = rand(f/44100,0);
var nextPeriodTime = 0;
Generator(function (absTime) {
if (absTime > nextPeriodTime) {
nextPeriodTime += rand(f/44100,0.00005);
}
//rel time
var t = T - (nextPeriodTime - absTime);
//render gaussian
return gaussian(t, T/2, 0.0001);
//triangle
// return t/T;
})
.pipe(spectrum)
.pipe(waveform)
.on('render', function (canvas) {
console.log(canvas.toString());
})
.pipe(Speaker());