Gravity Synth is a multi-view iOS application I designed. It's written in a cominbation of Objective-C and C++ and
uses Apple's Core Audio and wavetable synthesis to create notes. There isn't much of a template for the design, I simply wanted to do something cool that supported high-polyphony and this seemed like the way to go. I know that's not particularly scientific but the whole ethos of the project is making something that's fun to pick up and play around with and learn from that experience rather than spend a great deal of time trying to figure out how to make the application do what you want it to do. I wanted it to be something anyone could play with.
The Toro Verb is a reverb algorithm I designed based off of the "Reverb Tank" concept published by Jon Dattorro of Stanford in 1997. It also includes a modulation LFO to get some nonlinear effects as well as a freeze button that allows for a huge reverb "drop" when engaged and disengaged. The plugin is VST-compatible and was originally designed in an old version of Will Pirkle's RackAFX software. That's part of the reason why there are three buttons when only one of them is functional. RackAFX is a lot better now and I would recommend it to anyone looking to get into plugin programming in either VST2/3 or AU format.
Here's an impulse response of the reverb at a realitvely high setting so you can see the voluptuous envelope it generates.
If you'd like to test this guy out (as a VST .dll) or look at the documentation further please feel free to download it!
The following examples of the reverb are done using stems from the song "Trying To Be Cool" by the band Phoenix. They may be freely obtained from the band's soundcloud.
Title
Audio
Clean
Light Reverb
Nonlinear Reverb
The above button contains some examples of a few reverb settings mixed in the Reaper DAW. Give it a listen and compare it to your favorite reverb plugins.
Project 3 - Tone Lube
This is an analog distortion circuit I designed named the "Tone Lube".It features both diode and transistor distortion as well as a waveshaper and built in limiter to provide some serious destruction to an input signal. The write up in the following paragraph speaks for it more than anything I'll say here. The circuit was designed and simulated in CircuitMaker Pro and the schematic was drawn up in ExpressSCH.
Here is the write up I did for this design as well as some output signal tests performed through CircuitMaker Pro : Tone Lube
Project 4 - Mazer
I know, that's not a great name. This was a Christmas present for my cousins. It's a turn based game where you navigate increasingly large mazes trying to get to the end and finding the "purple nugget" as they're so named. The real impressive thing from a programming perspective is that the game randomly generates levels each time you play, so each time you play there is a new environment to explore. The braiding algorithm used to generate the mazes also limits the number of dead ends.
For whatever it's worth my cousins liked it. As more an more enemies get added the game definitely becomes a bit of a beast, I don't think I've ever gotten past level 12, so if you do please let me know! You can download a .zip of the game by clicking on that link. There are two executables that run the same game, however Mazer.exe runs in a bigger window than Mazer2.exe. They both share the same highscores and operate the same way. Sorry OS X people but you need Windows to run it. I've tested it on Windows Vista/7/8 and all of them cooperate.
Project 5 - Genetic Algorithm
A project for my class on artificial intelligence that I improved a bit
after the class was completed. This program uses the
genetic algorithm to search for the global maxima along a randomized
function. You can see in the above gif the tendency for the population
to congregate around local maxima (the tops of hills so to speak).
The user is allows to specify a number of generations of population to
use (in the case of the above gif where I picked 100) or to terminate
when the population ceases to evolve over a certain number of
generations. There's also a setting that allows the user to single step
through generations.
I had a lot of fun doing this, watching generations of dots march slowly
around a function is peaceful when it's done slowly. From a programming
perspective it's interesting because of the random mutation involved.
You have a chance of improving the quality of your previous generations,
but also a chance of making it worse, making it very tough to know when
to stop if you're looking for something specific, but it can be quite
useful if you don't really know what you're looking for. All you need to
know is how to evaluate what you're viewing.
Project 6 - Matlab Convolution
Here are a few Matlab projects I have done as part of my coursework in Digital Audio. The first example contains convolution of an impulse response with two audio files, while the second deals with HRTFs.
Title
Audio
Spectrum
Impulse Response
Glass Break
Glass Convolution
Audio Clip
Audio Convolution
Click the above button to reveal the table of audio clips and magnitude plots. All of the above audio files deal with the convolution of the impulse response (first audio file) with another audio file to place it in a space. Fortunately Matlab makes it very easy to use the FFT to get the audio files into the frequency domain where they can be multiplied together for a fast convolution.
This next project was a manipulation of audio files using the CIPIC HRTF database. That database contains head-related transfer functions for a multitude of different ear shapes and sizes. Using the impulse responses of one set of ears and manipulating interaural time and level differences, the sound can be placed in different locations of the listener's aural perspective. This allows one to pan audio in two dimensions (horizontally and vertically).
This is a set of the HRTF impulse reponses. The particular pair above is for a sound source located directly in front of the subject.
Title
Audio
Glass Break Normal
Leftmost Image
Rightmost Image
Highest (y-axis) Image
Left-high Image
Don't feel bad if you can't hear these as perfect left and right pans or struggle to hear the change in height. If your ears aren't similar to those used to create the impulse responses you won't respond perfectly to these sound files. However, you should be able to percieve that there are some differences between them.
Project 7 - Signal Plotter
This is a project I'm currently working on that I sort of started for fun
which I'm now trying to turn into a mildly educational and fun tool. The idea
is to create a program that can plot complex sinuoids and help the user better
understand digital signal processing. The version shown in the above gif (ver 0.8)
supports plotting some basic wavetypes and has some commands tools that allow the
user to get a good visual idea of how these waveforms are plotted digitally.
There is a still a to do list that accompanies this, including improving the editing
tool for creating custom waveforms, like allowing the user to add more than one custom
waveform, and Fourier transforms of the signal as it's being plotted, allowing the user to
see a STFT occuring on their signal as it's being plotted.
The interface and design are all original creations using the drawing mechanisms and events
from the windows API, so this is also an opportunity to get familiar with that and
test out designing some of my own interface objects (buttons and sliders).