Пьезоэлектрический излучатель. Мелодия

А: А кем ты работаешь?

Б: Я — программист!

А: О, классно, а что ты программируешь?

Б: Акустические волны.

Кроме генерации однотонного звука, можно воспроизвести даже целые мелодии: для этого потребуется поочередно задавать ту или иную частоту колебаний. Путь это будет русская народная песня «Коробейники».

Ниже представлена табулатура Коробейников для укулеле.

Если записать линейно, то мелодия будет выглядеть так:

D5, G4, G4#, A4#, G4#, G4, F4, F4, G4#, D5, A4#, G4#, G4, G4, A4#, D5, G4#, F4, F4,

C5, D5#, G5, F5, D5#, D5, G4#, D5, G4#, D5, A4#, G4#, G4, G4, A4#, D5, G4#, F4, F4

В табулатуре используется первая и вторая октавы, однако наш динамик плохо воспроизводит звуки до 1 кГц. Вам необходимо транспонировать его на более высокие октавы (например, на 3 и 4 октавы, или же на 4 и 5 октавы). Нужные частоты вы можете найти в сети, мы же приведём частоты 3, 4 и 5 октав:

Нота3 октава, Гц4 октава, Гц5 октава, Гц
C1046,520934186
C#1108,72217,44434,8
D1174,62349,24698,4
D#1244,524894978
E1318,526375274
F1396,92793,85587,6
F#148029605920
G156831366272
G#1661,23322,46644,8
A176035207040
A#1864,63729,27458,4
H1975,539517902

Поочередно меняя тон и вставляя задержки, мы получим мелодию. Добавим макросы с говорящими именами для каждого тона из таблицы.

Музыка это не только поочерёдная смена тона, а ещё и паузы между нотами — это называется ритмом. С технической точки зрения нужно сделать ШИМ внутри другого ШИМ, причём параметры обоих могут меняться во времени.

Таким образом, одна единица мелодии состоит из трёх частей: частота звука, продолжительность ноты, продолжительность паузы. Создадим для этого структуру.

Здесь по возможности нужно обойтись минимальным размером экземпляра структуры. Давайте рассуждать: частота точно не будет превышать 10 кГц, поэтому 16 бит для ноты вполне достаточно; если мы хотим уложится в 32 бита, то на продолжительность паузы и воспроизведения нужно оставить по 8 бит; продолжительность игры и паузы вряд ли будет больше 1 секунды, но даже при этом, если мы будем хранить значения в сантисекундах (10-2), то переменной хватит аж на 2,55 с.

Создадим массив таких структур для мелодии «Коробейники».

Осталось мелодию воспроизвести. Добавим функцию для воспроизведения.

Код доступен на GitHub: CMSIS.

Реализация наивная и имеет один существенный недостаток. Что, если вам потребуется остановить воспроизведение мелодии? Что, если данную функцию захочется вызвать из прерывания? Наверняка вам в голову уже пришло одно решение, но оно... не самое лучшее — вы просто не всё знаете.


Назад | Оглавление | Дальше