⠀⠀⠀⠀ⵙ⠀옷⠀ⵙ⠀✤⠀ⵙ⠀ИN⠀ⵙ⠀人⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀⠀◯⠀⠀ⵙ⠀人⠀ⵙ⠀ᙁ⠀ⵙ⠀Ⓞ⠀ⵙ⠀ߦ⠀ⵙ⠀⠀◯⠀⠀ⵙ⠀Ⓞ⠀ⵙ⠀ИN⠀ⵙ⠀Ⓞ⠀ⵙ⠀ᙏ⠀ⵙ⠀⠀◯⠀⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᙁ⠀ⵙ⠀ߦ⠀ⵙ⠀ᙏ⠀ⵙ⠀ꖴ⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀ꖴ⠀ⵙ⠀ᙏ⠀ⵙ⠀ߦ⠀ⵙ⠀ᙁ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀⠀◯⠀⠀ⵙ⠀ᙏ⠀ⵙ⠀Ⓞ⠀ⵙ⠀ИN⠀ⵙ⠀Ⓞ⠀ⵙ⠀⠀◯⠀⠀ⵙ⠀ߦ⠀ⵙ⠀Ⓞ⠀ⵙ⠀ᙁ⠀ⵙ⠀人⠀ⵙ⠀⠀◯⠀⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀人⠀ⵙ⠀ИN⠀ⵙ⠀✤⠀ⵙ⠀옷⠀ⵙ⠀⠀⠀⠀ 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. desc:O_HTNYS_YLOP_ONOM_ELPMIS_O_SIMPLE_MONO_POLY_SYNTH_O
  2. //tags: generator synthesis
  3. //author: Tale
  4. // Copyright (C) 2012-2017 Theo Niessink
  5. // License: LGPL - http://www.gnu.org/licenses/lgpl.html
  6. slider1:-9.5424250943932487459005580651023061840025772838139172965973128061<-120.0,24.0,.0000001>Volume (dB)
  7. slider2:0<-1200.0,1200.0,1.0>Tuning (cent)
  8. slider3:0<0,1>-Unused
  9. slider4:115.78329573381897224814693702618792906596623994250878031835253772<0,5000,1>Attack (ms)
  10. slider5:84406.25<1,15000,1>Decay (ms)
  11. slider6:0.0<-120.0,24.0,1.0>Sustain (dB)
  12. slider7:115.78329573381897224814693702618792906596623994250878031835253772<0,5000,1>Release (ms)
  13. slider8:0<0,1>-Unused
  14. slider9:0<0,15,1{Sine,HW Rect Sine,FW Rect Sine,Triangle,Trapezoid,Square,Pulse PW,Saw,Mod Triangle PW,Tri Pulse,Hammond,Staircase,Mod Square PW,Trapezoid PW,Tri Pulse PW,O_ALOBARAP_O_PARABOLA_O}>Wave
  15. slider10:0.5<0.0,1.0,0.01>Pulse Width
  16. slider11:0<0,1>-Unused
  17. slider12:200.0<0.0,1200.0,1.0>Pitch Wheel (cent)
  18. slider13:0<0,1>-Unused
  19. slider14:-36.0<-36.0,0.0,1.0>White Noise (dB)
  20. slider15:0<0,1>-Unused
  21. slider16:1.0<0.0,1.0,0.01>Low-Pass Filter
  22. slider17:0<0,15000,1>Filter Decay (ms)
  23. slider18:1.0<0.01,4.0,0.01>Filter Q
  24. slider19:0<0,1>-Unused
  25. slider20:0<-100,100,1>Pan (%)
  26. slider21:0<0,1>-Unused
  27. slider22:0<0,16,1{Any,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI Ch
  28. slider23:1<0,2,1{Legacy,Poly,Mono}>Mode
  29. slider24:100<0,100,1>Velocity (%)
  30. slider25:0<0,1>-Unused
  31. slider26:0.0118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118474639022584228063680118
  32. <0.01,12.0,0.001>LFO Rate (Hz)
  33. slider27:0<0,100,1>LFO Depth (%)
  34. out_pin:Left
  35. out_pin:Right
  36. import midi_queue.jsfx-inc
  37. import adsr.jsfx-inc
  38. import rc_filter.jsfx-inc
  39. import zdf_filter.jsfx-inc
  40. import sine.jsfx-inc
  41. import poly_blep.jsfx-inc
  42. import noise.jsfx-inc
  43. import Tale/fft_synth.jsfx-inc
  44. import Tale/fourier_series.jsfx-inc
  45. import Tale/wavetable.jsfx-inc
  46. @init
  47. osc_buf = 0; max_poly = 16; osc_size = 13;
  48. note_buf = osc_buf + max_poly * osc_size;
  49. hold_buf = note_buf + 128;
  50. midiq.midiq_init(hold_buf + 128);
  51. pitch = 1;
  52. noise_gain = sqrt(srate / 48000);
  53. lpf.m = 50;
  54. lpf.ln = log(lpf.m);
  55. function int(x) ( x|0 );
  56. function gain(db, inf) ( db <= inf ? 0 : 10^(0.05 * db) );
  57. function mix(a, b, mix) ( (1.0 - mix) * a + mix * b );
  58. function cache(x) ( x != this ? ( this = x; 1; ); );
  59. smooth.rc_set(0.0033);
  60. function smooth() ( smooth.lp = this.smooth; this.smooth = smooth.rc_lp(this); );
  61. min_inf = -384.0;
  62. gain0.smooth = gain1.smooth = gain(slider1, min_inf);
  63. function set_tg(note)
  64. // global(tg*)
  65. (
  66. tg.poly_setf(440 * 2^((note - 69) / 12));
  67. );
  68. function tg_wave(wave)
  69. // global(tg*)
  70. (
  71. wave == 7 ? tg.poly_saw() :
  72. wave == 6 ? tg.poly_rect() :
  73. wave == 5 ? tg.poly_sqr() :
  74. wave == 4 ||
  75. wave == 13 ? tg.poly_trap2() :
  76. wave == 3 ? tg.poly_tri() :
  77. wave == 2 ? tg.poly_full() :
  78. wave == 1 ? tg.poly_half() :
  79. wave == 0 ? tg.poly_sin() :
  80. wave == 8 ? tg.poly_tri2() :
  81. wave == 9 ||
  82. wave == 14 ? tg.poly_trip() :
  83. wave == 10 ? tg.poly_ham() :
  84. wave == 11 ? tg.poly_stairs() :
  85. wave == 12 ? tg.poly_sqr2() :
  86. wave == 15 ? tg.poly_para()
  87. );
  88. function adsr_sets(g)
  89. instance(state)
  90. (
  91. state == 4 ? state = 2;
  92. this.adsr_sets(g);
  93. );
  94. function load_adsr(p)
  95. // global(adsr*)
  96. (
  97. adsr.state = p[3];
  98. adsr.env = p[4];
  99. adsr.scale = p[5];
  100. adsr.s = p[6];
  101. );
  102. function store_adsr(p)
  103. // global(adsr*)
  104. (
  105. p[3] = adsr.state;
  106. p[4] = adsr.env;
  107. p[5] = adsr.scale;
  108. p[6] = adsr.s;
  109. );
  110. function load_lpf(p)
  111. // global(lpf*)
  112. (
  113. lpf.env.lp = p[7];
  114. lpf.freq.smooth = p[8];
  115. lpf.zdf.g = p[9];
  116. lpf.zdf.h = p[10];
  117. lpf.zdf.s1 = p[11];
  118. lpf.zdf.s2 = p[12];
  119. );
  120. function store_lpf(p)
  121. // global(lpf*)
  122. (
  123. p[7] = lpf.env.lp;
  124. p[8] = lpf.freq.smooth;
  125. p[9] = lpf.zdf.g;
  126. p[10] = lpf.zdf.h;
  127. p[11] = lpf.zdf.s1;
  128. p[12] = lpf.zdf.s2;
  129. );
  130. function lpf_freq(dt)
  131. // global(lpf*, srate)
  132. (
  133. (lpf.env.a < 1 ? lpf.env.rc_lp(lpf.n) : lpf.n) * dt * srate;
  134. );
  135. function reset_lpf(dt)
  136. // global(lpf*)
  137. (
  138. lpf.env.lp = 0;
  139. lpf.zdf.zdf_reset();
  140. lpf.freq.smooth = lpf_freq(dt);
  141. lpf.zdf.zdf_lp(lpf.freq.smooth, lpf.q);
  142. );
  143. function set_buf(buf, num, size)
  144. // global(p, end)
  145. (
  146. p = buf;
  147. end = p + num * size;
  148. );
  149. function remove_buf(size)
  150. // global(p, end)
  151. (
  152. end -= size;
  153. p < end ? memcpy(p, p + size, end - p);
  154. );
  155. function find_note(note, buf, num, size)
  156. // global(p, end)
  157. (
  158. set_buf(buf, num, size);
  159. while(p < end && p[] != note ? p += size);
  160. );
  161. function note_on(note, vel)
  162. // global(p, end, note_buf, num_notes, hold_buf, num_hold, osc_buf, num_osc, osc_size, num_poly, tuning, tg*, adsr*, lpf*)
  163. (
  164. find_note(note, note_buf, num_notes, 1);
  165. p >= end ? (
  166. p[] = note;
  167. num_notes += 1;
  168. );
  169. find_note(note, hold_buf, num_hold, 1);
  170. p < end ? (
  171. remove_buf(1);
  172. num_hold -= 1;
  173. );
  174. find_note(note, osc_buf, num_osc, osc_size);
  175. p >= end ? (
  176. set_tg(note);
  177. num_osc >= num_poly ? (
  178. p = osc_buf;
  179. num_poly > 1 ? (
  180. // Set oscillator/ADSR state to first played note (to mimic old
  181. // mono_synth global state behavior).
  182. tg.t = p[1];
  183. load_adsr(p);
  184. load_lpf(p);
  185. );
  186. remove_buf(osc_size);
  187. p = end;
  188. num_osc -= 1;
  189. ) : (
  190. // Don't reset oscillator on first note (old mono_synth behavior).
  191. num_osc > 0 ? tg.t = 0;
  192. adsr.adsr_reset();
  193. reset_lpf(tuning * tg.dt);
  194. );
  195. num_osc += 1;
  196. p[0] = note;
  197. p[1] = tg.t;
  198. p[2] = tg.dt;
  199. ) : num_poly > 1 ? (
  200. load_adsr(p);
  201. load_lpf(p);
  202. );
  203. adsr.adsr_a(vel);
  204. lpf.env.lp = lpf.m;
  205. store_adsr(p);
  206. store_lpf(p);
  207. );
  208. function note_off(note)
  209. // global(p, end, note_buf, num_notes, osc_buf, num_osc, osc_size, num_poly, note_prio, tg*, adsr*)
  210. (
  211. find_note(note, note_buf, num_notes, 1);
  212. p < end ? (
  213. remove_buf(1);
  214. num_notes -= 1;
  215. );
  216. find_note(note, osc_buf, num_osc, osc_size);
  217. p < end ? (
  218. // Mono, last-note priority
  219. num_poly == 1 && num_notes > 0 && note_prio ? (
  220. note = note_buf[num_notes - 1];
  221. set_tg(note);
  222. p[0] = note;
  223. p[1] = tg.t;
  224. p[2] = tg.dt;
  225. ) : (
  226. // Release
  227. num_poly > 1 ? load_adsr(p);
  228. adsr.adsr_r();
  229. store_adsr(p);
  230. );
  231. );
  232. );
  233. function hold_note(note)
  234. // global(p, end, hold_buf, num_hold)
  235. (
  236. find_note(note, hold_buf, num_hold, 1);
  237. p >= end ? (
  238. p[] = note;
  239. num_hold += 1;
  240. );
  241. );
  242. function release_notes()
  243. // global(hold_buf, num_hold)
  244. local(p)
  245. (
  246. p = hold_buf;
  247. loop(num_hold,
  248. note_off(p[]);
  249. p += 1;
  250. );
  251. num_hold = 0;
  252. );
  253. function all_notes_off()
  254. // global(num_notes, num_hold, num_osc)
  255. (
  256. num_notes = num_hold = num_osc = 0;
  257. );
  258. function pitch_bend(pitch_wheel)
  259. // global(pitch, pitch_range)
  260. (
  261. pitch = pitch_range < 0.00001 ? 1 : 2^(pitch_wheel * pitch_range);
  262. );
  263. @slider
  264. function adr(ms, lo, hi) ( max(lo, min(hi, ms)) * 0.001 );
  265. function pan(gain, pos)
  266. // global(gain0, gain1)
  267. (
  268. // REAPER default 0 dB pan law (thanks Justin!)
  269. // http://www.askjf.com/index.php?q=2342s
  270. pos *= 0.25*$pi;
  271. gain *= sqrt(2) * (1 - sqrt(0.5) * (1 / cos(pos) - 1));
  272. pos += 0.25*$pi;
  273. gain0 = cos(pos) * gain;
  274. gain1 = sin(pos) * gain;
  275. );
  276. pan(gain(slider1, min_inf), max(-100, min(100, slider20)) * 0.01);
  277. adsr.adsr_seta(adr(slider4, 0, 5000));
  278. adsr.adsr_setd(adr(slider5, 1, 15000));
  279. adsr.adsr_sets(gain(slider6, min_inf));
  280. adsr.adsr_setr(adr(slider7, 0, 5000));
  281. tuning = 2^(slider2 / 1200);
  282. wave = int(slider9);
  283. // Limit pulse width for pulse, triangular pulse, modified square.
  284. min_pw = wave == 6 || wave == 14 ? 0.10 : wave == 8 ? 0.01 : wave == 12 ? 0.20 : 0.0;
  285. max_pw = wave == 6 ? 0.90 : wave == 8 ? 0.99 : 1.0;
  286. pw = wave == 4 || wave == 9 ? 0.5 : max(min_pw, min(max_pw, slider10));
  287. noise_mix = gain(slider14, -36.0);
  288. lpf.n = slider16 >= 1.0 ? lpf.m : exp(max(0.0, slider16) * lpf.ln);
  289. slider17 < 1 ? lpf.env.a = 1 : lpf.env.rc_sett(0.001 * min(15000, slider17));
  290. lpf.q = max(0.01, min(4.0, slider18));
  291. pitch_range = max(0.0, slider12) / 1200;
  292. midi_ch.cache(max(0, min(16, int(slider22))) - 1) ? all_notes_off();
  293. num_poly.cache(slider23 < 0.5 || slider23 >= 1.5 ? 1 : max_poly) ? all_notes_off();
  294. note_prio.cache(slider23 >= 0.5) ? all_notes_off();
  295. vel_range = max(0, min(100, slider24)) * 0.01;
  296. lfo_range = max(0, min(100, slider27)) * 0.01;
  297. lfo_range <= 0 ? (
  298. lfo_mod = 0;
  299. ) : wave == 6 || wave == 8 || wave >= 12 ? (
  300. lfo_mod = 1;
  301. lfo_range *= 0.5 * (max_pw - min_pw);
  302. pw = max(min_pw + lfo_range, min(max_pw - lfo_range, pw));
  303. ) : (
  304. lfo_mod = 2;
  305. lfo_range *= 0.5/12;
  306. );
  307. lfo_mod != 1 ? tg.poly_setpw(pw);
  308. lfo_mod ? lfo.sin_setf(max(0.01, slider26));
  309. @block
  310. midiq.midiq_collect(midi_ch, 3|8|64);
  311. @sample
  312. while(midiq.midiq_remove() ? (
  313. midiq.msg1 &= 0xF0;
  314. // Note On
  315. midiq.msg1 == 0x90 && midiq.msg3 ? (
  316. note_on(midiq.msg2, (1.0 - vel_range) + vel_range * midiq.msg3 / 127);
  317. ) :
  318. // Note Off
  319. midiq.msg1 == 0x80 || midiq.msg1 == 0x90 ? (
  320. hold_pedal ? hold_note(midiq.msg2) : note_off(midiq.msg2);
  321. ) :
  322. // Pitch Wheel
  323. midiq.msg1 == 0xE0 ? (
  324. pitch_bend(((midiq.msg3 << 7 | midiq.msg2) - 8192) / (midiq.msg3 < 64 ? 8192 : 8191));
  325. ) :
  326. // Control Change
  327. midiq.msg1 == 0xB0 ? (
  328. // Damper Pedal (Sustain)
  329. midiq.msg2 == 64 ? (
  330. hold_pedal = midiq.msg3 >= 64;
  331. !hold_pedal ? release_notes();
  332. ) :
  333. // All Notes Off
  334. midiq.msg2 == 123 ? (
  335. all_notes_off();
  336. );
  337. );
  338. 1; // while midiq.midiq_remove()
  339. ));
  340. function sample_tg(t, dt)
  341. // global(adsr*, freq_mod, tg*, wave, white_noise, noise_mix)
  342. local(ph, out)
  343. (
  344. adsr.state ? (
  345. noise_mix < 1.0 ? (
  346. // Correct full-wave rectified sine/triangular pulse phase.
  347. ph = wave == 2 ? 0.25 : wave == 14 ? 0.75 + 0.5 * tg.pw;
  348. ph > 0 ? tg.poly_sync(t - ph) : tg.t = t;
  349. tg.poly_setdt(freq_mod * dt);
  350. tg.poly_resetf();
  351. out = adsr.env * mix(tg_wave(wave), white_noise, noise_mix);
  352. ph > 0 ? tg.poly_sync(tg.t + ph);
  353. out;
  354. ) : (
  355. adsr.env * white_noise;
  356. );
  357. );
  358. // 0.0 otherwise
  359. );
  360. function apply_lpf(in, dt)
  361. // global(lpf*, tuning)
  362. local(out)
  363. (
  364. lpf.freq = lpf_freq(tuning * dt);
  365. lpf.freq.smooth();
  366. // Recalculate LPF coefficients only every 16 samples.
  367. lpf.skip <= 0 && lpf.freq.smooth != lpf.zdf.freq ? (
  368. lpf.zdf.freq = lpf.freq.smooth;
  369. lpf.zdf.zdf_lp(lpf.zdf.freq, lpf.q);
  370. );
  371. out = lpf.zdf.zdf_svf_lp(in);
  372. lpf.n < lpf.m ? out : in;
  373. );
  374. function adsr_lpf_off()
  375. // global(adsr*, lpf.zdf*)
  376. (
  377. !adsr.state && lpf.zdf.s1 == 0 && lpf.zdf.s2 == 0;
  378. );
  379. freq_mod = pitch * tuning;
  380. lfo_mod ? lfo_mod == 1 ? tg.poly_setpw(pw + lfo_range * lfo.sin_sin()) : freq_mod *= 2^(lfo.sin_sin() * lfo_range);
  381. white_noise = noise_mix > 0.0 ? noise_gain * noise.lcg_white();
  382. out = 0.0;
  383. // Optimize for mono i.e. don't load/store oscillator/ADSR/filter state.
  384. num_poly == 1 ? (
  385. num_osc ? (
  386. adsr.adsr_process();
  387. out = apply_lpf(sample_tg(tg.t, osc_buf[2]), osc_buf[2]);
  388. adsr_lpf_off() ? num_osc = 0;
  389. );
  390. ) :
  391. /* num_poly > 1 ? */ (
  392. sus = adsr.s;
  393. set_buf(osc_buf, num_osc, osc_size);
  394. while(p < end ? (
  395. // Functions indexing memory seems to be slow, so manually inline them.
  396. /* load_adsr(p); */ adsr.state = p[3]; adsr.env = p[4]; adsr.scale = p[5]; adsr.s = p[6];
  397. adsr.s != sus ? adsr.adsr_sets(sus);
  398. adsr.adsr_process();
  399. /* store_adsr(p); */ p[3] = adsr.state; p[4] = adsr.env; p[5] = adsr.scale; p[6] = adsr.s;
  400. s = sample_tg(p[1], p[2]);
  401. p[1] = tg.t;
  402. /* load_lpf(p); */ lpf.env.lp = p[7]; lpf.freq.smooth = p[8]; lpf.zdf.g = p[9]; lpf.zdf.h = p[10]; lpf.zdf.s1 = p[11]; lpf.zdf.s2 = p[12];
  403. s = apply_lpf(s, p[2]);
  404. /* store_lpf(p); */ p[7] = lpf.env.lp; p[8] = lpf.freq.smooth; p[9] = lpf.zdf.g; p[10] = lpf.zdf.h; p[11] = lpf.zdf.s1; p[12] = lpf.zdf.s2;
  405. out += s;
  406. adsr_lpf_off() ? (
  407. remove_buf(osc_size);
  408. num_osc -= 1;
  409. ) : (
  410. p += osc_size;
  411. );
  412. ));
  413. );
  414. lpf.skip > 0 ? lpf.skip -= 1 : lpf.skip = 16 - 1;
  415. spl0 += gain0.smooth() * out;
  416. spl1 += gain1.smooth() * out;