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.

296 lines
9.5 KiB

7 years ago
  1. /* Copyright 2016 Jack Humbert
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "voices.h"
  17. #include "audio.h"
  18. #include "stdlib.h"
  19. // these are imported from audio.c
  20. extern uint16_t envelope_index;
  21. extern float note_timbre;
  22. extern float polyphony_rate;
  23. extern bool glissando;
  24. voice_type voice = default_voice;
  25. void set_voice(voice_type v) {
  26. voice = v;
  27. }
  28. void voice_iterate() {
  29. voice = (voice + 1) % number_of_voices;
  30. }
  31. void voice_deiterate() {
  32. voice = (voice - 1 + number_of_voices) % number_of_voices;
  33. }
  34. float voice_envelope(float frequency) {
  35. // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
  36. __attribute__ ((unused))
  37. uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
  38. switch (voice) {
  39. case default_voice:
  40. glissando = false;
  41. note_timbre = TIMBRE_50;
  42. polyphony_rate = 0;
  43. break;
  44. #ifdef AUDIO_VOICES
  45. case something:
  46. glissando = false;
  47. polyphony_rate = 0;
  48. switch (compensated_index) {
  49. case 0 ... 9:
  50. note_timbre = TIMBRE_12;
  51. break;
  52. case 10 ... 19:
  53. note_timbre = TIMBRE_25;
  54. break;
  55. case 20 ... 200:
  56. note_timbre = .125 + .125;
  57. break;
  58. default:
  59. note_timbre = .125;
  60. break;
  61. }
  62. break;
  63. case drums:
  64. glissando = false;
  65. polyphony_rate = 0;
  66. // switch (compensated_index) {
  67. // case 0 ... 10:
  68. // note_timbre = 0.5;
  69. // break;
  70. // case 11 ... 20:
  71. // note_timbre = 0.5 * (21 - compensated_index) / 10;
  72. // break;
  73. // default:
  74. // note_timbre = 0;
  75. // break;
  76. // }
  77. // frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8);
  78. if (frequency < 80.0) {
  79. } else if (frequency < 160.0) {
  80. // Bass drum: 60 - 100 Hz
  81. frequency = (rand() % (int)(40)) + 60;
  82. switch (envelope_index) {
  83. case 0 ... 10:
  84. note_timbre = 0.5;
  85. break;
  86. case 11 ... 20:
  87. note_timbre = 0.5 * (21 - envelope_index) / 10;
  88. break;
  89. default:
  90. note_timbre = 0;
  91. break;
  92. }
  93. } else if (frequency < 320.0) {
  94. // Snare drum: 1 - 2 KHz
  95. frequency = (rand() % (int)(1000)) + 1000;
  96. switch (envelope_index) {
  97. case 0 ... 5:
  98. note_timbre = 0.5;
  99. break;
  100. case 6 ... 20:
  101. note_timbre = 0.5 * (21 - envelope_index) / 15;
  102. break;
  103. default:
  104. note_timbre = 0;
  105. break;
  106. }
  107. } else if (frequency < 640.0) {
  108. // Closed Hi-hat: 3 - 5 KHz
  109. frequency = (rand() % (int)(2000)) + 3000;
  110. switch (envelope_index) {
  111. case 0 ... 15:
  112. note_timbre = 0.5;
  113. break;
  114. case 16 ... 20:
  115. note_timbre = 0.5 * (21 - envelope_index) / 5;
  116. break;
  117. default:
  118. note_timbre = 0;
  119. break;
  120. }
  121. } else if (frequency < 1280.0) {
  122. // Open Hi-hat: 3 - 5 KHz
  123. frequency = (rand() % (int)(2000)) + 3000;
  124. switch (envelope_index) {
  125. case 0 ... 35:
  126. note_timbre = 0.5;
  127. break;
  128. case 36 ... 50:
  129. note_timbre = 0.5 * (51 - envelope_index) / 15;
  130. break;
  131. default:
  132. note_timbre = 0;
  133. break;
  134. }
  135. }
  136. break;
  137. case butts_fader:
  138. glissando = true;
  139. polyphony_rate = 0;
  140. switch (compensated_index) {
  141. case 0 ... 9:
  142. frequency = frequency / 4;
  143. note_timbre = TIMBRE_12;
  144. break;
  145. case 10 ... 19:
  146. frequency = frequency / 2;
  147. note_timbre = TIMBRE_12;
  148. break;
  149. case 20 ... 200:
  150. note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
  151. break;
  152. default:
  153. note_timbre = 0;
  154. break;
  155. }
  156. break;
  157. // case octave_crunch:
  158. // polyphony_rate = 0;
  159. // switch (compensated_index) {
  160. // case 0 ... 9:
  161. // case 20 ... 24:
  162. // case 30 ... 32:
  163. // frequency = frequency / 2;
  164. // note_timbre = TIMBRE_12;
  165. // break;
  166. // case 10 ... 19:
  167. // case 25 ... 29:
  168. // case 33 ... 35:
  169. // frequency = frequency * 2;
  170. // note_timbre = TIMBRE_12;
  171. // break;
  172. // default:
  173. // note_timbre = TIMBRE_12;
  174. // break;
  175. // }
  176. // break;
  177. case duty_osc:
  178. // This slows the loop down a substantial amount, so higher notes may freeze
  179. glissando = true;
  180. polyphony_rate = 0;
  181. switch (compensated_index) {
  182. default:
  183. #define OCS_SPEED 10
  184. #define OCS_AMP .25
  185. // sine wave is slow
  186. // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
  187. // triangle wave is a bit faster
  188. note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
  189. break;
  190. }
  191. break;
  192. case duty_octave_down:
  193. glissando = true;
  194. polyphony_rate = 0;
  195. note_timbre = (envelope_index % 2) * .125 + .375 * 2;
  196. if ((envelope_index % 4) == 0)
  197. note_timbre = 0.5;
  198. if ((envelope_index % 8) == 0)
  199. note_timbre = 0;
  200. break;
  201. case delayed_vibrato:
  202. glissando = true;
  203. polyphony_rate = 0;
  204. note_timbre = TIMBRE_50;
  205. #define VOICE_VIBRATO_DELAY 150
  206. #define VOICE_VIBRATO_SPEED 50
  207. switch (compensated_index) {
  208. case 0 ... VOICE_VIBRATO_DELAY:
  209. break;
  210. default:
  211. frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
  212. break;
  213. }
  214. break;
  215. // case delayed_vibrato_octave:
  216. // polyphony_rate = 0;
  217. // if ((envelope_index % 2) == 1) {
  218. // note_timbre = 0.55;
  219. // } else {
  220. // note_timbre = 0.45;
  221. // }
  222. // #define VOICE_VIBRATO_DELAY 150
  223. // #define VOICE_VIBRATO_SPEED 50
  224. // switch (compensated_index) {
  225. // case 0 ... VOICE_VIBRATO_DELAY:
  226. // break;
  227. // default:
  228. // frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
  229. // break;
  230. // }
  231. // break;
  232. // case duty_fifth_down:
  233. // note_timbre = 0.5;
  234. // if ((envelope_index % 3) == 0)
  235. // note_timbre = 0.75;
  236. // break;
  237. // case duty_fourth_down:
  238. // note_timbre = 0.0;
  239. // if ((envelope_index % 12) == 0)
  240. // note_timbre = 0.75;
  241. // if (((envelope_index % 12) % 4) != 1)
  242. // note_timbre = 0.75;
  243. // break;
  244. // case duty_third_down:
  245. // note_timbre = 0.5;
  246. // if ((envelope_index % 5) == 0)
  247. // note_timbre = 0.75;
  248. // break;
  249. // case duty_fifth_third_down:
  250. // note_timbre = 0.5;
  251. // if ((envelope_index % 5) == 0)
  252. // note_timbre = 0.75;
  253. // if ((envelope_index % 3) == 0)
  254. // note_timbre = 0.25;
  255. // break;
  256. #endif
  257. default:
  258. break;
  259. }
  260. return frequency;
  261. }