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.

81 lines
3.1KB

  1. /*
  2. C C# D Eb E F F# G G# A Bb B
  3. 0 16.35 17.32 18.35 19.45 20.60 21.83 23.12 24.50 25.96 27.50 29.14 30.87
  4. 1 32.70 34.65 36.71 38.89 41.20 43.65 46.25 49.00 51.91 55.00 58.27 61.74
  5. 2 65.41 69.30 73.42 77.78 82.41 87.31 92.50 98.00 103.8 110.0 116.5 123.5
  6. 3 130.8 138.6 146.8 155.6 164.8 174.6 185.0 196.0 207.7 220.0 233.1 246.9
  7. 4 261.6 277.2 293.7 311.1 329.6 349.2 370.0 392.0 415.3 440.0 466.2 493.9
  8. 5 523.3 554.4 587.3 622.3 659.3 698.5 740.0 784.0 830.6 880.0 932.3 987.8
  9. 6 1047 1109 1175 1245 1319 1397 1480 1568 1661 1760 1865 1976
  10. 7 2093 2217 2349 2489 2637 2794 2960 3136 3322 3520 3729 3951
  11. 8 4186 4435 4699 4978 5274 5588 5920 6272 6645 7040 7459 7902
  12. Guitar strings are E2=82.41Hz, A2=110Hz, D3=146.8Hz, G3=196Hz, B3=246.9Hz, E4=329.6Hz
  13. Bass strings are (5th string) B0=30.87Hz, (4th string) E1=41.20Hz, A1=55Hz, D2=73.42Hz, G2=98Hz
  14. This example tests the yin algorithm with actual notes from nylon string guitar recorded
  15. as wav format at 16B @ 44100 samples/sec. Since the decay of the notes will be longer than what
  16. the teensy can store in flash these notes are truncated to ~120,000B or about 1/2 of the whole
  17. signal.
  18. */
  19. #include <SerialFlash.h>
  20. #include <AudioTuner.h>
  21. #include <Audio.h>
  22. #include <Wire.h>
  23. #include <SPI.h>
  24. #include <SD.h>
  25. //---------------------------------------------------------------------------------------
  26. #include "e2_note.h"
  27. #include "a2_note.h"
  28. #include "d3_note.h"
  29. #include "g3_note.h"
  30. #include "b3_note.h"
  31. #include "e4_note.h"
  32. //---------------------------------------------------------------------------------------
  33. AudioTuner tuner;
  34. AudioOutputAnalog dac;
  35. AudioPlayMemory wav_note;
  36. AudioMixer4 mixer;
  37. //---------------------------------------------------------------------------------------
  38. AudioConnection patchCord0(wav_note, 0, mixer, 0);
  39. AudioConnection patchCord1(mixer, 0, tuner, 0);
  40. AudioConnection patchCord2(mixer, 0, dac, 0);
  41. //---------------------------------------------------------------------------------------
  42. IntervalTimer playNoteTimer;
  43. void playNote(void) {
  44. if (!wav_note.isPlaying()) {
  45. wav_note.play(e2_note);
  46. //wav_note.play(a2_note);
  47. //wav_note.play(d3_note);
  48. //wav_note.play(g3_note);
  49. //wav_note.play(b3_note);
  50. //wav_note.play(e4_note);
  51. digitalWriteFast(LED_BUILTIN, !digitalReadFast(LED_BUILTIN));
  52. }
  53. }
  54. //---------------------------------------------------------------------------------------
  55. void setup() {
  56. AudioMemory(4);
  57. /*
  58. * Initialize the yin algorithm's absolute
  59. * threshold, this is good number.
  60. *
  61. * Percent of overall current cpu usage used
  62. * before making the search algorithm less
  63. * aggressive (0.0 - 1.0).
  64. */
  65. tuner.initialize(.15, .99);
  66. pinMode(LED_BUILTIN, OUTPUT);
  67. playNoteTimer.begin(playNote, 1000);
  68. }
  69. void loop() {
  70. // read back fundamental frequency
  71. if (tuner.available()) {
  72. float note = tuner.read();
  73. float prob = tuner.probability();
  74. Serial.printf("Note: %3.2f | Probability: %.2f\n", note, prob);
  75. }
  76. }