voices.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #include "voices.h"
  2. #include "audio.h"
  3. #include "stdlib.h"
  4. // these are imported from audio.c
  5. extern uint16_t envelope_index;
  6. extern float note_timbre;
  7. extern float polyphony_rate;
  8. extern bool glissando;
  9. voice_type voice = default_voice;
  10. void set_voice(voice_type v) {
  11. voice = v;
  12. }
  13. void voice_iterate() {
  14. voice = (voice + 1) % number_of_voices;
  15. }
  16. void voice_deiterate() {
  17. voice = (voice - 1 + number_of_voices) % number_of_voices;
  18. }
  19. float voice_envelope(float frequency) {
  20. // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
  21. uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
  22. switch (voice) {
  23. case default_voice:
  24. glissando = true;
  25. note_timbre = TIMBRE_50;
  26. polyphony_rate = 0;
  27. break;
  28. case something:
  29. glissando = false;
  30. polyphony_rate = 0;
  31. switch (compensated_index) {
  32. case 0 ... 9:
  33. note_timbre = TIMBRE_12;
  34. break;
  35. case 10 ... 19:
  36. note_timbre = TIMBRE_25;
  37. break;
  38. case 20 ... 200:
  39. note_timbre = .125 + .125;
  40. break;
  41. default:
  42. note_timbre = .125;
  43. break;
  44. }
  45. break;
  46. case drums:
  47. glissando = false;
  48. polyphony_rate = 0;
  49. note_timbre = 0;
  50. switch (envelope_index) {
  51. case 0 ... 20:
  52. note_timbre = 0.5;
  53. default:
  54. frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8);
  55. break;
  56. }
  57. // if (frequency < 80.0) {
  58. // switch (envelope_index % 4) {
  59. // case 0:
  60. // frequency = 348.0;
  61. // case 1:
  62. // frequency = 53.0;
  63. // case 2:
  64. // frequency = 128.0;
  65. // case 3:
  66. // frequency = 934.0;
  67. // default:
  68. // break;
  69. // }
  70. // } else if (frequency < 160.0) {
  71. // } else if (frequency < 320.0) {
  72. // } else if (frequency < 640.0) {
  73. // } else if (frequency < 1280.0) {
  74. // }
  75. break;
  76. case butts_fader:
  77. glissando = true;
  78. polyphony_rate = 0;
  79. switch (compensated_index) {
  80. case 0 ... 9:
  81. frequency = frequency / 4;
  82. note_timbre = TIMBRE_12;
  83. break;
  84. case 10 ... 19:
  85. frequency = frequency / 2;
  86. note_timbre = TIMBRE_12;
  87. break;
  88. case 20 ... 200:
  89. note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
  90. break;
  91. default:
  92. note_timbre = 0;
  93. break;
  94. }
  95. break;
  96. // case octave_crunch:
  97. // polyphony_rate = 0;
  98. // switch (compensated_index) {
  99. // case 0 ... 9:
  100. // case 20 ... 24:
  101. // case 30 ... 32:
  102. // frequency = frequency / 2;
  103. // note_timbre = TIMBRE_12;
  104. // break;
  105. // case 10 ... 19:
  106. // case 25 ... 29:
  107. // case 33 ... 35:
  108. // frequency = frequency * 2;
  109. // note_timbre = TIMBRE_12;
  110. // break;
  111. // default:
  112. // note_timbre = TIMBRE_12;
  113. // break;
  114. // }
  115. // break;
  116. case duty_osc:
  117. // This slows the loop down a substantial amount, so higher notes may freeze
  118. glissando = true;
  119. polyphony_rate = 0;
  120. switch (compensated_index) {
  121. default:
  122. #define OCS_SPEED 10
  123. #define OCS_AMP .25
  124. // sine wave is slow
  125. // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
  126. // triangle wave is a bit faster
  127. note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
  128. break;
  129. }
  130. break;
  131. case duty_octave_down:
  132. glissando = true;
  133. polyphony_rate = 0;
  134. note_timbre = (envelope_index % 2) * .125 + .375 * 2;
  135. if ((envelope_index % 4) == 0)
  136. note_timbre = 0.5;
  137. if ((envelope_index % 8) == 0)
  138. note_timbre = 0;
  139. break;
  140. case delayed_vibrato:
  141. glissando = true;
  142. polyphony_rate = 0;
  143. note_timbre = TIMBRE_50;
  144. #define VOICE_VIBRATO_DELAY 150
  145. #define VOICE_VIBRATO_SPEED 50
  146. switch (compensated_index) {
  147. case 0 ... VOICE_VIBRATO_DELAY:
  148. break;
  149. default:
  150. frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
  151. break;
  152. }
  153. break;
  154. // case delayed_vibrato_octave:
  155. // polyphony_rate = 0;
  156. // if ((envelope_index % 2) == 1) {
  157. // note_timbre = 0.55;
  158. // } else {
  159. // note_timbre = 0.45;
  160. // }
  161. // #define VOICE_VIBRATO_DELAY 150
  162. // #define VOICE_VIBRATO_SPEED 50
  163. // switch (compensated_index) {
  164. // case 0 ... VOICE_VIBRATO_DELAY:
  165. // break;
  166. // default:
  167. // frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
  168. // break;
  169. // }
  170. // break;
  171. // case duty_fifth_down:
  172. // note_timbre = 0.5;
  173. // if ((envelope_index % 3) == 0)
  174. // note_timbre = 0.75;
  175. // break;
  176. // case duty_fourth_down:
  177. // note_timbre = 0.0;
  178. // if ((envelope_index % 12) == 0)
  179. // note_timbre = 0.75;
  180. // if (((envelope_index % 12) % 4) != 1)
  181. // note_timbre = 0.75;
  182. // break;
  183. // case duty_third_down:
  184. // note_timbre = 0.5;
  185. // if ((envelope_index % 5) == 0)
  186. // note_timbre = 0.75;
  187. // break;
  188. // case duty_fifth_third_down:
  189. // note_timbre = 0.5;
  190. // if ((envelope_index % 5) == 0)
  191. // note_timbre = 0.75;
  192. // if ((envelope_index % 3) == 0)
  193. // note_timbre = 0.25;
  194. // break;
  195. default:
  196. break;
  197. }
  198. return frequency;
  199. }