SV: Re: [sdiy] Much progress on Buchla waveshaper analysis

Aaron Lanterman lanterma at ece.gatech.edu
Sun Nov 20 21:50:05 CET 2005


On Sun, 20 Nov 2005, karl dalen wrote:

> Nice samples,...but.... using 3 cascaded stages of the 
> http://www.cgs.synth.net/modules/cgs52_folder.html R Lockart nonlinear 
> shaper produces lot of folds who gives a more gentle, rounded DX'ish FM 
> to it and that to a LOT less circuitry compared to the Buchla, but with

I plan to explore other waveshapers at some point; right now, my prime 
goal was to understand and model that specific Buchla circuit, with the 
idea of making a software model of the Easel.

> all those stages shouldent the Buchla sound produced have a lot more of 
> folds during symetry sweep? It sounds a bit hollow and weak!

Beats me.

I haven't analyzing the FET-controlled VCA and offset circuitry at the 
front end, so I don't know what voltage ranges are expected going in.

The voltage threshold where the op amp turns "on" are:

0.6 1.8 2.994 4.08 and 5.46

The final summing amp also acts as a single-pole low-pass filter with a 
relatively low cutoff frequency; that might take off some of the edge. I 
haven't modeled it yet.

For those who are curious, my MATLAB code is below...

- Aaron

% function y = timbre2(xin);

fs = 44100;

tt = 0:(1/fs):3.5;

% For timbresweep
%x = 2 .* tt .* cos(220*2*pi*tt);

% For symmetrysweep
x = tt + 2 .* cos(220*2*pi*tt);

x = [x x(end:-1:1)];

% to plot waveshape
%x = -6:0.01:6;

supplylimit = 6;
R1 = [68E3 30E3 91E3 49.9E3 10E3]
R2 = 100E3;
R3 = [33E3 68E3 56E3 43.2E3 100E3];
Rout = 1.2E6;
C = 100E-12;

threshold = [0, supplylimit .* R1 ./ R2];
funky_multiplier = 1 ./ (1 ./ R1 + 1 ./ R2 + 1 ./ R3);

mixer_multiplier = Rout ./ R3;
total_multiplier = [Rout ./ 240E3, funky_multiplier .* mixer_multiplier];
signs = [1 1 1 -1 -1 -1];

terms = zeros(length(x), 6);

for loop = 1:length(threshold);
   terms(:,loop) = signs(loop) .* (abs(x) > threshold(loop)) ...
                     .* total_multiplier(loop)...
                     .* (x - sign(x) .* threshold(loop));
end
y = sum(terms,2);

soundsc(y,fs);
y = y ./ (max(abs(y)));
%wavwrite(y,fs,'buchla_timbresweep.wav')
wavwrite(y,fs,'buchla_symmetrysweep.wav');



More information about the Synth-diy mailing list