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.

626 lines
17 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 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 "audio.h"
  17. #include "ch.h"
  18. #include "hal.h"
  19. #include <string.h>
  20. #include "print.h"
  21. #include "keymap.h"
  22. #include "eeconfig.h"
  23. // -----------------------------------------------------------------------------
  24. /**
  25. * Size of the dac_buffer arrays. All must be the same size.
  26. */
  27. #define DAC_BUFFER_SIZE 256U
  28. /**
  29. * Highest value allowed by our 12bit DAC.
  30. */
  31. #ifndef DAC_SAMPLE_MAX
  32. #define DAC_SAMPLE_MAX 4095U
  33. #endif
  34. #define DAC_LOW_QUALITY
  35. /**
  36. * These presets allow you to quickly switch between quality/voice settings for
  37. * the DAC. The sample rate and number of voices roughly has an inverse
  38. * relationship - slightly higher sample rates may be possible.
  39. */
  40. #ifdef DAC_VERY_LOW_QUALITY
  41. #define DAC_SAMPLE_RATE 11025U
  42. #define DAC_VOICES_MAX 8
  43. #endif
  44. #ifdef DAC_LOW_QUALITY
  45. #define DAC_SAMPLE_RATE 22050U
  46. #define DAC_VOICES_MAX 4
  47. #endif
  48. #ifdef DAC_HIGH_QUALITY
  49. #define DAC_SAMPLE_RATE 44100U
  50. #define DAC_VOICES_MAX 2
  51. #endif
  52. #ifdef DAC_VERY_HIGH_QUALITY
  53. #define DAC_SAMPLE_RATE 88200U
  54. #define DAC_VOICES_MAX 1
  55. #endif
  56. /**
  57. * Effective bitrate of the DAC. 44.1khz is the standard for most audio - any
  58. * lower will sacrifice perceptible audio quality. Any higher will limit the
  59. * number of simultaneous voices. In most situations, a tenth (1/10) of the
  60. * sample rate is where notes become unbearable.
  61. */
  62. #ifndef DAC_SAMPLE_RATE
  63. #define DAC_SAMPLE_RATE 44100U
  64. #endif
  65. /**
  66. * The number of voices (in polyphony) that are supported. If too high a value
  67. * is used here, the keyboard will freeze and glitch-out when that many voices
  68. * are being played.
  69. */
  70. #ifndef DAC_VOICES_MAX
  71. #define DAC_VOICES_MAX 2
  72. #endif
  73. /**
  74. * The default value of the DAC when not playing anything. Certain hardware
  75. * setups may require a high (DAC_SAMPLE_MAX) or low (0) value here.
  76. */
  77. #ifndef DAC_OFF_VALUE
  78. #define DAC_OFF_VALUE DAC_SAMPLE_MAX / 2
  79. #endif
  80. int voices = 0;
  81. float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  82. int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  83. bool playing_notes = false;
  84. bool playing_note = false;
  85. float note_frequency = 0;
  86. float note_length = 0;
  87. uint8_t note_tempo = TEMPO_DEFAULT;
  88. float note_timbre = TIMBRE_DEFAULT;
  89. uint32_t note_position = 0;
  90. float (* notes_pointer)[][2];
  91. uint16_t notes_count;
  92. bool notes_repeat;
  93. uint16_t current_note = 0;
  94. #ifdef VIBRATO_ENABLE
  95. float vibrato_counter = 0;
  96. float vibrato_strength = .5;
  97. float vibrato_rate = 0.125;
  98. #endif
  99. float polyphony_rate = 0;
  100. static bool audio_initialized = false;
  101. audio_config_t audio_config;
  102. uint16_t envelope_index = 0;
  103. bool glissando = true;
  104. #ifndef STARTUP_SONG
  105. #define STARTUP_SONG SONG(STARTUP_SOUND)
  106. #endif
  107. float startup_song[][2] = STARTUP_SONG;
  108. static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
  109. // 256 values, max 4095
  110. 0x800,0x832,0x864,0x896,0x8c8,0x8fa,0x92c,0x95e,
  111. 0x98f,0x9c0,0x9f1,0xa22,0xa52,0xa82,0xab1,0xae0,
  112. 0xb0f,0xb3d,0xb6b,0xb98,0xbc5,0xbf1,0xc1c,0xc47,
  113. 0xc71,0xc9a,0xcc3,0xceb,0xd12,0xd39,0xd5f,0xd83,
  114. 0xda7,0xdca,0xded,0xe0e,0xe2e,0xe4e,0xe6c,0xe8a,
  115. 0xea6,0xec1,0xedc,0xef5,0xf0d,0xf24,0xf3a,0xf4f,
  116. 0xf63,0xf76,0xf87,0xf98,0xfa7,0xfb5,0xfc2,0xfcd,
  117. 0xfd8,0xfe1,0xfe9,0xff0,0xff5,0xff9,0xffd,0xffe,
  118. 0xfff,0xffe,0xffd,0xff9,0xff5,0xff0,0xfe9,0xfe1,
  119. 0xfd8,0xfcd,0xfc2,0xfb5,0xfa7,0xf98,0xf87,0xf76,
  120. 0xf63,0xf4f,0xf3a,0xf24,0xf0d,0xef5,0xedc,0xec1,
  121. 0xea6,0xe8a,0xe6c,0xe4e,0xe2e,0xe0e,0xded,0xdca,
  122. 0xda7,0xd83,0xd5f,0xd39,0xd12,0xceb,0xcc3,0xc9a,
  123. 0xc71,0xc47,0xc1c,0xbf1,0xbc5,0xb98,0xb6b,0xb3d,
  124. 0xb0f,0xae0,0xab1,0xa82,0xa52,0xa22,0x9f1,0x9c0,
  125. 0x98f,0x95e,0x92c,0x8fa,0x8c8,0x896,0x864,0x832,
  126. 0x800,0x7cd,0x79b,0x769,0x737,0x705,0x6d3,0x6a1,
  127. 0x670,0x63f,0x60e,0x5dd,0x5ad,0x57d,0x54e,0x51f,
  128. 0x4f0,0x4c2,0x494,0x467,0x43a,0x40e,0x3e3,0x3b8,
  129. 0x38e,0x365,0x33c,0x314,0x2ed,0x2c6,0x2a0,0x27c,
  130. 0x258,0x235,0x212,0x1f1,0x1d1,0x1b1,0x193,0x175,
  131. 0x159,0x13e,0x123,0x10a,0xf2, 0xdb, 0xc5, 0xb0,
  132. 0x9c, 0x89, 0x78, 0x67, 0x58, 0x4a, 0x3d, 0x32,
  133. 0x27, 0x1e, 0x16, 0xf, 0xa, 0x6, 0x2, 0x1,
  134. 0x0, 0x1, 0x2, 0x6, 0xa, 0xf, 0x16, 0x1e,
  135. 0x27, 0x32, 0x3d, 0x4a, 0x58, 0x67, 0x78, 0x89,
  136. 0x9c, 0xb0, 0xc5, 0xdb, 0xf2, 0x10a,0x123,0x13e,
  137. 0x159,0x175,0x193,0x1b1,0x1d1,0x1f1,0x212,0x235,
  138. 0x258,0x27c,0x2a0,0x2c6,0x2ed,0x314,0x33c,0x365,
  139. 0x38e,0x3b8,0x3e3,0x40e,0x43a,0x467,0x494,0x4c2,
  140. 0x4f0,0x51f,0x54e,0x57d,0x5ad,0x5dd,0x60e,0x63f,
  141. 0x670,0x6a1,0x6d3,0x705,0x737,0x769,0x79b,0x7cd
  142. };
  143. static const dacsample_t dac_buffer_triangle[DAC_BUFFER_SIZE] = {
  144. // 256 values, max 4095
  145. 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0x100,
  146. 0x120,0x140,0x160,0x180,0x1a0,0x1c0,0x1e0,0x200,
  147. 0x220,0x240,0x260,0x280,0x2a0,0x2c0,0x2e0,0x300,
  148. 0x320,0x340,0x360,0x380,0x3a0,0x3c0,0x3e0,0x400,
  149. 0x420,0x440,0x460,0x480,0x4a0,0x4c0,0x4e0,0x500,
  150. 0x520,0x540,0x560,0x580,0x5a0,0x5c0,0x5e0,0x600,
  151. 0x620,0x640,0x660,0x680,0x6a0,0x6c0,0x6e0,0x700,
  152. 0x720,0x740,0x760,0x780,0x7a0,0x7c0,0x7e0,0x800,
  153. 0x81f,0x83f,0x85f,0x87f,0x89f,0x8bf,0x8df,0x8ff,
  154. 0x91f,0x93f,0x95f,0x97f,0x99f,0x9bf,0x9df,0x9ff,
  155. 0xa1f,0xa3f,0xa5f,0xa7f,0xa9f,0xabf,0xadf,0xaff,
  156. 0xb1f,0xb3f,0xb5f,0xb7f,0xb9f,0xbbf,0xbdf,0xbff,
  157. 0xc1f,0xc3f,0xc5f,0xc7f,0xc9f,0xcbf,0xcdf,0xcff,
  158. 0xd1f,0xd3f,0xd5f,0xd7f,0xd9f,0xdbf,0xddf,0xdff,
  159. 0xe1f,0xe3f,0xe5f,0xe7f,0xe9f,0xebf,0xedf,0xeff,
  160. 0xf1f,0xf3f,0xf5f,0xf7f,0xf9f,0xfbf,0xfdf,0xfff,
  161. 0xfdf,0xfbf,0xf9f,0xf7f,0xf5f,0xf3f,0xf1f,0xeff,
  162. 0xedf,0xebf,0xe9f,0xe7f,0xe5f,0xe3f,0xe1f,0xdff,
  163. 0xddf,0xdbf,0xd9f,0xd7f,0xd5f,0xd3f,0xd1f,0xcff,
  164. 0xcdf,0xcbf,0xc9f,0xc7f,0xc5f,0xc3f,0xc1f,0xbff,
  165. 0xbdf,0xbbf,0xb9f,0xb7f,0xb5f,0xb3f,0xb1f,0xaff,
  166. 0xadf,0xabf,0xa9f,0xa7f,0xa5f,0xa3f,0xa1f,0x9ff,
  167. 0x9df,0x9bf,0x99f,0x97f,0x95f,0x93f,0x91f,0x8ff,
  168. 0x8df,0x8bf,0x89f,0x87f,0x85f,0x83f,0x81f,0x800,
  169. 0x7e0,0x7c0,0x7a0,0x780,0x760,0x740,0x720,0x700,
  170. 0x6e0,0x6c0,0x6a0,0x680,0x660,0x640,0x620,0x600,
  171. 0x5e0,0x5c0,0x5a0,0x580,0x560,0x540,0x520,0x500,
  172. 0x4e0,0x4c0,0x4a0,0x480,0x460,0x440,0x420,0x400,
  173. 0x3e0,0x3c0,0x3a0,0x380,0x360,0x340,0x320,0x300,
  174. 0x2e0,0x2c0,0x2a0,0x280,0x260,0x240,0x220,0x200,
  175. 0x1e0,0x1c0,0x1a0,0x180,0x160,0x140,0x120,0x100,
  176. 0xe0, 0xc0, 0xa0, 0x80, 0x60, 0x40, 0x20, 0x0
  177. };
  178. static const dacsample_t dac_buffer_square[DAC_BUFFER_SIZE] = {
  179. // First half is max, second half is 0
  180. [0 ... DAC_BUFFER_SIZE/2-1] = DAC_SAMPLE_MAX,
  181. [DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = 0,
  182. };
  183. static dacsample_t dac_buffer_empty[DAC_BUFFER_SIZE] = { DAC_OFF_VALUE };
  184. #include "wavetable.h"
  185. float dac_if[8] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
  186. uint8_t dac_voice = 0;
  187. uint8_t dac_voice_flipped = 0;
  188. uint16_t dac_voice_counter = 0;
  189. float dac_voice_count_flipped = 0;
  190. /**
  191. * Generation of the sample being passed to the callback. Declared weak so users
  192. * can override it with their own waveforms/noises.
  193. */
  194. __attribute__ ((weak))
  195. uint16_t generate_sample(void) {
  196. uint16_t sample = DAC_OFF_VALUE;
  197. uint8_t working_voices = voices;
  198. if (working_voices > DAC_VOICES_MAX)
  199. working_voices = DAC_VOICES_MAX;
  200. if (working_voices > 0) {
  201. uint16_t sample_sum = 0;
  202. for (uint8_t i = 0; i < working_voices; i++) {
  203. dac_if[i] = dac_if[i] + ((frequencies[i]*DAC_BUFFER_SIZE)/DAC_SAMPLE_RATE);
  204. // Needed because % doesn't work with floats
  205. // 0.5 less than the size because we use round() later
  206. while (dac_if[i] >= (DAC_BUFFER_SIZE))
  207. dac_if[i] = dac_if[i] - DAC_BUFFER_SIZE;
  208. (void)dac_buffer;
  209. (void)dac_buffer_square;
  210. (void)dac_buffer_triangle;
  211. #define DAC_MORPH_SPEED 3000
  212. #define DAC_SAMPLE_CUSTOM_LENGTH 64
  213. #define DAC_MORPH_SPEED_COMPUTED (DAC_SAMPLE_RATE / DAC_SAMPLE_CUSTOM_LENGTH * DAC_MORPH_SPEED / 1000)
  214. uint16_t dac_i = (uint16_t)dac_if[i];
  215. // Wavetable generation/lookup
  216. // SINE
  217. // sample_sum += dac_buffer[dac_i] / working_voices / 3;
  218. // TRIANGLE
  219. // sample_sum += dac_buffer_triangle[dac_i] / working_voices / 3;
  220. // RISING TRIANGLE
  221. // sample_sum += (uint16_t)round((dac_if[i] * DAC_SAMPLE_MAX) / DAC_BUFFER_SIZE / working_voices );
  222. // SQUARE
  223. // sample_sum += ((dac_if[i] > (DAC_BUFFER_SIZE / 2)) ? DAC_SAMPLE_MAX / working_voices: 0);
  224. // sample_sum += dac_buffer_square[dac_i] / working_voices / 3;
  225. // sample_sum += dac_buffer_custom[dac_voice_flipped][dac_i] / working_voices / 2 * ((dac_voice >= 63) ? 6400 - dac_voice_counter : dac_voice_counter) / 6400;
  226. // sample_sum += dac_buffer_custom[dac_voice_flipped + 1][dac_i] / working_voices / 2 * ((dac_voice >= 63) ? dac_voice_counter : 6400 - dac_voice_counter) / 6400;
  227. sample_sum += dac_buffer_custom[dac_voice][dac_i] / working_voices / 2 * (DAC_MORPH_SPEED_COMPUTED - dac_voice_counter) / DAC_MORPH_SPEED_COMPUTED;
  228. sample_sum += dac_buffer_custom[dac_voice + 1][dac_i] / working_voices / 2 * dac_voice_counter / DAC_MORPH_SPEED_COMPUTED;
  229. }
  230. sample = sample_sum;
  231. dac_voice_counter++;
  232. if (dac_voice_counter >= DAC_MORPH_SPEED_COMPUTED) {
  233. dac_voice_counter = 0;
  234. // dac_voice = (dac_voice + 1) % 125;
  235. // dac_voice_flipped = ((dac_voice >= 63) ? (125 - dac_voice) : dac_voice);
  236. dac_voice = (dac_voice + 1) % (DAC_SAMPLE_CUSTOM_LENGTH - 1);
  237. }
  238. }
  239. return sample;
  240. }
  241. /**
  242. * DAC streaming callback. Does all of the main computing for playing songs.
  243. */
  244. static void dac_end(DACDriver * dacp, dacsample_t * sample_p, size_t sample_count) {
  245. (void)dacp;
  246. for (uint8_t s = 0; s < sample_count; s++) {
  247. sample_p[s] = generate_sample();
  248. }
  249. if (playing_notes) {
  250. note_position += sample_count;
  251. // End of the note - 35 is arbitary here, but gets us close to AVR's timing
  252. if ((note_position >= (note_length*DAC_SAMPLE_RATE/35))) {
  253. stop_note((*notes_pointer)[current_note][0]);
  254. current_note++;
  255. if (current_note >= notes_count) {
  256. if (notes_repeat) {
  257. current_note = 0;
  258. } else {
  259. playing_notes = false;
  260. return;
  261. }
  262. }
  263. play_note((*notes_pointer)[current_note][0], 15);
  264. envelope_index = 0;
  265. note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
  266. // Skip forward in the next note's length if we've over shot the last, so
  267. // the overall length of the song is the same
  268. note_position = note_position - (note_length*DAC_SAMPLE_RATE/35);
  269. }
  270. }
  271. }
  272. static void dac_error(DACDriver *dacp, dacerror_t err) {
  273. (void)dacp;
  274. (void)err;
  275. chSysHalt("DAC failure. halp");
  276. }
  277. static const GPTConfig gpt6cfg1 = {
  278. .frequency = DAC_SAMPLE_RATE * 3,
  279. .callback = NULL,
  280. .cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
  281. .dier = 0U
  282. };
  283. static const DACConfig dac_conf = {
  284. .init = DAC_SAMPLE_MAX,
  285. .datamode = DAC_DHRM_12BIT_RIGHT
  286. };
  287. /**
  288. * @note The DAC_TRG(0) here selects the Timer 6 TRGO event, which is triggered
  289. * on the rising edge after 3 APB1 clock cycles, causing our gpt6cfg1.frequency
  290. * to be a third of what we expect.
  291. *
  292. * Here are all the values for DAC_TRG (TSEL in the ref manual)
  293. * TIM15_TRGO 0b011
  294. * TIM2_TRGO 0b100
  295. * TIM3_TRGO 0b001
  296. * TIM6_TRGO 0b000
  297. * TIM7_TRGO 0b010
  298. * EXTI9 0b110
  299. * SWTRIG 0b111
  300. */
  301. static const DACConversionGroup dac_conv_cfg = {
  302. .num_channels = 1U,
  303. .end_cb = dac_end,
  304. .error_cb = dac_error,
  305. .trigger = DAC_TRG(0b000)
  306. };
  307. void audio_init() {
  308. if (audio_initialized) {
  309. return;
  310. }
  311. // Check EEPROM
  312. #if defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE)
  313. if (!eeconfig_is_enabled()) {
  314. eeconfig_init();
  315. }
  316. audio_config.raw = eeconfig_read_audio();
  317. #else // ARM EEPROM
  318. audio_config.enable = true;
  319. #ifdef AUDIO_CLICKY_ON
  320. audio_config.clicky_enable = true;
  321. #endif
  322. #endif // ARM EEPROM
  323. #if defined(A4_AUDIO)
  324. palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG );
  325. dacStart(&DACD1, &dac_conf);
  326. dacStartConversion(&DACD1, &dac_conv_cfg, dac_buffer_empty, DAC_BUFFER_SIZE);
  327. #endif
  328. #if defined(A5_AUDIO)
  329. palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG );
  330. dacStart(&DACD2, &dac_conf);
  331. dacStartConversion(&DACD2, &dac_conv_cfg, dac_buffer_empty, DAC_BUFFER_SIZE);
  332. #endif
  333. gptStart(&GPTD6, &gpt6cfg1);
  334. gptStartContinuous(&GPTD6, 2U);
  335. audio_initialized = true;
  336. if (audio_config.enable) {
  337. PLAY_SONG(startup_song);
  338. } else {
  339. stop_all_notes();
  340. }
  341. }
  342. void stop_all_notes() {
  343. dprintf("audio stop all notes");
  344. if (!audio_initialized) {
  345. audio_init();
  346. }
  347. voices = 0;
  348. playing_notes = false;
  349. playing_note = false;
  350. for (uint8_t i = 0; i < 8; i++)
  351. {
  352. frequencies[i] = 0;
  353. volumes[i] = 0;
  354. }
  355. }
  356. void stop_note(float freq) {
  357. dprintf("audio stop note freq=%d", (int)freq);
  358. if (playing_note) {
  359. if (!audio_initialized) {
  360. audio_init();
  361. }
  362. for (int i = 7; i >= 0; i--) {
  363. if (frequencies[i] == freq) {
  364. frequencies[i] = 0;
  365. volumes[i] = 0;
  366. for (int j = i; (j < 7); j++) {
  367. frequencies[j] = frequencies[j+1];
  368. frequencies[j+1] = 0;
  369. volumes[j] = volumes[j+1];
  370. volumes[j+1] = 0;
  371. }
  372. break;
  373. }
  374. }
  375. voices--;
  376. if (voices < 0) {
  377. voices = 0;
  378. }
  379. if (voices == 0) {
  380. playing_note = false;
  381. }
  382. }
  383. }
  384. #ifdef VIBRATO_ENABLE
  385. float mod(float a, int b) {
  386. float r = fmod(a, b);
  387. return r < 0 ? r + b : r;
  388. }
  389. float vibrato(float average_freq) {
  390. #ifdef VIBRATO_STRENGTH_ENABLE
  391. float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
  392. #else
  393. float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
  394. #endif
  395. vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
  396. return vibrated_freq;
  397. }
  398. #endif
  399. void play_note(float freq, int vol) {
  400. dprintf("audio play note freq=%d vol=%d", (int)freq, vol);
  401. if (!audio_initialized) {
  402. audio_init();
  403. }
  404. if (audio_config.enable && voices < 8) {
  405. // Cancel notes if notes are playing
  406. // if (playing_notes) {
  407. // stop_all_notes();
  408. // }
  409. playing_note = true;
  410. if (freq > 0) {
  411. envelope_index = 0;
  412. frequencies[voices] = freq;
  413. dac_if[voices] = 0.0f;
  414. volumes[voices] = vol;
  415. voices++;
  416. }
  417. }
  418. }
  419. void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) {
  420. if (!audio_initialized) {
  421. audio_init();
  422. }
  423. if (audio_config.enable) {
  424. playing_notes = true;
  425. notes_pointer = np;
  426. notes_count = n_count;
  427. notes_repeat = n_repeat;
  428. current_note = 0;
  429. note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
  430. note_position = 0;
  431. play_note((*notes_pointer)[current_note][0], 15);
  432. }
  433. }
  434. bool is_playing_notes(void) {
  435. return playing_notes;
  436. }
  437. bool is_audio_on(void) {
  438. return (audio_config.enable != 0);
  439. }
  440. void audio_toggle(void) {
  441. audio_config.enable ^= 1;
  442. eeconfig_update_audio(audio_config.raw);
  443. if (audio_config.enable) {
  444. audio_on_user();
  445. }
  446. }
  447. void audio_on(void) {
  448. audio_config.enable = 1;
  449. eeconfig_update_audio(audio_config.raw);
  450. audio_on_user();
  451. }
  452. void audio_off(void) {
  453. stop_all_notes();
  454. audio_config.enable = 0;
  455. eeconfig_update_audio(audio_config.raw);
  456. }
  457. #ifdef VIBRATO_ENABLE
  458. // Vibrato rate functions
  459. void set_vibrato_rate(float rate) {
  460. vibrato_rate = rate;
  461. }
  462. void increase_vibrato_rate(float change) {
  463. vibrato_rate *= change;
  464. }
  465. void decrease_vibrato_rate(float change) {
  466. vibrato_rate /= change;
  467. }
  468. #ifdef VIBRATO_STRENGTH_ENABLE
  469. void set_vibrato_strength(float strength) {
  470. vibrato_strength = strength;
  471. }
  472. void increase_vibrato_strength(float change) {
  473. vibrato_strength *= change;
  474. }
  475. void decrease_vibrato_strength(float change) {
  476. vibrato_strength /= change;
  477. }
  478. #endif /* VIBRATO_STRENGTH_ENABLE */
  479. #endif /* VIBRATO_ENABLE */
  480. // Polyphony functions
  481. void set_polyphony_rate(float rate) {
  482. polyphony_rate = rate;
  483. }
  484. void enable_polyphony() {
  485. polyphony_rate = 5;
  486. }
  487. void disable_polyphony() {
  488. polyphony_rate = 0;
  489. }
  490. void increase_polyphony_rate(float change) {
  491. polyphony_rate *= change;
  492. }
  493. void decrease_polyphony_rate(float change) {
  494. polyphony_rate /= change;
  495. }
  496. // Timbre function
  497. void set_timbre(float timbre) {
  498. note_timbre = timbre;
  499. }
  500. // Tempo functions
  501. void set_tempo(uint8_t tempo) {
  502. note_tempo = tempo;
  503. }
  504. void decrease_tempo(uint8_t tempo_change) {
  505. note_tempo += tempo_change;
  506. }
  507. void increase_tempo(uint8_t tempo_change) {
  508. if (note_tempo - tempo_change < 10) {
  509. note_tempo = 10;
  510. } else {
  511. note_tempo -= tempo_change;
  512. }
  513. }