From e5799cb2ae9bab12999001d39219f36f71dbb504 Mon Sep 17 00:00:00 2001 From: Pierre Alexandre Tremblay Date: Thu, 9 Jan 2020 15:48:14 +0000 Subject: [PATCH] JiT-NMF-classifier: now with better sounding drums --- .../Examples/nmf/JiT-NMF-classifier.scd | 121 +++++++++--------- 1 file changed, 64 insertions(+), 57 deletions(-) diff --git a/release-packaging/ignore/Examples/nmf/JiT-NMF-classifier.scd b/release-packaging/ignore/Examples/nmf/JiT-NMF-classifier.scd index 1ec04b3..24656d1 100644 --- a/release-packaging/ignore/Examples/nmf/JiT-NMF-classifier.scd +++ b/release-packaging/ignore/Examples/nmf/JiT-NMF-classifier.scd @@ -5,6 +5,8 @@ s.reboot ( b = Buffer.alloc(s,s.sampleRate * 2); g = Bus.audio(s,1); +c = 0; +d = 0; SynthDef(\JITcircular,{arg bufnum = 0, input = 0, env = 0; var head, head2, duration, audioin, halfdur, trig; @@ -25,70 +27,70 @@ SynthDef(\JITcircular,{arg bufnum = 0, input = 0, env = 0; Out.ar(0,[audioin, trig]); }).add; -// drum sounds modified from original code by snappizz +// drum sounds taken from original code by snappizz // https://sccode.org/1-523 +// produced further and randomised by PA SynthDef(\fluidbd, { - |out = 0, pan = 0, amp = 0.3| - var body, bodyFreq, bodyAmp; - var pop, popFreq, popAmp; - var click, clickAmp; - var snd; - - // body starts midrange, quickly drops down to low freqs, and trails off - bodyFreq = EnvGen.ar(Env([261, 120, 51], [0.035, 0.08], curve: \exp)); - bodyAmp = EnvGen.ar(Env.linen(0.005, 0.1, 0.3), doneAction: 2); - body = SinOsc.ar(bodyFreq) * bodyAmp; - // pop sweeps over the midrange - popFreq = XLine.kr(750, 261, 0.02); - popAmp = EnvGen.ar(Env.linen(0.001, 0.02, 0.001)) * 0.15; - pop = SinOsc.ar(popFreq) * popAmp; - // click is spectrally rich, covering the high-freq range - // you can use Formant, FM, noise, whatever - clickAmp = EnvGen.ar(Env.perc(0.001, 0.01)) * 0.15; - click = LPF.ar(Formant.ar(910, 4760, 2110), 3140) * clickAmp; - - snd = body + pop ; //+ click; - snd = snd.tanh; - - Out.ar(out, Pan2.ar(snd, pan, amp)); + |out = 0| + var body, bodyFreq, bodyAmp; + var pop, popFreq, popAmp; + var click, clickAmp; + var snd; + + // body starts midrange, quickly drops down to low freqs, and trails off + bodyFreq = EnvGen.ar(Env([Rand(200,300), 120, Rand(45,49)], [0.035, Rand(0.07,0.1)], curve: \exp)); + bodyAmp = EnvGen.ar(Env([0,Rand(0.8,1.3),1,0],[0.005,Rand(0.08,0.085),Rand(0.25,0.35)]), doneAction: 2); + body = SinOsc.ar(bodyFreq) * bodyAmp; + // pop sweeps over the midrange + popFreq = XLine.kr(Rand(700,800), Rand(250,270), Rand(0.018,0.02)); + popAmp = EnvGen.ar(Env([0,Rand(0.8,1.3),1,0],[0.001,Rand(0.018,0.02),Rand(0.0008,0.0013)])); + pop = SinOsc.ar(popFreq) * popAmp; + // click is spectrally rich, covering the high-freq range + // you can use Formant, FM, noise, whatever + clickAmp = EnvGen.ar(Env.perc(0.001,Rand(0.008,0.012),Rand(0.07,0.12),-5)); + click = RLPF.ar(VarSaw.ar(Rand(900,920),0,0.1), 4760, 0.50150150150) * clickAmp; + + snd = body + pop + click; + snd = snd.tanh; + + Out.ar(out, snd); }).add; SynthDef(\fluidsn, { - |out = 0, pan = 0, amp = 0.3| - var pop, popAmp, popFreq; - var noise, noiseAmp; - var snd; - - // pop makes a click coming from very high frequencies - // slowing down a little and stopping in mid-to-low - popFreq = EnvGen.ar(Env([3261, 410, 160], [0.005, 0.01], curve: \exp)); - popAmp = EnvGen.ar(Env.perc(0.001, 0.11)) * 0.7; - pop = SinOsc.ar(popFreq) * popAmp; - // bandpass-filtered white noise - noiseAmp = EnvGen.ar(Env.perc(0.001, 0.15), doneAction: 2); - noise = BPF.ar(WhiteNoise.ar, 810, 1.6) * noiseAmp; - - snd = (pop + noise) * 1.3; - - Out.ar(out, Pan2.ar(snd, pan, amp)); + |out = 0| + var pop, popAmp, popFreq; + var noise, noiseAmp; + var click; + var snd; + + // pop makes a click coming from very high frequencies + // slowing down a little and stopping in mid-to-low + popFreq = EnvGen.ar(Env([Rand(3210,3310), 410, Rand(150,170)], [0.005, Rand(0.008,0.012)], curve: \exp)); + popAmp = EnvGen.ar(Env.perc(0.001, Rand(0.1,0.12), Rand(0.7,0.9),-5)); + pop = SinOsc.ar(popFreq) * popAmp; + // bandpass-filtered white noise + noiseAmp = EnvGen.ar(Env.perc(0.001, Rand(0.13,0.15), Rand(1.2,1.5),-5), doneAction: 2); + noise = BPF.ar(WhiteNoise.ar, 810, 1.6) * noiseAmp; + + click = Impulse.ar(0); + snd = (pop + click + noise) * 1.4; + + Out.ar(out, snd); }).add; SynthDef(\fluidhh, { - |out = 0, pan = 0, amp = 0.3| - var click, clickAmp; - var noise, noiseAmp; - var snd; + |out = 0| + var click, clickAmp; + var noise, noiseAmp, noiseFreq; - // noise -> resonance -> expodec envelope - noiseAmp = EnvGen.ar(Env.perc(0.001, 0.3, curve: -8), doneAction: 2); - noise = Mix(BPF.ar(ClipNoise.ar, [4010, 4151], [0.15, 0.56], [1.0, 0.6])) * 0.7 * noiseAmp; + // noise -> resonance -> expodec envelope + noiseAmp = EnvGen.ar(Env.perc(0.001, Rand(0.28,0.3), Rand(0.4,0.6), [-20,-15]), doneAction: 2); + noiseFreq = Rand(3900,4100); + noise = Mix(BPF.ar(ClipNoise.ar, [noiseFreq, noiseFreq+141], [0.12, 0.31], [2.0, 1.2])) * noiseAmp; - snd = noise; - - Out.ar(out, Pan2.ar(snd, pan, amp)); + Out.ar(out, noise); }).add; - ) ( @@ -98,8 +100,12 @@ x = Synth(\JITcircular,[\bufnum, b.bufnum, \input, g.index]); // instantiate the listener to cue the processing from the language side r = OSCFunc({ arg msg; - msg.postln; - }, '/attack', s.addr); + if (c == 0, { + msg[0].postln; + }, { + msg[3].postln; + }); +}, '/attack', s.addr); ) // stop it all @@ -111,7 +117,8 @@ Button(w, Rect(10,10,80, 80)).states_([["bd",Color.black,Color.white]]).mouseDow Button(w, Rect(100,10,80, 80)).states_([["sn",Color.black,Color.white]]).mouseDownAction_({Synth(\fluidsn, [\out, g.index], x, \addBefore)}); Button(w, Rect(190,10,80, 80)).states_([["hh",Color.black,Color.white]]).mouseDownAction_({Synth(\fluidhh, [\out, g.index], x,\addBefore)}); StaticText(w, Rect(280,7,70,25)).string_("Select").align_(\center); -c = PopUpMenu(w, Rect(280,32,70,25)).items_(["train","guess"]); -d = PopUpMenu(w, Rect(280,65,70,25)).items_(["classA","classB","classC"]); +PopUpMenu(w, Rect(280,32,70,25)).items_(["train","guess"]).action_({|value| c = value.value;}); +e = PopUpMenu(w, Rect(280,65,70,25)).items_(["classA","classB","classC"]).action_({|value| d = value.value;}); w.onClose_({b.free;g.free;r.clear;x.free; y.free;}); -) \ No newline at end of file +) +