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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@music-i18n/musicxml-player

v1.3.0

Published

A TypeScript component that loads and plays MusicXML files in the browser using Web Audio and Web MIDI.

Downloads

27

Readme

MusicXML Player

npm build

A TypeScript component that loads and plays MusicXML files in the browser using Web Audio and Web MIDI.

Screenshot

Getting started

npm install
npm run build
npm test
npm run demo:develop

Then open http://127.0.0.1:8080/

NOTE! To use the MMA (Musical MIDI Accompaniment) feature, you need to install and run musicxml-midi separately. Typically, running PORT=3000 npm run start from the musicxml-midi folder in a separate console should be enough.

Theory of operation

This component synchronizes rendering and playback of MusicXML scores. Rendering is done using existing Web-based music engraving libraries such as Verovio or OpenSheetMusicDisplay. Rendering can also use pre-rendered assets (SVG, metadata) obtained from MuseScore or Verovio. Playback uses standard MIDI files that are expected to correspond to the given MusicXML, and sends the MIDI events to either a Web MIDI output, or to a Web Audio synthesizer, using the module spessasynth_lib.

The crucial part of this functionality is to synchronize the measures and beats in the MusicXML file with the events of the MIDI file. In a nutshell, the player expects the provider of the MIDI file (an implementation of IMidiConverter) to supply a "timemap", which associates each measure in the MusicXML file to a timestamp at which this measure occurs. In the case of repeats and jumps, the same measure will be referenced several times in the timemap.

There are 3 bundled implementations of IMidiConverter in this module:

  • An API client that connects to the musicxml-midi API server. musicxml-midi is a converter whose major contribution is to generate a MIDI accompaniment in addition to the music in the MusicXML score.
  • Verovio, that generates a faithful rendition of the MusicXML score but lacks accompaniment generation.
  • It is also possible to hand-craft the MIDI and timemap files, and instruct the player to read those explicitly.

API usage

At the moment, the only documentation available for the usage of the player is located in the demo app.

Tests

This project uses Vitest for testing:

  • Unit tests run in Node.

  • Integration tests (that might rely on browser-like APIs) run with a jsdom environment. Use the commands below to run all tests, a single file, or a single test in watch or non-watch mode.

  • All tests

npm test
  • Single file
npm test -- src/helpers/fetish.spec.ts
  • Single test by name (pattern)
npm test -- -t "should throw if not ok"
  • Watch mode (all tests)
npm test -- --watch
  • Watch a single file
npm test -- src/helpers/fetish.spec.ts --watch
  • Watch a single test in a file
npm test -- src/helpers/fetish.spec.ts -t "should throw if not ok" --watch