MIDI плейер для AVR

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


NebelWefer
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 16, 2009 14:23:59

Re: MIDI плейер для AVR

Сообщение NebelWefer »

поскажите по формату мелодии на выходе программы:

Код: Выделить всё

{
        [тиков таймера подождать до этого события]
        [канал]
        [нота или 0 === отключить]
    }
typedef struct
    {
        //highest bit is highest for channel index
        uint8_t m_noteNumber;
        ///15-3 bits - Delta value, 2,1,0 bits - channel index
        uint16_t m_delta;
    } TPlayerStateChange;

const TPlayerStateChange s_melody_events[123] = {
   { 42, 9 },//1-1
   { 30, 10 },//1-2
   { 49, 128 },//16-0
   { 0, 128 },//16-0
   { 56, 8 }, //1-0
   { 44, 9 },//1-1
   { 68, 266 },//33-2
   { 57, 8 },//1-0
   { 45, 9 },//1-1
   { 69, 266 },//33-2
   { 54, 8 }, //1-0
...

вот в комментариях я выписал значения delta и Nch:
как проигрывается данный файл?
1) ждем 1 тик таймера с fдискретизации
2) выдаем в канал PWM ноту №42
3) ждем еще 1 тик? или сразу добавляем на выход ноту №30?
4)ждем 16 тиков
5)....
Аватара пользователя
hax
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Вт окт 25, 2011 17:39:42
Откуда: Киев
Контактная информация:

Re: MIDI плейер для AVR

Сообщение hax »

1) Так, только тики 255Гц.
2) минимальное значение тиков - 1, это сделано для того, чтобы плейер не обрабатывал несколько нот на одном событии. Даже если по нотам было по-другому, это незаметно при прослушивании. Значение тиков 0 обозначает конец мелодии.
NebelWefer
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 16, 2009 14:23:59

Re: MIDI плейер для AVR

Сообщение NebelWefer »

ясно , спасибо. Хотелось еще уточнить:
после того как обработано событие, например, { 42, 9 },//1-1, это значит, что нота 42 будет присутствовать на выходе до тех пор, пока не появится новое значение на 1м канале либо {0, 0b...001} ?
накидал в виде диаграммы, правильно ли я понял?
вместо частоты просто номер ноты поставил
Вложения
dia.png
(18.08 КБ) 545 скачиваний
Аватара пользователя
hax
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Вт окт 25, 2011 17:39:42
Откуда: Киев
Контактная информация:

Re: MIDI плейер для AVR

Сообщение hax »

Нота на канале звучит, пока не будет установлена другая нота на этот канал, или не придет событие отключения на этот канал(нота=0).
На диаграмме все каналы включились одновременно, так быть не может - задержка минимум 1 тик.
И я не понял, что обозначает диаграмма Вых.
NebelWefer
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 16, 2009 14:23:59

Re: MIDI плейер для AVR

Сообщение NebelWefer »

ой, со стартом оплошал :oops: , но идею понял верно.
под выходом подразумевал sample , который потом отскалировать согласно CHANNEL_COUNT
NebelWefer
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 16, 2009 14:23:59

Re: MIDI плейер для AVR

Сообщение NebelWefer »

а вот еще вопрос возник:

Код: Выделить всё

uint16_t s_noteFreqEx[ 12 ] = { 0xFCDF, 0xEEAE, 0xE147, 0xD4A3, 0xC8B4, 0xBD70, 0xB2CE, 0xA8C4, 0x9F4B, 0x965C, 0x8DEB, 0x85F3 };

uint16_t inline Player_GetNoteFreqAdd( uint8_t _noteNumber )
{
    uint8_t noteIndex;
    uint8_t noteDiv;
   
    noteIndex = 132 - 1 - _noteNumber;
    noteDiv =   noteIndex / 12;  //how many octaves down
    noteIndex = noteIndex - 12 * noteDiv;
    return s_noteFreqEx[ noteIndex ] >> noteDiv;
}           

возьмем, например, ноту №42 из таблицы http://img.radiokot.ru/files/47221/4xp1cfzuz.png
№42=92Гц
если считать по данному алгоритму:

Код: Выделить всё

noteIndex = 132 - 1 - 42=89;
    noteDiv =   89 / 12 = 7 //how many octaves down
    noteIndex = 89 - 12 * 7 = 5;
    return s_noteFreqEx[ 5 ] >> 7 = 0xBD70 / 2^7 = 48496 / 127 = 378 Гц;

где подвох?
Аватара пользователя
hax
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Вт окт 25, 2011 17:39:42
Откуда: Киев
Контактная информация:

Re: MIDI плейер для AVR

Сообщение hax »

Эта функция возвращает значение для приращения указателя в таблицу семпла.
rft2
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Пн ноя 15, 2010 19:17:00
Откуда: Москва

Re: MIDI плейер для AVR

Сообщение rft2 »

Изображения в статье не грузятся.
[url=http://userbars.ru/][img]http://img811.imageshack.us/img811/3482/moscowbar.jpg[/img][/url]
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Re: MIDI плейер для AVR

Сообщение BlackKilkennyCat »

Всё поправимо при помощи машины времени: https://web.archive.org/web/20170827061 ... al/game/51

А вообще - офигенно звучит, вспомнился атари :)
Меня здесь больше нет
Аватара пользователя
hax
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Вт окт 25, 2011 17:39:42
Откуда: Киев
Контактная информация:

Re: MIDI плейер для AVR

Сообщение hax »

Копия статьи с рисунками:
http://www.deep-shadows.com/hax/wordpress/?page_id=1111
Аватара пользователя
Starichok51
Модератор
Сообщения: 19043
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: MIDI плейер для AVR

Сообщение Starichok51 »

подниму тему и обращусь к сообщению с первой страницы:[uquote="Dmitry Dubrovenko",url="/forum/viewtopic.php?p=1819386#p1819386"]В 8-битном сэмпле, без знака, нет значения 00h (иначе сэмпл будет несимметричным).[/uquote]Dmitry Dubrovenko, ты не прав, значение 0 имеет право быть.
работа таймера в режиме Fast PWM такова, что при 0 в регистре сравнения таймер формирует импульс шириной в 1 такт таймера.
а при числе 255 (ШИМ 8 бит) в регистре сравнения таймер формирует постоянную 1 на своем выходе.
таким образом, "запрещенным" числом является число 255 в регистре сравнения, а не число 0.
а идеально симметричный меандр (одинаковые длительности импульса и паузы) получаются в числе 127 в регистре сравнения.
и таким образом, таблицу синуса нужно строить относительно числа 127 (ноль синуса), а максимальные пределы изменения синуса тогда будут от 0 до 254.
при этом ширина импульса будет изменяться от 1 такта (при 0 в регистре сравнения) до 255 тактов (при 254 в регистре сравнения), и будем иметь идеальную симметрию сэмплов.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2349
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: MIDI плейер для AVR

Сообщение Dmitry Dubrovenko »

Starichok51 писал(а):значение 0 имеет право быть.
Ну, во-первых, речь шла не о работе АВР, а о формате звукового сэмпла Unsigned.
Там используются значения от 1 до 255, а середина - 128.
Про особенности работы АВРов я изрядно подзабыл, но вот из твоих слов не вижу никаких противоречий.
Почему ты считаешь, что 255 - запрещённое состояние?
Ну будут все 256 тактов, так и что?
Главное, что б весь диапазон составлял нечётное количество уровней, тогда сэмпл будет симметричным.
Кстати, насколько помнится, в АВРах был интересный режим PWM, когда использовался не один а два "симметричных" такта.
В первом сперва шёл 0, а затем 1, а во втором - наоборот.
Таким образом результирующий импульс изменялся симметрично относительно частоты PWM.
Правда для этого её необходимо было повышать в два раза.
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19043
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: MIDI плейер для AVR

Сообщение Starichok51 »

я уже достаточно подробно все объяснил, в том числе и почему 255 - запрещенное число.
при 255 ШИМ "стоит" - на выходе держится постоянно 1. это нам не годится.
а если "середина" равна 127 - то имеем идеальный, симметричный меандр.
и изменения "туда-сюда" на 127 дадут нам диапазон от 0 до 254, всего 255 состояний - именно нечетное число.

"интересный режим" - это "PWM, Phase Correct". счетчик считает "туда и обратно". поэтому частота ШИМ получается в 2 раза ниже, чем при быстром ШИМе (Fast PWM).
и этот режим нам не подходит именно из-за того, что частота в 2 раза ниже, чем при быстром ШИМе.
и вот, в режиме "Phase Correct", как раз ноль будет запрещенным числом,так как при 0 импульс на выходе отсутствует - на выходе держится постоянно 0.
и поэтому там, как раз, серединой будет 128, а изменения на 127 "туда-сюда" дадут нужное нам нечетное число состояний от 1 до 255.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2349
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: MIDI плейер для AVR

Сообщение Dmitry Dubrovenko »

Starichok51 писал(а):это нам не годится
Да почему не годиться-то?
Конечный результат будет абсолютно одинаковый используем мы диапазон от 1 до 255, или от 0 до 254.
Но в первом случае данные представлены в формате 8-bit Unsigned, а во втором их надо специально пересчитывать перед выводом в PWM.
Starichok51 писал(а):этот режим нам не подходит именно из-за того, что частота в 2 раза ниже
Опять же, что в этом страшного?
Вы путаете частоту PWM и частоту квантования.
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19043
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: MIDI плейер для AVR

