Як відтворити звуки мелодії з Ардуіно

Звукові модулі та їх особливості, обговорення плеєрів, мікрофонів та підсилювачів звуку, запис та відтворення голосу з допомогою контролерів Ардуіно
Відповісти
Аватар користувача
Arduino
Site Admin
Повідомлень: 98
З нами з: 16 травня 2017 18:18

Як відтворити звуки мелодії з Ардуіно

Повідомлення Arduino » 13 червня 2017 16:16

Для відтворення мелодії необхідно подавати послідовно сигнали-звуки певної частоти і тривалості. Для генерації звуків певної частоти і тривалості будемо використовувати Arduino-функцію tone (): one (pin, frequency, duration);
Функція tone () генерує на виведення прямокутний сигнал заданої частоти (з коефіцієнтом заповнення 50%). Функція також дозволяє задавати тривалість сигналу. Якщо тривалість сигналу не вказана, він буде генеруватися доти, поки не буде викликана функція noTone (). Значення частот для нот першої і другої октав представлені в малюнку
zvuk-noty.jpg

Код: Виділити все

// МЕЛОДІЯ – масив нот і масив тривалосетей звучання
char melody[]={'G','G','G','E','H',
'G','E','H','G','*',
'd','d','d','e','H',
'T','E','H','F',
'g','G','G','g','t','e',
's','s','s','*','U','r','c','B',
'H','A','H','*','E','T','E','F',
'H','G','H','d',
'g','G','G','g','t','f',
's','s','s','*','U','r','c','B',
'H','A','H','*','E','T','E','H',
'G','E','H','G',
'%','%'};
int bb[]={8,8,8,6,2,
8,6,2,8,8,
8,8,8,6,2,
8,6,2,16,
8,6,2,8,6,2,
2,2,4,4,2,8,6,2,
2,2,4,4,2,8,6,2,
8,6,2,16,
8,6,2,8,6,2,
2,2,4,4,2,8,6,2,
2,2,4,4,2,8,6,2,
8,6,2,16,
64,64};
// підключити динамік до pin 8
int speakerPin = 8;
// темп відтворення, ноти, тривалості
int tempo,notes,beats;
// процедура відтворення ноти
void playNote(char note, int duration)
{
// масив для найменування нот в межах двух октав
char names[]={'c','r','d','s','e','f','t','g','u','a','b',
'h','C','R','D','S','E','F','T','G','U','A','B', 'H','F'};
// массив частот нот
int tones[]={261,277,293,311,329,349,370,392,415,440,466,
494, 523,554,587,622,659,698,740,784,830,880,932,988};
// програш тону, відповідного  ноті
for (int i = 0; i < sizeof(tones); i++)
{
if (names[i] == note)
{
tone(speakerPin,tones[i],duration);
}
}
}
void setup()
{
pinMode(speakerPin, OUTPUT);
tempo=50; // швидкість відтворення мелодії
}
void loop()
{
for(int i=0;i<sizeof(melody);i++)
{
notes=melody[i];
beats=bb[i];
if (notes == '*')
tone(speakerPin,0, beats*tempo); // пауза
else
playNote(notes, beats*tempo);
// пауза між нотами
delay(beats*tempo+tempo);
}
}

Відповісти

Повернутись до “Звук та ультразвук”