voices.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. voice_type voice = default_voice;
  9. void set_voice(voice_type v) {
  10. voice = v;
  11. }
  12. void voice_iterate() {
  13. voice = (voice + 1) % number_of_voices;
  14. }
  15. void voice_deiterate() {
  16. voice = (voice - 1 + number_of_voices) % number_of_voices;
  17. }
  18. float voice_envelope(float frequency) {
  19. // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
  20. uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
  21. switch (voice) {
  22. case default_voice:
  23. note_timbre = TIMBRE_50;
  24. polyphony_rate = 0;
  25. break;
  26. case something:
  27. polyphony_rate = 0;
  28. switch (compensated_index) {
  29. case 0 ... 9:
  30. note_timbre = TIMBRE_12;
  31. break;
  32. case 10 ... 19:
  33. note_timbre = TIMBRE_25;
  34. break;
  35. case 20 ... 200:
  36. note_timbre = .25 + .125 + pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
  37. break;
  38. default:
  39. note_timbre = .25;
  40. break;
  41. }
  42. break;
  43. case butts_fader:
  44. polyphony_rate = 0;
  45. switch (compensated_index) {
  46. case 0 ... 9:
  47. frequency = frequency / 4;
  48. note_timbre = TIMBRE_12;
  49. break;
  50. case 10 ... 19:
  51. frequency = frequency / 2;
  52. note_timbre = TIMBRE_12;
  53. break;
  54. case 20 ... 200:
  55. note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
  56. break;
  57. default:
  58. note_timbre = 0;
  59. break;
  60. }
  61. break;
  62. // case octave_crunch:
  63. // polyphony_rate = 0;
  64. // switch (compensated_index) {
  65. // case 0 ... 9:
  66. // case 20 ... 24:
  67. // case 30 ... 32:
  68. // frequency = frequency / 2;
  69. // note_timbre = TIMBRE_12;
  70. // break;
  71. // case 10 ... 19:
  72. // case 25 ... 29:
  73. // case 33 ... 35:
  74. // frequency = frequency * 2;
  75. // note_timbre = TIMBRE_12;
  76. // break;
  77. // default:
  78. // note_timbre = TIMBRE_12;
  79. // break;
  80. // }
  81. // break;
  82. case duty_osc:
  83. // This slows the loop down a substantial amount, so higher notes may freeze
  84. polyphony_rate = 0;
  85. switch (compensated_index) {
  86. default:
  87. #define OCS_SPEED 10
  88. #define OCS_AMP .25
  89. // sine wave is slow
  90. // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
  91. // triangle wave is a bit faster
  92. note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
  93. break;
  94. }
  95. break;
  96. case duty_octave_down:
  97. polyphony_rate = 0;
  98. note_timbre = (envelope_index % 2) * .125 + .375 * 2;
  99. if ((envelope_index % 4) == 0)
  100. note_timbre = 0.5;
  101. if ((envelope_index % 8) == 0)
  102. note_timbre = 0;
  103. break;
  104. case delayed_vibrato:
  105. polyphony_rate = 0;
  106. note_timbre = TIMBRE_50;
  107. #define VOICE_VIBRATO_DELAY 150
  108. #define VOICE_VIBRATO_SPEED 50
  109. switch (compensated_index) {
  110. case 0 ... VOICE_VIBRATO_DELAY:
  111. break;
  112. default:
  113. frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
  114. break;
  115. }
  116. break;
  117. // case delayed_vibrato_octave:
  118. // polyphony_rate = 0;
  119. // if ((envelope_index % 2) == 1) {
  120. // note_timbre = 0.55;
  121. // } else {
  122. // note_timbre = 0.45;
  123. // }
  124. // #define VOICE_VIBRATO_DELAY 150
  125. // #define VOICE_VIBRATO_SPEED 50
  126. // switch (compensated_index) {
  127. // case 0 ... VOICE_VIBRATO_DELAY:
  128. // break;
  129. // default:
  130. // frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
  131. // break;
  132. // }
  133. // break;
  134. // case duty_fifth_down:
  135. // note_timbre = 0.5;
  136. // if ((envelope_index % 3) == 0)
  137. // note_timbre = 0.75;
  138. // break;
  139. // case duty_fourth_down:
  140. // note_timbre = 0.0;
  141. // if ((envelope_index % 12) == 0)
  142. // note_timbre = 0.75;
  143. // if (((envelope_index % 12) % 4) != 1)
  144. // note_timbre = 0.75;
  145. // break;
  146. // case duty_third_down:
  147. // note_timbre = 0.5;
  148. // if ((envelope_index % 5) == 0)
  149. // note_timbre = 0.75;
  150. // break;
  151. // case duty_fifth_third_down:
  152. // note_timbre = 0.5;
  153. // if ((envelope_index % 5) == 0)
  154. // note_timbre = 0.75;
  155. // if ((envelope_index % 3) == 0)
  156. // note_timbre = 0.25;
  157. // break;
  158. default:
  159. break;
  160. }
  161. return frequency;
  162. }