npm.io
3.1.1 • Published 2 weeks ago

vue-audio-visual

Licence
MIT
Version
3.1.1
Deps
2
Size
152 kB
Vulns
0
Weekly
0

vue-audio-visual

Node.js CI codecov Codacy Badge MIT npm

Vue HTML5 audio visualization components

UPDATE NOTES

The current plugin version is compatible only with Vue v3. For Vue 2, use plugin version 2.5.1. See the install section for details.

Overview

An audio spectrum visualizer plugin for VueJS framework. It is built with HTML5 Web Audio API and compatible with all browsers that support the HTML5 audio API. It provides several Vue components that let you draw lightweight, attractive visualizations for audio HTML elements.

Visit DEMO page for working examples.

Usage examples:

Component AvLine. Vue template name <av-line>

<av-line :line-width="2" line-color="lime" src="/static/music.mp3"></av-line>

This will create the following element:

AvLine Intro

Component AvBars. Vue template name <av-bars>

<av-bars
  caps-color="#FFF"
  :bar-color="['#f00', '#ff0', '#0f0']"
  canv-fill-color="#000"
  :caps-height="2"
  src="/static/bach.mp3"
></av-bars>

This will create the following element:

AvBars Intro

Component AvCircle. Vue template name <av-circle>

<av-circle
  :outline-width="0"
  :progress-width="5"
  :outline-meter-space="5"
  :playtime="true"
  playtime-font="18px Monaco"
  src="/static/bach.mp3"
></av-circle>

This will create the following element:

AvCircle Intro

Component AvWaveform. Vue template name <av-waveform>

<av-waveform src="/static/bar.mp3"></av-waveform>

This will create the following waveform element:

AvWaveform Intro

The component will pre-load audio content and generate a clickable waveform.

Component AvMedia. Vue component <AvMedia>

<AvMedia :media="mediaObject" type="vbar"></AvMedia>

This will create the following media element:

AvMedia Intro

There are more media types. See details below.

Get started

Install

Install using npm

npm install --save vue-audio-visual

For Vue 2, install version 2.5.1

npm i -S vue-audio-visual@2.5.1
Use plugin

Install the plugin in main.js:

import { createApp } from "vue";
import App from "./App.vue";
import { AVPlugin } from "vue-audio-visual";

const app = createApp(App);
app.use(AVPlugin);

app.mount("#app");

Then anywhere in your app you can use it like this:

<av-bars src="/static/bach.mp3" bar-color="#CCC"> </av-bars>
Use component

A single component can be imported and used:

<script setup lang="ts">
import { AVWaveform } from 'vue-audio-visual'
</script>

<template>
  <AVWaveform src="http://foo.com/music.ogg" />
</template>
Composable functions

The plugin provides composable "use" functions for each component. Each component uses a composable function internally. See, for example, line component.

Composable functions use audio and canvas element refs. They are handy when you need full access to audio or canvas elements. At the same time they are easy to use:

<script setup lang="ts">
import { ref } from 'vue'
import { useAVBars } from 'vue-audio-visual'

const player = ref(null)
const canvas = ref(null)
const mySource = "./symphony.mp3"

// composable function useAVBars
useAVBars(player, canvas, { src: mySource, canvHeight: 40, canvWidth: 200, barColor: 'lime' })
</script>

<template>
  <div>
    <audio ref="player" :src="mySource" controls />
    <canvas ref="canvas" />
  </div>
</template>

API

There are several components that come with the plugin. Here is the list of available components:

Name Component name Composable function
av-bars AVBars useAVBars
av-circle AvCircle useAVCircle
av-line AVLine useAVLine
av-media AVMedia useAVMedia
av-waveform AVWaveform useAVWaveform

There are props that are common to all components and special props for each component. Component prop names follow Vue conventions when used with composable functions: when a prop's name is "foo-bar", the corresponding composable function parameter is expected to be "fooBar".

Common props
Name Type Default Description
src String null URL for the audio element's src attribute. When provided, creates an audio element wrapped in a "div".
audio-controls Boolean true Audio element controls attribute. When provided, displays the audio element with controls.
canv-fill-color String null Canvas fill background RGB color. Default is null, which makes the background transparent. Examples:
canv-fill-color="#00AAFF"
AVLine props
Name Type Default Description
canv-width Number 300 Canvas element width. Default 300. Example: :canv-width="600"
canv-height Number 80 Canvas element height. Default 80. Example: :canv-height="120"
line-width Number 2 Graph line width in px. Integer or float number. Example: :line-width="0.5"
line-color String, Array #9F9 Graph line color. Can be string RGB color or Array of RGB color. When an Array is given, the plugin creates a linear gradient and sets it as the background. The Array value should be bound. Examples:
line-color="#00AAFF"
:line-color="['#FFF', 'rgb(0,255,127)', '#00f']"
fft-size Number 128 Represents the window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.
Must be power of 2 between 25 and 215. Example: :fft-size="512"

