I am developing a Virtual Studio (VST) Plugin for MAT240A, Digital Audio Programming. VST plugins are used in professional audio software such as Cubase, Sony ACID and Ableton Live. Development is simpler than making a standalone audio application since the details of manipulating sound files are taken care of by the plugin host.
The host gives you a buffer of values corresponding to the audio stream and the plugin operates on the buffer and returns it so it can be passed to the next plugin in the host, or the output.
I am using the JUCE framework to develop my plugin. Though JUCE has many features and benefits I am using it because it greatly simplifies the Graphical User Interface development through a tool called the Jucer.
My project goal is to create a plugin that will shift the pitch of the audio while keeping duration constant (since it is used in a real-time playback situation). To make things more interesting I want to have multiple bands that let me pitch-shift certain segments of the frequency spectrum independently.
Pitch shifting can be accomplished in the time-domain or the frequency-domain. Time-domain involves modifying the sampling rate and discarding samples while frequency-based shifting uses the Fast Fourier Transform (FFT).
I started by reading about the various techniques and decided it would be interesting to try it with the Fourier transform. This article has very good information about the method as well as the FFT in general. The FFT method is effective but computationally intensive.
Many people have written open-source libraries of code that are extremely optimized for this task. As the goal of this class is to explore the creation of audio-processing applications rather than the effects algorithms themselves I decided to incorporate one such library into my code.
SoundTouch is an open-source library that provides pitch-shift, time-stretch and playback-rate effects. It is object-oriented and very easy to use. It is used in many open source applications and audio plugins.
The JUCE framework has built-in classes for audio filters as part of the audio plugin code which will make splitting the signal into different bands much easier.
Below is the curent user interface for the plugin as it is begin developed: