DISTRHO Juice Plugins
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.

332 lines
7.5KB

  1. /*
  2. * Trigger 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 "TriggerJuicePlugin.hpp"
  18. #include <iostream>
  19. START_NAMESPACE_DISTRHO
  20. // -----------------------------------------------------------------------
  21. TriggerJuicePlugin::TriggerJuicePlugin()
  22. : Plugin(paramCount, 1, 0) // 1 program, 0 states
  23. {
  24. // set default values
  25. d_setProgram(0);
  26. // reset
  27. d_deactivate();
  28. }
  29. TriggerJuicePlugin::~TriggerJuicePlugin()
  30. {
  31. }
  32. // -----------------------------------------------------------------------
  33. // Init
  34. void TriggerJuicePlugin::d_initParameter(uint32_t index, Parameter& parameter)
  35. {
  36. switch (index)
  37. {
  38. case paramAttack:
  39. parameter.hints = PARAMETER_IS_AUTOMABLE;
  40. parameter.name = "Attack";
  41. parameter.symbol = "att";
  42. parameter.unit = "seconds";
  43. parameter.ranges.def = 0.0f;
  44. parameter.ranges.min = 0.0f;
  45. parameter.ranges.max = 1.0f;
  46. break;
  47. case paramRelease:
  48. parameter.hints = PARAMETER_IS_AUTOMABLE;
  49. parameter.name = "Release";
  50. parameter.symbol = "rel";
  51. parameter.unit = "seconds";
  52. parameter.ranges.def = 0.0f;
  53. parameter.ranges.min = 0.0f;
  54. parameter.ranges.max = 1.0f;
  55. break;
  56. case paramRev:
  57. parameter.hints = PARAMETER_IS_AUTOMABLE;
  58. parameter.name = "Reverse";
  59. parameter.symbol = "rev";
  60. parameter.unit = "";
  61. parameter.ranges.def = 0.0f;
  62. parameter.ranges.min = 0.0f;
  63. parameter.ranges.max = 1.0f;
  64. break;
  65. case paramSplit:
  66. parameter.hints = PARAMETER_IS_AUTOMABLE;
  67. parameter.name = "Split";
  68. parameter.symbol = "spl";
  69. parameter.unit = "";
  70. parameter.ranges.def = 0.0f;
  71. parameter.ranges.min = 0.0f;
  72. parameter.ranges.max = 1.0f;
  73. break;
  74. case paramMS:
  75. parameter.hints = PARAMETER_IS_AUTOMABLE;
  76. parameter.name = "M/S";
  77. parameter.symbol = "ms";
  78. parameter.unit = "";
  79. parameter.ranges.def = 0.0f;
  80. parameter.ranges.min = 0.0f;
  81. parameter.ranges.max = 1.0f;
  82. break;
  83. }
  84. }
  85. void TriggerJuicePlugin::d_initProgramName(uint32_t index, d_string& programName)
  86. {
  87. if (index != 0)
  88. return;
  89. programName = "Default";
  90. }
  91. // -----------------------------------------------------------------------
  92. // Internal data
  93. float TriggerJuicePlugin::d_getParameterValue(uint32_t index) const
  94. {
  95. switch (index)
  96. {
  97. case paramAttack:
  98. return attack;
  99. case paramRelease:
  100. return release;
  101. case paramSplit:
  102. return split;
  103. case paramRev:
  104. return rev;
  105. case paramMS:
  106. return MS;
  107. default:
  108. return 0.0f;
  109. }
  110. }
  111. void TriggerJuicePlugin::d_setParameterValue(uint32_t index, float value)
  112. {
  113. switch (index)
  114. {
  115. case paramSplit:
  116. split = value;
  117. break;
  118. case paramRev:
  119. rev = value;
  120. if (rev<0.5) {
  121. left.close(d_getSampleRate()/10); right.close(d_getSampleRate()/10);
  122. } else {
  123. left.open(d_getSampleRate()/10); right.open(d_getSampleRate()/10);
  124. }
  125. break;
  126. case paramAttack:
  127. attack = value;
  128. break;
  129. case paramRelease:
  130. release = value;
  131. break;
  132. case paramMS:
  133. MS = value;
  134. break;
  135. }
  136. }
  137. void TriggerJuicePlugin::d_setProgram(uint32_t index)
  138. {
  139. if (index != 0)
  140. return;
  141. /* Default parameter values */
  142. split = 0.0f;
  143. rev = 0.0f;
  144. attack = 0.0f;
  145. release = 0.0f;
  146. MS = 0.0f;
  147. /* Default variable values */
  148. attack=release=0;
  149. rev=split=MS=0;
  150. left.setSr(d_getSampleRate());
  151. right.setSr(d_getSampleRate());
  152. //parameter smoothing
  153. for (int i=0; i<2; i++) {
  154. sA[i] = 0.99f;
  155. sB[i] = 1.f - sA[i];
  156. sZ[i] = 0;
  157. }
  158. /* reset filter values */
  159. d_activate();
  160. }
  161. // -----------------------------------------------------------------------
  162. // Process
  163. void TriggerJuicePlugin::d_activate()
  164. {
  165. //sinePos = 0;
  166. }
  167. void TriggerJuicePlugin::d_deactivate()
  168. {
  169. // all values to zero
  170. }
  171. void TriggerJuicePlugin::d_run(const float** inputs, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount)
  172. {
  173. for (uint32_t i; i<frames; i++) {
  174. float inL = inputs[0][i];
  175. float inR = inputs[1][i];
  176. if (MS<0.5) {
  177. //stereo mode
  178. left.update(inL);
  179. right.update(inR);
  180. } else {
  181. //M/S mode
  182. left.update(inL+inR);
  183. right.update(inL-inR);
  184. }
  185. float audioL = left.run();
  186. float audioR = right.run();
  187. if (MS>=0.5) {
  188. // decode from MS
  189. float mid = audioL;
  190. float side = audioR;
  191. audioL = (mid+side)/2;
  192. audioR = (mid-side)/2;
  193. }
  194. outputs[0][i] = audioL;
  195. outputs[1][i] = audioR;
  196. }
  197. int userNote = 64;//TODO
  198. for (uint32_t i; i<midiEventCount; i++) {
  199. int mType = midiEvents[i].buf[0] & 0xF0;
  200. int mChan = midiEvents[i].buf[0] & 0x0F;
  201. int mNum = midiEvents[i].buf[1];
  202. if (mType == 0x90) {
  203. //NOTE ON
  204. std::cout << mNum << std::endl;
  205. int mVelo = midiEvents[i].buf[2];
  206. if (mNum == userNote) {
  207. if (rev<0.5) {
  208. if (split<0.5) {
  209. //open both streams
  210. left.open(attack);
  211. right.open(attack);
  212. } else {
  213. //open just left stream
  214. left.open(attack);
  215. }
  216. } else {
  217. if (split<0.5) {
  218. //close both streams
  219. left.close(attack);
  220. right.close(attack);
  221. } else {
  222. //close just left stream
  223. left.close(attack);
  224. }
  225. }
  226. }
  227. if (split>=0.5) {
  228. if (mNum == userNote+1) {
  229. if (rev<0.5) {
  230. //open right stream
  231. right.open(attack);
  232. } else {
  233. //close right stream
  234. right.close(attack);
  235. }
  236. }
  237. }
  238. } else if (mType == 0x80) {
  239. //NOTE OFF
  240. if (mNum == userNote) {
  241. if (rev<0.5) {
  242. if (split<0.5) {
  243. //close both streams
  244. left.close(release);
  245. right.close(release);
  246. } else {
  247. //close just left stream
  248. left.close(release);
  249. }
  250. } else {
  251. if (split<0.5) {
  252. //open both streams
  253. left.open(release);
  254. right.open(release);
  255. } else {
  256. //open just left stream
  257. left.open(release);
  258. }
  259. }
  260. }
  261. if (split>=0.5) {
  262. if (mNum == userNote+1) {
  263. if (rev<0.5) {
  264. //close right stream
  265. right.close(release);
  266. } else {
  267. //open right stream
  268. right.open(release);
  269. }
  270. }
  271. }
  272. }
  273. }
  274. }
  275. // -----------------------------------------------------------------------
  276. Plugin* createPlugin()
  277. {
  278. return new TriggerJuicePlugin();
  279. }
  280. // -----------------------------------------------------------------------
  281. END_NAMESPACE_DISTRHO