Сообщение Starichok51 »

опять-таки, ты задаешь вопрос, когда я чётко написал ПОЧЕМУ не годится.
и в прошлый раз я всё четко расписал, но взялся задавать вопросы, как будто не понял написанного мной.
мне совершенно не приходится ничего пересчитывать при диапазоне от 0 до 254 в режиме "быстрого" ШИМ.
ничего я не путаю.
я прекрасно различаю частоту сэмплирования частоту ШИМ, которая и воспроизводит звук.
конешно, ничего страшного нет в том, что в режиме Phase Correct частота в 2 раза ниже, но лично мне это не нравится.
и в режиме Phase Correct с диапазоном от 1 до 255 тоже не нужно ничего пересчитывать.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2349
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: MIDI плейер для AVR

Сообщение Dmitry Dubrovenko »

Starichok51 писал(а):я чётко написал ПОЧЕМУ не годится
Отнюдь.
Ты написал, что при 255 будет полное заполнение, но ПОЧЕМУ ты считаешь, что оно не годиться, не сказал.

Starichok51 писал(а):не приходится ничего пересчитывать
Как же не приходится, если данные храняться в диапазоне 1-255, а ты используешь 0-254?
Нужен банальный декремент каждого байта.
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19043
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: MIDI плейер для AVR

Сообщение Starichok51 »

не годится потому, что полное заполнение нарушает форму (симметрию) выходного сигнала ШИМ.
с полным заполнением из-за нарушения симметрии будет подмагничивание динамика. хотя, на слух это обнаружить практически невозможно.
нам нужно, чтобы ширина импульса изменялась от 1 такта таймера до 255 тактов.
то есть, при 255 тактах импульса должна быть пауза в 1 такт.
соответственно, при 1 такте импульса должна быть пауза в 255 тактов.
и никаких полных заполнений не допускается.
тогда будет абсолютная симметрия генерируемого синуса.
у меня данные синуса хранятся в диапазоне 0-254 - пересчитывать ничего не надо. и середина диапазона, как я уже сказал = 127.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2349
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: MIDI плейер для AVR

Сообщение Dmitry Dubrovenko »

Starichok51 писал(а):полное заполнение нарушает форму (симметрию)
Господь с тобой! Что ж ты такое говоришь-то? :)
Подмагничивание у тебя возникнет, если ты не уберёшь постоянную составляющую из РЕЗУЛЬТИРУЮЩЕГО сигнала (и без разницы, будешь ты менять от 0 до 254, или от 1 до 255, ибо это будет в диапазоне от 0 до Uпит МК). А для этого задаются минимальной частотой сигнала и ставят ФВЧ. Но это - уже аппаратная особенность и к формату хранения сэмпла не имеющая отношения.
Starichok51 писал(а):нам нужно, чтобы ширина импульса изменялась от 1 такта таймера до 255 тактов
Да не нужно нам этого.
Нам нужно, что б динамический диапазон составлял 255 значений и только, вот тогда и будет симметрия.
Starichok51 писал(а):у меня данные синуса хранятся в диапазоне 0-254
А где ты их берёшь-то?
Все редакторы создают звуковые файлы в формате 1-255.
Следовательно, всё-равно конвертировать приходится.
И так понимаю, ты ещё никакой арифметики с ними не производил. :wink:
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: MIDI плейер для AVR

Сообщение ARV »

подадим минимум диапазона на ШИМ - увидим редкие короткие импульсы. подадим максимум - увидим постоянную единицу. (для рассматриваемого режима ШИМ). несимметрия очевидна. какие еще вопросы?
кстати, динамический диапазон для 1-байтного формата не 255 зачений, а 127.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Starichok51
Модератор
Сообщения: 19043
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: MIDI плейер для AVR

Сообщение Starichok51 »

Dmitry Dubrovenko писал(а):А где ты их берёшь-то?
Все редакторы создают звуковые файлы в формате 1-255.
а мне не нужны редакторы. мне программа на С++ делает все расчеты.
причем, на любое количество сэмплов (шагов) синуса, но всегда со смещением 127 нуля синуса.
я сам задаю число шагов и величину смещения нуля синуса.
у меня был даже вариант, где синус состоял из 122 шагов, чтобы при дельта=1 выходная частота была 256 Гц.
а несимметрию при значении 128 ты легко можешь посмотреть в том же Протеусе.
создай простенькую программу с таймером в режиме "быстрого" ШИМ (8 бит), и осциллографом увидишь, что при числе 128 длительность импульса больше длительности паузы.
а при числе 127 длительность импульса точно равна длительности паузы.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Ответить

Вернуться в «Статьи»