Composable function:

function useAVLine<T extends object>(
  player: Ref<HTMLAudioElement | null>,
  canvas: Ref<HTMLCanvasElement | null>,
  props: T,
);
AVBars props
Name Type Default Description
canv-width Number 300 Canvas element width. Default 300. Example: :canv-width="600"
canv-height Number 80 Canvas element height. Default 80. Example: :canv-height="120"
bar-width Number 5 Width of bars in pixels. Example: :bar-width="12"
bar-space Number 1 Space between bars. Example: :bar-space="1.6"
bar-color String, Array #0A0AFF Bar fill color. Can be string RGB color or canvas gradients array.
Examples:
bar-color="#00AAFF"
:bar-color="['#FFF', 'rgb(0,255,127)', 'green']"
caps-height Number 0 Create caps on bars with given height in pixels. When zero no caps created. Example: :caps-height="2"
caps-drop-speed Number 0.9 Caps drop down animation speed. The higher the number, the faster the caps go down. Example: :caps-drop-speed="0.5"
caps-color String #A0A0FF Caps rectangles RGB color. Example: caps-color="lime"
brick-height Number 0 Draw bar as bricks when height is set and not zero.
Example: :brick-height="6"
brick-space Number 1 Space between bricks. Example: :brick-space="2"
symmetric Boolean false Draw bars symmetric to canvas vertical center. Example: :symmetric="true"
fft-size Number 1024 Represents the window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.
Must be power of 2 between 25 and 215. Example: :fft-size="2048"

Composable function

