The proposed goal of this assignment was to create a plug-in that emulates a vocal harmonizer, or an instrument-controlled voice duplicator that takes an input vocal track and maps copies of the voice to the pitches played by the instrument (MIDI keyboard). In actuality, a vocal harmonizer would perform either a pitch-tracking or pitch-correction algorithm on the vocal track, and map duplicated vocal tracks to notes according to the pitches played on the keyboard. These were features that were secondary to the initial goal of producing a system that would alter a vocal input signal with the characteristics of a polyphonic source, preferably driven by a synthesizer.
To emulate such an effect with the given confines of an AudioUnit plug-in template and resources for completion, a Channel Vocoder was implemented to emulate the behaviors of a Vocal Harmonizer. A channel vocoder describes a particular implementation of a vocoder. The function of a channel vocoder is to essentially map the spectral amplitude of a modulator sig- nal (typically voice) to that of a carrier signal (synthesized patch of one or more tones). With this effect, one could emulate the sound of a synthesized instrument effectively ”speaking” with a similar spectral timbre of a human’s voice. Here is an example of this effect with the carrier of a pipe organ, and a modulator of someone reciting the United States Pledge of Allegiance. Although the output of this effect is powerful and interesting, the process by which such a signal is produced does not require immense computational power. Thanks to the growing availability of personal computers and computing devices, any machine with the ability to perform FFTs on audio files would be able to reproduce this effect. Both the FFTW and libsndfile libraries were used to develop this plug-in.
Working through this assignment provided eye-opening experiences in fashioning a template (such as the AUEffect template) to support desired behaviors outside of the default functionality. Amongst several obstacles, a primary function of the channel vocoder plug-in would rely on 2 steady input streams of audio at all times. This would require multi-channel support from the plug-in architecture, which is unfortunately unsupported by both Apple's template and documentation. This post covers the steps required to alter your AudioUnits plug-in to handle more than the default mono I/O channel configuration.
Download the ChannelVocoder AU plug-in from my final project here. A few notes on using the plug-in: remember to put the plug-in on a stereo channel (perhaps a bus), and send it two panned inputs (modulator on the left, and carrier on the right). Also, be sure to add the plugin to your /Library/Audio/Plug-ins/Components/ directory (this is the default path for AU plug-ins to be recognized by most host applications. There are still minor bugs in the plug-in, and some popping may occur when first loading. If this occurs at all, try bypassing the plug-in, and re-enabling it. If this does not work, restarting your host appliation should fix the issue.
More information on the process and outcome of this project can be found in this paper written to compliment the assignment. The presentation delivered as part of the completion of this assignment can be viewed by clicking the thumbnail to the right. Audio clips highlighting the capabilities of the channel vocoder created can also be found below.