3.1.2 • Published 5 years ago

func-midi-visualizer v3.1.2

Weekly downloads
3
License
MIT
Repository
github
Last release
5 years ago

midi-visualizer

Build Status Coverage Status Dependency Status

A simple, functional-based midi visualization library

Example

const initMidiVisualizer = import 'midi-visualizer';
const config = {
  window: window,
  root: document.getElementById('#my-root'),
  width: 500,
  height: 500,
  midi: {
    data: myFnToFetchMidiData()
  },
  audio: {
    data: myFnToFetchAudioData()
  },
  renderer: setupMyCustomRenderer()
};

initMidiVisualizer(config).then((visualizer) => {
  const playingVisualizer = visualizer.play();
  // all your other fun operations...
}).catch((error) => console.error('Oh man, something bad happened:', error));

API Reference

midiVisualizer

Monad managing visualization animation of midi data

midiVisualizer~restart(playheadSec) ⇒

put MidiVisualizer into "play" state

Kind: inner method of midiVisualizer
Returns: MidiVisualizer

ParamTypeDescription
playheadSecnumberoffset in seconds to start playback

midiVisualizer~pause() ⇒

put MidiVisualizer into "pause" state

Kind: inner method of midiVisualizer
Returns: MidiVisualizer

midiVisualizer~stop() ⇒

put MidiVisualizer into "stop" state

Kind: inner method of midiVisualizer
Returns: MidiVisualizer

midiVisualizer~resize() ⇒

handle resize of page MidiVisualizer is rendering into

Kind: inner method of midiVisualizer
Returns: MidiVisualizer

midi-visualizer : object

Kind: global namespace

midi-visualizer~initMidiVisualizer(config) ⇒ Promise(MidiVisualizer, Error)

initializes MidiVisualizer monad

Kind: inner method of midi-visualizer
Returns: Promise(MidiVisualizer, Error) - promise that fulfills with MidiVisualizer instance

ParamTypeDescription
configobjectconfiguration data to set up MidiVisualizer
config.midi.dataUInt8Arrayarray of unsigned 8-bit integers representing Midi data
config.audio.dataUInt8Arrayarray of unsigned 8-bit integers representing audio data
config.windowWindowWindow of page holding the player
config.rootHTMLElementHTMLElement that will be the root node of the visualizer
config.renderRendererRenderer strategy to use
config.widthnumberthe width of our canvans
config.heightnumberthe height of our canvans

RenderUtils

RenderUtils~MAX_RAF_DELTA_MS : number

Kind: inner constant of RenderUtils
Default: 16

RenderUtils~play(state, player, renderFn, resumeFn) ⇒ RendererState

Put visualizer in "play" state (where audio player is playing and animations are running)

Kind: inner method of RenderUtils
Returns: RendererState - - new monad state

ParamTypeDescription
stateRendererStatecurrent monad state
playerAudioPlayeraudio player used for audio playback we are syncing to
renderFnRenderUtils~rendercallback for actual rendering
resumeFnRenderUtils~resumecallback for resuming playback after stopping

RenderUtils~pause(state) ⇒ RendererState

Put visualizer in "paused" state (where audio player is paused and animations are not running)

Kind: inner method of RenderUtils
Returns: RendererState - - new monad state

ParamTypeDescription
stateRendererStatecurrent monad state

RenderUtils~stop(state) ⇒ RendererState

Put visualizer in "stopped" state (where audio player is stopped and animations are not running)

Kind: inner method of RenderUtils
Returns: RendererState - - new monad state

ParamTypeDescription
stateRendererStatecurrent monad state

RenderUtils~transformEvents(state, trackTransforms, animEvents) ⇒ Array.<RenderEvent>

Applies given track transforms to animation events

Kind: inner method of RenderUtils
Returns: Array.<RenderEvent> - array of transformed renderEvents

ParamTypeDescription
stateRendererStatestate monad
trackTransformsArray.<function()>callback functions (TODO: document)
animEventsArray.<AnimEvent>given animation events to transform

RenderUtils~mapEvents(state, midi, config) ⇒ RendererState

Map over given Midi data, transforming MidiEvents into RenderEvents

Kind: inner method of RenderUtils
Returns: RendererState - - new monad state

