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 🙏

© 2026 – Pkg Stats / Ryan Hefner

react-riffs

v1.0.0

Published

React Hooks for WebMidi.js

Readme

🧑‍🎤 react-riffs

Build Status npm Coverage Status

React Hooks + MIDI 🎹 = 🎶 Riffs 🎶

Contents

Usage

React Riffs exposes several hooks for use with the WebMIDI API. It wraps the excellent WebMidi.js, so refer to their documentation for event reference, etc.

useMidiInputs

In order to make use of Riffs, you first need to invoke the useMidiInputs hook. This will bootstrap WebMidi and return an array of connected Inputs:

let [myInput] = useMidiInputs();

console.log(myInput);
//=> Input {_userHandlers: {...}, _midiInput: MIDIInput, ...}

useMidiInputs takes an optional debug flag, which will add listeners to log the following events to the console: noteon, pitchbend, start, stop

let [myInput] = useMidiInputs({ debug: true });

Once you have your input, you can start reading from your input device. Just remember to pass your input object each time you invoke an event hook.

Each of the following takes an optional channel as the last parameter. If no channel is specified, it will default to 'all'.

useClock

Returns the current timestamp from the input device along with a boolean representing whether or not the clock is currently running

let [timestamp, isRunning] = useClock(myInput);

console.log(timestamp);
//=> 1234.1234567890123

console.log(isRunning);
//=> false

useControl

Returns the integer value of a controlchange event: 0-127 This hook accepts as an optional second parameter, a string indicating the control to listen for. If this is not supplied, it will default to modulationwheelcoarse. A list of valid control types will be printed to the console if useMidiInputs is initialized with the debug flag.

let mod = useControl(myInput);

console.log(mod);
//=> 64

useNote

NOTE: You probably want useNotes

Returns the most recent noteon/noteoff event, along with a Boolean flag for whether the note is being played

let [noteEvent, isOn] = useNote(myInput);

console.log(noteEvent);
//=> {target: Input, data: Uint8Array(3), type: "noteon", ...}

console.log(isOn);
//=> true

useNotes

Returns an array of noteon events for all of the notes currently being played

let pressedKeys = useNotes(myInput);

console.log(pressedKeys);
//=> [{target: Input, data: Uint8Array(3), type: "noteon" ...}]

usePitchbend

Returns a float between -1.0 and 1.0 for the current pitchbend value. No bend is 0.0

let bend = usePitchbend(myInput);

console.log(bend);
//=> 0