freqs.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. #include "freqs.h"
  2. const uint32_t frequency_table[FREQ_TAB_SIZE] =
  3. {
  4. (uint32_t)(2093.00 * 1024), // 7th octave, the highest in this tracker
  5. (uint32_t)(2217.46 * 1024), // frequency precision is 1 / 1024th of Hz
  6. (uint32_t)(2349.32 * 1024),
  7. (uint32_t)(2489.02 * 1024),
  8. (uint32_t)(2637.02 * 1024),
  9. (uint32_t)(2793.83 * 1024),
  10. (uint32_t)(2959.96 * 1024),
  11. (uint32_t)(3135.96 * 1024),
  12. (uint32_t)(3322.44 * 1024),
  13. (uint32_t)(3520.00 * 1024),
  14. (uint32_t)(3729.31 * 1024),
  15. (uint32_t)(3951.07 * 1024),
  16. };
  17. uint32_t get_freq(uint16_t note)
  18. {
  19. if (note >= ((FREQ_TAB_SIZE * 8) << 8))
  20. {
  21. return frequency_table[FREQ_TAB_SIZE - 1];
  22. }
  23. if ((note & 0xff) == 0)
  24. {
  25. return frequency_table[((note >> 8) % 12)] / (2 << (((NUM_OCTAVES) - ((note >> 8) / 12)) - 2)); // wrap to one octave
  26. }
  27. else
  28. {
  29. uint64_t f1 = frequency_table[((note >> 8) % 12)] / (uint64_t)(2 << (((NUM_OCTAVES) - ((note >> 8) / 12)) - 2));
  30. uint64_t f2 = frequency_table[(((note >> 8) + 1) % 12)] / (uint64_t)(2 << (((NUM_OCTAVES) - (((note >> 8) + 1) / 12)) - 2));
  31. return (uint64_t)f1 + (uint64_t)((f2 - f1) * (uint64_t)(note & 0xff)) / (uint64_t)256;
  32. }
  33. }