ParamTypeDescription
stateRendererStatecurrent monad state
midiMidimidi data to map to RenderEvents
configobjectconfiguration data

RenderUtils~maxNote(currentMaxNote, event) ⇒ number

Compare given note with note in given RenderEvent, returning whichever is larger

Kind: inner method of RenderUtils
Returns: number - - largest of two notes

ParamTypeDescription
currentMaxNotenumbervalue of current "max" note
eventRenderEventRenderEvent containing note to compare

RenderUtils~minNote(currentMinNote, event) ⇒ number

Compare given note with note in given RenderEvent, returning whichever is smaller

Kind: inner method of RenderUtils
Returns: number - - smallest of two notes

ParamTypeDescription
currentMinNotenumbervalue of current "min" note
eventRenderEventRenderEvent containing note to compare

RenderUtils~isNoteToggleEvent(event) ⇒ boolean

Predicate to test whether given RenderEvent is for a note on/off event

Kind: inner method of RenderUtils
Returns: boolean - - is it a note on/off event

ParamTypeDescription
eventRenderEventRenderEvent to test

RenderUtils~isNoteOnEvent(event) ⇒ boolean

Predicate to test whether given RenderEvent is for a note on event

Kind: inner method of RenderUtils
Returns: boolean - - is it a note on event

ParamTypeDescription
eventRenderEventRenderEvent to test

RenderUtils~render(state, cleanupFn, rafFn, currentRunningEvents, renderEvents, nowMs) ⇒ Array.<RenderEvent>

render function

Kind: inner method of RenderUtils
Returns: Array.<RenderEvent> - - active running render events for this render call

ParamTypeDescription
stateRendererStatemonad state
cleanupFnfunctioncallback to remove expired animation artifacts
rafFnfunctionRAF callback to do actual animation
currentRunningEventsArray.<RenderEvent>RenderEvents currently being animated
renderEventsArray.<RenderEvent>new RenderEvents to animate
nowMsnumbercurrent time in milliseconds

ThreeJsRenderer

ThreeJsRenderer~prepDOM(midi, config) ⇒ ThreeJsRendererState

handles initialization of DOM for renderer

Kind: inner method of ThreeJsRenderer

ParamTypeDescription
midiMidiMidi instance of song information
configobjectconfiguration information
config.windowWindowWindow where rendering will take place
config.rootHTMLElementDOM Element that will hold render canvas
dimension.widthnumberwidth of the rendering area
dimension.heightnumberheight of the renderering area

ThreeJsRenderer~resize(state, dimension) ⇒ ThreeJsRendererState

deals with resizing of the browser window

Kind: inner method of ThreeJsRenderer

ParamTypeDescription
stateThreeJsRendererStatecurrent renderer state
dimensionobjectdimensions of render area
dimension.widthnumber
dimension.heightnumber

