Свежие обсуждения
Микроконтроллеры

Вэйвтэйбл синтезатор

1 3 26

А вот программа для преобразования файлов WAVE/RIF16-bit PCM / mono / 8000Hz F в Intel HEX-файл.

109331.rar

 

AHTOXA:
Могу помочь
Тенкс, но, насколько понял из статьи, она умеет только убирать заголовок вавки, и прошивать это в какой-то программатор.

IDiod:
аудиоредакторы позволяют экспортировать данные в текст
Да собственно в текст и не надо (хотя, интересно, как это там будет выглядеть).

Поясняю подробно, что надо.
Я Кулом не пользуюсь, предпочитаю Форж. Там можно действительно экспортнуть во что хошь. По-моему целесообразней в RAW. Насколько понимаю, его потом можно сразу грузить в м/сх памяти. Только в современные чипы можно запихнуть не один такой файл. В приведённой выше статье звучит совершенно здравая мысль, что надо их "сростить", а информацию о начале, окончании, и прочую вспомогательную поместить в самом начале, в специально отведённой служебной области. Там же даётся программа, которая это делает. Но нет никаких сведений о структуре создаваемой области. Я смотрел полученные файлы в Волкове и в IC-Proge, но так и не понял. Кроме того, как мне кажется, под служебную область отведен слишком большой объём. Поэтому, если не удастся разобраться с прогой, надо будет это делать как-то самому. Допустим, сместить данные первого RAW'а, что бы вписать свою служебную область, можно и в Волкове, а вот как "прицепить" туда данные из второго и последующих RAW'ов? В блокноте?

 

Gregory: как "прицепить" туда данные из второго и последующих RAW'ов?

Есть волшебная команда copy /b Пишете каждую мелодию в отдельный файл, потом формируете файл со служебной информацией, и наконец, слепляете всё в кучу:

  copy /b info.bin + melody1.bin + melody2.bin + melody3.bin proshivka.bin

Следующий вопрос - как сформировать служебную информацию?

Ну конечно проще довериться компьютеру. Написать скрипт/программку... Всё равно же без программирования не обойтись
Но можно и руками. Создаёте в блокноте файл нужного размера (N пробелов) и заполняете в Hex-редакторе.

Кстати, вот хекс-редактор Hiew (в аттаче), может, пригодится?

109343.rar

 

AHTOXA:
copy /b
Ключ b "склеивает" файлы? Подзабыл я уже старый, добрый DOS. Что-то, как-то не доводилось мне этим ключом пользоваться. А следующий файл "прицепится" к последнему адресу, или всё-таки "отступит до новой строки"?
В любом случае, если оно работает, то, вроде должно решить задачу. Только алгоритм придётся малость усложнить:
Сперва создаём служебную область в первом файле, и заносим необходимые данные. Затем "приклеиваем" второй файл, и заносим в служебную область данные о нём.
Затем с третьим, и так далее.
А иначе, я не представляю, как выяснить адреса начала и окончания.

AHTOXA:
Создаёте в блокноте
Можно и проще. Просто вставить эти пробелы в самый первый RAW.

в Hex-редакторе
Как выше говорил, подойдёт и Волков. Во всяком случае, с небольшими файлами.

может, пригодится
Безусловно.

 

Ключ /b просто задаёт бинарный режим работы. То есть, все байты берутся как есть и обрабатываются без изменений.

Адреса начала и окончания вычисляются из размеров файлов мелодий
Адрес начала служебного блока = 0;
Адрес начала первой мелодии = длина служебного блока;
Адрес начала второй мелодии = длина служебного блока + длина первой мелодии;
И т. д.
Длину служебного блока лучше взять с запасом, чтобы не увеличивать каждый раз при добавлении мелодии.

Кстати, можно обойтись вовсе без служебного блока. Просто перед мелодией записывать её длину. (а после последней мелодии - 0)

 

AHTOXA:
записывать её длину
А можно ведь и без этого. Просто, 0 будет разделителем мелодий.

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

вычисляются
Да, понятно, что можно и так, но, при ручном вводе, легко ошибиться. Поэтому, я - за "сложный вариант".

 

Gregory: 0 будет разделителем мелодий.

Не, это не фонтан. Во-первых нельзя использовать 0 в мелодии, а во-вторых, придётся последовательно читать всю флешку.

Gregory: при ручном вводе, легко ошибиться. Поэтому, я - за "сложный вариант".

А "сложный" - он не вручную?

Я тут подумал... Всё равно Вы скорее всего будете один раз при старте программы считывать служебную информацию в память контроллера, и в дальнейшем при работе пользоваться информацией из памяти. В этом случае служебную информацию можно безболезненно выкинуть, и сделать как я сказал - размер - мелодия - размер - мелодия - ... - размер - мелодия - 0. А при запуске - разок пробежаться и запомнить эти адреса.

 

AHTOXA: Кстати, вот хекс-редактор Hiew (в аттаче), может, пригодится?
Используйте лучше Winhex.

 


WinHex - универсальный HEX-редактор.
http://2baksa.net/news/19718/

Здесь русский .

http://2baksa.net/news/16562/

