/lovebpm

A LÖVE library for syncing events to the BPM of an audio track

Primary LanguageLuaMIT LicenseMIT

Lovebpm

A LÖVE library for syncing events to the BPM of an audio track.

Installation

The lovebpm.lua file should be dropped into an existing project and required by it:

lovebpm = require "lovebpm"

Lovebpm requires LÖVE version 0.10.0 or above.

Getting Started

First a Track object should be created using the lovebpm.newTrack() function:

music = lovebpm.newTrack()

The update() method of each track should be called from within the love.update() function:

function love.update(dt)
  music:update()
end

The track's load() method should be called to load in the music. The load method takes a single argument: the music's filename or a SoundData object. The setBPM() method should be called with the BPM of the loaded track.

music:load("loop.ogg")
music:setBPM(127)

An event handler function for the beat event can be set. This will be called at the start of each beat when the song is playing, the beat number is passed to the handler function.

music:on("beat", function(n) print("beat:", n) end)

The music can be played by using the play() method.

music:play()

See the demo directory for a small example project.

Functions

lovebpm.newTrack()

Creates and returns a new Track object.

lovebpm.detectBPM(filename [, opts])

Tries to detect the BPM of a looped song. filename can be a filename or SoundData object. An opts table can be provided with additional options, consisting of the following:

Name Default Description
minbpm 75 Minimum allowed BPM
maxbpm 300 Maximum allowed BPM

Track:load(filename)

Loads an audio file or SoundData object.

Track:setBPM(n)

Sets the BPM of the current track; this is used when calculating the current beat.

Track:setVolume([volume])

Sets the volume of the track, by default this is 1.

Track:setPitch([pitch])

Sets the pitch of the track, by default this is 1.

Track:setLooping([loop])

Sets whether the track should loop when it reaches the end. By default this is false.

Track:setOffset([n])

Offsets the track's timing by n seconds. This function can be used to compensate for audio latency. By default this is 0.

Track:on(name, fn)

Sets an event handler for the event of the given name. The on() function can be called several times for the same event to set multiple handlers. The events which can be emitted by a track are as follows:

Name Description Arguments
beat The start of a beat has occurred current_beat
update The track's update() function was called track_delta_time
loop The track has reached the end and looped
end The track has reached the end and stopped

Track:play([restart])

Plays the track if it is stopped or paused. If restart is true then the track starts playing from the beginning.

Track:pause()

Pauses the track's progress, but retains the current play-position of the track.

Track:stop()

Stops the track, reseting the current play-position to the beginning.

Track:setTime(n)

Sets the current play-position of the track to n seconds.

Track:setBeat(n)

Sets the current play-position of the track to the given beat number.

Track:getTotalTime()

Returns the length of the track in seconds.

Track:getTotalBeats()

Returns the total number of beats in the track.

Track:getTime()

Returns the current play-position of the track.

Track:getBeat([multiplier])

Returns the current beat and subbeat of the track. For example, if the track is exactly half way between beats 3 and 4, the values 3 and 0.5 will be returned:

local beat, subbeat = music:getBeat()

Track:update()

Updates the track's internal state, and emits events if required. This should be called from the love.update() function.

License

This library is free software; you can redistribute it and/or modify it under the terms of the MIT license. See LICENSE for details.