вторник, 22 февраля 2011 г.

Музыка на микроконтроллерах AVR. Часть 2

В прошлый раз я выбрал для эксперимента микроконтроллер ATMEGA48, но, наверное, для таких целей как музыкальная открытка лучше взять что-нибудь попроще и помельче.
Поэтому на этот раз я выбрал ATTINY11-8. Объем ПЗУ там в 4 раза меньше, чем в мега48 - ровно 1024 Байт, а оперативной памяти и энергонезависимой флеш-памяти нет совсем.
В первой части наш контроллер издавал один звук на одной частоте. Я решил заставить его проигрывать мелодии. В результате получилась компактная программа размером 272 байта, под ноты осталось 752 байта (по 1 байту на ноту), то есть 752 ноты. Это почти 3 минуты звучания.
Ноты двух длительностей, 8-е и 16-е + две паузы 8 и 16. Всего 2 октавы.
Мелодии записываются через запятую в конце программы после директивы .db в виде констант: C - до, D - ре, E - ми, F - фа, G - соль, A - ля, B - си. Знаком диеза служит подчеркивание (_), ставится после ноты. Чтобы обозначить ноты второй октавы - после знака ноты и если есть диез после знака диеза ставится двойка (2).
Пример:
.db e2, d_2, e2, d_2, e2, b, d2, c2, a, p

Короткие (16-е) ноты и паузы предваряются иксом (x).
Пример:
.db xc2, xp

В каждой строчке количество значений должно быть четным.
Общее количество нот указывается перед мелодией (см. исходный код).

Так выглядит симуляция в Proteus ISIS:
Для примера я вбил по памяти 162 ноты. Вот как это все звучит в симуляции (сюрприз для поклонников сериала Rozen Maiden): ПОСЛУШАТЬ (Комментарии приветствуются.)

В следующей части я попытаюсь на основе AVR создать секвенсор.

2 комментария:

nemeemsi комментирует...

Попробуем на досуге.

Макс комментирует...

Довольно-таки интересно