ThreeJsRenderer~cleanup(state, currentRunningEvents[, expiredEvents[) ⇒ undefined

removes any object from the scene

Kind: inner method of ThreeJsRenderer

ParamTypeDescription
stateThreeJsRendererStatecurrent renderer state
currentRunningEvents[RenderEventarray of RenderEvents currently active
expiredEvents[RenderEventarray of RenderEvents that are no longer active and should be cleaned up

ThreeJsRenderer~generateReturnFn(midi, config) ⇒

function returned to user for creating instance of ThreeJsRenderer

Kind: inner method of ThreeJsRenderer
Returns: ThreeJsRenderer

ParamTypeDescription
midiMidiMidi data to be renderered
configobjectconfiguration information
config.windowWindowWindow where rendering will take place
config.rootHTMLElementDOM Element that will hold render canvas
dimension.widthnumberwidth of the rendering area
dimension.heightnumberheight of the renderering area

ThreeJsRenderer~generate(renderConfig, frameRenderer, cleanupFn) ⇒ ThreeJsRenderer~generateReturnFn

generator to create ThreeJsRenderer

Kind: inner method of ThreeJsRenderer

ParamTypeDescription
renderConfigobjectconfiguration information for setup
frameRendererThreeJsRenderer~frameRenderCbcallback for rendering events
cleanupFncleanupCbcallback for cleaning up THREEJS

ThreeJsRenderer~frameRenderCb ⇒

callback for actual rendering of frame

Kind: inner typedef of ThreeJsRenderer
Returns: undefined

ParamTypeDescription
eventsToAdd[ThreeJsRenderEventevents that are queued up to be rendered in the next frame
sceneTHREEJS~SceneThreeJS scene events should be renderered in
cameraTHREEJS~CameraThreeJS camera for given scene
THREETHREEJSThreeJS

D3Renderer

D3Renderer~prepDOM(midi, config) ⇒ D3RendererState

handles initialization of DOM for renderer

Kind: inner method of D3Renderer

ParamTypeDescription
midiMidiMidi instance of song information
configobjectconfiguration information
config.windowWindowWindow where rendering will take place
config.rootHTMLElementDOM Element that will hold render canvas
dimension.widthnumberwidth of the rendering area
dimension.heightnumberheight of the renderering area

D3Renderer~resize(state, dimension) ⇒ D3RendererState

deals with resizing of the browser window

Kind: inner method of D3Renderer

ParamTypeDescription
stateD3RendererStatecurrent renderer state
dimensionobjectdimensions of render area
dimension.widthnumber
dimension.heightnumber

D3Renderer~generateReturnFn(midi, config) ⇒

function returned to user for creating instance of D3Renderer

Kind: inner method of D3Renderer
Returns: D3Renderer

ParamTypeDescription
midiMidiMidi data to be renderered
configobjectconfiguration information
config.windowWindowWindow where rendering will take place
config.rootHTMLElementDOM Element that will hold render canvas
dimension.widthnumberwidth of the rendering area
dimension.heightnumberheight of the renderering area

D3Renderer~generate(renderConfig) ⇒ D3Renderer

generator to create D3Renderer

Kind: inner method of D3Renderer

ParamTypeDescription
renderConfigobjectconfiguration data for renderer
renderConfig.frameRendererframeRenderCbcallback for rendering individual frames

AudioPlayer

Kind: global class

new AudioPlayer(params)

manages audio playback

Returns: AudioPlayer

ParamTypeDescription
paramsobjectsettings for audio player
params.windowWindowWindow used to retrieve AudioContext

audioPlayer.getPlayheadTime() ⇒

gets the playhead time in milliseconds

Kind: instance method of AudioPlayer
Returns: playheadTimeMs

audioPlayer.play(startTimeOffset, playheadSec)

initiates playing of audio

Kind: instance method of AudioPlayer

ParamTypeDefaultDescription
startTimeOffsetnumber0offset in seconds to wait before playing
playheadSecnumber0where to start playback within audio in seconds

audioPlayer.pause(stopAfter)

pauses playing of audio

Kind: instance method of AudioPlayer

ParamTypeDescription
stopAfternumbernumber of seconds to wait before stopping

AudioPlayer.getAudioContextFromWindow(window) ⇒

cross-browser fetch of AudioContext from given window

Kind: static method of AudioPlayer
Returns: AudioContext

ParamTypeDescription
windowWindowWindow to fetch AudioContext from

AudioPlayer~loadDataCallback : function

loads given audio data and invokes callback when done

Kind: inner typedef of AudioPlayer

ParamTypeDefaultDescription
audioDataArrayBufferArrayBuffer of data for audio to play
callbackloadDataCallbackcallback to invoke when audioData is finished loading
errstringnullstring of error message (null if no error)
selfAudioPlayerref to AudioPlayer instance if loading successful (undefined otherwise)

DataTypes

DataTypes~MidiVisualizerState

Kind: inner class of DataTypes

new MidiVisualizerState(params)

top-level data type representing state of MidiVisualizer

Returns: MidiVisualizerState

ParamTypeDefaultDescription
paramsobjectproperties to set
params.audioPlayerAudioPlayerAudioPlayer instance managing audio to sync with
params.rendererRendererRenderer used to draw visualization
params.animEventsByTimeMsobject{}AnimEvent to render, grouped by millisecond-based mark where they should be rendered
params.isPlayingbooleanfalseflag indicating whether currently playing

DataTypes~RendererState

Kind: inner class of DataTypes

new RendererState(params)

top-level data type representing state of Renderer

Returns: RendererState

ParamTypeDefaultDescription
paramsobjectproperties to set
params.idstringunique identifier for renderer
params.rootHTMLElementHTMLElement to use as root node for renderer canvas placement
params.windowWindowWindow we are rendering in (note, Window must have a 'document')
params.widthnumber0width for rendering canvas
params.heightnumber0height for rendering canvas
param.renderEventsArray.<RenderEvents>[]RenderEvents to render
params.scalesArray.<object>[]Scales for normalizing position/sizing
params.isPlayingbooleanfalseflag indicating whether currently playing

DataTypes~D3RendererState ⇐ RendererState

Kind: inner class of DataTypes
Extends: RendererState

new D3RendererState()

data type representing state of Renderer that uses D3

Returns: D3RendererState

ParamTypeDescription
params.svgSVGElementSVGElement for renderering

DataTypes~ThreeJsRendererState ⇐ RendererState

Kind: inner class of DataTypes
Extends: RendererState

new ThreeJsRendererState()

data type representing state of Renderer that uses D3

Returns: ThreeJsRendererState

ParamTypeDescription
params.THREETHREEJSThreeJs object
params.cameraCameraThreeJs Camera to use
params.sceneSceneThreeJs Scene to use
params.rendererRendererRenderer monad to use

DataTypes~AnimEvent

Kind: inner class of DataTypes

new AnimEvent(id)

data type representing individual animation event

Returns: AnimEvent

ParamTypeDefaultDescription
params.eventMidiEventMidiEvent being renderered
params.tracknumber0index of midi track event belongs to
params.startTimeMicroSecnumber0offset in microseconds from beginning of song when event starts
params.lengthMicroSecnumber0length of event in microseconds
params.microSecPerBeatnumber500000number of microseconds per beat
idstring"<track>-<event.notestartTimeInMicroSec>"unique ID of event

DataTypes~RenderEvent

Kind: inner class of DataTypes

new RenderEvent()

base data type representing individual render event

Returns: RenderEvent

ParamTypeDefaultDescription
params.ididunique string identifier for event
params.tracknumberindex of midi track event belongs to
params.subtypestringmidi event subtype
params.xnumberx position for element
params.ynumbery position for element
params.lengthMicroSecnumberlength of event in microseconds
params.microSecPerBeatnumbernumber of microseconds per beat
params.znumber0z position for element
params.microSecPerBeatnumber500000number of microseconds per beat
params.colorstring"'#FFFFFF'"color of element to render

DataTypes~D3RenderEvent ⇐ RenderEvent

Kind: inner class of DataTypes
Extends: RenderEvent

new D3RenderEvent()

data type representing individual render event using D3

Returns: D3RenderEvent

ParamTypeDescription
params.pathstringSVG path string (required if no 'radius' given)
params.radiusnumberradius to use for rendering circle (required if no 'path' given)
params.scaled3.ScaleD3.Scale (required if 'path' is given)

DataTypes~ThreeJsRenderEvent ⇐ RenderEvent

Kind: inner class of DataTypes
Extends: RenderEvent

new ThreeJsRenderEvent()

data type representing individual render event using ThreeJS

Returns: ThreeJsRenderEvent

ParamTypeDefaultDescription
params.scalenumber1scaling factor
params.zRotnumber0z-rotation
params.xRotnumber0x-rotation
params.yRotnumber0y-rotation
params.notenumbermidi note value (0-127)
params.shapeTHREEJS~Object3DThreeJs Object3D of shape representing this event
3.1.2

5 years ago

3.1.1

5 years ago

3.1.0

5 years ago

3.0.0

5 years ago

2.8.0

5 years ago

2.7.3

5 years ago

2.7.2

5 years ago

2.6.3

7 years ago

2.6.2

7 years ago

2.6.1

7 years ago

2.6.0

7 years ago

2.5.0

7 years ago

2.4.0

7 years ago

2.3.0

7 years ago

2.2.0

7 years ago

2.1.2

7 years ago

2.1.1

7 years ago

2.1.0

7 years ago

2.0.0

8 years ago

1.6.0

8 years ago

1.5.0

8 years ago

1.4.0

8 years ago

1.3.1

8 years ago

1.3.0

8 years ago

1.2.0

8 years ago

1.1.0

8 years ago

1.0.1

8 years ago

1.0.0

8 years ago

0.0.5

8 years ago

0.0.4

8 years ago

0.0.3

8 years ago

0.0.2

8 years ago

0.0.1

8 years ago