Advertisement
Guest User

Untitled

a guest
Feb 17th, 2024
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.74 KB | None | 0 0
  1. (
  2. var compressor;
  3.  
  4. compressor = { |snd, attack, release, threshold, ratio|
  5. var amplitudeDb, gainDb;
  6. amplitudeDb = Amplitude.ar(snd, attack, release).ampdb.mean;
  7. gainDb = ((amplitudeDb - threshold) * (1 / ratio - 1)).min(0);
  8. snd * gainDb.dbamp;
  9. };
  10.  
  11. ~paramGenerators = ();
  12.  
  13. ~paramGenerators[\kick] = {
  14. [
  15. bendTime: exprand(0.5, 1),
  16. pitchBend: exprand(1, 2), // 1 preferred
  17. release: rrand(0.5, 1),
  18. ];
  19. };
  20. SynthDef(\kick, {
  21. var snd;
  22. snd = SinOsc.ar(Env([500 * \pitchBend.kr(1), 70, 50] / 50 * \freq.kr(60), [0.04, 0.05] * \bendTime.kr(1), \exp).ar);
  23. snd = snd + (HPF.ar(Hasher.ar(Sweep.ar), 1200) * Env.linen(0.001, 0.01, 0.001).ar * -5.dbamp);
  24. snd = snd + (snd * 2).tanh;
  25. snd = snd * Env.perc(0.001, \release.kr(0.3)).ar(Done.freeSelf);
  26. snd = snd * \amp.kr(1) ! 2;
  27. snd = snd * 5.dbamp;
  28. Out.ar(\out.kr(0), snd);
  29. }).add;
  30.  
  31. ~paramGenerators[\sub] = {
  32. [
  33. drive: exprand(1, 20),
  34. pitchBendDur: exprand(0.5, 2),
  35. release: exprand(5, 8),
  36. ];
  37. };
  38. SynthDef(\sub, {
  39. var snd, freq;
  40. freq = Env([100, 60, 50] / 50 * \freq.kr(60), [0.03, 0.15] * \pitchBendDur.kr(1), \exp).ar;
  41. snd = SinOsc.ar(freq * [1, 2]).sum;
  42. snd = BPF.ar(snd, 60, 0.3);
  43. snd = snd + (DelayC.ar(HPF.ar((snd * (1 + Env.perc(0, \release.kr(5)).ar) * \drive.kr(1)).tanh, 800), 0.1, SinOsc.ar(1, [0, pi]).range(0, 1) * 1e-3) * 0.dbamp);
  44. snd = snd * Env.adsr(0.1, \release.kr(5), 0, 0.03).ar(Done.freeSelf, \gate.kr(1));
  45. snd = snd * \amp.kr(1);
  46. snd = snd * 0.dbamp;
  47. Out.ar(\out.kr(0), snd);
  48. }).add;
  49.  
  50. ~paramGenerators[\clap] = {
  51. [
  52. decay: exprand(0.05, 0.15),
  53. ];
  54. };
  55. SynthDef(\clap, {
  56. var snd;
  57. snd = Hasher.ar(Sweep.ar);
  58. snd = RHPF.ar(snd, 1225 * [0.9, 1.2, 1.15, 1.8, 1.4] * 1.1, 0.1);
  59. snd = snd * Env.perc(1e-4, \decay.kr(0.15)).delay([0, 2, 5, 3, 2.5, 4] * 0.7e-2).ar;
  60. snd = snd * ([0, -3, -5, -8, -2] * 2).dbamp;
  61. snd = [snd[3], snd[4], snd[0], snd[1], snd[2]];
  62. snd = Splay.ar(snd);
  63. snd = MoogFF.ar(snd, 8000, 0) * 10.dbamp;
  64. snd = snd * Env.perc(0.0, 0.3).ar(Done.freeSelf);
  65. snd = snd * 5.dbamp;
  66. snd = Pan2.ar(snd, \pan.kr(0));
  67. Out.ar(\out.kr(0), snd);
  68. }).add;
  69.  
  70. ~paramGenerators[\snare] = {
  71. [
  72. freq: exprand(200, 500),
  73. noiseFreq: exprand(1500, 2300),
  74. decay: exprand(0.1, 0.2),
  75. drive: rrand(0, 5).dbamp,
  76. ];
  77. };
  78. SynthDef(\snare, {
  79. var snd;
  80. snd = LFTri.ar(Env([300, 230, 200] / 200 * \freq.kr(220), [0.02, 0.03], \exp).ar) * Env.perc(0.001, 0.5).ar;
  81. snd = (snd * 3).tanh;
  82. snd = snd + (BPF.ar(Hasher.ar(Sweep.ar), \noiseFreq.kr(1200), 0.6) * Env.perc(0.1, 0.4).ar * 5.dbamp);
  83. snd = (snd * 0.5 * \drive.kr(0.5)).tanh * 5.dbamp;
  84. snd = snd + (SinOsc.ar(XLine.ar(3000, 100, 0.02)) * Env.perc(0.001, 0.02).ar);
  85. snd = snd * Env.perc(0.001, \decay.kr(0.4)).ar(Done.freeSelf);
  86. snd = snd * 8.dbamp;
  87. snd = snd ! 2;
  88. Out.ar(\out.kr(0), snd);
  89. }).add;
  90.  
  91. ~paramGenerators[\hat] = {
  92. [
  93. freq: exprand(1.5, 2.3),
  94. decay: exprand(0.03, 0.09),
  95. ];
  96. };
  97. SynthDef(\hat, {
  98. var snd, freq;
  99. freq = \freq.kr(1);
  100. snd = SinOsc.ar(3370 * freq) * 3120;
  101. snd = SinOsc.ar(3250 * freq + snd) * 3120;
  102. snd = SinOsc.ar(100 * freq + snd);
  103. snd = snd + Hasher.ar(Sweep.ar);
  104. snd = RHPF.ar(snd, [4e3, 7e3] * freq, 0.1).sum * 10.dbamp;
  105. snd = snd * Env.perc(0.001, \decay.kr(0.08)).ar(Done.freeSelf);
  106. snd = Pan2.ar(snd, \pan.kr(0));
  107. snd = snd * \amp.kr(1);
  108. snd = snd * -5.dbamp;
  109. Out.ar(\out.kr(0), snd);
  110. }).add;
  111.  
  112. SynthDef(\drumfx, {
  113. var snd, low, mid, high, lowFreq, highFreq;
  114. snd = In.ar(\out.kr(0), 2);
  115.  
  116. lowFreq = 300;
  117. highFreq = 3200;
  118. low = LPF.ar(LPF.ar(snd, lowFreq), lowFreq);
  119. snd = snd - low;
  120. mid = LPF.ar(LPF.ar(snd, highFreq), highFreq);
  121. high = snd - mid;
  122.  
  123. low = compressor.(low, 0.01, 0.05, -6, 4);
  124. mid = compressor.(mid, 0.01, 0.05, -6, 4);
  125. high = compressor.(high, 0.01, 0.05, -6, 4);
  126.  
  127. snd = snd * -5.dbamp;
  128. // clip on master, baby!
  129. snd = snd.clip2;
  130. ReplaceOut.ar(\out.kr(0), snd);
  131. }).add;
  132.  
  133. ~paramGenerators[\fmPad] = {
  134. [
  135. ratio: [1, 2, 3, 4].choose,
  136. ratio2: [0.5, 1, 2, 3, 4].choose,
  137. index: rand(8000.0),
  138. attack: exprand(0.01, 0.1),
  139. release: exprand(0.5, 2),
  140. lpf: exprand(8000, 16e3),
  141. fmDecay1: exprand(0.1, 0.5),
  142. fmDecay2: exprand(0.1, 0.5),
  143. vibratoDepth: rrand(0.0, 0.5).squared,
  144. vibratoFreq: exprand(4, 6),
  145. bend: rrand(0, 12),
  146. ]
  147. };
  148. SynthDef(\fmPad, {
  149. var snd, freq;
  150. freq = \freq.kr(440) * (SinOsc.kr(\vibratoFreq.kr(4)) * \vibratoDepth.kr).midiratio;
  151. freq = freq * Line.ar(\bend.kr(0), 0, 0.01).midiratio;
  152. snd = SinOsc.ar(freq + (SinOsc.ar(freq * \ratio.kr(1)) * \index.kr * Env.adsr(0, \fmDecay1.kr(0.3), 0.5).ar));
  153. snd = snd + SinOsc.ar(freq + (SinOsc.ar(freq * \ratio2.kr(1)) * \index.kr * Env.adsr(0, \fmDecay2.kr(0.3), 0.5).ar));
  154. snd = snd * Env.perc(\attack.kr(0), \release.kr(1)).ar(Done.freeSelf);
  155. snd = snd * freq.explin(600, 4000, 0, -10).dbamp;
  156. snd = LPF.ar(snd, \lpf.kr(1000));
  157. snd = snd * -13.dbamp;
  158. snd = snd * \amp.kr(1) ! 2;
  159. Out.ar(\out.kr(0), snd);
  160. }).add;
  161.  
  162. SynthDef(\send, {
  163. var snd;
  164. snd = In.ar(\in.kr(0), 2);
  165. snd = snd * \amp.kr(1);
  166. Out.ar(\out.kr(0), snd);
  167. }).add;
  168.  
  169. ~paramGenerators[\melodyFx] = {
  170. [
  171. delayTimeInBeats: [0.5, 1, 1.5, 2].choose,
  172. feedback: rrand(-10, -5).dbamp,
  173. ];
  174. };
  175. SynthDef(\melodyFx, {
  176. var snd, wet, beat, delayTimeInBeats, adjustedDelayTime;
  177. var introLengthInSeconds;
  178. var filterFreq;
  179. delayTimeInBeats = \delayTimeInBeats.kr(1);
  180. beat = \beat.kr(1);
  181. introLengthInSeconds = beat * \introLength.kr(0);
  182. snd = In.ar(\out.kr(0), 2);
  183. snd = snd + LocalIn.ar(2);
  184. adjustedDelayTime = delayTimeInBeats * beat - ControlDur.ir;
  185. wet = DelayC.ar(snd, adjustedDelayTime + 1e-2, adjustedDelayTime + (SinOsc.ar(4, [0, pi]) * 1e-4));
  186. wet = wet * \feedback.kr(0.5);
  187. wet = LPF.ar(wet, 3000);
  188. wet = HPF.ar(wet, 100);
  189. LocalOut.ar(wet);
  190. snd = snd + (DelayC.ar(GVerb.ar(snd.sum, 10), 0, LFNoise2.kr(3 ! 2).linlin(-1, 1, 0, 0.001)) * -10.dbamp);
  191. snd = snd * Line.kr(-5, 0, introLengthInSeconds).dbamp;
  192. filterFreq = XLine.kr(700, 16e3, introLengthInSeconds);
  193. snd = LPF.ar(LPF.ar(snd, filterFreq), filterFreq);
  194. ReplaceOut.ar(\out.kr(0), snd);
  195. }).add;
  196.  
  197. SynthDef(\reverseCymbal, {
  198. var snd;
  199. snd = { PinkNoise.ar } ! 2;
  200. snd = BPF.ar([snd], [3210, 6253, 8255, 6326, 10425] * ExpRand(0.1, 1), 0.1).sum * 10.dbamp;
  201. snd = snd * Env.perc(\dur.kr(1), 0.05, curve: 4).ar(Done.freeSelf);
  202. snd = snd * -2.dbamp;
  203. Out.ar(\out.kr(0), snd);
  204. }).add;
  205. )
  206.  
  207. (
  208. Routine {
  209. var s;
  210. var tempo, root, melody;
  211. var beat;
  212.  
  213. var kickPattern;
  214. var melodyBus, melodyGroup, melodyFx;
  215. var introLength;
  216. var params;
  217. var hatPan;
  218.  
  219. s = Server.default;
  220.  
  221. kickPattern = [
  222. [2.5, 0.5, 5],
  223. [3, 2, 3],
  224. ].choose;
  225.  
  226. tempo = [120, 125, 128, 130, 135, 140].choose;
  227. root = (6..10).choose;
  228. melody = {
  229. var notes, result, length;
  230. notes = [-5, 0, 2, 3, 7, 8, 12];
  231. result = List();
  232. result.add(0);
  233. length = [4, 8, 16].choose;
  234. (length - 1).do { |i|
  235. var candidates;
  236. candidates = notes.copy;
  237. if (result.last == 8) {
  238. candidates = [7];
  239. };
  240. if (result.last == 2) {
  241. candidates = [0, 3, 7];
  242. };
  243. candidates.remove(result.last);
  244. if (i == (length - 2)) {
  245. candidates.remove(notes[0]);
  246. candidates.remove(8);
  247. };
  248. result.add(candidates.choose);
  249. };
  250. 60 + ([0, 1, 2].choose * 12) + root + result;
  251. }.value;
  252.  
  253. params = (
  254. melody: (
  255. noteDuration: if(melody.size == 16, 1 / 2, if(melody.size == 4, 1, [1, 1 / 2].choose)),
  256. ),
  257. melodyFx: ~paramGenerators[\melodyFx].value,
  258. kick: ~paramGenerators[\kick].value,
  259. sub: ~paramGenerators[\sub].value,
  260. fmPad: ~paramGenerators[\fmPad].value,
  261. snare: ~paramGenerators[\snare].value,
  262. hat: ~paramGenerators[\hat].value,
  263. clap: ~paramGenerators[\clap].value,
  264. );
  265. hatPan = rrand(0.3, 0.6);
  266.  
  267. introLength = 4 * if(melody.size == 4, 4, [4, 8].choose);
  268. beat = 60 / tempo;
  269.  
  270. melodyBus = Bus.audio(Server.default, 2);
  271. melodyGroup = Group(Server.default);
  272. melodyFx = Synth.after(melodyGroup, \melodyFx, [out: melodyBus, beat: beat, introLength: introLength] ++ params[\melodyFx]);
  273. Synth.after(melodyFx, \send, [in: melodyBus, out: 0]);
  274.  
  275. Synth.tail(Server.default, \drumfx);
  276. Server.default.sync;
  277.  
  278. fork {
  279. loop {
  280. melody.do { |note|
  281. s.makeBundle(s.latency, {
  282. Synth(\fmPad, [amp: 1, freq: note.midicps, out: melodyBus] ++ params[\fmPad], melodyGroup);
  283. });
  284. (beat * params[\melody][\noteDuration]).yield;
  285. };
  286. };
  287. };
  288. fork {
  289. var reverseCymbalDur;
  290. reverseCymbalDur = rrand(2, 6);
  291. (introLength * beat - (reverseCymbalDur + 0.1)).yield;
  292. s.makeBundle(s.latency, {
  293. Synth(\reverseCymbal, [amp: 1, out: 0, dur: reverseCymbalDur]);
  294. });
  295. };
  296. (introLength * beat).yield;
  297. fork {
  298. loop {
  299. kickPattern.do { |beats|
  300. s.makeBundle(s.latency, {
  301. Synth(\kick, [amp: 1.0, freq: (24 + root).midicps] ++ params[\kick]);
  302. });
  303. (beat * beats).yield;
  304. };
  305. };
  306. };
  307. fork {
  308. loop {
  309. kickPattern.do { |beats|
  310. var synth;
  311. s.makeBundle(s.latency, {
  312. synth = Synth(\sub, [amp: 1.0, freq: (24 + root).midicps] ++ params[\sub]);
  313. });
  314. (beat * beats).yield;
  315. s.makeBundle(s.latency, {
  316. synth.set(\gate, 0);
  317. });
  318. };
  319. };
  320. };
  321. fork {
  322. (beat * 2).yield;
  323. loop {
  324. [4, 4].do { |beats|
  325. s.makeBundle(s.latency, {
  326. Synth(\snare, [amp: 1] ++ params[\snare]);
  327. });
  328. fork {
  329. 0.01.yield;
  330. s.makeBundle(s.latency, {
  331. Synth(\clap, [amp: 1] ++ params[\clap]);
  332. });
  333. };
  334. (beat * beats).yield;
  335. };
  336. };
  337. };
  338. fork {
  339. var pan;
  340. pan = hatPan;
  341. loop {
  342. 4.do { |i|
  343. var subdivision;
  344. subdivision = [2, 3, 8].wchoose([2, 2, [0, 1, 0, 3][i % 4]].normalizeSum);
  345. subdivision.do { |j|
  346. s.makeBundle(s.latency, {
  347. Synth(\hat, [amp: 1.0 * if(j == 0, 3, 0).dbamp, pan: pan] ++ params[\hat]);
  348. });
  349. (beat / subdivision).yield;
  350. pan = pan * -1;
  351. };
  352. };
  353. };
  354. };
  355. } .play;
  356. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement