programming

Programming is my favorite pastime. Here are a few examples of my adventures with code.

mechanical keyboard

I created a mechanical keyboard from scratch. I designed its PCB and case in KiCad and Solidworks, and it runs off my own fully custom firmware running on a Teensy 2.0. It has full n-key rollover, and can report up to 14 HID keypresses at a time. I hardcoded a Colemak layout onto it, but it can be switched to Qwerty with the press of a button. I added a MIDI keyboard mode with 4 full octaves of notes, and I programmed two additional function layers for extra keys or macros. The full source code for the keyboard can be found on Gitlab.

layout manager

I built a modern web interface for my keyboard so that its layouts can be easily updated on the fly. I host a live demo of the layout manager here.

3d printer

I've designed a 3D printer that uses polar - rather than Cartesian - coordinates. I created an OpenGL program to help me visualize the path of the print head, so that I don't have to run the printer to test my transformation logic. Unfortunately, the stability of the print head is very poor, so I don't really use the printer for much, but I spent a good amount of time on it and learned a lot about CAD and firmware as a result.

cga graphics adapter

I found an IBM 5153 monitor at a flea market for just $5, hoping to use it as a dedicated terminal device. I quickly realized that it connects to a computer using a CGA cable, using a protocol that has long since been abandoned for more modern connections like DVI, VGA, HDMI, and DisplayPort. Rather than giving up, I bought a cheap FPGA and programmed it to work as a serial terminal graphics adapter using Verilog. I am working on a dedicated PCB for the FPGA that will allow it to a computer over USB, as well as a Linux driver that will allow it to be used essentially as a terminal emulator.

As the project matures, I plan to open source its components. So far, I've already published klostro, the font I designed for the monitor, and mkfontrom to translate it and other character grids into hardware synthesizable memory initializers.

vst synthesizer

I am coding an audio synthesizer VST plugin in Rust, with an ultimate goal of being able to comfortably compose electronic music without relying on closed-source operating systems like Windows or MacOS.

So far, the audio engine is just about completed. Since Rust doesn't really have any well-supported GUI libraries just yet, I've written a demo GUI with React/Redux. Browsers aren't ideal for real-time audio applications though, so in the meantime, I've been making some open source contributions to improve Rust GUI libraries.

enum_dispatch

I'm the author of enum_dispatch, a Rust procedural macro library that makes it very easy to gain up to 10x performance on dynamic dispatched method calls by refactoring them into static type sets, keeping boilerplate to a minimum.

taro

I created taro, a tool that allows tar archives to be extracted in-place. Normally, extracting files from a tar archive leaves a copy of the original in the archive, requiring twice the disk space. If that's not an option, taro can extract everything with only 512 extra bytes of disk space overhead.

rust

My favorite programming language is, by far, Rust. It offers the raw performance of C, but with memory-safety guarantees and an awesome tooling ecosystem.

open source

I strongly prefer the open source software model because it allows me to make changes to the programs I use if they don't work for me. Those changes can also directly benefit lots of other users when submitted back upstream. So far, I've contributed to azul, a desktop GUI framework for Rust, AnySoftKeyboard, a software keyboard for Android, PostmarketOS, a lightweight Linux distribution designed to run on old mobile devices, zola, the static site generator I use to build this website, and more!