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

simple-reversible-audio-buffer-source-node

v0.0.3

Published

AudioBufferSourceNode variant that supports negative playback rate

Readme

simple-reversible-audio-buffer-source-node

This package implements a ReversibleAudioBufferSourceNode class that allows for playback of an AudioBuffer with a negative playback rate. This is useful starting point for many DJ and audio processing applications, where reverse playback is a requirement.

To use this class, clone this repo and spin up our dev server, or install this via npm i simple-reversible-audio-buffer-source-node and try the following example in a browser environment:

import { ReversibleAudioBufferSourceNode } from "simple-reversible-audio-buffer-source-node";

(async () => {
    // Pull down a local file and initialize an audio context.
    const audioContext = new AudioContext();
    const response = await fetch("/example.mp3");
    const arrayBuffer = await response.arrayBuffer();
    const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);

    const reversibleAudioBufferSourceNode = new ReversibleAudioBufferSourceNode(
        audioContext,
    );
    reversibleAudioBufferSourceNode.buffer = audioBuffer;

    reversibleAudioBufferSourceNode.connect(audioContext.destination);
    reversibleAudioBufferSourceNode.start();

    reversibleAudioBufferSourceNode.onended((direction) => {
        console.log(`node ended in: ${direction}`);
    });

    // Wait for a few seconds...
    await new Promise((resolve) => setTimeout(resolve, 3_000));

    // Playback in reverse.
    // You should hear the last three seconds (or so) played backwards.
    reversibleAudioBufferSourceNode.playbackRate(-1);
})();

Performance considerations

This package specifically deals with AudioBuffers, and can quickly get computationally expensive to use when working with large buffers. It's important to note that AudioBuffers in general were designed to work with small audio snippets less than 45s in length.

That said, this package does leave some room for a few performance optimizations, noted below.

Pre-process reversed audio buffer

A user can supply the reversed audio buffer by setting the ReversibleAudioBufferSourceNode's buffer with a pre-processed reversed buffer (e.g. — created offline via ffmpeg or reversed in a worker environment) like so:

const reversibleAudioBufferSourceNode = new ReversibleAudioBufferSourceNode(
    audioContext,
);
reversibleAudioBufferSourceNode.buffer = {
    forward: audioBuffer,
    reversed: reversedAudioBuffer,
};

Otherwise, there will be an in-place creation of a reversed audio buffer, which can be expensive. For more details, see our reverseAudioBuffer utility.

Pre-process playback position channel

[!NOTE] For more information about our approach and why it's still necessary to create an additional channel to accurately track audio playback time, refer to this thread.

A user can supply the reversed audio buffer with an additional playback position channel already supplied.

// In a worker environment:
import {
    makePlaybackPositionChannelData,
    makeAudioBufferWithPlaybackPositionChannel,
} from "simple-reversible-audio-buffer-source-node";

const playbackPositionChannel = makePlaybackPositionChannelData(audioBuffer);
const audioBufferWithPlaybackPositionChannel =
    makeAudioBufferWithPlaybackPositionChannel(
        audioBuffer,
        playbackPositionChannel,
    );

//
// ---
//

// In a browser environment:
import { ReversibleAudioBufferSourceNode } from "simple-reversible-audio-buffer-source-node";

const reversibleAudioBufferSourceNode = new ReversibleAudioBufferSourceNode(
    audioContext,
    {
        shouldCreatePlaybackPositionChannel: false,
    },
);
reversibleAudioBufferSourceNode.buffer = audioBufferWithPlaybackPositionChannel;

Otherwise, there will be an in-place creation of a playback position channel, which can be expensive. For more details, see our makePlaybackPositionChannelData and makeAudioBufferWithPlaybackPositionChannel utilities.

Things this package does not yet support:

  • Looping, but I'm looking into it.
  • duration arg for .start(), but I'm looking into it.
  • MediaElementAudioSourceNode support