export interface AudioVisualizerProps { | |
type: "agent" | "user" | |
frequencies: Float32Array[] | |
gap: number | |
barWidth: number | |
minBarHeight: number | |
maxBarHeight: number | |
borderRadius: number | |
} | |
export default function AudioVisualizer(props: AudioVisualizerProps) { | |
const { | |
frequencies, | |
gap, | |
barWidth, | |
minBarHeight, | |
maxBarHeight, | |
borderRadius, | |
type, | |
} = props | |
const summedFrequencies = frequencies.map((bandFrequencies) => { | |
const sum = bandFrequencies.reduce((a, b) => a + b, 0) | |
if (sum <= 0) { | |
return 0 | |
} | |
return Math.sqrt(sum / bandFrequencies.length) | |
}) | |
return ( | |
<div | |
className={`flex items-center justify-center`} | |
style={{ gap: `${gap}px` }} | |
> | |
{summedFrequencies.map((frequency, index) => { | |
const style = { | |
height: | |
minBarHeight + frequency * (maxBarHeight - minBarHeight) + "px", | |
borderRadius: borderRadius + "px", | |
width: barWidth + "px", | |
transition: | |
"background-color 0.35s ease-out, transform 0.25s ease-out", | |
// transform: transform, | |
backgroundColor: type === "agent" ? "#0888FF" : "#EAECF0", | |
boxShadow: type === "agent" ? "0 0 10px #EAECF0" : "none", | |
} | |
return <span key={index} style={style} /> | |
})} | |
</div> | |
) | |
} | |