Skip to main content



Naima voting interface

Naima is a Discord bot that I use to manage a jazz listening club with friends. It is implemented in Kotlin using the JDA Discord API, and depends on a MongoDB instance for managing state. Naima allows users to suggest and then subsequently vote on a weekly album to listen to and discuss. Additionally, it pulls album covers and metadata from the MusicBrainz API and uses imagemagick for album cover processing.

I’ve configured the project to build as a Docker image via jib, and in my own personal deployment I run it in a k3s cluster managed with FluxCD.


SoundBounds Logo

SoundBounds is a first-of-its-kind soundtracking mod for Minecraft, allowing players to define sophisticated region-based soundtracks for their worlds. Like Minecraft itself, SoundBounds uses OpenAL (through LWJGL) for its sound engine, allowing for virtually seamless in-game integration and smooth, artifact-free fades and effects. Additionally, it offers a variety of community-focused features such as artist promo links (accessible through its now-playing command), definable groups and featured artists!


QuickSand is a live-input granular synthesis VST, made with JUCE. Rather than granulating a presupplied buffer (as traditional granular synthesizers do), QuickSand caches live input and granulates it in realtime.

QuickSand’s interface

QuickSand was designed as an alternative to the lack of spontaneity offered in classic granular synths. In VST terms, QuickSand’s use of live input makes it an audio effect, rather than an instrument. This makes for a more dynamic user experience, and I hope it can help make granular synthesis a more convenient option in live performance!

Duplex (Max/MSP)

This patch is a polyphonic four-operator FM/additive synth. The synth is intentionally simple, and can only run in either pure parallel (additive) or pure series (FM). You can easily plug it into custom filters, but it has its own resonant lowpass built in for ease of use. It is designed to take MIDI input, but also has a built-in GUI keyboard to play with.

Per-operator features:

  • Individual ADSR envelope with dial controls and function display
  • Harmonicity ratio selector (integer numerator and denominator)
  • Waveform selection (sin, smooth saw, pure saw, square)
  • Pulse width control for square waveform
  • Optional velocity gain control (in FM, this can be used to control timbre)


“Rearranged” is a short octophonic work made from instrumental samples and conrete sounds. The piece uses granular synthesis to turn sampled instruments into drones, which are then layered, modulated, and panned in 2D in order to create varied textures and gestures. Listen for harmonic content underneath layers of noise.

No Bearing

“No Bearing” is a short work inspired by and derived entirely from the sounds produced by an aluminum yoyo. The piece’s spectral layout, structure, and use of modulation are all intended to reflect the sonic qualities of a spinning ball-bearing yoyo; a droning, consistent low register accompanied by piercing, resonant upper harmonics. Structurally, ‘No Bearing’ has two main sections: an initial, low velocity throw (the first 35 seconds), followed by a more confident one. Two important aspects of the composition are its flurries of high-pitched klangs (sampled and re-pitched by modulating playback speed with a random number generator) and frequent modulations that cross over and under the 20Hz threshold (through the use of LFOs and ring modulation).