Эксперимент 24. Музыкальный автомат

Теперь создадим настоящий музыкальный автомат. Мы подготовим для него запись мелодии, а он будет ее воспроизводить. Возьмем всем известную мелодию «В лесу родилась ёлочка»

Рисунок 1. Ноты мелодии «В лесу родилась ёлочка»

Если ты не разбираешься в музыкальной грамоте, то не беда. Эксперимент получится и без этого, ведь мы уже перевели эту нотную запись в «язык» для нашего музыкального автомата. Но если тебе интересно, и ты хочешь сделать запись другой мелодии, то начать знакомство с нотной грамотностью можно, например, здесь.

Схема эксперимента

Рисунок 1. Электрическая принципиальная схема эксперимента

Рисунок 2. Монтажная схема эксперимента

Программный код эксперимента

Exp24.ino
  1. #define SPEAKER_PIN 15
  2.  
  3. int tones[8] = {262, 294, 330, 349, 392, 440, 494, 523};
  4.  
  5. enum Note {c, d, e, f, g, a, b, C};
  6.  
  7. struct Sound {
  8. int note;
  9. int length;
  10. };
  11.  
  12. const int tempo = 2000;
  13.  
  14. Sound melody[42] = {
  15. {c, 8}, {a, 8}, {a, 8}, {g, 8}, {a, 8}, {f, 8}, {c, 8}, {c, 8},
  16. {c, 8}, {a, 8}, {a, 8}, {b, 8}, {g, 8}, {C, 3}, {C, 8}, {d, 8},
  17. {d, 8}, {b, 8}, {b, 8}, {a, 8}, {g, 8}, {f, 8}, {c, 8}, {a, 3},
  18. {a, 8}, {g, 8}, {a, 8}, {f, 3}, {C, 8}, {d, 8}, {d, 8}, {b, 8},
  19. {b, 8}, {a, 3}, {g, 8}, {f, 8}, {c, 8}, {a, 3}, {a, 8}, {g, 8},
  20. {a, 8}, {f, 3}
  21. };
  22.  
  23. void setup() {
  24. pinMode(SPEAKER_PIN, OUTPUT);
  25. analogWriteRange(1024);;
  26. }
  27.  
  28. void loop() {
  29. for (int i = 0; i < 42; i++){
  30. analogWrite(SPEAKER_PIN, 512);
  31. analogWriteFreq(tones[melody[i].note]);
  32. delay(tempo / melody[i].length);
  33. analogWrite(SPEAKER_PIN, 0);
  34. delay(tempo / melody[i].length / 4);
  35. }
  36. }

В массиве melody записаны ноты мелодии и их длительности.

Дополнительное задание

  • Попробуй записать и воспроизвести другую мелодию,​ например «В траве сидел кузнечик»​