Collection of DPF-based plugins for packaging
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.

311 lines
10.0KB

  1. /*
  2. * DISTRHO SoulForce, a DPF'ied SoulForce.
  3. * Copyright (C) 2006 Niall Moody
  4. * Copyright (C) 2015 Filipe Coelho <falktx@falktx.com>
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a
  7. * copy of this software and associated documentation files (the "Software"),
  8. * to deal in the Software without restriction, including without limitation
  9. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the
  11. * Software is furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22. * DEALINGS IN THE SOFTWARE.
  23. */
  24. #include "DistrhoPluginSoulForce.hpp"
  25. START_NAMESPACE_DISTRHO
  26. // -----------------------------------------------------------------------
  27. DistrhoPluginSoulForce::DistrhoPluginSoulForce()
  28. : Plugin(kParameterCount, kProgramCount, 0),
  29. coeff(0.5f),
  30. wave(0.0f),
  31. env(0.0f),
  32. footEnv(0.0f)
  33. {
  34. // set initial values
  35. loadProgram(0);
  36. }
  37. // -----------------------------------------------------------------------
  38. // Init
  39. void DistrhoPluginSoulForce::initParameter(uint32_t index, Parameter& parameter)
  40. {
  41. parameter.hints = kParameterIsAutomable;
  42. parameter.ranges.min = 0.0f;
  43. parameter.ranges.max = 1.0f;
  44. switch (index)
  45. {
  46. case kParameterShape:
  47. parameter.name = "Shape";
  48. parameter.symbol = "shape";
  49. parameter.ranges.def = 0.5f;
  50. break;
  51. case kParameterFeedback:
  52. parameter.name = "FBack";
  53. parameter.symbol = "fback";
  54. parameter.ranges.def = 0.0f;
  55. break;
  56. case kParameterSource:
  57. parameter.hints |= kParameterIsBoolean;
  58. parameter.name = "Source";
  59. parameter.symbol = "source";
  60. parameter.ranges.def = 0.0f;
  61. break;
  62. case kParameterFootswitch:
  63. parameter.hints |= kParameterIsBoolean;
  64. parameter.name = "Foot";
  65. parameter.symbol = "foot";
  66. parameter.ranges.def = 1.0f;
  67. break;
  68. }
  69. }
  70. void DistrhoPluginSoulForce::initProgramName(uint32_t index, String& programName)
  71. {
  72. switch(index)
  73. {
  74. case kProgramDefault:
  75. programName = "Default";
  76. break;
  77. case kProgramStayDown:
  78. programName = "Stay Down";
  79. break;
  80. case kProgramLookingForTheWorld:
  81. programName = "Looking for the World";
  82. break;
  83. case kProgramGuerillaLove:
  84. programName = "Guerilla Love";
  85. break;
  86. case kProgramTumbleToThePower:
  87. programName = "Tumble to the Power";
  88. break;
  89. case kProgramDoYourselfFavour:
  90. programName = "Do Yourself a Favour";
  91. break;
  92. case kProgramPastIsPast:
  93. programName = "Past is Past";
  94. break;
  95. case kProgramYouAndOnlyYou:
  96. programName = "You and Only You";
  97. break;
  98. case kProgramSoulForce:
  99. programName = "Soul Force";
  100. break;
  101. }
  102. }
  103. // -----------------------------------------------------------------------
  104. // Internal data
  105. float DistrhoPluginSoulForce::getParameterValue(uint32_t index) const
  106. {
  107. return parameters[index];
  108. }
  109. void DistrhoPluginSoulForce::setParameterValue(uint32_t index, float value)
  110. {
  111. parameters[index] = value;
  112. switch(index)
  113. {
  114. case kParameterShape:
  115. coeff = (1.0f-(1.0f/((value * 0.99f)+0.005f)));
  116. break;
  117. case kParameterFeedback:
  118. if (d_isZero(value))
  119. coeff = (1.0f-(1.0f/((parameters[kParameterShape] * 0.99f)+0.005f)));
  120. break;
  121. }
  122. }
  123. void DistrhoPluginSoulForce::loadProgram(uint32_t index)
  124. {
  125. switch(index)
  126. {
  127. case kProgramDefault:
  128. parameters[kParameterShape] = 0.5f;
  129. parameters[kParameterFeedback] = 0.0f;
  130. parameters[kParameterSource] = 0.0f;
  131. parameters[kParameterFootswitch] = 1.0f;
  132. break;
  133. case kProgramStayDown:
  134. parameters[kParameterShape] = 0.4f;
  135. parameters[kParameterFeedback] = 0.0f;
  136. parameters[kParameterSource] = 0.0f;
  137. parameters[kParameterFootswitch] = 1.0f;
  138. break;
  139. case kProgramLookingForTheWorld:
  140. parameters[kParameterShape] = 1.0f;
  141. parameters[kParameterFeedback] = 0.0f;
  142. parameters[kParameterSource] = 0.0f;
  143. parameters[kParameterFootswitch] = 1.0f;
  144. break;
  145. case kProgramGuerillaLove:
  146. parameters[kParameterShape] = 0.5f;
  147. parameters[kParameterFeedback] = 1.0f;
  148. parameters[kParameterSource] = 0.0f;
  149. parameters[kParameterFootswitch] = 1.0f;
  150. break;
  151. case kProgramTumbleToThePower:
  152. parameters[kParameterShape] = 0.0f;
  153. parameters[kParameterFeedback] = 1.0f;
  154. parameters[kParameterSource] = 0.0f;
  155. parameters[kParameterFootswitch] = 1.0f;
  156. break;
  157. case kProgramDoYourselfFavour:
  158. parameters[kParameterShape] = 0.5f;
  159. parameters[kParameterFeedback] = 1.0f;
  160. parameters[kParameterSource] = 1.0f;
  161. parameters[kParameterFootswitch] = 1.0f;
  162. break;
  163. case kProgramPastIsPast:
  164. parameters[kParameterShape] = 0.0f;
  165. parameters[kParameterFeedback] = 1.0f;
  166. parameters[kParameterSource] = 1.0f;
  167. parameters[kParameterFootswitch] = 1.0f;
  168. break;
  169. case kProgramYouAndOnlyYou:
  170. parameters[kParameterShape] = 0.3f;
  171. parameters[kParameterFeedback] = 0.5f;
  172. parameters[kParameterSource] = 0.0f;
  173. parameters[kParameterFootswitch] = 1.0f;
  174. break;
  175. case kProgramSoulForce:
  176. parameters[kParameterShape] = 0.3f;
  177. parameters[kParameterFeedback] = 0.5f;
  178. parameters[kParameterSource] = 1.0f;
  179. parameters[kParameterFootswitch] = 1.0f;
  180. break;
  181. }
  182. }
  183. // -----------------------------------------------------------------------
  184. // Process
  185. void DistrhoPluginSoulForce::run(const float** inputs, float** outputs, uint32_t frames)
  186. {
  187. float tempf, tempf2;
  188. float inLeft, inRight;
  189. //frames = sampleFrames;
  190. // Calculate audio.
  191. for (uint32_t i=0; i<frames; ++i)
  192. {
  193. // For footEnv, later.
  194. inLeft = inputs[0][i];
  195. inRight = inputs[1][i];
  196. // Update coeff, if necessary.
  197. if (parameters[kParameterFeedback] > 0.0f)
  198. {
  199. if (parameters[kParameterSource] > 0.5f)
  200. {
  201. tempf2 = (1.0f-parameters[kParameterFeedback]) * parameters[kParameterShape];
  202. tempf2 += parameters[kParameterFeedback] * wave;
  203. coeff = (1.0f-(1.0f/((tempf2 * 0.99f)+0.005f)));
  204. }
  205. else
  206. {
  207. if ((tempf = std::abs(inLeft)) > env)
  208. {
  209. env = tempf;
  210. }
  211. else if (env > 0.0f)
  212. {
  213. env -= 0.001f;
  214. if (env < 0.0f)
  215. env = 0.0f;
  216. }
  217. tempf2 = (1.0f-parameters[kParameterFeedback]) * parameters[kParameterShape];
  218. tempf2 += parameters[kParameterFeedback] * env;
  219. coeff = (1.0f-(1.0f/((tempf2 * 0.99f)+0.005f)));
  220. }
  221. }
  222. tempf = inLeft;
  223. if (tempf > 0.0f)
  224. {
  225. tempf = tempf/(tempf+(coeff*(tempf-1.0f)));
  226. }
  227. else if (d_isZero(tempf))
  228. {
  229. tempf = 0.0f;
  230. }
  231. else
  232. {
  233. tempf = std::abs(tempf);
  234. tempf = 1.0f - (tempf/(tempf+(coeff*(tempf-1.0f))));
  235. tempf -= 1.0f;
  236. }
  237. if (parameters[kParameterShape] < 0.5f)
  238. tempf *= ((0.5f-parameters[kParameterShape])*16.0f)+1.0f;
  239. if (parameters[kParameterSource] > 0.5f)
  240. tempf *= 1.0f + (parameters[kParameterFeedback] * 2.0f);
  241. outputs[0][i] = tempf;
  242. tempf = inRight;
  243. if (tempf > 0.0f)
  244. {
  245. tempf = tempf/(tempf+(coeff*(tempf-1.0f)));
  246. }
  247. else if (d_isZero(tempf))
  248. {
  249. tempf = 0.0f;
  250. }
  251. else
  252. {
  253. tempf = std::abs(tempf);
  254. tempf = 1.0f - (tempf/(tempf+(coeff*(tempf-1.0f))));
  255. tempf -= 1.0f;
  256. }
  257. if (parameters[kParameterShape] < 0.5f)
  258. tempf *= ((0.5f-parameters[kParameterShape])*16.0f)+1.0f;
  259. if (parameters[kParameterSource] > 0.5f)
  260. tempf *= 1.0f + (parameters[kParameterFeedback] * 2.0f);
  261. outputs[1][i] = tempf;
  262. outputs[0][i] = std::tanh(outputs[0][i]) * 0.9f;
  263. outputs[1][i] = std::tanh(outputs[1][i]) * 0.9f;
  264. wave = outputs[0][i];
  265. // Handle footswitch.
  266. outputs[0][i] *= footEnv;
  267. outputs[0][i] += (1.0f-footEnv) * inLeft;
  268. outputs[1][i] *= footEnv;
  269. outputs[1][i] += (1.0f-footEnv) * inRight;
  270. if (parameters[kParameterFootswitch] > 0.5f && footEnv < 1.0f)
  271. footEnv += 0.01f;
  272. else if (parameters[kParameterFootswitch] < 0.5f && footEnv > 0.0f)
  273. footEnv -= 0.01f;
  274. }
  275. }
  276. // -----------------------------------------------------------------------
  277. Plugin* createPlugin()
  278. {
  279. return new DistrhoPluginSoulForce();
  280. }
  281. // -----------------------------------------------------------------------
  282. END_NAMESPACE_DISTRHO