What kind of signal is the SpectrumInRAM and/or the LiveSpectralAnalysis producing and how can you access single partials and process them seperately? This was the question I asked myself a while ago. Of course you can use the SpectrumTrackSelector or any of the Spectral Modifiers but there’s no way of splitting or summing the signal itself so you always end up with many processor-hungry OscillatorBanks. At least that’s what I thought… but after watching “The Wire Between” by Pete Johnston and with some help of the very same Pete in the Forum I worked it out
First you have to understand how the signal is presented to the OscillatorBank. To see it you have to split the signal. So just put a ChannelJoin after the SpectrumInRam and delete the delay module which will be added by default. Now you have the amplitudes on the left and the frequencies on the right. In this case I used Alien threat new h.spc which contains 252 partials. Insert an OscilloscopeDisplay to see what’s going on. Set the PulseTrain Period to 252 samp:
As you can see the signal is divided in frames, each frame 252 samples long because it’s a 252 partials spectrum file. If 252 samples represent 252 partials it is kind of obvious that 1 sample represents 1 partial, right? So in order to access the single partials (or groups of them) we have to split the signal at sample rate. Since CapyTalk isn’t fast enough (operating at 1kHz) we have to figure out another way.
The PulseTrain comes quite handy for this: Using a Period of 252 samp and a DutyCycle of (!FirstPartial/252) we get repeating frames of 0s and 1s. Remember a DutyCycle of 1 means that it is 1 for all of each frame (period) and 0 means that the output is 0 for all of each frame (period). By using the CapyTalk above we can specify how many samples will be 1s. Using a ScaleAndOffset module we can invert the PulseTrain so the 0s become 1s and vice versa: Scale by -1 and Offset by 1. If we multiply the inverted PulseTrain with the two legs of the spectrum signal using a Product module we can now choose where the spectrum should start (that’s the reason I called the HotValue !FirstPartial).
Now we’re going to use a second PulseTrain with the following CapyTalk expression in the DutyCycle parameter field: ((!FirstPartial + !NbrPartials) / 252). Multiplying the inverted PulseTrain with this PulseTrain gives us the possibility to select an area of 1s for each frame.
Now we can split the spectrum signal by using one Product module for the processed part and one Product module for the original signal using the inverted Product of the PulseTrains. Using this method we can sum up the spectrum signals later with a Mixer and we can finally use only one single OscillatorBank:
Now you can do the usual processing but you can choose which partials are affected. Here is one Sound I made I call the VowelFreezer: