Audio plugin host https://kx.studio/carla
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.

412 lines
11KB

  1. /*
  2. * Vector Juice Plugin
  3. * Copyright (C) 2014 Andre Sklenar <andre.sklenar@gmail.com>, www.juicelab.cz
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "VectorJuicePlugin.hpp"
  18. START_NAMESPACE_DISTRHO
  19. // -----------------------------------------------------------------------
  20. VectorJuicePlugin::VectorJuicePlugin()
  21. : Plugin(paramCount, 1, 0) // 1 program, 0 states
  22. {
  23. // set default values
  24. d_setProgram(0);
  25. // reset
  26. d_deactivate();
  27. }
  28. // -----------------------------------------------------------------------
  29. // Init
  30. void VectorJuicePlugin::d_initParameter(uint32_t index, Parameter& parameter)
  31. {
  32. switch (index)
  33. {
  34. case paramX:
  35. parameter.hints = PARAMETER_IS_AUTOMABLE;
  36. parameter.name = "X";
  37. parameter.symbol = "x";
  38. parameter.unit = "";
  39. parameter.ranges.def = 0.5f;
  40. parameter.ranges.min = 0.0f;
  41. parameter.ranges.max = 1.0f;
  42. break;
  43. case paramY:
  44. parameter.hints = PARAMETER_IS_AUTOMABLE;
  45. parameter.name = "Y";
  46. parameter.symbol = "y";
  47. parameter.unit = "";
  48. parameter.ranges.def = 0.5f;
  49. parameter.ranges.min = 0.0f;
  50. parameter.ranges.max = 1.0f;
  51. break;
  52. case paramOrbitSpeedX:
  53. parameter.hints = PARAMETER_IS_AUTOMABLE;
  54. parameter.name = "Orbit Speed X";
  55. parameter.symbol = "";
  56. parameter.unit = "";
  57. parameter.ranges.def = 4.0f;
  58. parameter.ranges.min = 1.0f;
  59. parameter.ranges.max = 128.0f;
  60. break;
  61. case paramOrbitSpeedY:
  62. parameter.hints = PARAMETER_IS_AUTOMABLE;
  63. parameter.name = "Orbit Speed Y";
  64. parameter.symbol = "";
  65. parameter.unit = "";
  66. parameter.ranges.def = 4.0f;
  67. parameter.ranges.min = 1.0f;
  68. parameter.ranges.max = 128.0f;
  69. break;
  70. case paramOrbitSizeX:
  71. parameter.hints = PARAMETER_IS_AUTOMABLE;
  72. parameter.name = "Orbit Size X";
  73. parameter.symbol = "osl";
  74. parameter.unit = "";
  75. parameter.ranges.def = 0.5f;
  76. parameter.ranges.min = 0.0f;
  77. parameter.ranges.max = 1.0f;
  78. break;
  79. case paramOrbitSizeY:
  80. parameter.hints = PARAMETER_IS_AUTOMABLE;
  81. parameter.name = "Orbit Size Y";
  82. parameter.symbol = "osr";
  83. parameter.unit = "";
  84. parameter.ranges.def = 0.5f;
  85. parameter.ranges.min = 0.0f;
  86. parameter.ranges.max = 1.0f;
  87. break;
  88. case paramSubOrbitSpeed:
  89. parameter.hints = PARAMETER_IS_AUTOMABLE;
  90. parameter.name = "SubOrbit Speed";
  91. parameter.symbol = "";
  92. parameter.unit = "";
  93. parameter.ranges.def = 32.0f;
  94. parameter.ranges.min = 1.0f;
  95. parameter.ranges.max = 128.0f;
  96. break;
  97. case paramSubOrbitSize:
  98. parameter.hints = PARAMETER_IS_AUTOMABLE;
  99. parameter.name = "SubOrbit Size";
  100. parameter.symbol = "";
  101. parameter.unit = "";
  102. parameter.ranges.def = 0.5f;
  103. parameter.ranges.min = 0.0f;
  104. parameter.ranges.max = 1.0f;
  105. break;
  106. case paramSubOrbitSmooth:
  107. parameter.hints = PARAMETER_IS_AUTOMABLE;
  108. parameter.name = "SubOrbit Wave";
  109. parameter.symbol = "";
  110. parameter.unit = "";
  111. parameter.ranges.def = 0.5f;
  112. parameter.ranges.min = 0.0f;
  113. parameter.ranges.max = 1.0f;
  114. break;
  115. case paramOrbitWaveX:
  116. parameter.hints = PARAMETER_IS_AUTOMABLE;
  117. parameter.name = "Orbit Wave X";
  118. parameter.symbol = "";
  119. parameter.unit = "";
  120. parameter.ranges.def = 3.0f;
  121. parameter.ranges.min = 1.0f;
  122. parameter.ranges.max = 4.0f;
  123. break;
  124. case paramOrbitPhaseX:
  125. parameter.hints = PARAMETER_IS_AUTOMABLE;
  126. parameter.name = "Orbit Phase X";
  127. parameter.symbol = "";
  128. parameter.unit = "";
  129. parameter.ranges.def = 0.0f;
  130. parameter.ranges.min = 0.0f;
  131. parameter.ranges.max = 1.0f;
  132. break;
  133. case paramOrbitPhaseY:
  134. parameter.hints = PARAMETER_IS_AUTOMABLE;
  135. parameter.name = "Orbit Phase Y";
  136. parameter.symbol = "";
  137. parameter.unit = "";
  138. parameter.ranges.def = 0.0f;
  139. parameter.ranges.min = 0.0f;
  140. parameter.ranges.max = 1.0f;
  141. break;
  142. case paramOrbitWaveY:
  143. parameter.hints = PARAMETER_IS_AUTOMABLE;
  144. parameter.name = "Orbit Wave Y";
  145. parameter.symbol = "";
  146. parameter.unit = "";
  147. parameter.ranges.def = 3.0f;
  148. parameter.ranges.min = 1.0f;
  149. parameter.ranges.max = 4.0f;
  150. break;
  151. case paramOrbitOutX:
  152. parameter.hints = PARAMETER_IS_OUTPUT;
  153. parameter.name = "Orbit X";
  154. parameter.symbol = "orx";
  155. parameter.unit = "";
  156. parameter.ranges.def = 0.5f;
  157. parameter.ranges.min = 0.0f;
  158. parameter.ranges.max = 1.0f;
  159. break;
  160. case paramOrbitOutY:
  161. parameter.hints = PARAMETER_IS_OUTPUT;
  162. parameter.name = "Orbit Y";
  163. parameter.symbol = "ory";
  164. parameter.unit = "";
  165. parameter.ranges.def = 0.5f;
  166. parameter.ranges.min = 0.0f;
  167. parameter.ranges.max = 1.0f;
  168. break;
  169. case paramSubOrbitOutX:
  170. parameter.hints = PARAMETER_IS_OUTPUT;
  171. parameter.name = "SubOrbit X";
  172. parameter.symbol = "sorx";
  173. parameter.unit = "";
  174. parameter.ranges.def = 0.5f;
  175. parameter.ranges.min = 0.0f;
  176. parameter.ranges.max = 1.0f;
  177. break;
  178. case paramSubOrbitOutY:
  179. parameter.hints = PARAMETER_IS_OUTPUT;
  180. parameter.name = "SubOrbit Y";
  181. parameter.symbol = "sory";
  182. parameter.unit = "";
  183. parameter.ranges.def = 0.5f;
  184. parameter.ranges.min = 0.0f;
  185. parameter.ranges.max = 1.0f;
  186. break;
  187. }
  188. }
  189. void VectorJuicePlugin::d_initProgramName(uint32_t index, d_string& programName)
  190. {
  191. if (index != 0)
  192. return;
  193. programName = "Default";
  194. }
  195. // -----------------------------------------------------------------------
  196. // Internal data
  197. float VectorJuicePlugin::d_getParameterValue(uint32_t index) const
  198. {
  199. switch (index)
  200. {
  201. case paramX:
  202. return x;
  203. case paramY:
  204. return y;
  205. case paramOrbitSizeX:
  206. return orbitSizeX;
  207. case paramOrbitSizeY:
  208. return orbitSizeY;
  209. case paramOrbitSpeedX:
  210. return orbitSpeedX;
  211. case paramOrbitSpeedY:
  212. return orbitSpeedY;
  213. case paramSubOrbitSpeed:
  214. return subOrbitSpeed;
  215. case paramSubOrbitSize:
  216. return subOrbitSize;
  217. case paramOrbitOutX:
  218. return orbitX;
  219. case paramOrbitOutY:
  220. return orbitY;
  221. case paramSubOrbitOutX:
  222. return subOrbitX;
  223. case paramSubOrbitOutY:
  224. return subOrbitY;
  225. case paramSubOrbitSmooth:
  226. return subOrbitSmooth;
  227. case paramOrbitWaveX:
  228. return orbitWaveX;
  229. case paramOrbitWaveY:
  230. return orbitWaveY;
  231. case paramOrbitPhaseX:
  232. return orbitPhaseY;
  233. case paramOrbitPhaseY:
  234. return orbitPhaseY;
  235. default:
  236. return 0.0f;
  237. }
  238. }
  239. void VectorJuicePlugin::d_setParameterValue(uint32_t index, float value)
  240. {
  241. switch (index)
  242. {
  243. case paramX:
  244. x = value;
  245. break;
  246. case paramY:
  247. y = value;
  248. break;
  249. case paramOrbitSpeedX:
  250. orbitSpeedX = value;
  251. resetPhase();
  252. break;
  253. case paramOrbitSpeedY:
  254. orbitSpeedY = value;
  255. resetPhase();
  256. break;
  257. case paramOrbitSizeX:
  258. orbitSizeX = value;
  259. break;
  260. case paramOrbitSizeY:
  261. orbitSizeY = value;
  262. break;
  263. case paramSubOrbitSpeed:
  264. subOrbitSpeed = value;
  265. resetPhase();
  266. break;
  267. case paramSubOrbitSize:
  268. subOrbitSize = value;
  269. break;
  270. case paramSubOrbitSmooth:
  271. subOrbitSmooth = value;
  272. break;
  273. case paramOrbitWaveX:
  274. orbitWaveX = value;
  275. break;
  276. case paramOrbitWaveY:
  277. orbitWaveY = value;
  278. break;
  279. case paramOrbitPhaseX:
  280. orbitPhaseX = value;
  281. resetPhase();
  282. break;
  283. case paramOrbitPhaseY:
  284. orbitPhaseY = value;
  285. resetPhase();
  286. break;
  287. }
  288. }
  289. void VectorJuicePlugin::d_setProgram(uint32_t index)
  290. {
  291. if (index != 0)
  292. return;
  293. /* Default parameter values */
  294. x = 0.5f;
  295. y = 0.5f;
  296. orbitSpeedX = 4.0f;
  297. orbitSpeedY = 4.0f;
  298. orbitSizeX = 0.5f;
  299. orbitSizeY = 0.5f;
  300. subOrbitSize = 0.5f;
  301. subOrbitSpeed = 32.0f;
  302. orbitWaveX = 3.0f;
  303. orbitWaveY = 3.0f;
  304. subOrbitSmooth = 0.5f;
  305. orbitPhaseX = 0.0f;
  306. orbitPhaseY = 0.0f;
  307. /* Default variable values */
  308. orbitX=orbitY=orbitTX=orbitTY=0.5;
  309. subOrbitX=subOrbitY=subOrbitTX=subOrbitTY=0;
  310. interpolationDivider=200;
  311. bar=tickX=tickY=percentageX=percentageY=tickOffsetX=0;
  312. tickOffsetY=sinePosX=sinePosY=tick=percentage=tickOffset=sinePos=0;
  313. waveBlend=0;
  314. //parameter smoothing
  315. for (int i=0; i<2; i++) {
  316. sA[i] = 0.99f;
  317. sB[i] = 1.f - sA[i];
  318. sZ[i] = 0;
  319. }
  320. /* reset filter values */
  321. d_activate();
  322. }
  323. // -----------------------------------------------------------------------
  324. // Process
  325. void VectorJuicePlugin::d_activate()
  326. {
  327. //sinePos = 0;
  328. }
  329. void VectorJuicePlugin::d_deactivate()
  330. {
  331. // all values to zero
  332. }
  333. void VectorJuicePlugin::d_run(float** inputs, float** outputs, uint32_t frames)
  334. {
  335. float out1, out2, tX, tY;
  336. for (uint32_t i=0; i<frames; i++) {
  337. //1.41421 -> 1
  338. //<0 = 0
  339. animate();
  340. tX = subOrbitX;
  341. tY = subOrbitY;
  342. out1 = inputs[0][i]*tN(1-std::sqrt((tX*tX)+(tY*tY)));
  343. out2 = inputs[1][i]*tN(1-std::sqrt((tX*tX)+(tY*tY)));
  344. out1 += inputs[2][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+(tY*tY)));
  345. out2 += inputs[3][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+(tY*tY)));
  346. out1 += inputs[4][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+((1-tY)*(1-tY))));
  347. out2 += inputs[5][i]*tN(1-std::sqrt(((1-tX)*(1-tX))+((1-tY)*(1-tY))));
  348. out1 += inputs[6][i]*tN(1-std::sqrt((tX*tX)+((1-tY)*(1-tY))));
  349. out2 += inputs[7][i]*tN(1-std::sqrt((tX*tX)+((1-tY)*(1-tY))));
  350. outputs[0][i] = out1;
  351. outputs[1][i] = out2;
  352. }
  353. }
  354. // -----------------------------------------------------------------------
  355. Plugin* createPlugin()
  356. {
  357. return new VectorJuicePlugin();
  358. }
  359. // -----------------------------------------------------------------------
  360. END_NAMESPACE_DISTRHO