upload
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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

voices.c 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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;
  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 butts_fader:
  27. polyphony_rate = 0;
  28. switch (compensated_index) {
  29. case 0 ... 9:
  30. frequency = frequency / 4;
  31. note_timbre = TIMBRE_12;
  32. break;
  33. case 10 ... 19:
  34. frequency = frequency / 2;
  35. note_timbre = TIMBRE_12;
  36. break;
  37. case 20 ... 200:
  38. note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
  39. break;
  40. default:
  41. note_timbre = 0;
  42. break;
  43. }
  44. break;
  45. // case octave_crunch:
  46. // polyphony_rate = 0;
  47. // switch (compensated_index) {
  48. // case 0 ... 9:
  49. // case 20 ... 24:
  50. // case 30 ... 32:
  51. // frequency = frequency / 2;
  52. // note_timbre = TIMBRE_12;
  53. // break;
  54. // case 10 ... 19:
  55. // case 25 ... 29:
  56. // case 33 ... 35:
  57. // frequency = frequency * 2;
  58. // note_timbre = TIMBRE_12;
  59. // break;
  60. // default:
  61. // note_timbre = TIMBRE_12;
  62. // break;
  63. // }
  64. // break;
  65. case duty_osc:
  66. // This slows the loop down a substantial amount, so higher notes may freeze
  67. polyphony_rate = 0;
  68. switch (compensated_index) {
  69. default:
  70. #define OCS_SPEED 10
  71. #define OCS_AMP .25
  72. // sine wave is slow
  73. // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
  74. // triangle wave is a bit faster
  75. note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
  76. break;
  77. }
  78. break;
  79. case duty_octave_down:
  80. polyphony_rate = 0;
  81. note_timbre = (envelope_index % 2) * .125 + .375 * 2;
  82. if ((envelope_index % 4) == 0)
  83. note_timbre = 0.5;
  84. if ((envelope_index % 8) == 0)
  85. note_timbre = 0;
  86. break;
  87. case delayed_vibrato:
  88. polyphony_rate = 0;
  89. note_timbre = TIMBRE_50;
  90. #define VOICE_VIBRATO_DELAY 150
  91. #define VOICE_VIBRATO_SPEED 50
  92. switch (compensated_index) {
  93. case 0 ... VOICE_VIBRATO_DELAY:
  94. break;
  95. default:
  96. frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
  97. break;
  98. }
  99. break;
  100. // case delayed_vibrato_octave:
  101. // polyphony_rate = 0;
  102. // if ((envelope_index % 2) == 1) {
  103. // note_timbre = 0.55;
  104. // } else {
  105. // note_timbre = 0.45;
  106. // }
  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 duty_fifth_down:
  118. // note_timbre = 0.5;
  119. // if ((envelope_index % 3) == 0)
  120. // note_timbre = 0.75;
  121. // break;
  122. // case duty_fourth_down:
  123. // note_timbre = 0.0;
  124. // if ((envelope_index % 12) == 0)
  125. // note_timbre = 0.75;
  126. // if (((envelope_index % 12) % 4) != 1)
  127. // note_timbre = 0.75;
  128. // break;
  129. // case duty_third_down:
  130. // note_timbre = 0.5;
  131. // if ((envelope_index % 5) == 0)
  132. // note_timbre = 0.75;
  133. // break;
  134. // case duty_fifth_third_down:
  135. // note_timbre = 0.5;
  136. // if ((envelope_index % 5) == 0)
  137. // note_timbre = 0.75;
  138. // if ((envelope_index % 3) == 0)
  139. // note_timbre = 0.25;
  140. // break;
  141. default:
  142. break;
  143. }
  144. return frequency;
  145. }