This module abstracts away the logic needed to record audio in your browser. Since it's based on the Chnl module, a lot of effects can be added to the input. For information about this aspect just have a look a the documentation of Chnl. You can treat any Recordy-instance as a Chnl, because Recordy is extending Chnl. To record the input, I'm using a fork of the popular recorder.js library from Matt Diamond, wrecorder, which allows us to record the output of WebAudio-nodes. Big thanks for this awesome work!
Attention: Since the webaudio-effect-unit has reached v.1.1.0, the way how the effects work has changed. Have a look at it's repository for more details. Make sure to do this BEFORE you update. If you have difficulties or questions, just open an issue! I am always glad if I can help. 😄
The package is hosted on npm. You can consume it with any package manager supporting npm packages.
npm i recordy -S
new Recordy(audioCtx)
To create a Recordy-instance, you have to pass exactly one argument to the constructor: an AudioContext object. Now, you can request audio input(have a look at the example for more information).
.getInput()
This method needs to be executed before you can start recording. It asynchronously requests audio input. So the return value is a Promise, which returns a boolean value. This value evaluates to true if the request for the microphone/audio-input was successfully and to false if it wasn't.
.startRecording()
This method is really self-explanatory. Recody will record until you call the .stopRecording(...) method.
.stopRecording(asAudioObject)
This methods stops a previously started recording. It accepts exactly one parameter: a boolean. If this boolean evaluates to true, this method will return a Promise which returns an Audio-object with the recorded track. Otherwise, it returns a Promise which returns the plain binary data(blob) of the recorded track.
.toSpeaker(gainValue)
Recordy allows you to directly output the audio-input to the speakers, so you could directly hear the effects you apply etc. The method accepts exactly one parameter: The volume of the output. This can be a number from 0 - 1. If you set a value of 0 it's muted, if you set a value of 1 it's the maximal possible volume. ATTENTION: Due to the lack of support of advanced and latency-free audio protocols like ASIO(...) in the actual browsers, there's a quite high latency between input and output (it's clearly noticeable). Therefore, it's muted by default.
This is a simple example which records an one second long track. The track gets returned as an Audio-object so it can be directly played. Also, the input is directly outputted to the speakers with a gain of 0.4. In addition, some functionality of the Chnl module was applied: The bitcrusher effect was enabled.
const audioCtx = new AudioContext();
const r = new Recordy(audioCtx);
r.getInput()
.then(val => {
r.startRecording();
window.setTimeout(() => {
r.stopRecording(true)
.then(audio => {
audio.play();
});
}, 1000);
r.toSpeaker(0.4);
r.effects.bitcrusher.enable();
});