euterpe-source/packages/player/README.md

76 lines
2.8 KiB
Markdown
Raw Permalink Normal View History

2023-05-21 22:10:41 +00:00
# Euterpe.js Player
A simple, safe AudioContext web music player.
### How to use
##### Full demo at [github link](https://github.com/euterpe-js/euterpe-source/tree/master/packages/player-web-test)
All we need to do is import the player builder and build it
```ts
2023-05-21 22:10:41 +00:00
import { MusicPlayerBuilder } from "@euterpe/player";
const audio_el = document.querySelector("#audio")
const music_player_builder = MusicPlayerBuilder(audio_el)
// Builder allows for attaching custom nodes if necessary, eg.
const panning_node = music_player_builder.add_stereo_panner_node()
panning_node.pan.value = -0.4
const wave_shaper_node = music_player_builder.add_wave_shaper_node()
waves_shaper_node.oversample = '4x'
const music_player = music_player_builder.build()
//Next we add a song URL to the Audio Element,
music_player.try_new_song(encodeURI("my_song.ogg"))
//and wait for the user input to resume the AudioContext
document.querySelector("#play")?.addEventListener("click", () => {
music_player.try_play()
.then(
//Easily follow up with what to do next
() => { console.log("Playing!") },
(e) => alert("Failed to play, " + e)
)
})
2023-05-21 22:10:41 +00:00
```
2023-05-21 22:10:41 +00:00
It's quite easy to give user the control in UI
```ts
2023-05-21 22:10:41 +00:00
// Play when user clicks a <button></button>
document.querySelector("#play-button")?.addEventListener("click", () => {
music_player.try_play()
2023-05-21 22:10:41 +00:00
.then(() => { console.log("Playing!") }, (e) => alert("Failed to play, " + e))
})
// Mute when user clicks another <button></button>
document.querySelector("#mute")?.addEventListener("click", () => {
music_player.mute()
})
// Easily give volume control via <input type="range" min="0" max="1" value="1" id="volume" step="0.01">
document.querySelector("#volume")?.addEventListener("input", (e) => {
music_player.change_volume(e.target?.valueAsNumber)
})
```
Euterpe Player also provides functions to easily track the status of playback. It does this via Subscription/Publisher pattern which publishes every frame ( Using `requestAnimationFrame()`). This allows for always up todate values reflecting on the UI.
```ts
2023-05-21 22:10:41 +00:00
// Subscriptions to AudioContext changes, eg. time..
2023-06-12 15:50:33 +00:00
music_player.on_duration_formatted((time) => {
2023-05-21 22:10:41 +00:00
//time == "4:53, "15:59", "1756:15:59"...
document.querySelector("#duration-text").innerHTML = time
//duration but in "0","1.2", "1223.21668181"... format
document.querySelector("#input-seek-range").max = "" + music_player.get_current_duration()
})
//Keep the current time uptodate but formatted.
2023-06-12 15:50:33 +00:00
music_player.on_time_tick_formatted((time) => {
2023-05-21 22:10:41 +00:00
//time == "2:52", "10:59:59"...
document.querySelector("#current-text").innerHTML = time
})
//Keep <input type="range"..> slider uptodate
2023-06-12 15:50:33 +00:00
music_player.on_time_tick((time) => {
2023-05-21 22:10:41 +00:00
//time == "0","1.2", "1223.21668181"...
document.querySelector("#input-seek-range").value = "" + time
})
```