Открываете в нем ваш файл. Далее выделяете необходимый блок.
Держа левую кнопку нажатой.
Идете -> Edit-> Copy Block -> C source , и вставляете в ваш файл , созданный например в блокноте( PASTE).

Единственное: в Wave файле надо отсекать заголовок и сколькото байт в конце( не помню точно).

 

Это ringin.wav из виндовского набора(часть).
5 СЕКУНД ДЕЛАЕТЬСЯ.
Вот что получаеться:

unsigned char data[335] = {
0x86, 0xBC, 0x9A, 0x76, 0x53, 0x3C, 0x7A, 0x7A, 0x9C, 0xBE, 0x6A, 0x74, 0x6E, 0x50, 0x8B, 0x90,
0x9A, 0x8F, 0x75, 0x9C, 0x75, 0x81, 0x9F, 0x56, 0x75, 0x87, 0x78, 0xB0, 0xA1, 0x90, 0x6C, 0x47,
0x7A, 0x71, 0x9C, 0xD5, 0x8A, 0x83, 0x6A, 0x3E, 0x76, 0x8A, 0xAA, 0xA5, 0x7A, 0x86, 0x4D, 0x5D,
0x99, 0x6F, 0x8F, 0x94, 0x6C, 0x90, 0x83, 0x8C, 0x80, 0x5B, 0x80, 0x62, 0x7A, 0xC1, 0x8D, 0x8F,
0x7A, 0x41, 0x65, 0x78, 0xA6, 0xBA, 0x94, 0x9A, 0x52, 0x44, 0x8B, 0x74, 0x9C, 0xB2, 0x7D, 0x82,
0x66, 0x73, 0x7F, 0x6B, 0x9A, 0x76, 0x6B, 0xA5, 0x76, 0x83, 0x8B, 0x57, 0x6B, 0x65, 0x87, 0xA6,
0x8C, 0xA4, 0x61, 0x3C, 0x75, 0x61, 0x92, 0xBD, 0x94, 0x8C, 0x58, 0x5C, 0x6F, 0x6B, 0xB0, 0x94,
0x74, 0x97, 0x5F, 0x70, 0x8C, 0x73, 0x88, 0x73, 0x85, 0x95, 0x7B, 0xA9, 0x7B, 0x53, 0x80, 0x5F,
0x86, 0xB7, 0xA0, 0xA0, 0x65, 0x5C, 0x65, 0x5D, 0xB0, 0xAD, 0x8D, 0xA3, 0x58, 0x5B, 0x7A, 0x79,
0xA0, 0x8A, 0x8D, 0x88, 0x5D, 0x90, 0x7E, 0x64, 0x92, 0x66, 0x78, 0x9B, 0x8D, 0xA1, 0x75, 0x69,
0x67, 0x4B, 0x97, 0xA8, 0x92, 0xB2, 0x67, 0x53, 0x6A, 0x69, 0xA1, 0xA1, 0xA5, 0x99, 0x52, 0x79,
0x76, 0x66, 0xAA, 0x8A, 0x82, 0x90, 0x76, 0x8F, 0x78, 0x7D, 0x82, 0x51, 0x8A, 0x97, 0x81, 0xB3,
0x79, 0x5A, 0x6B, 0x5C, 0x82, 0x8F, 0xA6, 0xA3, 0x60, 0x75, 0x5C, 0x5A, 0xA9, 0x8B, 0x83, 0x7E,
0x5D, 0x7E, 0x79, 0x8D, 0x94, 0x58, 0x78, 0x73, 0x6C, 0xB8, 0x92, 0x78, 0x79, 0x55, 0x73, 0x76,
0xA5, 0xC1, 0x7A, 0x8C, 0x67, 0x3E, 0x8B, 0x8C, 0x91, 0xA0, 0x7B, 0x83, 0x67, 0x7D, 0x97, 0x60,
0x8A, 0x87, 0x5F, 0xA3, 0x97, 0x8C, 0x8A, 0x60, 0x73, 0x62, 0x85, 0xBC, 0x83, 0x96, 0x73, 0x2F,
0x70, 0x7D, 0x96, 0xBC, 0x97, 0x8F, 0x55, 0x57, 0x87, 0x66, 0x99, 0xA1, 0x66, 0x94, 0x76, 0x73,
0x8A, 0x6B, 0x81, 0x6A, 0x79, 0xA9, 0x7F, 0x9A, 0x88, 0x43, 0x73, 0x6F, 0x87, 0xBC, 0xA1, 0xA3,
0x60, 0x44, 0x6F, 0x5B, 0xA0, 0xC3, 0x88, 0x92, 0x60, 0x50, 0x71, 0x74, 0xA6, 0x8A, 0x80, 0x9E,
0x5F, 0x82, 0x94, 0x5F, 0x86, 0x75, 0x79, 0x9C, 0x8C, 0xA1, 0x67, 0x49, 0x73, 0x4C, 0x8C, 0xC2,
0x95, 0xA1, 0x66, 0x47, 0x5B, 0x60, 0xA5, 0xA3, 0x92, 0xA1, 0x4D, 0x5F, 0x81, 0x60, 0x9B
};