Якщо ви читаєте дану статтю - це може означати тільки одне: Ви людина що не може жити без музикиlaughing Ну я теж такий, тому на світ і з'явилось це творіння. Що восени робити довгими вечорами, коли за вікном дощ і настрою гуляти немає взагалі? - правильно, кодити. Отож, поченемо!

Все максимально просто: підключаємо бузер (ну в моєму випадку пасивний) до 9 цифрового ШІМ піна на ардуіні, а до 2 виходу підключаємо кнопку (маю велику надію, що у Вас вже є базові поняття як це все зробити і підготувати все до подальної прошивки та успішної роботи пристрою). Опісля прошиваємо ардуіну даним скетчем: Melody.ino

Розбираємо код:

// ноти та їх частоти
int frq[] = {262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494, 523,
554, 587, 622, 659, 698, 740, 0, 247, 233, 220, 208, 196, 185, 174};

int f0=frq[26], f_dies0=frq[25],
g0=frq[24], g_dies0=frq[23],
a0=frq[22], a_dies0=frq[21],
h0=frq[20],
c=frq[0], c_dies=frq[1],
d=frq[2], d_dies=frq[3],
e=frq[4],
f=frq[5], f_dies=frq[6],
g=frq[7], g_dies=frq[8],
a=frq[9], a_dies=frq[10],
h=frq[11],
c2=frq[12], c_dies2=frq[13],
d2=frq[14], d_dies2=frq[15],
e2=frq[16],
f2=frq[17], f_dies2=frq[18],
nul=frq[19];

В даному блоці коду ми ініціалізуємо масив frq (frequency), в який записуємо частоти кожної з нот. 

Як говорить Вікіпедія, частоти нот визначаються за цікавою формулою:

Формула визначення частоти ноти, або Формула визначення частоти нот

де 440 - це частота еталонної ноти Ля (440 Гц) на ідеальному піаніно, по рахунку 49. Ну звичайно я не збирався рахувати частоту кожної ноти а взяв готові з таблиці в тій же статті на Вікіпедії

Дальше в стовпчик я розписав назви нот та присвоїв їм їхні комірки в масиві частот. Тепер у нас є можливість грати в мелодії в такому діапазоні:

Діапазон нот: фа 3-ї октави - фа дієз 5-ї октави, тобто, це від Фа третьої октави до Фа дієз п'ятої октави. Як на мене, цілком достатньо.

// тривалість нот

int SEMIB = 700; // semibreve - ціла нота

int HALF = 350; // half-note - половинна нота

int QUART = 175; // quarter note - четвертинна нота

int POINT = 150;

int PAUSE = 0;

int count = 0;

А в даному блоці коду ми записуємо тривалість нот. SEMIB - semibreve - ціла нота, і т.д.

POINT - крапка, що ставиться біля ноти для збільшення її тривалості.

PAUSE = 0; -- дивує? поясню трохи нижче чому так.

А дальше ми переходимо до найцікавішого - записуємо мелодії. Принцип наступний: пишемо в масив назву ноти і через кому зразу пишемо її тривалість (SEMIB, HALF, QUART, по потребі додаємо POINT; для паузи пишемо замість ноти "nul", і через кому вписуємо "PAUSE" до якої додаємо тривалість). Складно? Тільки в теорії. На практиці простіше:

// Меч Арея

int sword_areas[] = {c,SEMIB, c,SEMIB, c,HALF, d,HALF, d_dies,HALF,
c,HALF, d,SEMIB, d,SEMIB, d,SEMIB, d,HALF, d_dies,HALF,
f,SEMIB, f,SEMIB, f,HALF, d_dies,HALF, d,HALF,
c,HALF, d_dies,SEMIB, c,SEMIB, c,SEMIB};

Ну погодьтесь же ж, не складно embarassed

Так само вписуємо наступні мелодії:

// Імперський марш

int star_wars[] = {g,SEMIB, g,SEMIB, g,SEMIB, d_dies,HALF+POINT, a_dies,QUART,
g,SEMIB, d_dies,HALF+POINT, a_dies,QUART, g,SEMIB, nul,PAUSE+SEMIB,
d2,SEMIB, d2,SEMIB, d2,SEMIB, d_dies2,HALF+POINT, a_dies,QUART,
f_dies,SEMIB, d_dies,HALF+POINT, a_dies,QUART, g,SEMIB, nul,PAUSE+SEMIB,};

// Гімн України

int slaven[] = {e,SEMIB+POINT, e,HALF, e,HALF, d,HALF, e,HALF, f,HALF, g,SEMIB+POINT,
f,HALF, e,SEMIB, d,SEMIB, c,SEMIB, e,SEMIB, h0,SEMIB, e,SEMIB,
a0,HALF, g_dies0,HALF, a0,HALF, h0,HALF, c,SEMIB, d,SEMIB,
e,SEMIB+POINT, e,HALF, e,HALF, d,HALF, e,HALF, f,HALF, g,SEMIB+POINT,
f,HALF, e,SEMIB, d,SEMIB, c,SEMIB, a0,SEMIB, e,SEMIB, g_dies0,SEMIB,
a0,SEMIB+SEMIB, a0,SEMIB};

Ну а весь наступний код як ви зрозуміли - це зчитувач кнопки що переключає мелодії та фнкція play(), що грає мелодію. 

Про них я детальніше розпишу потім..


Теги


Коментарі

Коментарі відсутні