Is there a way to increase the slope of an asymmetrical sine wave in SC efficiently? The best way I know of to make an asymmetrical sine wave is with SineOscFB
. I can increase the slope of a sine wave with PMOsc
using a modulator of twice the frequency as the carrier and modulation index between 0 and 0.5. But how would I increase the slope of an asymmetrical wave? Would I just have to use a wavetable?
There are many ways to synthesize an asymmetrical sine wave. My first thought would be a variant of phase distortion synthesis, such as using a power function to warp the phase of a sine oscillator: { ((LFSaw.ar(100, 3).linlin(-1, 1, 0, 1) ** 0.5) * 2pi).cos }.plot(0.05)
. Modulate the 0.5 exponent for timbral variation.
Amplifying a signal “increases its slope” but that’s probably not what you mean by that. Could you draw a picture of the desired waveform or effect?
EDIT: I tried the PMOsc thing, do you mean something like this: { SinOsc.ar(100, SinOsc.ar(200) * 0.5) }.plot(0.05);
? That effect can be emulated with saturation, e.g. (sig * 10.dbamp).tanh
.
By increasing the slope I mean something like this:
{SinOsc.ar(100, 0, [1, SinOsc.ar(100, 0).squared]) }.plot(0.05, s);
I want to have a sine wave generator where I can change the symmetry, slope, and saturation incidentally (though I used .softclip
instead of .tanh
).
hmmm your plot is SinOsc.ar(100).cubed
maybe you want to vary the exponent:
{SinOsc.ar(100) ** Line.kr(1,4,0.1)}.plot(0.1, s);
Perfect, the answer is basically both of those things! Something like:
(
SynthDef(\test, {
|out=12, freq=440, asym=0, saturation=0, slope=0|
var osc = ((LFSaw.ar(freq, 3).linlin(-1, 1, 0, 1) ** asym.linlin(0,1,1.0,0.5)) * 2pi).cos;
osc = osc ** slope.linlin(0,1,1,4);
osc = (osc * saturation.linlin(0,1,1,10)).softclip;
Out.ar(out, osc);
}).add;
)
(
Synth(\test, [\slope, 1, \asym, 1, \saturation, 1]);
s.scope(1, 12);
)