Проект 7. Необычный синтезатор
Синтезатор - это устройство, которое при нажатию на кнопку/клавишу воспроизводит какой-либо звук. Наш синтезатор будет реализован на модуле Keypad, с помощью кнопок и их комбинаций мы будем проигрывать любую из 7 существующих нот! А при помощью регулятора можно будет подстроить тональность.
Программирование:
Логические операции
Практика
Запрограммируйте кнопки на клавиатуре, чтобы они работали следующим образом (0 - нажато, 1 - не нажато):
D0 | D1 | D2 | Нота | Частота ноты |
1 | 1 | 1 | - | noTone |
0 | 1 | 1 | До | 523 |
1 | 0 | 1 | Ре | 587 |
1 | 1 | 0 | Ми | 659 |
0 | 0 | 1 | Фа | 698 |
1 | 0 | 0 | Соль | 784 |
0 | 1 | 0 | Ля | 880 |
0 | 0 | 0 | Си | 980 |
Дополнительное задание
Попробуйте сделать так, чтобы регулятор на клавиатуре изменял тональность звука.
d0 |
d1 |
d2 |
нота |
частота ноты по октавам |
вторая |
третья |
четвёртая |
1 |
1 |
1 |
- |
notone |
0 |
1 |
1 |
до |
523 |
1046 |
2093 |
1 |
0 |
1 |
ре |
587 |
1174 |
2349 |
1 |
1 |
0 |
ми |
659 |
1318 |
2637 |
0 |
0 |
1 |
фа |
698 |
1396 |
2739 |
1 |
0 |
0 |
соль |
784 |
1568 |
3136 |
0 |
1 |
0 |
ля |
880 |
1720 |
3440 |
0 |
0 |
0 |
си |
980 |
1975 |
3951 |
Решение
Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:
Основная программа
#include <Eryoma.h>
Eryoma eryoma;
void setup() {
pinMode(A14, OUTPUT);
eryoma.setupConnector(ePort4, Keypad);
}
void loop() {
int buttonD0 = eryoma.read(ePort4, D0);
int buttonD1 = eryoma.read(ePort4, D1);
int buttonD2 = eryoma.read(ePort4, D2);
if (buttonD0 == 1 && buttonD1 == 1 && buttonD2 == 1)noTone(A14);
if (buttonD0 == 0 && buttonD1 == 1 && buttonD2 == 1)tone(A14, 523);
if (buttonD0 == 1 && buttonD1 == 0 && buttonD2 == 1)tone(A14, 587);
if (buttonD0 == 1 && buttonD1 == 1 && buttonD2 == 0)tone(A14, 659);
if (buttonD0 == 0 && buttonD1 == 0 && buttonD2 == 1)tone(A14, 698);
if (buttonD0 == 1 && buttonD1 == 0 && buttonD2 == 0)tone(A14, 784);
if (buttonD0 == 0 && buttonD1 == 1 && buttonD2 == 0)tone(A14, 880);
if (buttonD0 == 0 && buttonD1 == 0 && buttonD2 == 0)tone(A14, 988);
delay(50);
}
Дополнительное задание
#include <Eryoma.h>
Eryoma eryoma;
void setup() {
pinMode(A14, OUTPUT);
eryoma.setupConnector(ePort4, Keypad);
}
void loop() {
int buttonD0 = eryoma.read(ePort4, D0);
int buttonD1 = eryoma.read(ePort4, D1);
int buttonD2 = eryoma.read(ePort4, D2);
if (eryoma.read(ePort4, An) >= 0 && eryoma.read(ePort4, An) < 300) {
if (buttonD0 == 1 && buttonD1 == 1 && buttonD2 == 1)noTone(A14);
if (buttonD0 == 0 && buttonD1 == 1 && buttonD2 == 1)tone(A14, 523);
if (buttonD0 == 1 && buttonD1 == 0 && buttonD2 == 1)tone(A14, 587);
if (buttonD0 == 1 && buttonD1 == 1 && buttonD2 == 0)tone(A14, 659);
if (buttonD0 == 0 && buttonD1 == 0 && buttonD2 == 1)tone(A14, 698);
if (buttonD0 == 1 && buttonD1 == 0 && buttonD2 == 0)tone(A14, 784);
if (buttonD0 == 0 && buttonD1 == 1 && buttonD2 == 0)tone(A14, 880);
if (buttonD0 == 0 && buttonD1 == 0 && buttonD2 == 0)tone(A14, 988);
}
if (eryoma.read(ePort4, An) > 301 && eryoma.read(ePort4, An) < 600) {
if (buttonD0 == 1 && buttonD1 == 1 && buttonD2 == 1)noTone(A14);
if (buttonD0 == 0 && buttonD1 == 1 && buttonD2 == 1)tone(A14, 1046);
if (buttonD0 == 1 && buttonD1 == 0 && buttonD2 == 1)tone(A14, 1174);
if (buttonD0 == 1 && buttonD1 == 1 && buttonD2 == 0)tone(A14, 1318);
if (buttonD0 == 0 && buttonD1 == 0 && buttonD2 == 1)tone(A14, 1396);
if (buttonD0 == 1 && buttonD1 == 0 && buttonD2 == 0)tone(A14, 1568);
if (buttonD0 == 0 && buttonD1 == 1 && buttonD2 == 0)tone(A14, 1720);
if (buttonD0 == 0 && buttonD1 == 0 && buttonD2 == 0)tone(A14, 1975);
}
if (eryoma.read(ePort4, An) > 901 && eryoma.read(ePort4, An) <= 1023) {
if (buttonD0 == 1 && buttonD1 == 1 && buttonD2 == 1)noTone(A14);
if (buttonD0 == 0 && buttonD1 == 1 && buttonD2 == 1)tone(A14, 2093);
if (buttonD0 == 1 && buttonD1 == 0 && buttonD2 == 1)tone(A14, 2349);
if (buttonD0 == 1 && buttonD1 == 1 && buttonD2 == 0)tone(A14, 2637);
if (buttonD0 == 0 && buttonD1 == 0 && buttonD2 == 1)tone(A14, 2793);
if (buttonD0 == 1 && buttonD1 == 0 && buttonD2 == 0)tone(A14, 3136);
if (buttonD0 == 0 && buttonD1 == 1 && buttonD2 == 0)tone(A14, 3440);
if (buttonD0 == 0 && buttonD1 == 0 && buttonD2 == 0)tone(A14, 3951);
}
delay(50);
}