Проигрывание нот

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

const int dynPin = 2;
 
int numTones = 10;
// Ноты C,C#,D,D#,E,F,F#,G,G#,A
int tones[10] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};

void setup(){
    pinMode( dynPin, OUTPUT );
}
 
void loop(){
    for( int i = 0; i < numTones; i++ ){
        tone( dynPin, tones[i] );
        delay( 500 );
    }
    noTone( dynPin );
}

Для удобства хранения последовательности нот мы использовали массив tones. В следующем примере мы будем проигрывать десятки нот, и без массива наша программа стала бы через чур громоздкой и непонятной.

Мелодия из Звёздных войн на Ардуино

Наконец, попробуем воспроизвести полноценную мелодию из известной всем космической саги.

const byte dynPin = 2;
const byte COUNT_NOTES = 39;

// частоты нот
int tones[COUNT_NOTES] = {
 392, 392, 392, 311, 466, 392, 311, 466, 392,
 587, 587, 587, 622, 466, 369, 311, 466, 392,
 784, 392, 392, 784, 739, 698, 659, 622, 659,
 415, 554, 523, 493, 466, 440, 466,
 311, 369, 311, 466, 392
};

// длительности нот
int durations[COUNT_NOTES] = {
 350, 350, 350, 250, 100, 350, 250, 100, 700,
 350, 350, 350, 250, 100, 350, 250, 100, 700,
 350, 250, 100, 350, 250, 100, 100, 100, 450,
 150, 350, 250, 100, 100, 100, 450,
 150, 350, 250, 100, 750
};

void setup() {
    pinMode( dynPin, OUTPUT ); // Настраиваем контакт на выход 
}

void loop() {
    for (int i = 0; i <= COUNT_NOTES; i++ ) {
        tone( dynPin, tones[i], durations[i] * 2 );
        delay( durations[i] * 2 );
        noTone( dynPin );
    }
}

Чтобы проиграть мелодию нам потребуется учитывать не только частоту звука, но и его длительность. Специально для этого мы ввели еще один массив — durations, в котором перечислены длительности нот из массива tones.

Загружаем программу на Ардуино и слушаем имперский марш!

На следующем уроке поговорим о зуммере, который выглядит почти также, но позволяет генерировать писк без дополнительных схем с транзисторами!


Изменено:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.