Same concept can be applied to Rhythms too (see attached recent research).
Hi everybody,
I don't know how many people use rack fx these days, and how many dig into them to catch new sounds, but I would like to share with you what I obtained as complex waveforms to control parameters on my fx units.
Basically, as you probably know, rack fxs have the possibility to assign some parameters to CC midi signals, or voltage on specific inlets, or volume pedals and so on. Lexicons (at least my lexicons) limit them to 5 per each unit.
On Mesa Boogie Triaxis you can assign any of the stored values (gain, mid, lows, highs, volume, etc...) to an external information, in order to change it while playing.
Same can be applied to the parameters of all rack fxs compatible with CC signals.
Some of them are just a 1 bit signals (0-63 and 64-127), some have full dynamic on the 128 values.
You can then change in real time the shape of the chorus, the decay of a reverb, the pan, etc...
After being in contact with Professor John Chowning of the Stanford University, the inventor of the FM modulation on the synths to emulate the real sound of the instruments, I came out with some algorythms to change in real time the parameters of my rack fxs.
Here below you can find the code.
I've done it in matlab to speed-up the plots, but I've intentionally used the same commands that can be used in Arduino, that is the platform I'll use to send commands to the fxs.
Code:% #1 funzione per Chorus con AM ed FM fc = 0.29; % Carrier Freq (Hz) fm = 0.085; % Modulating Signal Freq (Hz) m = 9; % Modulation Index t = linspace(0, 10, 2^14); % Number of samples y = -0.45*sin(2*pi*fc*t*0.96) + 0.45*cos(2*pi*fc*t - (m*sin(2*pi*fm*t))) + 0.1*cos(2*pi*fc*t*2.8); subplot (3,2,1), plot(t,y); % #2 funzione per panning fc = 0.69; % Carrier Freq (Hz) fm = 0.23; % Modulating Signal Freq (Hz) m = 9; % Modulation Index t = linspace(0, 10, 2^14); % Number of samples y = - 0.5*sin(2*pi*fc*t - (m*cos(2*pi*fm*t*0.618))) + 0.5*cos(2*pi*fc*t*2.8 + (m*sin(2*pi*fm*t*0.618))); subplot (3,2,2), plot(t,y); % #3 funzione per psycho-flanger fc = 0.69; % Carrier Freq (Hz) fm = 0.23; % Modulating Signal Freq (Hz) m = 1; % Modulation Index t = linspace(0, 10, 2^14); % Number of samples y = - 0.5*sin(2*pi*fc*t - (m*cos(2*pi*fm*t*1.32))) -0.5 + abs(cos(2*pi*fc*t*1.32 + (m*sin(2*pi*fm*t*0.618)))); subplot (3,2,3), plot(t,y); % #4 funzione per dimensione riverbero fc = 0.69; % Carrier Freq (Hz) fm = 0.23; % Modulating Signal Freq (Hz) m = 19; % Modulation Index p = 0; %numero del plot t = linspace(0, 10, 2^14); % Number of samples y = - 0.6*sin(2*pi*fc*t - (m*cos(2*pi*fm*t*1.32))) + 0.4*cos(2*pi*fc*t*3 - (m*sin(2*pi*fm*t*1.32))); subplot (3,2,4), plot(t,y); % #5 funzione per chorus lento fc = 0.069; % Carrier Freq (Hz) fm = 0.023; % Modulating Signal Freq (Hz) m = 19; % Modulation Index t = linspace(0, 10, 2^14); % Number of samples y = - abs(sin(2*pi*fc*t - (m*cos(2*pi*fm*t*1.32)))) + abs(cos(2*pi*fc*t*3 - (m*sin(2*pi*fm*t*1.32)))); subplot (3,2,5), plot(t,y); % #6 funzione per chorus lento fc = 1.29; % Carrier Freq (Hz) fm = 0.385; % Modulating Signal Freq (Hz) m = 18; % Modulation Index t = linspace(0, 20, 2^14); % Number of samples y = cos(2*pi*fc*t - (m*sin(2*pi*fm*t*0.26))) ; subplot (3,2,6), plot(t,y);
Has anyone done something similar to his rack?
Same concept can be applied to Rhythms too (see attached recent research).
The Matlab code I've developed to see the effect of each parameter in 25 different plots is the following:
To switch from the [-1,+1] range of the plots to the [0,127] midi range, you can use the map function in Arduino: https://www.arduino.cc/en/reference/mapCode:% Plot funzioni con AM ed FM fc = 1.29; % Carrier Freq (Hz) fm = 0.385; % Modulating Signal Freq (Hz) m = 9; % Modulation Index p = 0; %numero del plot for fi = 0.1:0.04:1.06; p = p+1; t = linspace(0, 20, 2^14); % Number of samples y = cos(2*pi*fc*t - (m*sin(2*pi*fm*t*fi))) + 0.1*cos(2*pi*fc*t*2.8); subplot(5,5,p), plot(t,y); end
This is what the previous lines plot. I like to plot the parameters this way, in order to understand how they'll affect the function.
It's nice of you to share what you have learned and refreshing to see something new
Experience is something you get, just after you really needed it.
Thanks nickb,
I would also like to see if this can lead new people to experiment, and see new results.
Well, the basic code is really simple.
I modulate the frequency of a sine or cosine wave by varying the value of the radiants during the time:
This can be splitted in:Code:y = cos(2*pi*fc*t - (m*sin(2*pi*fm*t*0.26)))
That is nothing else than a simple cosine wave of the carrier frequency fc.Code:y = cos(2*pi*fc*t)
Then I modulate the radiants of the funcion, so I change the speed of the radiants, so the frequency.
It's a frequency modulation of the carrier frequency fc at the modulation frequency fm.Code:- (m*sin(2*pi*fm*t*0.26))
The amount of modulation is set by the parameter m.
This is the very basic one, then you can do whatever you want:
- square waves by adding nth order harmonics at the amplitude 1/n;
- absolute values of the sinewaves;
- odd roots of the sine waves;
- triangular waves;
- sawtooth waves;
- etc...
For example, do you want to do an AM modulation of a FM modulated sine?
Where:Code:y = cos(2*pi*am*t) * cos(2*pi*fc*t - (m*sin(2*pi*fm*t))) ;
- am is the amplitude modulating frequency;
- fm is the frequency modulation frequency.
Do you want to modulate only from 0 to 50% of the total swing?
Otherwise you can use the map function in Arduino and change the destination range to 32-96 omitting the 0.5.Code:y = 0.5*cos(2*pi*am*t) * cos(2*pi*fc*t - (m*sin(2*pi*fm*t)))
Best way, is to keep the full range on the midi and reduce the range when assigning the midi cc to the effect parameter. This way you do not reduce the resolution in the transmission of the parameter while obtaining the same result.
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks