Проєкт Караоке

Вступ

Караоке було винайдене в Японії в другій половині XX століття. Назва всесвітньо відомої забави складається із слова [кара] — «порожній» і [оке] - “оркестр”. Її винайшов в 1971 році японський барабанщик Дайсуке Іноуе. На виступах рок-групи, в якій він грав, нічим було зайняти публіку під час перерв. Тоді він придумав апарат, який міг відтворювати пісенну музику без слів. Музиканти роздавали глядачам тексти і відпочивали, доки публіка із задоволенням співала. У той час ніхто, окрім відвідувачів концерту, новинку не оцінив. Тільки через 15 років караоке стало дуже популярним. Проте єдине, чим відзначили Дайсуке, — вручили в 2004 році «Шнобелівську премію» за найбезглуздіші, смішніші і даремніші винаходи. Пізніше ж колишнього барабанщика нагородили премією миру як людину, яка «відкрила людям новий спосіб вчитися терпимості один до одного». Адже погодьтесь, не так то і просто терпіти спів іншої людини, якщо це не професійний співак. Сьогодні ж в українських містах досі популярні караоке-кімнати, куди компанії друзів можуть прийти і весело провести час, співаючи улюблені пісні

Оскільки наш Дрон це насправді платформа для творчості і креативу і сфера його застосування обмежується лише Вашою фантазією, то давайте на основі цієї платформи створимо Караоке. Відтворювати мелодії ми вже вміємо з 3-го уроку, тепер треба лише кудись виводити тест пісні, щоб допомогти співаку-аматору попадати в ноти. Це насправді ми вже теж можемо. І хоча наш Дрон не має власного екранчику, але ми можемо використати дисплей комп’ютера, відсилаючи текст пісні через послідовний інтерфейс на комп’ютер

Караоке

Давайте напише караоке пісню для Гімну України, незважаючи на те, що слова і так всі знають і в ноти скоріше всього теж попадають. Отже пригадаємо структуру програми з 3-го уроку:

  1. Ми мали 3 масиви: з нотами, їх тривалістю та павзами перед наступною нотою
  2. Також у нас був цикл, в якому ми по черзі діставали ці значення з масивів і відтворювали на пищалці. Пищалка була підключена до піна PA6

Тепер нам потрібно додатково ще один масив, де ми будемо зберігати текст пісні. Давайте напишемо таку програму

 1void setup() {
 2  Serial.begin(115200);
 3  pinMode(PA6, OUTPUT);
 4  delay(2000);
 5}
 6
 7int notes[] = {
 8  494, 494, 494, 440, 494, 523, 587, 523, 494,
 9  440, 392, 494, 370, 494, 330, 370, 392, 440,
10  494, 494, 494, 440, 494, 523, 587, 523, 494,
11  440, 392, 494, 370, 494, 330, 330, 370, 370,
12  494, 440, 392, 370, 330, 370, 392, 330, 370,
13  370, 392, 392, 440, 440, 494, 494, 370, 370,
14  494, 440, 392, 370, 330, 370, 392, 330, 370,
15  370, 392, 494, 370, 494, 330, 370, 392, 440
16};
17
18int durations[] = {
19  800, 250, 250, 250, 250, 250, 850, 250, 550,
20  550, 550, 550, 550, 550, 850, 250, 550, 550,
21  850, 250, 250, 250, 250, 250, 850, 250, 550,
22  550, 550, 550, 550, 550, 1100, 550, 850, 250,
23  250, 250, 250, 250, 250, 250, 250, 250, 550,
24  550, 550, 550, 550, 550, 1100, 550, 800, 250,
25  250, 250, 250, 250, 250, 250, 250, 250, 550,
26  550, 550, 550, 550, 550, 800, 250, 250, 250
27};
28
29int delays[] = {
30  900, 300, 300, 300, 300, 300, 900, 300, 600,
31  600, 600, 600, 600, 600, 900, 300, 600, 600,
32  900, 300, 300, 300, 300, 300, 900, 300, 600,
33  600, 600, 600, 600, 600, 1200, 1200, 900, 300,
34  300, 300, 300, 300, 300, 300, 300, 300, 600,
35  600, 600, 600, 600, 600, 1200, 1200, 900, 300,
36  300, 300, 300, 300, 300, 300, 300, 300, 600,
37  600, 600, 600, 600, 600, 900, 300, 300, 300
38};
39
40String text[] = {
41  "\r\nЩе", "не", "вме", "рл", "а", "", "У", "кра", "ї", "ни", "і", "сла", "ва", "і", "во", "", "", "ля",
42  "\r\nЩе", "нам", "бра", "ття", "", "мо", "", "ло", "ді", "ї", "у", "смі", "хне", "ться", "до", "ля",
43  "\r\nЗги", "ну", "ть", "на", "ші", "во", "", "рі", "", "же", "нь", "ки", "як", "ро", "са", "на", "со", "нці",
44  "\r\nЗа", "", "па", "ну", "", "єм", "і", "ми", "бра", "", "ття", "у", "сво", "їй", "сто", "ро", "", "", "нці", ""
45};
46
47void loop() {
48  for (int i = 0; i < 72; i++) {
49    sendWord(i);
50    tone(PA6, notes[i], durations[i]);
51    delay(delays[i]);
52  }
53}
54
55void sendWord(int wordNumber) {
56  String word = text[wordNumber];
57  if (word != "") {
58    Serial.print(word + " ");
59  }
60}

Переведіть Дрон в режим програмування, завантажте програму на Дрон, перейдіть на панель Монітор порту та перевірте себе чи потрапляєте Ви в ноти. Нагадування: щоб припинити пісню, достатньо знову перевести Дрон в режим програмування

Отже все, що ми додали до нашої програми в порівнянні з 3-ім уроком, то це новий 4-ий масив з текстом Гімну і ще нову функцію sendWord, яка власне і відправляє слова тексту з 4-го масиву text на комп’ютер на панель Монітор порту

Ви могли помітити, що масив зі словами Гімну має пусті елементи такі як “”. Це тому, що на деякі склади слів припадає більше, ніж одна нота. Тому таким чином ми це обіграли в самому масиві, щоб поки не виводити наступне слово, коли нота стосується ще попереднього. Також Ви могли помітити дивні символи (\r\n) на початку кожного рядку Гімну. Це спеціальні символи, які вказують панелі Монітор порту почати друкувати слова з нового рядка

  • send (сенд) – відправляти
  • word (ворд) – слово
  • text (текст) – текст
  • number (намбер) – номер
  • serial (сіріал) – серійний, послідовний
  • duration (дюрейшн) – тривалість
  • delay (ділей) – павза, зартимка
  • print (прінт) – надрукувати
  • string (стрінг) – рядок (тексту)
Самостійна робота №1

Модифікуйте програму таким чином, щоб кожну кратну 2-ом ноту вмикався світлодіод (будь-який), а не кратну – вимикався. Як на відео нижче. Таким чином додамо трохи “спецефектів”, щоб мигання співпадало з нотами