react-audio-mixer v0.4.0
React Audio Mixer
Do you need audio options in React without the fuss of dealing with contexts? Are you trying to mix a bunch of AudioNode objects together but it's hard? Do you have lots of componants trying to work together with audioNodes?
Use react-audio-mixer
to make music in your React apps!
Usage
function App() {
return (
<AudioProvider>
<MicrophoneNode
name="mic"
echoCancellation
noiseSuppression
/>
<GainNode
name="gain"
listen="mic"
gain={0.5}
/>
<SpeakerNode
listen="gain"
/>
</AudioProvider>
);
}
All nodes can be provided the following:
name?
: Name of the node or group of nodeslisten?
: Name node(s) to take data from. Not available on input nodesonNode?
: AudioNode callbackonError?
: Error handler
Some node attributes can take sequence values that correspond with AudioParam.
These are provided as an Array AudioParamSequence
in any comination of the following tuples:
setValueAtTime
:type
: 'setValue'value
: numberstartTime
: number
linearRampToValueAtTime
:type
: 'linearRamp'value
: numberendTime
: number
exponentialRampToValueAtTime
:type
: 'exponentialRamp'value
: numberendTime
: number
setTargetAtTime
:type
: 'setTarget'target
: numberstartTime
: numbertimeConstant
: number
setValueCurveAtTime
:type
: 'setValueCurve'values
: number[] | Float32ArraystartTime
: numberduration
: number
AudioProvider
Creates an audio context for this module
latencyHint?
: Context latency hintsampleRate?
: Context sample rate
useAudio default
Returns the context and status of the AudioProvider
useAudioDevices
Requests and gathers available audio media devices.
const [devices, ready] = useAudioDevices();
useAudioInputDevices
Requests and gathers available input audio media devices.
const [devices, ready] = useAudioInputDevices();
useAudioOutputDevices
Requests and gathers available output audio media devices.
const [devices, ready] = useAudioOutputDevices();
useStream
Requests a stream via MediaStreamConstraints
const constraints = useMemo(() => ({ audio: true, video: false }))
const stream = useStream(constraints);
Group Node
Scopes children in a new group
children?
: Audio NodesinputName?
(default:input
): input node nameoutputName?
(default:output
): putput node name
Microphone Node
deviceId?
: Media device idechoCancellation?
: Echo cancellationnoiseSuppression?
: Noise suppressionautoGainControl?
: Auto gain controlonStream?
: MediaStream handler
StreamIn Node
stream
: MediaProvider
Oscillator Node
type?
: Oscillator typefrequency
: FrequencyfrequencySequence?
: AudioParamSequencedetune?
: detunedetuneSequence?
: AudioParamSequencestart?
: Start timeend?
: End timeonEnded?
: Ended handler
Speaker Node
deviceId?
: Media device id
StreamOut Node
stream
: MediaStream
Null Node
A node just for pivoting on.
Gain Node
gain
: Gain valuegainSequence?
: AudioParamSequence
Analyser Node
type
:frequency
orwaveform
fftSize?
: FFT sizeinterval?
: Interval between updatesmin?
: Decibels minimummax?
: Decibels maximumfloatBuffer?
: Update with Float32ArrayonUpdate
: Update data handler
HzAnalyser Node
limit?
: Volume limitpadding?
: Gap paddingfftSize?
: FFT sizeinterval?
: Interval between updatesmin?
: Decibels minimummax?
: Decibels maximumonUpdate
: Update data handler
NoteAnalyser Node
noteList?
: Note listlimit?
: Volume limitpadding?
: Gap paddingfftSize?
: FFT sizeinterval?
: Interval between updatesmin?
: Decibels minimummax?
: Decibels maximumonUpdate
: Update data handler
Custom Node
type
: node typenode
: AudioNode
import useAudio, { CustomNode } from 'react-audio-mixer';
function SomeNode(props) {
const { name, listen, onError } = props;
const { context, ready } = useAudio();
const node = useMemo(() => {
try {
context.createDynamicsCompressor();
catch(e) {}
}, [context]);
// Do something with your node
return (
<CustomNode
name={name}
listen={listen}
type="node"
node={node}
onError={onError}
/>
);
}
Examples
PulseGain Node
function PulseGain(props) {
const { name, listen, min = 0, max = 1, interval = 2000 } = props;
const { context } = useAudio();
const [gainSequence, setGainSequence] = useState();
useEffect(() => {
const update = () => {
const now = context.currentTime;
setGainSequence([
['linearRamp', max, interval / 2000 + now],
['linearRamp', min, interval / 1000 + now],
]);
};
update();
const timer = setInterval(update, interval);
return () => {
clearInterval(timer);
};
}, [context, min, max, interval]);
return (
<GainNode
name={name}
listen={listen}
gain={min}
gainSequence={gainSequence}
/>
);
}
RandomBeeps Node
function RandomBeeps(props) {
const { name, min = 256, max = 512, length = 500, margin = 500 } = props;
const { context } = useAudio();
const [[frequency, start, end], setState] = useState([0, 0, 0]);
const updateState = useCallback((offset = 0) => {
const now = context.currentTime + offset;
setState([
min + (max - min) * Math.random(),
margin / 1000 + now,
(margin + length) / 1000 + now,
]);
}, [context, min, max, length, margin]);
useEffect(() => {
updateState(-margin / 1000);
}, [margin, updateState]);
return frequency && (
<OscillatorNode
name={name}
frequency={frequency}
start={start}
end={end}
onEnded={updateState}
/>
);
}
License
Copyright (c) 2021, Michael Szmadzinski. (MIT License)
6 months ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago