regl-audio
v1.1.0
Published
Audio helper functions for regl
Downloads
2
Maintainers
Readme
regl-audio
Tools for working with audio in regl. This module has the following components:
- An analyser
- A microphone connection
Examples:
Examples
Here is a simple beat detector:
const regl = require('regl')()
const drawBeats = regl({
vert: `
precision highp float;
attribute vec2 position;
varying vec2 uv;
void main () {
uv = position;
gl_Position = vec4(position, 0, 1);
}
`,
frag: `
precision highp float;
varying vec2 uv;
uniform float beats[16];
void main () {
float intensity = 0.0;
float bin = floor(8.0 * (1.0 + uv.x));
for (int i = 0; i < 16; ++i) {
if (abs(float(i) - bin) < 0.25) {
intensity += step(0.25 * abs(uv.y), beats[i]);
}
}
gl_FragColor = vec4(intensity, 0, 0, 1);
}
`,
attributes: {
position: [
-4, 0,
4, 4,
4, -4
]
},
count: 3
})
require('regl-audio/microphone')({
regl,
beats: 16,
name: '',
done: (microphone) => {
regl.frame(() => {
microphone(({beats}) => {
drawBeats()
})
})
}
})
regl-audio/analyser
This module takes a WebAudio analyser node and returns a scope command giving convenient access to stats from the analyser.
- PCM time domain data
- STFT frequency domain data
- Beats
- Pitch
API
const audio = require('regl-audio/analyser')(options)
The constructor for the analyser takes the following arguments:
| Parameter | Description | Default |
|-----------|-------------|---------|
| regl
| A handle to a regl instance | Required |
| analyser
| A WebAudio analyser node | Required |
| name
| A prefix for the analyser output. | ''
|
| sampleRate
| The sample rate of the audio source in Hz | 44100
|
| beats
| The number of beats to detect grouped by pitch | 16
|
| beatTime
| Duration of moving average for beats in seconds | 1
|
| beatThreshold
| Cutoff for beat detection (must be between 0.5 and 1) | 0.8
|
| pitches
| Number of pitches to detect | 4
|
| maxPitch
| Maximum detectable pitch in Hz | 10000
|
| pitchTime
| Duration of moving average for pitch in seconds | 0.25
|
| tempo
| Initial guess of tempo for song in beats per second | 100/60
|
| maxTempo
| Number of tempo bins to count up to | binSize / 4
|
| tempoBufferSize
| Number of samples to compute tempo from | 4096
|
audio(block)
The result is a regl
scope command with the following properties:
| Context | Description |
|---------|-------------|
| sampleCount
| Number of samples |
| freq
| Array of frequencies |
| time
| Array of PCM time samples |
| cepstrum
| The cepstrum of the signal |
| timeTexture
| Current time information in texture |
| freqTexture
| Current frequency information in texture |
| volume
| Volume of the current signal |
| beats
| Array of detected beats sorted from low to high pitch. Each beat is a scalar in [0, 1]
|
| pitches
| Array of detected pitches sorted from loudest to softest in Hz |
| Uniform | Type | Description |
|---------|------|-------------|
| sampleCount
| float
| Number of samples in texture |
| time
| sampler2D
| A sampler storing the PCM time data |
| freq
| sampler2D
| A sampler storing the frequency data |
| volume
| float
| Volume of the signal |
| beats
| float[NUM_PITCHES]
| An array of beats |
| pitches
| float[NUM_PITCHES]
| The array of detected pitches |
| tempo
| float
| Tempo of song |
Note that these context variables are optionally prefixed depending on the name
parameter.
regl-audio/microphone
A short cut which gives you an analyser node connected to the microphone input from the computer. Note that this must be run on a secure domain.
API
const mic = require('regl-audio/microphone')(options)
The options are the same as above, except that it takes a webaudio context via the options.audioContext
parameter instead of an analyser node. By default everything is prefixed with mic_
though this can be changed by passing some alternative to name
.
License
(c) 2016 Mikola Lysenko. MIT License