Oct. 21, 2025

Two years ago I started working on Beat Maker. I thought it would take a week or two to build. Classic programmer estimate.

Beat Maker

My goal with Beat Maker was to make the best free online drum machine on the internet. A tool that gets you going fast. Simple enough for beginners and powerful enough for serious producers. I spent a bunch of time researching existing online drum machines to figure out their issues and make sure I built something that genuinely improved on them.

Besides the standard grid based beat editor Beat Maker has some unique features:

  • Procedural sample generation. Searching through folders of samples is annoying. I wanted to improve on this so I added the ability to generate new samples with a single click, giving you an infinite supply of unique one-shot drum samples.

  • Procedural beat generation. Beat Maker can generate patterns for you as a starting point for your beat. You can then edit and tweak the beat to your liking. This is great for solving the "blank canvas" problem and giving you something good to start from.

  • Advanced export options. This is where Beat Maker really shines for producers. You can export your work as:

    • A standard WAV loop
    • Individual stems (ZIP)
    • A MIDI file
    • A ZIP file with all your samples as WAVs
    • A SoundFont (.sf2) drum kit from your generated samples
    • An Impulse Tracker (.it) file for use in trackers like Renoise, OpenMPT or a Polyend
  • Sample upload. Don't like the generated samples? You can import your favorite samples to use in your beats. Or mix-and-match with both generated and uploaded.

  • Pocket Operator/Volca sync. Beat Maker can output a sync signal on the left audio channel to sync with these hardware devices for perfect timing.

  • Per-Note FX. You can add effects like volume slide, repeat, and initial volume to individual notes for more complex drum phrases incorporating flam and roll.

  • Cross-device sync. You can use Beat Maker on your phone to jot down a quick idea while you're on the go. Everything is sync'ed so when you get back on your computer you can pull up the same beats, edit them, and export to your DAW.

  • Install to home-screen. Even though it's a web app, you can add Beat Maker to your homescreen on your phone and it will then launch full screen like a native app. This is handy for power users find themselves using Beat Maker on mobile a lot.

As an old school tracker guy, I'm particularly excited about the Impulse Tracker export mode. I was surprised to discover how many DAWs (including hardware like Polyend) can import this format. Of course, you can also pull up the original Impulse Tracker on DOSBox, or the more modern re-implementation, Schismtracker for that retro experience.

By the way, the procedural sample and beat generator features are not trained on any artists or anything like that. Beat Maker uses an algorithm I built from scratch myself.

Tech

Beat Maker is a client-side web app written in ClojureScript. I've been using ClojureScript for just over 10 years now and I'm all in on it. Once you get past the initial learning curve there is nothing like the developer experience of Clojure tooling, and the community is about the most warm, intelligent, and welcoming group as you can find on planet Earth.

I also think Clojure is particularly well suited to LLM driven development. Although it's less represented in the training data, you can make up for that with good context. It's a concise, logical, and easily validated language that puts particular emphasis on the tight feedback loops using the REPL. These are all properties that play into the strengths of LLMs. You're much less likely to get a difficult to maintain ball of spaghetti from an LLM using Clojure, than you are from other languages.

The audio engine is built on a declarative audio graph using virtual-audio-graph, inspired by React's virtual DOM diffing paradigm. That makes managing the Web Audio API much cleaner. If you're building web based audio apps I highly recommend checking out this library.

I'd love for you to try out Beat Maker and let me know what you think. Every bit of feedback is useful and helps me craft a better drum machine.

You can check out the Beat Maker online drum machine on dopeloop.ai.

May 5, 2024

tl;dr: check out LuaVST on ChatGPT if you want to generate some VST plugins.

I've been doing weekly beats this year and it has been a lot of eustress fun (my best song so far is "smectite canyon gambit"). I found a nice positive feedback loop between composing electronic music and writing software for dopeloop.ai. Composing helps me figure out which features are important on the software side.

screenshot.png

In recent weeks I've been tinkering with Protoplug. It's a piece of open source software which allows you to write VST plugins in Lua. It turns out Lua is efficient enough to do DSP processing on modern CPUs. You can write the code interactively in the embedded editor, which makes for a smooth iterative workflow. I am using Protoplug with OpenMPT as a host running on Wine and really enjoying it.

