Pull to refresh

Comments 9

Как будет воспроизводиться музыка, насколько сложный синтезатор в планах? Полифония? Просто квадратная волна без громкости, или что-нибудь поинтереснее?
На данный момент времени, у меня в голове только один выход как всунуть большой трек не съедая почти всю память микроконтроллера, это сделать группы массивов для полифонии и правильное обращение к ним. Я так уже уменьшил размер музыки до очень малого размера, НО мне было скучно и я решил вручную переписать тон и задержку, и получил в результате ошибочные данные. Так что я пропишу код, что бы ардуино сам создал в логах правильные группы массивов для дальнейшего их использования. Вот такие у меня планы, если у вас есть предложение получше, я с удовольствием его выслушаю и опробую.
Потенциально предложений масса, но пока не понятно, что именно в планах. На Arduino по звуку можно сделать очень много чего, я бы сказал — в рамках чиптюна возможности безграничны.

Если у вас главная сложность не в синтезе интересного звука, а в сжатии данных — очень хорошо себя зарекомендовала схема, где каналы хранятся отдельно группами по 8 нот, и для каждой следующей группы в выходные данные или добавляется фрагмент (паттерн) с новой уникальной комбинацией 8 нот, или находится в уже добавленных данных полностью совпадающий фрагмент, и на него делается ссылка (одноуровневый CALL). По сути очень примитивный вариант LZ.

Размер группы в 8 нот (четверть такта, если вы считаете в музыкальных длительностях, а не кадрах) выявился статистически, иногда выгоднее 16, но разница не очень значительна, а другие размеры как правило заметно проигрывают. Я обычно делаю кодировщики так, чтобы они сами перебирали все возможные размеры блоков и находили самый выгодный для каждого конкретного трека брутфорсом, благо на современных компьютерах это занимает секунду.
Интересно, очень хорошее предложение, я как-то даже и не подумал насчет этого, а ведь треки старой доброй «Rock n Roll Racing», действительно имеют много повторений и зачем мне их дублировать, если я могу просто воспроизвести их нужное мне количество раз. Вы действительно помогли, и как только я дойду до этого этапа, надо будет обязательно попробовать. Супер! Спасибо :)
Asmodroid, «как всунуть большой трек не съедая почти всю память микроконтроллера» — у AVR на борту есть встроенная EEPROM (у Atmega8 это целых 512 байт). Библиотека Arduino для работы со встроенной EEPROM наверняка существует, попробуйте поискать. Ну и как самый простой вариант, Вы можете попробовать написать свой «секвенсор». Например, количество нот и, соответственно, частоту каждой из нот определить заранее; в то время как «секвенсор» будет принимать на вход номер ноты, длительность ноты и длительность паузы — при желании и грамотном подходе эту информацию можно уместить в байт. Прием этот древний, но эффективный. Успехов Вам!
Здравствуйте, shiru8bit. Уже не один раз с интересом просматривал я Вашу потрясающую статью (AONDEMO), а также всегда с удовольствием читаю Ваши комментарии — профессиональные и всегда по делу. Не теряю надежду на новую статью от Вас. С уважением.
Ахаха, рассказал другу про идею разбить музыку по тактам и повторять одинаковые отрезки для оптимизации, меня прям пристыдили, сказав что «Почему ты сам до этого не догадался? У тебя же музыкальное образование» вот так, отучился, получил диплом и забыл всю теорию )))
Разбиение на повторяющиеся фрагменты вообще типично для игровых музыкальных форматов. Но для большей эффективности важны несколько упомянутых мной моментов, раскрою их подробнее:

— Разбивать именно на такты, т.к. если просто взять поток нот, типа MIDI, где нет информации о тактах, и пробовать кодировать в блоки произвольного размера, повторяемость в них будет меньше, а в тактах это происходит натуральным образом.

— Кодировать поканально, а не все каналы одновременно, т.к. в пределах канала повторяемость гораздо выше, чем у комбинации каналов. Вроде очевидная идея, однако же в таких популярных форматах, как MOD/XM и им подобных кодируют каналы одновременно (сначала не подумали, потом традиции).

— Кодировать не двумя структурами типа 'линейный список тактов и данные тактов' (так называемый ордер-лист), а обратными ссылками в данных тактов. Это упрощает код плеера, и эффективно, т.к. повторения в среднем бывают реже, нет смысла хранить список типа 0 1 2 3 4 5 6 7.
Схемы ардуинщиков, состоящие из нарезанных фотографий бредбордов, плат, и разноцветных проводов, нарисованных с машиностроительной точностью просто не перестают удивлять… )
Та эти схемы делает программа (ее название внизу справа изображения) которая имеет в себе все эти нарезанные фотографии, ты их только выставляешь и соединяешь там же проводками и все :) я мог бы сделать стандартную схему, но смысла не вижу. В проекте для авто, там уже не прокатит эта прога так как много внешних устройств, автономные блоки питания, реле, стабилизаторы напряжения и т.д.
Sign up to leave a comment.

Articles