Compare commits
4 Commits
main
...
spectral-a
| Author | SHA1 | Date |
|---|---|---|
|
|
2fd31d158a | 18 hours ago |
|
|
8d2c2e887a | 19 hours ago |
|
|
6a6974d762 | 4 weeks ago |
|
|
cfb1196081 | 4 weeks ago |
@ -0,0 +1,77 @@
|
||||
s.boot;
|
||||
|
||||
~dict = BmDspAlgs.getDict("synths/bass/saw_bass.scd");
|
||||
~dict[\postAmp] = true;
|
||||
~dict[\useEnv] = true;
|
||||
|
||||
~dict.makeSourceSynthDef().add();
|
||||
|
||||
~sawBass = ();
|
||||
~sawBass[\name] = \saw;
|
||||
|
||||
Ndef(~sawBass[\name]).clear;
|
||||
Ndef(~sawBass[\name]).ar(2);
|
||||
Ndef(~sawBass[\name]).prime(~dict[\name]);
|
||||
Ndef(~sawBass[\name]).play;
|
||||
|
||||
(
|
||||
Tdef(\t, {
|
||||
loop {
|
||||
[40, 45, 47].do({|n|
|
||||
Ndef(~sawBass[\name]).put(
|
||||
n,
|
||||
Ndef(~sawBass[\name]).source,
|
||||
0,
|
||||
[\freq, n.midicps, \gate, 1, \amp, 0.25, \release, 0.5, \attack, 0.01]
|
||||
);
|
||||
0.25.wait;
|
||||
});
|
||||
}
|
||||
}).play;
|
||||
)
|
||||
|
||||
(
|
||||
Tdef(\t2, {
|
||||
loop {
|
||||
[55, 61].do({|n|
|
||||
Ndef(~sawBass[\name]).put(
|
||||
n,
|
||||
Ndef(~sawBass[\name]).source,
|
||||
0,
|
||||
[\freq, n.midicps, \gate, 1, \amp, 0.25, \release, 0.1, \attack, 0.01]
|
||||
);
|
||||
(4/7).wait;
|
||||
});
|
||||
}
|
||||
}).play;
|
||||
)
|
||||
|
||||
(
|
||||
Ndef(~sawBass[\name]).put( 159, \filter -> { arg in;
|
||||
d = LPF.ar(in, 1100);
|
||||
d
|
||||
});
|
||||
)
|
||||
|
||||
(
|
||||
Ndef(~sawBass[\name]).put( 160, \filter -> { arg in;
|
||||
var d = in;
|
||||
var diffusion = \diffusion.kr(1);
|
||||
var spacesize = \spacesize.kr(0.1);
|
||||
8.do { |i|
|
||||
d = AllpassC.ar(
|
||||
d,
|
||||
delaytime: LFNoise1.kr(0.01!2).range(0.01, spacesize),
|
||||
decaytime: diffusion
|
||||
)
|
||||
};
|
||||
|
||||
d
|
||||
});
|
||||
)
|
||||
|
||||
Ndef(~sawBass[\name]).set(\diffusion, 0.03);
|
||||
Ndef(~sawBass[\name]).set(\spacesize, 0.1);
|
||||
|
||||
Tdef(\t2).stop;
|
||||
Tdef(\t).stop;
|
||||
@ -0,0 +1,25 @@
|
||||
(
|
||||
name: 'fft_freeze',
|
||||
func: {
|
||||
| buf |
|
||||
var in = In.ar(buf, 1);
|
||||
var isOn = \freezeGate.kr(0);
|
||||
var chain = FFT(
|
||||
LocalBuf(2048),
|
||||
in
|
||||
);
|
||||
|
||||
var frozen = PV_Freeze(chain, isOn);
|
||||
var jittered = PV_PhaseShift(frozen, \phaseJitter.kr(0) * TRand.kr(0, 2pi) * isOn);
|
||||
var sig = IFFT(jittered);
|
||||
|
||||
sig;
|
||||
},
|
||||
inChannels: 1,
|
||||
outChannels: 1,
|
||||
requiresBuffer: true,
|
||||
specs: (
|
||||
freezeGate: [0, 1, \step, 1, 0],
|
||||
phaseJitter: [0, 1, \lin, 0.01, 0.1],
|
||||
),
|
||||
)
|
||||
@ -1,29 +1,89 @@
|
||||
NodeDictionary : IdentityDictionary {
|
||||
getDefaultOr {
|
||||
| key, defaultValue |
|
||||
if(this[\defaults][key].isNil, {
|
||||
^defaultValue
|
||||
}, {
|
||||
^this[\defaults][key]
|
||||
});
|
||||
}
|
||||
|
||||
makeAnalysysNdef {
|
||||
^Ndef(this[\name], {
|
||||
var input = SoundIn.ar(\bus.kr(0));
|
||||
var signal = SynthDef.wrap(
|
||||
func: this[\func],
|
||||
prependArgs: [input]
|
||||
);
|
||||
|
||||
if(this[\convertToKr].isNil.not
|
||||
and:
|
||||
this[\convertToKr] == true,
|
||||
{
|
||||
A2K.kr(signal);
|
||||
}, {
|
||||
signal;
|
||||
});
|
||||
});
|
||||
}
|
||||
getDefaultOr {
|
||||
| key, defaultValue |
|
||||
if(this[\defaults][key].isNil, {
|
||||
^defaultValue
|
||||
}, {
|
||||
^this[\defaults][key]
|
||||
});
|
||||
}
|
||||
|
||||
processSig {
|
||||
| sig, gate |
|
||||
|
||||
var releaseNode = if (
|
||||
this[\sustained].asBoolean,
|
||||
{ 2 },
|
||||
{ nil }
|
||||
);
|
||||
|
||||
var envDoneAction = if (
|
||||
this[\sustained].asBoolean,
|
||||
{ 0 },
|
||||
{ 2 }
|
||||
);
|
||||
|
||||
if(this[\useLfo].asBoolean, {
|
||||
var lfo = switch(this[\lfoWave])
|
||||
{ \sin } { SinOsc }
|
||||
{ \saw } { Saw }
|
||||
{ \tri } { LFTri }
|
||||
{ \pulse } { Pulse }
|
||||
? SinOsc;
|
||||
|
||||
signal = signal * lfo.kr(
|
||||
\lfoFreq.kr(1)
|
||||
).range(
|
||||
1 - \lfoGain.kr(0.5), 1
|
||||
);
|
||||
});
|
||||
|
||||
if(this[\useSaturation].asBoolean, {
|
||||
this.getDefaultOr(\saturationSteps, 4).do {
|
||||
signal = signal.tanh;
|
||||
}
|
||||
});
|
||||
|
||||
if(this[\useEnv].asBoolean, {
|
||||
var att = this.getDefaultOr(\attack, 0.1);
|
||||
var rel = this.getDefaultOr(\release, 0.1);
|
||||
var curve = this.getDefaultOr(\curve, 1);
|
||||
|
||||
var env = Env(
|
||||
[0, 0, 1, 0],
|
||||
[0, \attack.kr(att), \release.kr(rel)],
|
||||
[0, \attackCurve.kr(curve), \releaseCurve.kr(curve)],
|
||||
releaseNode: releaseNode,
|
||||
).kr(envDoneAction, gate: gate);
|
||||
|
||||
signal = signal * env;
|
||||
});
|
||||
|
||||
if(this[\usePan].asBoolean, {
|
||||
switch(this[\panning],
|
||||
\splay, { signal = Splay.ar(signal, \spread.kr(1), center: \pan.kr(0)); },
|
||||
\splayAz, { signal = SplayAz.ar(this[\panningChannels], signal, orientation: \orientation.kr(0.5)); },
|
||||
\pan, { signal = Pan2.ar(signal, \pan.kr(0)); }
|
||||
);
|
||||
});
|
||||
|
||||
if(this[\postAmp].asBoolean, {
|
||||
signal = signal * \postAmp.kr(1);
|
||||
});
|
||||
|
||||
// if(this[\detectSilence].asBoolean, {
|
||||
// FreeSelf.kr(
|
||||
// DetectSilence.ar(
|
||||
// [signal[0], signal[1]] + Impulse.ar(0)
|
||||
// ).product)
|
||||
// });
|
||||
|
||||
if(this[\limitDuration].asBoolean, {
|
||||
Line.kr(0, 1, \dur.kr(1), doneAction: 2);
|
||||
});
|
||||
|
||||
signal = signal * \amp.kr(1);
|
||||
|
||||
^signal;
|
||||
}
|
||||
}
|
||||
@ -1,14 +1,19 @@
|
||||
+ NodeDictionary {
|
||||
makeBufferProcessingNdef {
|
||||
| name, buf, quant = 1.0 |
|
||||
var ndef = Ndef(name);
|
||||
ndef.proxyspace.quant = quant;
|
||||
ndef[0] = SynthDef.wrap(
|
||||
func: this[\func],
|
||||
prependArgs: [buf]
|
||||
);
|
||||
|
||||
ndef.play;
|
||||
^ndef;
|
||||
}
|
||||
makeBufferProcessingNdef {
|
||||
| name |
|
||||
|
||||
var internalName = if(name.isNil, {this[\name]}, {name});
|
||||
|
||||
Ndef(internalName, {
|
||||
var signal, gate;
|
||||
|
||||
gate = \gate.tr(0);
|
||||
|
||||
signal = SynthDef.wrap(
|
||||
func: this[\func],
|
||||
);
|
||||
|
||||
this.processSig(signal, gate);
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1,32 +1,18 @@
|
||||
+ NodeDictionary {
|
||||
makeBufferProcessingSynthDef {
|
||||
SynthDef(this[\name], {
|
||||
var buf = \buf.kr;
|
||||
var signal = SynthDef.wrap(
|
||||
func: this[\func],
|
||||
prependArgs: [buf]
|
||||
);
|
||||
makeBufferProcessingSynthDef {
|
||||
SynthDef(this[\name], {
|
||||
var signal, gate;
|
||||
|
||||
signal = Pan2.ar(
|
||||
signal * \amp.kr(1),
|
||||
\pan.kr(0)
|
||||
);
|
||||
gate = \gate.tr(0);
|
||||
|
||||
if(this[\detectSilence].asBoolean, {
|
||||
FreeSelf.kr(
|
||||
DetectSilence.ar(
|
||||
[signal[0], signal[1]] + Impulse.ar(0)
|
||||
).product)
|
||||
});
|
||||
signal = SynthDef.wrap(
|
||||
func: this[\func],
|
||||
);
|
||||
|
||||
if(this[\limitDuration].asBoolean, {
|
||||
Line.kr(0, 1, \dur.kr(1), doneAction: 2);
|
||||
});
|
||||
|
||||
Out.ar(
|
||||
\out.kr(0),
|
||||
signal
|
||||
);
|
||||
}).add;
|
||||
}
|
||||
Out.ar(
|
||||
\out.kr(0),
|
||||
this.processSig(signal, gate);
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1,74 +1,24 @@
|
||||
+ NodeDictionary {
|
||||
makeSourceNdef {
|
||||
| name |
|
||||
var internalName = if(name.isNil, {this[\name]}, {name});
|
||||
makeSourceNdef {
|
||||
| name |
|
||||
var internalName = if(name.isNil, {this[\name]}, {name});
|
||||
|
||||
Ndef(internalName, {
|
||||
var freq, signal, env, gate;
|
||||
Ndef(internalName, {
|
||||
var freq, signal, gate;
|
||||
|
||||
var releaseNode = if (
|
||||
this[\sustained].asBoolean,
|
||||
{ 2 },
|
||||
{ nil }
|
||||
);
|
||||
gate = \gate.tr(0);
|
||||
freq = \freq.kr(220);
|
||||
|
||||
gate = \gate.tr(0);
|
||||
freq = \freq.kr(220);
|
||||
if(this[\useFreqLag].asBoolean, {
|
||||
freq = Lag.kr(freq, \freqLag.kr(0.5));
|
||||
});
|
||||
|
||||
if(this[\useFreqLag].asBoolean, {
|
||||
freq = Lag.kr(freq, \freqLag.kr(0.5));
|
||||
});
|
||||
signal = SynthDef.wrap(
|
||||
func: this[\func],
|
||||
prependArgs: [freq, gate]
|
||||
);
|
||||
|
||||
signal = SynthDef.wrap(
|
||||
func: this[\func],
|
||||
prependArgs: [freq, gate]
|
||||
);
|
||||
|
||||
if(this[\useLfo].asBoolean, {
|
||||
var lfo = switch(this[\lfoWave])
|
||||
{ \sin } { SinOsc }
|
||||
{ \saw } { Saw }
|
||||
{ \tri } { LFTri }
|
||||
{ \pulse } { Pulse }
|
||||
? SinOsc;
|
||||
|
||||
signal = signal * lfo.kr(
|
||||
\lfoFreq.kr(1)
|
||||
).range(
|
||||
1 - \lfoGain.kr(0.5), 1
|
||||
);
|
||||
});
|
||||
|
||||
if(this[\useSaturation].asBoolean, {
|
||||
this[\saturationSteps].do {
|
||||
signal = signal.tanh;
|
||||
}
|
||||
});
|
||||
|
||||
if(this[\useEnv].asBoolean, {
|
||||
var att = this.getDefaultOr(\attack, 0.1);
|
||||
var rel = this.getDefaultOr(\release, 0.1);
|
||||
var curve = this.getDefaultOr(\curve, 1);
|
||||
|
||||
var env = Env(
|
||||
[0, 0, 1, 0],
|
||||
[0, \attack.kr(att), \release.kr(rel)],
|
||||
[0, \attackCurve.kr(curve), \releaseCurve.kr(curve)],
|
||||
releaseNode: releaseNode,
|
||||
).kr(0, gate: gate);
|
||||
|
||||
signal = signal * env;
|
||||
});
|
||||
|
||||
if(this[\usePan].asBoolean, {
|
||||
switch(this[\panning],
|
||||
\splay, { signal = Splay.ar(signal, \spread.kr(1), center: \pan.kr(0)); },
|
||||
\splayAz, { signal = SplayAz.ar(this[\panningChannels], signal, orientation: \orientation.kr(0.5)); },
|
||||
\pan, { signal = Pan2.ar(signal, \pan.kr(0)); }
|
||||
);
|
||||
});
|
||||
|
||||
signal * \amp.kr(1);
|
||||
});
|
||||
}
|
||||
this.processSig(signal, gate);
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1,84 +1,24 @@
|
||||
+ NodeDictionary {
|
||||
makeSourceSynthDef {
|
||||
^SynthDef(this[\name], {
|
||||
var freq, signal, env, gate;
|
||||
|
||||
var releaseNode = if (
|
||||
this[\sustained].asBoolean,
|
||||
{ 2 },
|
||||
{ nil }
|
||||
);
|
||||
|
||||
var envDoneAction = if (
|
||||
this[\sustained].asBoolean,
|
||||
{ 0 },
|
||||
{ 2 }
|
||||
);
|
||||
|
||||
gate = \gate.tr(0);
|
||||
freq = \freq.kr(220);
|
||||
|
||||
if(this[\useFreqLag].asBoolean, {
|
||||
freq = Lag.kr(freq, \freqLag.kr(0.5));
|
||||
});
|
||||
|
||||
signal = SynthDef.wrap(
|
||||
func: this[\func],
|
||||
prependArgs: [freq, gate]
|
||||
);
|
||||
|
||||
if(this[\useLfo].asBoolean, {
|
||||
var lfo = switch(this[\lfoWave])
|
||||
{ \sin } { SinOsc }
|
||||
{ \saw } { Saw }
|
||||
{ \tri } { LFTri }
|
||||
{ \pulse } { Pulse }
|
||||
? SinOsc;
|
||||
|
||||
signal = signal * lfo.kr(
|
||||
\lfoFreq.kr(1)
|
||||
).range(
|
||||
1 - \lfoGain.kr(0.5), 1
|
||||
);
|
||||
});
|
||||
|
||||
if(this[\useSaturation].asBoolean, {
|
||||
this[\saturationSteps].do {
|
||||
signal = signal.tanh;
|
||||
}
|
||||
});
|
||||
|
||||
if(this[\useEnv].asBoolean, {
|
||||
var att = this.getDefaultOr(\attack, 0.1);
|
||||
var rel = this.getDefaultOr(\release, 0.1);
|
||||
var curve = this.getDefaultOr(\curve, 1);
|
||||
|
||||
var env = Env(
|
||||
[0, 0, 1, 0],
|
||||
[0, \attack.kr(att), \release.kr(rel)],
|
||||
\envCurve.kr(curve),
|
||||
releaseNode: releaseNode,
|
||||
).kr(envDoneAction, gate: gate);
|
||||
|
||||
signal = signal * env;
|
||||
});
|
||||
|
||||
switch(this[\panning],
|
||||
\splay, { signal = Splay.ar(signal, \spread.kr(1), center: \pan.kr(0)); },
|
||||
\splayAz, { signal = SplayAz.ar(this[\panningChannels], signal, orientation: \orientation.kr(0.5)); },
|
||||
nil, { signal = Pan2.ar(signal, \pan.kr(0)); }
|
||||
);
|
||||
|
||||
signal = signal * \amp.kr(1);
|
||||
|
||||
if(this[\postAmp].asBoolean, {
|
||||
signal = signal * \postAmp.kr(1);
|
||||
});
|
||||
|
||||
Out.ar(
|
||||
\out.kr(0),
|
||||
signal,
|
||||
);
|
||||
});
|
||||
}
|
||||
makeSourceSynthDef {
|
||||
^SynthDef(this[\name], {
|
||||
var freq, signal, gate;
|
||||
|
||||
gate = \gate.tr(0);
|
||||
freq = \freq.kr(220);
|
||||
|
||||
if(this[\useFreqLag].asBoolean, {
|
||||
freq = Lag.kr(freq, \freqLag.kr(0.5));
|
||||
});
|
||||
|
||||
signal = SynthDef.wrap(
|
||||
func: this[\func],
|
||||
prependArgs: [freq, gate]
|
||||
);
|
||||
|
||||
Out.ar(
|
||||
\out.kr(0),
|
||||
signal,
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue