-
Notifications
You must be signed in to change notification settings - Fork 70
Expand file tree
/
Copy pathimpulse.js
More file actions
37 lines (30 loc) · 1.13 KB
/
impulse.js
File metadata and controls
37 lines (30 loc) · 1.13 KB
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
// Dirac impulse — single-sample click for impulse response testing.
// Run: node examples/impulse.js 5 0.5s
// Run: node examples/impulse.js count=3 interval=1s
// Keys: space pause · f fire impulse · q quit
import { AudioContext } from 'web-audio-api'
import { args, sec, keys, clearLine } from './_util.js'
let { pos, $ } = args()
let nums = pos.filter(t => /^\d/.test(t))
let count = +(nums[0] || $('count', 1))
let interval = sec(nums[1] || $('interval', '0.5'))
let ctx = new AudioContext()
await ctx.resume()
let buf = ctx.createBuffer(1, 1, ctx.sampleRate)
buf.getChannelData(0)[0] = 1
let fire = () => {
let src = ctx.createBufferSource()
src.buffer = buf
src.connect(ctx.destination)
src.start()
}
let t = ctx.currentTime
for (let i = 0; i < count; i++) {
let src = ctx.createBufferSource()
src.buffer = buf
src.connect(ctx.destination)
src.start(t + i * interval)
}
keys({ f: fire }, () => { clearLine(); ctx.close() }, ctx)
console.log(`${count} impulse(s), ${interval}s interval space pause · f fire · q quit`)
setTimeout(() => { clearLine(); ctx.close(); process.exit(0) }, ((count - 1) * interval + 0.5) * 1000)