Visualizer
Euterpe Visualizer is a unique audio visual library for the web. Using SVG elements instead of canvas, it allows to leverage the power of GPU to do the actual drawing, unlike canvas, which is purely cpu. It is fully customizable with build parameters and through CSS, as the visuals are just <path>
elements that update every frame.
How to use
This library relies on AudioContext API, especially on AnalyserNode. To use the Visualizer without our player, first we need to create an AudioContext, from which we can create and connect an AnalyserNode:
import { AudioVisualBuilder, SmoothingAlgorythm, ShapeType } from "@euterpe/visualizer"
const audio_element = document.querySelector("#audio") as HTMLAudioElement
const audio_context = new AudioContext()
const track = audio_context.createMediaElementSource(audio_element)
const analyzer = audio_context.createAnalyser()
track.connect(analyzer).connect(audio_context.destination)
Now that the AudioContext is ready, we start constructing our Visualizer
const visualizer = new AudioVisualBuilder(analyser_node, document.querySelector("#canvas") as SVGSVGElement)
.build(ShapeType.Circle)
And it's ready! Once the audio context starts playing, the visualizer should start generating the path inside our SVG element.
visualizer.draw()
audio_element.play()
This is a minimal setup, and more options during the build process are recommended. Especially the .set_fft_data_tresholds()
method, as each setting affects another. There's really no scientific method to this for now unfortunately, so some trial and error will be necessary.
How to use with Euterpe Player
Full demo on how to use together with Euterpe player at github.
First we need to create our Euterpe Player
import { MusicPlayerBuilder } from "@euterpe/player";
import { AudioVisualBuilder, SmoothingAlgorythm, ShapeType } from "@euterpe/visualizer"
const audio_el = document.querySelector("#audio") as HTMLAudioElement
const music_player_builder = MusicPlayerBuilder(audio_el)
music_player_builder.start()
const analyzer_node = music_player_builder.add_analyser()
const music_player = music_player_builder.build()
Now that the AudioContext is ready, we start constructing our Visualizer
const visual_builder = new AudioVisualBuilder(analyzer_node, document.querySelector("#canvas") as SVGSVGElement)
.set_fft_size(8192)
.set_fft_data_tresholds({ to_fft_range_i: 3, point_count_i: 40, fft_multiplier_i: 1.5, fft_offset_i: 150 })
.set_fft_time_smoothing(0.6)
.set_smoothing_algorythm(SmoothingAlgorythm.CatmullRom)
const visualizer = visual_builder.build(ShapeType.Circle)
And it's ready! Once the audio context starts playing, the visualizer should start generating the path inside our SVG element.
visualizer.draw()
music_player.try_new_song(url)
.then( music_player.try_play()
.then(
console.log("It's working!")
)
)