Ynzn's Vocoder

by Christiaan Janssen

What's it?

When the first vocoder was invented, its purpose was to replace the telephone becoming a cheeper telecomunication system. The problem was that the result wasn't good enough to serve as a telephone: The voice seemed "robotized".
And that's the reason why it is so appreciated in modern music (not only electronic music). The vocoder takes some caracteristics of a sample (usually a speech) and aplies them to another signal (a synth output, an electric guitar, white noise, etc...). It's useful if you want your voice to sound like a robot one, but it can be used on ANY signal (including drumloops, basslines, guitar riffs, ...).
The name comes from "VOice enCODER".

How does it work?

This machine picks the module of the spectrum of the modulator. It splits into bands and multiplies these bands with the spectrum of the carrier. In time domain this would be something like a strange convolution, ignoring the phase of the modulator and doing some kind of frequency-domain-low-pass-filtering (A little weird idea).
So, what it does is:
1- Get the modulator and the carrier (discussed later).
2- Transform (performing the corresponding FFTs) these two signals.
3- Split the modulator into bands.
3- Multiply them with the carrier.
4- Perform the inverse Fourier transform with the output (IFFT).
5- Interpolate the output with the previous output.

Workmodes

Due to the problems to obtain two separated signals this vocoder can work in five different workmodes, which mean three different solutions to this problem. They are sorted in chronological order, from the first ones I thought about to the last ones, suggested by Volker Muehle.
The first two workmodes use a built-in tracker to get the missing signal.
In workmode 1 the input is used as modulator and the carrier is taken from the wavetable. You have a built-in tracker that lets you specify the note, the volume, which wave to use and some finetunning. This mode forces the carrier to loop, but lets you change the loopin and loopout points (you have to do it in the wavetable screen). It is a monotrack tracker and ignores the ADSR envelope. I wanted to make it better but I don't think it will be necessary, since you can use without problems the other workmodes, which are more powerful.
Workmode 2 considers the input as carrier and takes the modulator from the wavetable. It doesn't force any loop, but you can use loops if you want.
The workmode 3 needs the Ynzn's Multiplexer. It demultiplexes two multiplexed signals (it's explained in detail with the documentation of that machine and the Ynzn's AM), uses the low-pos one as modulator and the high-pos one as carrier.
The workmodes 4 and 5 use an array of buffers to store the carrier. They are inspirated from an idea of Volker Muehle. The workmode 4 stores its input to one of the buffers of that array and clears its output. The workmode 5 gets the signal from one of the buffers and uses it as carrier. It consideres its input as modulator.
To use this workmodes you'll need two vocoders: one to get the carrier and one to do the vocoding. It isn't necessary to connect them. Instead of only one buffer there is an array of buffers because otherwise it wouldn't be possible to use more than one vocoder per song.

Usage

> P a r a m e t e r s

WorkMode | The working mode of the vocoder as explained above.
Bands | The number of bands the modulator is splitted into.
Antialias | Only in mode 3. It sets the bandwith of the antialias filter.
Interpolation | The number of samples used to interpolate the beginning of the chunks with the previous chunks. This vocoder uses linear interpolation.
Buffer | This one is used in modes 4 and 5. In this mode 4 the input goes to a buffer specified by this parameter, and the output is cleared. In mode 5 the input is used as modulator and the carrier is taken from the buffer specified by this parameter.
Wav Volume | Only in modes 1 and 2. It's the volume of the wave taken from the wavetable. This parameter is visible only from the sequence editor.
Note | Only in modes 1 and 2. It lets you change the note in which the wave is played. This one doesn't trig the note. This means it lets you change the "pitch" of the wave without restarting it.
Wave Select | Only modes 1 and 2. It lets you specify which wave you want from the wavetable. It also jumps to the beggining of the wave.
FineTune | Only 1 and 2. It lets you change the pitch from -1/2 halftone to +1/2 halftone. It's also invisible in the machine editor.

> D e t a i l s

Mode 1: Place one or several generators for the modulator. Connect them to the vocoder. Go to the wavetable. Load the wave you want to be used as carrier. Program the vocoder as if it was a tracker to "generate" the carrier. Play the song (there must be a signal in the input of the vocoder).
Mode 2: Place one or several generators in the machine editor and program them to generate the carrier. Connect them to the vocoder. Select a wave (modulator) in the wavetable. Program the vocoder as if it was a tracker to "play" the modulator...
Mode 3: Place one or several generators for the modulator. Place and program some more for the carrier. Place two Multiplexers. Connect the "modulators" to one of them and set its filter on. Connect the "carriers" to the other one, set "position:High" and turn its filter on. Then place the vocoder (mode 3) and connect the both multiplexers to it.
Mode 4+5: Place some generators for the modulator and some more for the carrier. Place two vocoders. Connect the "carriers" to one of them and set its workmode to 4. Choose one buffer (anyone will work, but be careful if there are other vocoders in the same song). Connect it somewhere (it doesn't matter where, as there will be no output; but it needs to be connected if you want it to work). Connect the "modulators" to the other one and set its workmode to 5. Choose the same buffer as before. Okay.

Notes

This vocoder is a little clicky and very slow. The clicking appears because there are phase differences between chunks. The solution implemented is linear interpolation, although chunk overlapping would be better. The problem of chunk overlapping is that it's very difficult to implement it and keep the compatibility with Buzz without needing a huge CPU usage.
And it's slow because it performs three FFT's each time the Work() function is called.
I will gratefully listen to any comments or suggestions. Send me any feedback, questions, asskicking tunes, suggestions, greetings (what for?), breathtaking machines, complaints, want-to-become-part-of-the-spanish-buzz-scene messages, dont-understand-what-the-hell-did-you-write-in-your-shitty-helpfile messages, ... =)

Bibliography and help

"Discrete-time signal processing"
Alan V Oppenheim, Ronald W Schafer
PRENTICE HALL
"Tratamiento digital de la señal" (spanish)
José B Mariño, Francesc Vallverdú, José A. Rodríguez
EDICIONS UPC
"Fourier Transforms"
Robert M. Gray, Joseph W. Goodmad
KLUWER ACADEMIC PUBLISHERS
Many thanks for their help to:
Oskari Tammelin, José Mª Sánchez, José Luis García, Volker Muehle, J. Argüelles Rius (for maintaining my machines in his web), J. R. Casas and Albert Oliveras.
And, again, SORRY FOR MY ENGLISH!!!

Author | Christiaan Janssen "Ynzn"
Email | cjan5813@alu-etsetb.upc.es
Spanish Buzz Scene: | http://members.xoom.com/arguru/home.htm