DPF with Max Gen
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

421 lines
13KB

  1. #include "gen_exported.h"
  2. namespace gen_exported {
  3. /*******************************************************************************************************************
  4. Copyright (c) 2012 Cycling '74
  5. Permission is hereby granted, free of charge, to any person obtaining a copy of this software
  6. and associated documentation files (the "Software"), to deal in the Software without restriction,
  7. including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
  9. subject to the following conditions:
  10. The above copyright notice and this permission notice shall be included in all copies
  11. or substantial portions of the Software.
  12. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  13. INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  14. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  15. WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  16. OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  17. *******************************************************************************************************************/
  18. // global noise generator
  19. Noise noise;
  20. static const int GENLIB_LOOPCOUNT_BAIL = 100000;
  21. // The State struct contains all the state and procedures for the gendsp kernel
  22. typedef struct State {
  23. CommonState __commonstate;
  24. Delay m_delay_24;
  25. Delay m_delay_15;
  26. Delay m_delay_13;
  27. Delay m_delay_23;
  28. Delay m_delay_9;
  29. Delay m_delay_17;
  30. Delay m_delay_21;
  31. Delay m_delay_19;
  32. Delay m_delay_22;
  33. Delay m_delay_7;
  34. Delay m_delay_11;
  35. Delay m_delay_5;
  36. double m_history_6;
  37. double m_history_18;
  38. double m_spread_1;
  39. double m_history_20;
  40. double samplerate;
  41. double m_fb_2;
  42. double m_history_8;
  43. double m_history_16;
  44. double m_history_14;
  45. double m_damp_3;
  46. double m_history_12;
  47. double m_history_10;
  48. double m_fb_4;
  49. int vectorsize;
  50. int __exception;
  51. // re-initialize all member variables;
  52. inline void reset(double __sr, int __vs) {
  53. __exception = 0;
  54. vectorsize = __vs;
  55. samplerate = __sr;
  56. m_spread_1 = 0;
  57. m_fb_2 = 0.9;
  58. m_damp_3 = 0.5;
  59. m_fb_4 = 0.5;
  60. m_delay_5.reset("m_delay_5", 2000);
  61. m_history_6 = 0;
  62. m_delay_7.reset("m_delay_7", 2000);
  63. m_history_8 = 0;
  64. m_delay_9.reset("m_delay_9", 2000);
  65. m_history_10 = 0;
  66. m_delay_11.reset("m_delay_11", 2000);
  67. m_history_12 = 0;
  68. m_delay_13.reset("m_delay_13", 2000);
  69. m_history_14 = 0;
  70. m_delay_15.reset("m_delay_15", 2000);
  71. m_history_16 = 0;
  72. m_delay_17.reset("m_delay_17", 2000);
  73. m_history_18 = 0;
  74. m_delay_19.reset("m_delay_19", 2000);
  75. m_history_20 = 0;
  76. m_delay_21.reset("m_delay_21", 2000);
  77. m_delay_22.reset("m_delay_22", 2000);
  78. m_delay_23.reset("m_delay_23", 2000);
  79. m_delay_24.reset("m_delay_24", 2000);
  80. genlib_reset_complete(this);
  81. };
  82. // the signal processing routine;
  83. inline int perform(t_sample ** __ins, t_sample ** __outs, int __n) {
  84. vectorsize = __n;
  85. const t_sample * __in1 = __ins[0];
  86. t_sample * __out1 = __outs[0];
  87. if (__exception) {
  88. return __exception;
  89. } else if (( (__in1 == 0) || (__out1 == 0) )) {
  90. __exception = GENLIB_ERR_NULL_BUFFER;
  91. return __exception;
  92. };
  93. double mul_498 = (m_fb_4 * 0.5);
  94. double add_474 = (225 + m_spread_1);
  95. double add_481 = (341 + m_spread_1);
  96. double add_496 = (441 + m_spread_1);
  97. double add_467 = (556 + m_spread_1);
  98. double damp_379 = m_damp_3;
  99. double damp_377 = damp_379;
  100. double damp_376 = damp_379;
  101. double damp_378 = damp_379;
  102. double damp_380 = damp_379;
  103. double damp_381 = damp_379;
  104. double damp_382 = damp_379;
  105. double damp_383 = damp_379;
  106. double add_489 = (1557 + m_spread_1);
  107. double rsub_72 = (1 - damp_377);
  108. double add_488 = (1617 + m_spread_1);
  109. double rsub_510 = (1 - damp_376);
  110. double add_490 = (1491 + m_spread_1);
  111. double rsub_522 = (1 - damp_378);
  112. double add_491 = (1422 + m_spread_1);
  113. double rsub_537 = (1 - damp_379);
  114. double add_492 = (1356 + m_spread_1);
  115. double rsub_548 = (1 - damp_380);
  116. double add_493 = (1277 + m_spread_1);
  117. double rsub_561 = (1 - damp_381);
  118. double add_494 = (1188 + m_spread_1);
  119. double rsub_576 = (1 - damp_382);
  120. double add_495 = (1116 + m_spread_1);
  121. double rsub_585 = (1 - damp_383);
  122. // the main sample loop;
  123. while ((__n--)) {
  124. const double in1 = (*(__in1++));
  125. double mul_509 = (in1 * 0.015);
  126. double tap_79 = m_delay_5.read_linear(add_489);
  127. double gen_460 = tap_79;
  128. double mul_77 = (tap_79 * damp_377);
  129. double mul_75 = (m_history_6 * rsub_72);
  130. double add_76 = (mul_77 + mul_75);
  131. double mul_73 = (add_76 * m_fb_2);
  132. double add_80 = (mul_509 + mul_73);
  133. double history_74_next_81 = add_76;
  134. double tap_514 = m_delay_7.read_linear(add_488);
  135. double gen_508 = tap_514;
  136. double mul_518 = (tap_514 * damp_376);
  137. double mul_512 = (m_history_8 * rsub_510);
  138. double add_513 = (mul_518 + mul_512);
  139. double mul_515 = (add_513 * m_fb_2);
  140. double add_517 = (mul_509 + mul_515);
  141. double history_74_next_516 = add_513;
  142. double tap_526 = m_delay_9.read_linear(add_490);
  143. double gen_449 = tap_526;
  144. double mul_530 = (tap_526 * damp_378);
  145. double mul_524 = (m_history_10 * rsub_522);
  146. double add_525 = (mul_530 + mul_524);
  147. double mul_527 = (add_525 * m_fb_2);
  148. double add_529 = (mul_509 + mul_527);
  149. double history_74_next_528 = add_525;
  150. double tap_539 = m_delay_11.read_linear(add_491);
  151. double gen_438 = tap_539;
  152. double mul_536 = (tap_539 * damp_379);
  153. double mul_535 = (m_history_12 * rsub_537);
  154. double add_538 = (mul_536 + mul_535);
  155. double mul_540 = (add_538 * m_fb_2);
  156. double add_541 = (mul_509 + mul_540);
  157. double history_74_next_543 = add_538;
  158. double tap_550 = m_delay_13.read_linear(add_492);
  159. double gen_427 = tap_550;
  160. double mul_547 = (tap_550 * damp_380);
  161. double mul_546 = (m_history_14 * rsub_548);
  162. double add_549 = (mul_547 + mul_546);
  163. double mul_551 = (add_549 * m_fb_2);
  164. double add_553 = (mul_509 + mul_551);
  165. double history_74_next_555 = add_549;
  166. double tap_563 = m_delay_15.read_linear(add_493);
  167. double gen_416 = tap_563;
  168. double mul_560 = (tap_563 * damp_381);
  169. double mul_559 = (m_history_16 * rsub_561);
  170. double add_562 = (mul_560 + mul_559);
  171. double mul_564 = (add_562 * m_fb_2);
  172. double add_565 = (mul_509 + mul_564);
  173. double history_74_next_566 = add_562;
  174. double tap_574 = m_delay_17.read_linear(add_494);
  175. double gen_405 = tap_574;
  176. double mul_572 = (tap_574 * damp_382);
  177. double mul_571 = (m_history_18 * rsub_576);
  178. double add_573 = (mul_572 + mul_571);
  179. double mul_575 = (add_573 * m_fb_2);
  180. double add_577 = (mul_509 + mul_575);
  181. double history_74_next_579 = add_573;
  182. double tap_587 = m_delay_19.read_linear(add_495);
  183. double gen_394 = tap_587;
  184. double mul_584 = (tap_587 * damp_383);
  185. double mul_583 = (m_history_20 * rsub_585);
  186. double add_586 = (mul_584 + mul_583);
  187. double mul_588 = (add_586 * m_fb_2);
  188. double add_589 = (mul_509 + mul_588);
  189. double history_74_next_591 = add_586;
  190. double add_497 = ((((((((gen_394 + gen_405) + gen_416) + gen_427) + gen_438) + gen_449) + gen_508) + gen_460) + 0);
  191. double tap_60 = m_delay_21.read_linear(add_467);
  192. double sub_56 = (add_497 - tap_60);
  193. double mul_58 = (tap_60 * mul_498);
  194. double add_57 = (add_497 + mul_58);
  195. double tap_597 = m_delay_22.read_linear(add_496);
  196. double sub_594 = (sub_56 - tap_597);
  197. double mul_596 = (tap_597 * mul_498);
  198. double add_598 = (sub_56 + mul_596);
  199. double tap_603 = m_delay_23.read_linear(add_481);
  200. double sub_600 = (sub_594 - tap_603);
  201. double mul_602 = (tap_603 * mul_498);
  202. double add_604 = (sub_594 + mul_602);
  203. double tap_608 = m_delay_24.read_linear(add_474);
  204. double sub_606 = (sub_600 - tap_608);
  205. double mul_609 = (tap_608 * mul_498);
  206. double add_610 = (sub_600 + mul_609);
  207. double out1 = sub_606;
  208. m_delay_5.write(add_80);
  209. m_delay_24.write(add_610);
  210. m_delay_23.write(add_604);
  211. m_delay_22.write(add_598);
  212. m_delay_21.write(add_57);
  213. m_history_20 = history_74_next_591;
  214. m_delay_19.write(add_589);
  215. m_history_18 = history_74_next_579;
  216. m_delay_17.write(add_577);
  217. m_history_16 = history_74_next_566;
  218. m_delay_15.write(add_565);
  219. m_history_14 = history_74_next_555;
  220. m_delay_13.write(add_553);
  221. m_history_12 = history_74_next_543;
  222. m_delay_11.write(add_541);
  223. m_history_10 = history_74_next_528;
  224. m_delay_9.write(add_529);
  225. m_history_8 = history_74_next_516;
  226. m_delay_7.write(add_517);
  227. m_history_6 = history_74_next_81;
  228. m_delay_5.step();
  229. m_delay_7.step();
  230. m_delay_9.step();
  231. m_delay_11.step();
  232. m_delay_13.step();
  233. m_delay_15.step();
  234. m_delay_17.step();
  235. m_delay_19.step();
  236. m_delay_21.step();
  237. m_delay_22.step();
  238. m_delay_23.step();
  239. m_delay_24.step();
  240. // assign results to output buffer;
  241. (*(__out1++)) = out1;
  242. };
  243. return __exception;
  244. };
  245. inline void set_spread(double _value) {
  246. m_spread_1 = (_value < 0 ? 0 : (_value > 400 ? 400 : _value));
  247. };
  248. inline void set_fb1(double _value) {
  249. m_fb_2 = (_value < 0 ? 0 : (_value > 1 ? 1 : _value));
  250. };
  251. inline void set_damp(double _value) {
  252. m_damp_3 = (_value < 0 ? 0 : (_value > 1 ? 1 : _value));
  253. };
  254. inline void set_fb2(double _value) {
  255. m_fb_4 = (_value < 0 ? 0 : (_value > 1 ? 1 : _value));
  256. };
  257. } State;
  258. ///
  259. /// Configuration for the genlib API
  260. ///
  261. /// Number of signal inputs and outputs
  262. int gen_kernel_numins = 1;
  263. int gen_kernel_numouts = 1;
  264. int num_inputs() { return gen_kernel_numins; }
  265. int num_outputs() { return gen_kernel_numouts; }
  266. int num_params() { return 4; }
  267. /// Assistive lables for the signal inputs and outputs
  268. const char * gen_kernel_innames[] = { "in1" };
  269. const char * gen_kernel_outnames[] = { "out1" };
  270. /// Invoke the signal process of a State object
  271. int perform(CommonState *cself, t_sample **ins, long numins, t_sample **outs, long numouts, long n) {
  272. State * self = (State *)cself;
  273. return self->perform(ins, outs, n);
  274. }
  275. /// Reset all parameters and stateful operators of a State object
  276. void reset(CommonState *cself) {
  277. State * self = (State *)cself;
  278. self->reset(cself->sr, cself->vs);
  279. }
  280. /// Set a parameter of a State object
  281. void setparameter(CommonState *cself, long index, double value, void *ref) {
  282. State * self = (State *)cself;
  283. switch (index) {
  284. case 0: self->set_spread(value); break;
  285. case 1: self->set_fb1(value); break;
  286. case 2: self->set_damp(value); break;
  287. case 3: self->set_fb2(value); break;
  288. default: break;
  289. }
  290. }
  291. /// Get the value of a parameter of a State object
  292. void getparameter(CommonState *cself, long index, double *value) {
  293. State *self = (State *)cself;
  294. switch (index) {
  295. case 0: *value = self->m_spread_1; break;
  296. case 1: *value = self->m_fb_2; break;
  297. case 2: *value = self->m_damp_3; break;
  298. case 3: *value = self->m_fb_4; break;
  299. default: break;
  300. }
  301. }
  302. /// Allocate and configure a new State object and it's internal CommonState:
  303. void * create(double sr, long vs) {
  304. State *self = new State;
  305. self->reset(sr, vs);
  306. ParamInfo *pi;
  307. self->__commonstate.inputnames = gen_kernel_innames;
  308. self->__commonstate.outputnames = gen_kernel_outnames;
  309. self->__commonstate.numins = gen_kernel_numins;
  310. self->__commonstate.numouts = gen_kernel_numouts;
  311. self->__commonstate.sr = sr;
  312. self->__commonstate.vs = vs;
  313. self->__commonstate.params = (ParamInfo *)genlib_sysmem_newptr(4 * sizeof(ParamInfo));
  314. self->__commonstate.numparams = 4;
  315. // initialize parameter 0 ("m_spread_1")
  316. pi = self->__commonstate.params + 0;
  317. pi->name = "spread";
  318. pi->paramtype = GENLIB_PARAMTYPE_FLOAT;
  319. pi->defaultvalue = self->m_spread_1;
  320. pi->defaultref = 0;
  321. pi->hasinputminmax = false;
  322. pi->inputmin = 0;
  323. pi->inputmax = 1;
  324. pi->hasminmax = true;
  325. pi->outputmin = 0;
  326. pi->outputmax = 400;
  327. pi->exp = 0;
  328. pi->units = ""; // no units defined
  329. // initialize parameter 1 ("m_fb_2")
  330. pi = self->__commonstate.params + 1;
  331. pi->name = "fb1";
  332. pi->paramtype = GENLIB_PARAMTYPE_FLOAT;
  333. pi->defaultvalue = self->m_fb_2;
  334. pi->defaultref = 0;
  335. pi->hasinputminmax = false;
  336. pi->inputmin = 0;
  337. pi->inputmax = 1;
  338. pi->hasminmax = true;
  339. pi->outputmin = 0;
  340. pi->outputmax = 1;
  341. pi->exp = 0;
  342. pi->units = ""; // no units defined
  343. // initialize parameter 2 ("m_damp_3")
  344. pi = self->__commonstate.params + 2;
  345. pi->name = "damp";
  346. pi->paramtype = GENLIB_PARAMTYPE_FLOAT;
  347. pi->defaultvalue = self->m_damp_3;
  348. pi->defaultref = 0;
  349. pi->hasinputminmax = false;
  350. pi->inputmin = 0;
  351. pi->inputmax = 1;
  352. pi->hasminmax = true;
  353. pi->outputmin = 0;
  354. pi->outputmax = 1;
  355. pi->exp = 0;
  356. pi->units = ""; // no units defined
  357. // initialize parameter 3 ("m_fb_4")
  358. pi = self->__commonstate.params + 3;
  359. pi->name = "fb2";
  360. pi->paramtype = GENLIB_PARAMTYPE_FLOAT;
  361. pi->defaultvalue = self->m_fb_4;
  362. pi->defaultref = 0;
  363. pi->hasinputminmax = false;
  364. pi->inputmin = 0;
  365. pi->inputmax = 1;
  366. pi->hasminmax = true;
  367. pi->outputmin = 0;
  368. pi->outputmax = 1;
  369. pi->exp = 0;
  370. pi->units = ""; // no units defined
  371. return self;
  372. }
  373. /// Release all resources and memory used by a State object:
  374. void destroy(CommonState *cself) {
  375. State * self = (State *)cself;
  376. genlib_sysmem_freeptr(cself->params);
  377. delete self;
  378. }
  379. } // freeverb::