Это старая версия документа!


Эксперимент 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}, {c, 8}, {a, 8},
  16. {a, 8}, {b, 8}, {g, 8}, {C, 3}, {C, 8}, {d, 8}, {d, 8}, {b, 8}, {b, 8}, {a, 8},
  17. {g, 8}, {f, 8}, {c, 8}, {a, 3}, {a, 8}, {g, 8}, {a, 8}, {f, 3}, {C, 8}, {d, 8},
  18. {d, 8}, {b, 8}, {b, 8}, {a, 3}, {g, 8}, {f, 8}, {c, 8}, {a, 3}, {a, 8}, {g, 8},
  19. {a, 8}, {f, 3}
  20. };
  21.  
  22. void setup() {
  23. pinMode(SPEAKER_PIN, OUTPUT);
  24. analogWriteRange(1024);;
  25. }
  26.  
  27. void loop() {
  28. for (int i = 0; i < 42; i++){
  29. analogWrite(SPEAKER_PIN, 512);
  30. analogWriteFreq(tones[melody[i].note]);
  31. delay(tempo/melody[i].length);
  32. analogWrite(SPEAKER_PIN, 0);
  33. delay(tempo/melody[i].length/4);
  34. }
  35. }

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

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

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