UNPKG

react-sound-visualizer

Version:

A lightweight wrapper for the sound-visualizer library

127 lines (92 loc) 6.55 kB
# react-sound-visualizer ## Description This library acts as a lightweight React wrapper for [sound-visualizer](https://github.com/ej-shafran/sound-visualizer). You can check it out by visiting [the codesandbox](https://codesandbox.io/s/react-sound-visualizer-demo-gi8uhd). ## Getting Started ### Installation ```bash npm install react-sound-visualizer ``` ### Usage You'll mainly want to use the `Visualizer` component (you can see more documentation for it below): ```tsx import { useEffect, useState } from 'react'; import { Visualizer } from 'react-sound-visualizer'; function App() { const [audio, setAudio] = useState<MediaStream | null>(null); useEffect(() => { navigator.mediaDevices .getUserMedia({ audio: true, video: false, }) .then(setAudio); }, []); return ( <Visualizer audio={audio}> {({ canvasRef, stop, start, reset }) => ( <> <canvas ref={canvasRef} width={500} height={100} /> <div> <button onClick={start}>Start</button> <button onClick={stop}>Stop</button> <button onClick={reset}>Reset</button> </div> </> )} </Visualizer> ); } export default App; ``` If you need even more control over the visualization, the `useVisualizer` hook (used by `Visualizer` behind the scenes) is also exported. ## Documentation ### Components #### Visualizer ##### Props | **Prop** | **Type** | **Default** | **Explanation** | | |-----------------|--------------------------------------------|----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---| | **audio** | `MediaStream \| null` | | The audio to visualize. Can be `null` since usually that's how your state will be initialized, but note that the functions will not be defined while it is `null`. | | | **children** | `React.FC` | | See **Types** section below. | | | **mode** | `"current" \| "continuous"` | `"continuous"` | The visualizer version to use. You can check out the [sound-visualizer](https://github.com/ej-shafran/sound-visualizer) docs to learn more about what each version means. | | | **lineWidth** | `number \| "thin" \| "thick" \| "default"` | `"default"` | The width of each line drawn onto the canvas for the visualization. If a thickness string is provided, it will be translated into a percentage of the canvas's width; if a number is provided it will be used a `px` value. | | | **strokeColor** | `string` | `"#000"` | The color of each line drawn onto the canvas for the visualization. | | | **autoStart** | `boolean` | `false` | When set to `true`, the `start` function will be called as soon as the `audio` is available. | | | **slices** | `number` | `100` | The number of slices drawn onto the canvas to make up the wave. *Only available as a prop when `mode` is `"continuous"`* | | | **heightNorm** | `number` | `1` | A number used to normalize the height of the wave; the wave function is multiplied by this number, so a number larger than 1 will exaggerate the height of the wave, while a number between 0 and 1 will minimize it. *Only available as a prop when `mode` is `"current"`* | | ### Hooks #### useVisualizer ```typescript export function useVisualizer( audio: MediaStream | null, canvas: HTMLCanvasElement | null, options?: UseVisualizerOptions ): Partial<VisualizerFunctions>; ``` The `useVisualizer` hook acts as a simple wrapper for both the `currentVisualizer` and `continuousVisualizer` functions from `sound-visualizer`, which allows the user to pass `null` for the `audio` and `canvas` parameters and returns an empty object if `null` is passed for either. It also wraps the `VisualizerFunctions` that are returned in a `useMemo` hook. (*Note:* if you would rather not use a memo, you can directly use the `visualizerWrapper` function) ### Types #### VisualizerChildrenProps ```typescript export interface VisualizerChildrenProps { canvasRef: (canvas: HTMLCanvasElement) => void; start?: () => void; stop?: () => void; reset?: () => void; } ``` The `Visualizer`'s `children` prop must be a function that returns a `ReactNode`. The `canvasRef` must be passed as the `ref` prop to an HTML `canvas` element, *or else the visualizer will not draw anything!* #### UseVisualizerOptions ```typescript export type UseVisualizerOptions = | { mode: "current" } & DrawCurrentOptions | { mode?: "continuous" & DrawContinuousOptions ``` Where `DrawCurrentOptions` and `DrawContinuousOptions` are the types from `sound-visualizer`. ## Notes The `visualizerWrapper` function, used internally by `useVisualizer`, is exposed for convenience.