npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

timidity

v1.3.0

Published

Play MIDI files in the browser w/ Web Audio, WebAssembly, and libtimidity

Downloads

52

Readme

timidity

travis npm downloads javascript style guide

Play MIDI files in the browser w/ Web Audio, WebAssembly, and libtimidity

Play MIDI files in a browser with a simple API.

Demo

This package is used on BitMidi.com, the wayback machine for old-school MIDI files! Check out some examples here:

Install

npm install timidity

Features

  • Lightweight – Just 23 KB of JavaScript and 22 KB of lazy-loaded WebAssembly
  • Simple – No bells and whistles. Just what is needed to play MIDI files.
  • Works with the FreePats General MIDI soundset.

Usage

const Timidity = require('timidity')

const player = new Timidity()
player.load('/my-file.mid')
player.play()

player.on('playing', () => {
  console.log(player.duration) // => 351.521
})

Easier Usage

If you just want to play MIDI files in the browser and don't need a JavaScript API interface, consider using the bg-sound package, which supports this much simpler usage:

<script src="bg-sound.min.js"></script>
<bg-sound src="sound.mid"></bg-sound>

API

player = new Timidity([baseUrl])

Create a new MIDI player.

Optionally, provide a baseUrl to customize where the player will look for the lazy-loaded WebAssembly file libtimidity.wasm and the FreePats General MIDI soundset files. The default baseUrl is /.

For example, here is how to mount the necessary files at / with the express server:

const timidityPath = path.dirname(require.resolve('timidity'))
app.use(express.static(timidityPath))

const freepatsPath = path.dirname(require.resolve('freepats'))
app.use(express.static(freepatsPath))

player.load(urlOrBuf)

This function loads the specified MIDI file urlOrBuf, which is a string path to the MIDI file or a Uint8Array which contains the MIDI file data.

This should be the first function called on a new Timidity instance.

player.play()

Plays the currently loaded MIDI file.

player.pause()

Pauses the currently loaded MIDI file.

player.seek(seconds)

Seeks to a specified time in the MIDI file.

If the player is paused when the function is called, it will remain paused. If the function is called from another state (playing, etc.), the player will continue playing.

player.duration

Returns the duration in seconds (number) of the currently playing MIDI file. Note that duration will return 0 until the file is loaded, which normally happens just before the playing event.

player.currentTime

Returns the elapsed time in seconds since the MIDI file started playing.

player.destroy()

Destroys the entire player instance, stops the current MIDI file from playing, cleans up all resources.

Note: It's best to reuse the same player instance for as long as possible. It is not recommended to call player.destroy() to stop or change MIDI files. Rather, just call player.pause() to pause or player.load() to load a new MIDI file.

player.destroyed

Returns true if destroy() has been called on the player. Returns false otherwise.

player.on('error', (err) => {})

This event fires if a fatal error occurs in the player, including if a MIDI file is unable to be played.

player.on('timeupdate', (seconds) => {})

This event fires when the time indicated by the currentTime property has been updated.

player.on('unstarted', () => {})

This event fires when a new MIDI file is being loaded.

player.on('ended', () => {})

This event fires when a MIDI file has played until the end.

player.on('playing', () => {})

This event fires when a MIDI file starts playing.

player.on('paused', () => {})

This event fires when a MIDI file is paused.

player.on('buffering', () => {})

This event fires when a MIDI file is loading.

License

Copyright (c) Feross Aboukhadijeh.