В довершение статьи про генерацию звука с помощью AVR микроконтроллера, появилась новая версия прошивки. Прошивка стала намного больше и сложнее.
Однако, процесс написания своих мелодий более понятный, доступна 1 и 2 октава целиком, длительности нот и пауз регулируются, можно изменять темп мелодий.
Возьмем пример всем известной мелодии Nokia tune
Открываем проект, в нем будет 3 файла, нам нужен songs.c. В нем уже есть несколько мелодий, одна из них та самая мелодия нокии. Выглядит она так:
int nokia[]={120.000,P,N8,E2,N8,D2,N8, F1d,N4,G1d,N4,C2d,N8,H1,N8,D1,N4,E1,N4,H1,N8,A1,N8,
C1d,N4,E1,N4,A1,N4,End};
Расшифровать ее просто:
Первый элемент массива это темп — количество ударов в минуту, здесь темп равен 120 ударов.
Второй элемент P — это пауза, все мелодии должны начинаться с паузы.
Третий элемент — N8 это длительность паузы, N4 — четвертная, N8- восьмая, N16 — шестнадцатая.
Четвертый элемент — первая нота, ми второй октавы.
Обозначения для нот: C-до, D-ре, E-ми, F-фа, G-соль, A-ля, H-си. Цифра после ноты — октава, если после ноты стоит d значит диез (бемолей нет). Пример E2 — ми второй октавы, F1d — фа диез первой октавы.
Пятый элемент — длительность ноты, по аналогии с паузой. Т.е. сочетание E2,N8 означает восьмая ми второй октавы.
Остальные элементы по аналогии, сначала нота, потом ее длительность.
Последний элемент массива всегда End.
После создания мелодии важно занести ее в плейлист, чтобы она проигрывалась
int *playlist[]= {mortal,
nokia,
miniPolka,
bumer,
mario,
tanki
};
Количество мелодий в плейлисте должно быть 6, больше нельзя поместить потому что не хватает оперативной памяти. Победить эту проблему пока мне не удалось. Лучше всего изменять какую нибудь из набранных мелодий.
В протеусе жутко лагает(видимо проц слабоват), но на железе все работает отлично. Скачать файл протеуса и прошивку можно тут. Можно привязать проигрывание мелодий к кнопке и сделать музыкальный звонок .
Update:
Для перевода нот в массив находите нужные ноты, соотносите их названиям нот на рисунке. Заносите в массив. После H1 ноты повторяются, т.е. С2, D2(октавой выше) т.п. Если перед нотой попадается решеточка (диез) значит нота звучит на пол тона выше, #C1 запишется как C1d.
Здравствуйте! Спасибо Вам за уроки, очень интересно по вашим урокам делать первые шаги. Хочу сделать часы с будильником и на мелодию будильника поставить марио, как в ваших уроках.
Но вот появились у меня сомнения. Прерывание какого таймера главнее, первого или второго? И не будет ли команда #asm(«cli») отключать оба прерывания. Я хочу сделать так чтобы прерывание таймера для часов было главнее чем прерывание таймера для генерации звука и чтобы команда #asm(«cli») из генерации звука не вмешивалась в программку для работы часов. Как бы это все грамотно сделать с прерываниями таймера?
команда #asm(«cli») будет отключать оба прерывания, какое из них главнее можно посмотреть в даташите. Чтобы они не мешали друг другу можно поставить микросхему часов ds1307, либо ставить 2 мк
Все понял. Спасибо!
void play()
{
OCR1AH = (char)(Bit>>8); //записываем текущую ноту в OCR1A
OCR1AL = (char)Bit;
Уважаемый админ, поясните пожалуйста процесс записи в таймер и к чему в скобках указано char?
Первый вопрос снят, а вот вопрос с (char) остался.
char это 8 бит, число Bit 16битное, для того чтобы отбросить старший байт используется приведение типов, посмотрите пример здесь http://avr-start.ru/?p=904
«Открываем проект, в нем будет 3 файла» — что то я не вижу ссылки на скачивание!!!
Находишь в тексте строку: «Скачать файл протеуса и прошивку можно тут». Под словом ТУТ спрятан архив 😉 .
Количество мелодий в плейлисте должно быть 6, больше нельзя поместить потому что не хватает оперативной памяти. Победить эту проблему пока мне не удалось. Лучше всего изменять какую нибудь из набранных мелодий.
Используйте макрос PROGMEM (запись переменных во flash) и CONST. Читать данные по адресу &DATA.
Александр, статья мохнатого года, конечно правильнее хранить во флеше, кстати в CAVR достаточно при объявлении задать const.
Подскажите пожалуйста, вы кажется приводили сайт с нотами или чем то еще в пример… был вроде такой комментарий, но я что-то не нашел… 🙄
не помню такого 🙂 а подобных сайтов тысячи, поэтому просто гуглите по названию нужную мелодию.
😀 вполне возможно что меня глюкануло) было давно) Простите за наглость, а вы убрали файл с прошивкой в этой статье?) 🙄 либо у меня браузер не отображает, хотя в других уроках прошивка есть)
😆 увидел спасибо)
Подскажите пожалуйста. Допустим мне понравилась мелодия, открыл значит нотный стан на неё) а она состоит из 2 нотных станов объединенных скобочкой, это как бы значит два голоса? А на микроконтроллере мы играем как бы один, так?)
да, если нужна полифония, то тут уже надо заморочиться.
😡 все ломаю голову над музыкальной грамотой)Вообще музыканты говорят что длительность нот не связана с темпом. у вас как я понял
(playlist[trackN][0]/60.000);
мы как бы делим темп( первый элемент массива ) на 60.000. Правильно?Длительность связана в плане времени, чем быстрее темп, тем короче звучит нота. можете насчет статьи не заморачиваться это всего лишь пример. Можете поискать, вроде как библиотеки попадались для проигрывания мелодий, в которых все сделано более красиво.