function useAVBars<T extends object>(
  player: Ref<HTMLAudioElement | null>,
  canvas: Ref<HTMLCanvasElement | null>,
  props: T,
);
AVCircle props
Name Type Default Description
canv-width Number 100 Canvas element width. Example: :canv-width="600"
canv-height Number 100 Canvas element height. Example: :canv-height="120"
radius Number 0 Base circle radius. If zero, then will be calculated from canvas width: (canv-width / 2) * 0.7 Example: :radius="20"
line-width Number 1 Frequency bit line width to draw. Example: :line-width="0.4"
line-space Number 1 Space between lines to draw. Example: :line-space="2"
outline-color String #0000FF Outline (contour) style RGB color. Example: outline-color="rgb(0,255,0)"
outline-width Number 0.3 Outline (contour) line width. Float value. Example: :outline-width="1"
bar-width Number 1 Frequency graph bar width. Example: :bar-width="1"
bar-length Number 0 Frequency graph bar length/height. Default is a difference between radius and canvas width. Example: :bar-length="27"
bar-color String, Array [#FFF,#00F] Bar style RGB color or radial gradient when an array. Example: :bar-color="#12AA55"
progress Boolean true Draw playtime progress meter. Example: :progress="false"
progress-width Number 1 Playtime progress meter width. Example: :progress-width="2.4"
progress-color String #0000FF Playtime progress meter color. Example: :progress-color="green"
progress-clockwise Boolean false Playtime progress meter arc draw direction. Example: :progress-clockwise="true"
outline-meter-space Number 3 Space between outline and progress meter. The bigger the value, the closer to the circle centre. Example: :outline-meter-space="1"
playtime Boolean false Draw played time as text in the center of the circle. Example: :playtime="true"
playtime-font String 14px Monaco Played time print font. Example: playtime-font="18px monospace"
playtime-color String #00f Played time font color. Example: playtime-color="green"
rotate-graph Boolean false Enable clockwise graph rotation. Example: :rotate-graph="true"
rotate-speed Number 0.001 Rotate graph speed. Example: :rotate-speed="0.2"
fft-size Number 1024 Represents the window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.
Must be power of 2 between 25 and 215. Example: :fft-size="2048"

Composable function

function useAVCircle<T extends object>(
  player: Ref<HTMLAudioElement | null>,
  canvas: Ref<HTMLCanvasElement | null>,
  props: T,
);
AVWaveform props
Name Type Default Description
canv-width Number 500 Canvas element width. Example: :canv-width="600"
canv-height Number 80 Canvas element height. Example: :canv-height="120"
played-line-width Number 0.5 Waveform line width for played segment of audio. Example: :played-line-width="0.8"
played-line-color String navy Waveform line color for played segment of audio. Example: :played-line-color="#ABC123"
noplayed-line-width Number 0.5 Waveform line width for the not-yet-played segment of audio. Example: :noplayed-line-width="1"
noplayed-line-color String lime Waveform line color for the not-yet-played segment of audio. Example: :noplayed-line-color="grey"
playtime Boolean true Display played time next to progress slider. Example: :playtime="false"
playtime-with-ms Boolean true Display milliseconds in the played time when true. For example: 02:55.054. Example: :playtime-with-ms="false"
playtime-font-size Number 12 Played time print font size in pixels. Example: :playtime-font-size="14"
playtime-font-family String monospace Played time print font family. Example: :playtime-font-family="monaco"
playtime-font-color String grey Played time print font RGB color string. Example: :playtime-font-color="#00f"
playtime-text-bottom Boolean false Position the playtime text at the bottom. Default is on top. Example: playtime-text-bottom
playtime-slider Boolean true Draw played time slider on the waveform. Example: :playtime-slider="false"
playtime-slider-color String red Played slider color. Example: :playtime-slider-color="#fafafa"
playtime-slider-width Number 1 Played slider width. Example: :playtime-slider-width="2.5"
playtime-clickable Boolean true Allow click on waveform to change playtime. Example: :playtime-clickable="false"

The composable function uses useFetch from @vueuse/core package. The last argument of useAVWaveform is options for the "createFetch" function from the "useFetch" module.

export function useAVWaveform<T extends object>(
  player: Ref<HTMLAudioElement | null>,
  canvas: Ref<HTMLCanvasElement | null>,
  props: T,
  fetchOpts: CreateFetchOptions = {},
);
AVMedia props

The component expects a MediaStream object. You can get it directly from navigator.mediaDevices or from the @vueuse/core library function useUserMedia. A live example can be found in App.vue.

<script setup lang="ts">
import { AVMedia } from 'vue-audio-visual'
import { useUserMedia } from '@vueuse/core'
...
const { stream } = useUserMedia()
...
</script>

<template>
...
<AVMedia :media="stream" type="circle" />
...
</template>
Name Type Default Description
media MediaStream none Required property. See example above.
type String wform Type of media visualization. Available types: 'wform', 'circle', 'frequ' and 'vbar'. If not set or not recognized then 'wform' is set. See examples in the demo.
Example: type="frequ"
canv-width Number null Canvas element width. Default value depends on plugin type:
  • circle: 80
  • frequ: 300
  • vbar: 50
  • wform: 200
Example: :canv-width="600"
canv-height Number null Canvas element height. Default value depends on plugin type:
  • circle: 80
  • frequ: 80
  • vbar: 20
  • wform: 40
Example: :canv-height="120"
canv-class String null Canvas element css class name.
fft-size Number 1024/8192 Represents the window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data. Default 8192 for the type 'wform' or 1024 for 'frequ'
Example: :fft-size="512"
frequ-lnum Number 60 Number of vertical lines for 'frequ' type. Example: :frequ-lnum="30"
frequ-line-cap Boolean false Draw lines of 'frequ' type with rounded caps. Example: :frequ-line-cap="true"
frequ-direction String lr Direction to draw the frequency. Available values: 'lr' or 'mo' (left to right or middle out). If not set or not recognized then 'lr' is set.
Example: frequ-direction="mo"
line-color String #9F9 Graph line RGB color. Examples:
line-color="#00AAFF"
line-width Number 0.5 / 3 Graph line width in px. Integer or float number. If not set then 0.5 for 'wform' type and 3 for 'frequ' Example: :line-width="0.8"
radius Number 0 Base 'circle' radius. Example: :radius="4"
connect-destination Boolean false Analyser to connect to audio context's destination. Avoid echo during playback. Example: :connect-destination="true"
vbar-bg-color String #e1e1e1 Background canvas color for 'vbar' type
vbar-caps Boolean true Rounded bars for 'vbar' types
vbar-space Number 1 Space between bars in 'vbar' type
vbar-width Number 4 Width of bars in 'vbar' type
vbar-fill-color String lime Color of bars in 'vbar' type
vbar-right-color String #c0c0c0 Color of bars on right side in 'vbar' type

Composable function:

function useAVMedia<T extends object>(
  canvas: Ref<HTMLCanvasElement | null>,
  props: T,
);

License

MIT Copyright (c) 2018-present, Stas Kobzar