-
Notifications
You must be signed in to change notification settings - Fork 2
/
test.js
84 lines (79 loc) · 1.84 KB
/
test.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
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
var test = require('tape')
var generateAudio = require('ndsamples-generate')
var through = require('through2')
var almostEqual = require('almost-equal')
var range = require('lodash.range')
var fract = require('fract')
var audioRms = require('./')
test('rms of generated waves', function (t) {
var testsPerFixture = 4
var freq = 440
// fixtures taken from https://en.wikipedia.org/wiki/Root_mean_square
var fixtures = [
[ // constant
function constant (t) {
return 1
},
1
],
[ // sine wave
function sine (t) {
return Math.sin(2 * Math.PI * freq * t)
},
1 / Math.sqrt(2)
],
[ // square wave
function square (t) {
return fract(freq * t) > 0.5 ? 1 : -1
},
1
],
[ // modified square wave
function modifiedSquare (t) {
var n = fract(freq * t)
if (n < 0.25) {
return 0
} else if (n < 0.50) {
return 1
} else if (n < 0.75) {
return 0
} else {
return 1
}
},
1 / Math.sqrt(2)
],
[ // triangle wave
function triangle (t) {
return Math.abs(2 * fract(freq * t) - 1)
},
1 / Math.sqrt(3)
],
[ // sawtooth wave
function sawtooth (t) {
return 2 * fract(freq * t) - 1
},
1 / Math.sqrt(3)
]
]
t.plan(fixtures.length * testsPerFixture)
fixtures.forEach(function (fixture) {
var seen = 1
generateAudio({
fn: fixture[0]
})
.pipe(audioRms())
.pipe(through.obj(function (rms, enc, cb) {
var actual = rms.data[0]
var expected = fixture[1]
t.ok(
almostEqual(actual, expected, 0.01),
fixture[0].name + " expected rms: " + expected + "; actual: " + actual
)
if (seen < testsPerFixture) {
seen++
cb()
}
}))
})
})