After tinkering for a bit I had the idea to take the Protoplug API and some examples and feed them to ChatGPT to see if it could generate plugins from a written description. If you want to try it yourself you can go here: LuaVST GPT. Note, I am using GPT-4 and I haven't tested this with GPT-3.5. You will need to install the Protoplug VST into your host and then copy the code from the chat session into the VST's built-in editor.

Results

So how good is it? I don't like AI hype. I'm going to try to be objective and honest.

  1. Good: it can generate plugin boilerplate really well. If you just want to get something up and running that is a bit more tailored than copy-pasting one of the examples then it works well. You can say something like "create me a plugin that pitches all incoming MIDI notes down by one octave" or "create me a plugin that generates a pure sine tone at 440Hz" and it will do a resonable job that is usually bug-free.
  2. Okay: it can modify your existing code. If you can't be bothered looking through the API for how to implement something you might get a pretty good first pass out of it by pasting your code in and asking for a change. For more complex changes to the code it is probably going to create a lot of bugs. One thing that would significantly improve this would be automatically feeding any errors back to the GPT. At the moment you have to copy-paste errors and often you will figure out what is wrong faster than the AI will.
  3. Bad: asking it to do something complex like "simulate a full TB-303 with incoming MIDI and take into acount the non-linearities as documented by Devilfish creator Robin Whittle in 1999" it is going to do a very poor job. Even the first part of that ("simulate a TB-303") is going to be too much to ask of it. I tried with a few different prompt variants and it couldn't get there. I think this is where the hype of AI falls down. At this point in time only a human practitioner with years of experience, a nuanced understanding, and the ability to iteratively listen to the output as they code, is able to work their way towards a really good bug-free implementation of a complex plugin.

An example of a session that went well was when I used an online graphing calculator to come up with a distortion algorithm, and then I gave the equation to the GPT and asked it to write a plugin. I tweaked the code a little bit but on the whole it was a good implementation and did what I wanted. A distortion algorithm is one of the simpler types of plugins to code from scratch of course.

In the end building this has saved me some time and typing. I am able to work with the output from the GPT and get fairly useful advice from it without having to keep the whole API in my own head. This feels like a microcosm of the larger usefulness of modern LLMs. Productivity boosting but not job destroying.

Jan. 30, 2023

My first app of the year is out, hooray! \o/ It's a simple app to sync pocket operator devices. It outputs a sync signal from your phone which you can plug into your pocket operator's left input to drive it using a 2.5mm male-to-male stereo audio cable. It works well with the p0k3t0 Sync Splitter.

You can get it for Android and iPhone:

PO Sync connected to a phone

This was a fun app to build. I made it because somebody left this review on one of my other apps on Google Play:

Using this for the PO sync feature. I like that most; everything else is okay... I think a great idea would be to make an app with just the PO sync feature and a tempo slider or wheel, plus an on/off

So I knew there was at least one person who wanted this app. It was simple to implement and I got to use my favourite programming languge, ClojureScript. I love it when people need software that I know I can put together quickly. You can get the source code here:

https://github.com/chr15m/PocketSync

2023 is going to be the year of pocket operator apps for Dopeloop and I. I hope to make at least 4 new music apps. I'll post back here when I release them (and also to newsletter + Dopeloop subscribers).

Nov. 15, 2021

melody-generator-iOS-mockup.png

After many days of debugging (and filling out a bajillion forms) Melody Generator is finally available as an iOS app!

apple-app-store-button.svg

It's also available on the Google Play store.

You can still use the web app without installing anything at dopeloop.ai/melody-generator.

Enjoy!

Jan. 6, 2021

I've just released a melody generator that I've been working on for a while. It's a small web app that you can use to procedurally generate looping MIDI melodies and then use them in your own music.

The fractalesque algorithm it uses to generate melodies is one I came up with when I was writing a lot of algorave music a decade ago. The MIDI melodies are rendered to sound using the wasm port of Timidity by Feross.

Enjoy!