Проект 7. Необычный синтезатор

Синтезатор - это устройство, которое при нажатию на кнопку/клавишу воспроизводит какой-либо звук. Наш синтезатор будет реализован на модуле Keypad, с помощью кнопок и их комбинаций мы будем проигрывать любую из 7 существующих нот! А при помощью регулятора можно будет подстроить тональность.

Программирование:

Логические операции

Практика

Запрограммируйте кнопки на клавиатуре, чтобы они работали следующим образом (0 - нажато, 1 - не нажато):

D0D1D2НотаЧастота ноты
111-noTone
011До523
101Ре587
110Ми659
001Фа698
100Соль784
010Ля880
000Си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);
}