{
   "name" : "experiments in detecting fast onsets with Amplitude UGens",
   "author" : "julian.rohrhuber",
   "ancestor_list" : [],
   "description" : "A series of consecutive experiments (all results visualised as plots) that try to detect onsets in a noisy signal.",
   "labels" : [
      "amplitude",
      "analysis",
      "experiment",
      "trigger"
   ],
   "code" : "// single Amplitude UGen\r\n// attackTime:0.01, releaseTime:0.01\r\n// too soft to follow\r\n(\r\n{\r\n\tvar sig, amp, gate, trig;\r\n\tsig = LFSaw.ar(-200) * SinOsc.kr(20).range(0, 1);\r\n\tamp = Amplitude.ar(sig, attackTime:0.01, releaseTime:0.01);\r\n\tgate = amp > 0.2;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001); //  create a trigger signal\r\n\t[sig, amp, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)\r\n\r\n// attackTime:0, releaseTime:0.0002\r\n// follows well\r\n(\r\n{\r\n\tvar sig, amp, gate, trig;\r\n\tsig = LFSaw.ar(-200) * SinOsc.kr(20).range(0, 1);\r\n\tamp = Amplitude.ar(sig, attackTime:0, releaseTime:0.0002);\r\n\tgate = amp > 0.1;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001);\r\n\t[sig, amp, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)\r\n\r\n// attackTime:0, releaseTime:0.0002\r\n// follows well, but: for a bit of noise causes false positives ...\r\n(\r\n{\r\n\tvar sig, amp, gate, trig;\r\n\tsig = LFSaw.ar(-200) * SinOsc.kr(20).range(0, 1) + LFNoise2.ar(4000, 0.2);\r\n\tamp = Amplitude.ar(sig, attackTime:0, releaseTime:0.0002);\r\n\tgate = amp > 0.2;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001);\r\n\t[sig, amp, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)\r\n\r\n\r\n// ... comparison of multiple time scales may help\r\n// attackTime:0.001, releaseTime:0.0002\r\n// attackTime:0.01, releaseTime:0.01\r\n(\r\n{\r\n\tvar sig, amp1, amp2, gate, trig;\r\n\tsig = LFSaw.ar(-200) * SinOsc.kr(20).range(0, 1) + LFNoise2.ar(4000, 0.2);\r\n\tamp1 = Amplitude.ar(sig, attackTime:0.0002, releaseTime:0.0002);\r\n\tamp2 = Amplitude.ar(sig, attackTime:0.01, releaseTime:0.01);\r\n\tgate = (amp2 - amp1) > 0.2;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001);\r\n\t[sig, amp1, amp2, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)\r\n\r\n// with slowly increasing noise\r\n// attackTime:0.001, releaseTime:0.0002\r\n// attackTime:0.01, releaseTime:0.01\r\n(\r\n{\r\n\tvar sig, amp1, amp2, gate, trig;\r\n\tsig = LFSaw.ar(-200) * SinOsc.kr(20).range(0, 1) + LFNoise2.ar(4000, Line.kr(0.1, 0.6, 0.1));\r\n\tamp1 = Amplitude.ar(sig, attackTime:0.0002, releaseTime:0.0002);\r\n\tamp2 = Amplitude.ar(sig, attackTime:0.01, releaseTime:0.01);\r\n\tgate = (amp2 - amp1) > 0.2;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001);\r\n\t[sig, amp1, amp2, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)\r\n\r\n// for a lagged and little bit noisy signal\r\n// attackTime:0.001, releaseTime:0.0002\r\n// attackTime:0.01, releaseTime:0.01\r\n// loses the first peaks\r\n(\r\n{\r\n\tvar sig, amp1, amp2, gate, trig;\r\n\tsig = LFSaw.ar(-200).range(0, 1).lag(0.01) * SinOsc.kr(20).range(0, 1) + LFNoise2.ar(4000, 0.02);\r\n\tamp1 = Amplitude.ar(sig, attackTime:0.0002, releaseTime:0.0002);\r\n\tamp2 = Amplitude.ar(sig, attackTime:0.01, releaseTime:0.01);\r\n\tgate = (amp2 - amp1) > 0.1;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001);\r\n\t[sig, amp1, amp2, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)\r\n\r\n// with slowly increasing noise\r\n// attackTime:0.001, releaseTime:0.0002\r\n// attackTime:0.01, releaseTime:0.01\r\n(\r\n{\r\n\tvar sig, amp1, amp2, gate, trig;\r\n\tsig = LFSaw.ar(-200).range(0, 1).lag(0.01) * SinOsc.kr(20).range(0, 1) + LFNoise2.ar(4000, Line.kr(0.01, 0.2, 0.1));\r\n\tamp1 = Amplitude.ar(sig, attackTime:0.0002, releaseTime:0.0002);\r\n\tamp2 = Amplitude.ar(sig, attackTime:0.01, releaseTime:0.01);\r\n\tgate = (amp2 - amp1) > 0.1;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001);\r\n\t[sig, amp1, amp2, amp2 - amp1, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)\r\n\r\n\r\n// with slowly increasing noise\r\n// attackTime:0.001, releaseTime:0.0002\r\n// attackTime:0.01, releaseTime:0.01\r\n(\r\n{\r\n\tvar sig, amp1, amp2, floor, floorThresh, gate, trig;\r\n\tsig = LFSaw.ar(-200).range(0, 1).lag(0.01) * SinOsc.kr(20).range(0, 1) + LFNoise2.ar(4000, Line.kr(0.01, 0.2, 0.1));\r\n\tamp1 = Amplitude.ar(sig, attackTime:0.0002, releaseTime:0.0002);\r\n\tamp2 = Amplitude.ar(sig, attackTime:0.001, releaseTime:0.01);\r\n\tfloor = Amplitude.ar(sig, attackTime:0.01, releaseTime:0.03);\r\n\tfloorThresh = amp2 > 0.3;\r\n\tgate = (amp1 - amp2) > 0.01 * floorThresh;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001);\r\n\t[sig, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)\r\n\r\n\r\n\r\n// different randomly chosen time scales\r\n(\r\n{\r\n\tvar sig, amp1, amp2, floor, floorThresh, gate, trig;\r\n\tvar f0 = rrand(40, 540);\r\n\tvar tmul = 200/f0;\r\n\tvar noiseLevel = Line.kr(0.01, 0.2, 0.1);\r\n\r\n\t\"********* frequency: % **********\".format(f0).postln;\r\n\r\n\tsig = LFSaw.ar(f0.neg).range(0, 1).lag(0.5/f0) * SinOsc.kr(20).range(0, 1);\r\n\tsig = sig + LFNoise2.ar(f0 * 20, noiseLevel);\r\n\tamp1 = Amplitude.ar(sig, attackTime:0.0002 * tmul, releaseTime:0.0002 * tmul);\r\n\tamp2 = Amplitude.ar(sig, attackTime:0.001 * tmul, releaseTime:0.01 * tmul);\r\n\tfloor = Amplitude.ar(sig, attackTime:0.01 * tmul, releaseTime:0.03 * tmul);\r\n\tfloorThresh = amp2 > 0.3;\r\n\tgate = (amp1 - amp2) > 0.01 * floorThresh;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001);\r\n\t[sig, amp1, amp2, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)\r\n\r\n// sweep\r\n(\r\n{\r\n\tvar sig, amp1, amp2, floor, floorThresh, gate, trig;\r\n\tvar f0 = XLine.kr(40, 1540);\r\n\tvar noiseLevel = 0.1;\r\n\tvar tmul = 200/f0;\r\n\tsig = LFSaw.ar(f0.neg).range(0, 1).lag(0.5/f0) * SinOsc.kr(20).range(0, 1);\r\n\tsig = sig + LFNoise2.ar(f0 * 15, noiseLevel);\r\n\tamp1 = Amplitude.ar(sig, attackTime:0.0002 * tmul, releaseTime:0.0002 * tmul);\r\n\tamp2 = Amplitude.ar(sig, attackTime:0.001 * tmul, releaseTime:0.01 * tmul);\r\n\tfloor = Amplitude.ar(sig, attackTime:0.01 * tmul, releaseTime:0.03 * tmul);\r\n\tfloorThresh = amp2 > 0.3;\r\n\tgate = (amp1 - amp2) > 0.01 * floorThresh;\r\n\ttrig = Trig1.ar(HPZ1.ar(gate), 0.001);\r\n\t[sig, amp1, amp2, trig]\r\n}.plot(0.5, bounds:Rect(0, 0, 1200, 800), maxval:1.1)\r\n)\r\n\r\n\r\n// postscript:\r\n// for a lagged and little bit noisy signal\r\n// trying out the Onsets UGen: not good at all for what we are trying, however other settings may help.\r\n\r\n(\r\n{\r\n\tvar sig, fft, gate, trig;\r\n\tsig = LFSaw.ar(-200).range(0, 1).lag(0.01) * SinOsc.kr(20).range(0, 1) + LFNoise2.ar(4000, 0.02);\r\n\tgate = Onsets.kr(FFT(LocalBuf(1024), sig),threshold:0.2,relaxtime:0.01,floor:0.01, mingap:0.001);\r\n\ttrig = Trig1.kr(HPZ1.kr(gate), 0.001);\r\n\t[sig, trig]\r\n}.plot(0.1, bounds:Rect(0, 0, 800, 800), maxval:1.1)\r\n)",
   "is_private" : null,
   "id" : "1-50E"
}
