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.

181 lines
5.6KB

  1. /*
  2. ZynAddSubFX - a software synthesizer
  3. WaveShapeSmps.cpp - Sample Distortion
  4. Copyright (C) 2002-2005 Nasca Octavian Paul
  5. Author: Nasca Octavian Paul
  6. This program is free software; you can redistribute it and/or
  7. modify it under the terms of the GNU General Public License
  8. as published by the Free Software Foundation; either version 2
  9. of the License, or (at your option) any later version.
  10. */
  11. #include "WaveShapeSmps.h"
  12. #include <cmath>
  13. void waveShapeSmps(int n,
  14. float *smps,
  15. unsigned char type,
  16. unsigned char drive)
  17. {
  18. int i;
  19. float ws = drive / 127.0f;
  20. float tmpv;
  21. switch(type) {
  22. case 1:
  23. ws = powf(10, ws * ws * 3.0f) - 1.0f + 0.001f; //Arctangent
  24. for(i = 0; i < n; ++i)
  25. smps[i] = atanf(smps[i] * ws) / atanf(ws);
  26. break;
  27. case 2:
  28. ws = ws * ws * 32.0f + 0.0001f; //Asymmetric
  29. if(ws < 1.0f)
  30. tmpv = sinf(ws) + 0.1f;
  31. else
  32. tmpv = 1.1f;
  33. for(i = 0; i < n; ++i)
  34. smps[i] = sinf(smps[i] * (0.1f + ws - ws * smps[i])) / tmpv;
  35. ;
  36. break;
  37. case 3:
  38. ws = ws * ws * ws * 20.0f + 0.0001f; //Pow
  39. for(i = 0; i < n; ++i) {
  40. smps[i] *= ws;
  41. if(fabs(smps[i]) < 1.0f) {
  42. smps[i] = (smps[i] - powf(smps[i], 3.0f)) * 3.0f;
  43. if(ws < 1.0f)
  44. smps[i] /= ws;
  45. }
  46. else
  47. smps[i] = 0.0f;
  48. }
  49. break;
  50. case 4:
  51. ws = ws * ws * ws * 32.0f + 0.0001f; //Sine
  52. if(ws < 1.57f)
  53. tmpv = sinf(ws);
  54. else
  55. tmpv = 1.0f;
  56. for(i = 0; i < n; ++i)
  57. smps[i] = sinf(smps[i] * ws) / tmpv;
  58. break;
  59. case 5:
  60. ws = ws * ws + 0.000001f; //Quantisize
  61. for(i = 0; i < n; ++i)
  62. smps[i] = floor(smps[i] / ws + 0.5f) * ws;
  63. break;
  64. case 6:
  65. ws = ws * ws * ws * 32 + 0.0001f; //Zigzag
  66. if(ws < 1.0f)
  67. tmpv = sinf(ws);
  68. else
  69. tmpv = 1.0f;
  70. for(i = 0; i < n; ++i)
  71. smps[i] = asinf(sinf(smps[i] * ws)) / tmpv;
  72. break;
  73. case 7:
  74. ws = powf(2.0f, -ws * ws * 8.0f); //Limiter
  75. for(i = 0; i < n; ++i) {
  76. float tmp = smps[i];
  77. if(fabs(tmp) > ws) {
  78. if(tmp >= 0.0f)
  79. smps[i] = 1.0f;
  80. else
  81. smps[i] = -1.0f;
  82. }
  83. else
  84. smps[i] /= ws;
  85. }
  86. break;
  87. case 8:
  88. ws = powf(2.0f, -ws * ws * 8.0f); //Upper Limiter
  89. for(i = 0; i < n; ++i) {
  90. float tmp = smps[i];
  91. if(tmp > ws)
  92. smps[i] = ws;
  93. smps[i] *= 2.0f;
  94. }
  95. break;
  96. case 9:
  97. ws = powf(2.0f, -ws * ws * 8.0f); //Lower Limiter
  98. for(i = 0; i < n; ++i) {
  99. float tmp = smps[i];
  100. if(tmp < -ws)
  101. smps[i] = -ws;
  102. smps[i] *= 2.0f;
  103. }
  104. break;
  105. case 10:
  106. ws = (powf(2.0f, ws * 6.0f) - 1.0f) / powf(2.0f, 6.0f); //Inverse Limiter
  107. for(i = 0; i < n; ++i) {
  108. float tmp = smps[i];
  109. if(fabs(tmp) > ws) {
  110. if(tmp >= 0.0f)
  111. smps[i] = tmp - ws;
  112. else
  113. smps[i] = tmp + ws;
  114. }
  115. else
  116. smps[i] = 0;
  117. }
  118. break;
  119. case 11:
  120. ws = powf(5, ws * ws * 1.0f) - 1.0f; //Clip
  121. for(i = 0; i < n; ++i)
  122. smps[i] = smps[i]
  123. * (ws + 0.5f) * 0.9999f - floor(
  124. 0.5f + smps[i] * (ws + 0.5f) * 0.9999f);
  125. break;
  126. case 12:
  127. ws = ws * ws * ws * 30 + 0.001f; //Asym2
  128. if(ws < 0.3f)
  129. tmpv = ws;
  130. else
  131. tmpv = 1.0f;
  132. for(i = 0; i < n; ++i) {
  133. float tmp = smps[i] * ws;
  134. if((tmp > -2.0f) && (tmp < 1.0f))
  135. smps[i] = tmp * (1.0f - tmp) * (tmp + 2.0f) / tmpv;
  136. else
  137. smps[i] = 0.0f;
  138. }
  139. break;
  140. case 13:
  141. ws = ws * ws * ws * 32.0f + 0.0001f; //Pow2
  142. if(ws < 1.0f)
  143. tmpv = ws * (1 + ws) / 2.0f;
  144. else
  145. tmpv = 1.0f;
  146. for(i = 0; i < n; ++i) {
  147. float tmp = smps[i] * ws;
  148. if((tmp > -1.0f) && (tmp < 1.618034f))
  149. smps[i] = tmp * (1.0f - tmp) / tmpv;
  150. else
  151. if(tmp > 0.0f)
  152. smps[i] = -1.0f;
  153. else
  154. smps[i] = -2.0f;
  155. }
  156. break;
  157. case 14:
  158. ws = powf(ws, 5.0f) * 80.0f + 0.0001f; //sigmoid
  159. if(ws > 10.0f)
  160. tmpv = 0.5f;
  161. else
  162. tmpv = 0.5f - 1.0f / (expf(ws) + 1.0f);
  163. for(i = 0; i < n; ++i) {
  164. float tmp = smps[i] * ws;
  165. if(tmp < -10.0f)
  166. tmp = -10.0f;
  167. else
  168. if(tmp > 10.0f)
  169. tmp = 10.0f;
  170. tmp = 0.5f - 1.0f / (expf(tmp) + 1.0f);
  171. smps[i] = tmp / tmpv;
  172. }
  173. break;
  174. }
  175. }