When beginner musicians are learning how to play an instrument, it’s relatively easy to determine if you’ve played the right notes or not. However, they often overlook the timbre of these notes, which is equally important. Timbre is the quality of a note; for example, warm and round vs sharp and bright.
The main aspect that defines timbre are overtones. Overtones (often referred to as the harmonic series) are a sonic phenomenon where a root frequency is accompanied by frequencies which are integer multiples of the root. So, if an instrument plays the note
This project aims to invent the means for quantifying timbre, so that beginner musicians can receive real-time, visual feedback to train their ear and improve their playing technique.
ToneTutor assigns a number to timbre with three steps:
- it uses pitch detection to determine the fundamental note
- it performs a Fourier transformation to figure out the overtones corresponding to that note.
- In ToneTutor, this is called the harmonic fingerprint.
- it calculates a weighted sum of the harmonic fingerprint, with higher overtones having a higher weight.
- In ToneTutor, this is called a benya.
- In general, a smaller benya results from a warm note, whereas a large benya results from a bright note.
- In ToneTutor, this is called a benya.
Note - ToneTutor is still a work in progress.
Expand to learn more about the harmonic series
An Android app for additive synthesis. After adjusting the harmonic-series editor and waveshape selector to construct a sound, the user can play music with the resizable, polyphonic keyboard and pitch bend slider.
The app uses a synth library I wrote in a Kotlin for generating, manipulating, and playing periodic signals with overtones. This library is also used in ToneTutor for testing purposes.
This was my first dive into app development, and it ended up being a fantastic learning experience.
Links Repo
Satisfactory is a factory building game that I've been playing for the past few months. However, the game requires some ratio math that can become tiresome when planning larger factories. So, using Compose for Desktop, a Kotlin framework, I created a desktop app for browsing the game's recipes and calculating the clock speeds required for a given output/minute or vice versa. As a bonus, the app's UI mimics an in-game menu.
Links Repo
Time arithmetic is something that is quite tedious to me. And, with a hybrid-remote job where I need to track my hours, it's something I need to do quite often. So, I wrote TimeCalc, a CLI REPL-like program for performing arithmetic with time and durations.
TimeCalc was written with Kotlin-Native, which compiles down to a binary executable rather than a JVM byte-code. This makes it easier to add the executable to PATH and run from the command line.
TimeCalc supports the following:
A common use case is seeing what time I will be ending work that day. Suppose I want to get 8 hours, and I've already spent an 5 hours and 26 minutes. In TimeCalc, this is achieved with the following:
Links Repo
I developed an app to help my brother stay updated on the latest tools available on hyperKitten.com, a simple website that doesn't have a mailing list. The app regularly checks the website and sends notifications via email or text when it is updated. This helps my brother, who does hand carpentry, stay informed about new tool releases without having to manually check the website himself.
To accomplish this, the app uses WorkManager, a popular library for scheduling tasks, to run a script in the background on an old Android phone. This script checks the website, scrapes the last-updated date, compares it to the previous last-updated date, and alerts the mailing list if the date is new.