http://www.pos.atlic.ru/index.php?na...w_file&lid=897
SOUND AGRESSOR
v.1.0 beta
17.o6.2oo3
(c) Himik's ZxZ/PoS-WT
────────────────────────────────
Свершилось! Не смотря на все жизненные трудности и прочую ерунду, которая, конечно же, пыталась внести коррективы в текучесть событий, я смог зарелизить данную версию своего паковщика музыки.
Как Вам уже, наверное, известно, основная цель, которую я преследовал при создании данного конвертора - это использование программы при написании так называемых 4k Intro для разного рода party.
Основная проблема подобных номинаций это то, что в столь малый объем памяти очень трудно вставить музыкальное сопровождение. Точнее вставить его можно, но оно будет либо слишком "корявым", либо слишком коротким, либо просто из-за музыки не останется места под нормальный эффект.
Думаю, это отчасти влияет на желание программиста писать данные интрухи.
Надеюсь, с помощью моей программы все станет проще.
Скажу сразу, полученный в результате "код", может быть гораздо объемнее оригинального музыкального файла, но мой
"код" после упаковки, к примеру, RIP'ом занимает во много раз меньше.
Небольшие характеристики:
Размер плейера - 400 байт.
Занимает тактов - от 900 до 3300,
зависит все от музы
Максимум байт - 16384.
Раскладка каналов - ABC.
Входной файл - Pro-Tracker v3.5x
не понимает DELAY=2
Приведу немного статистики. В приложении вы найдете все мелодии, которые я привел в данном списке.
┌──────────┬────────────┬───────┬───────────────── ┬────────────┐
│Music Name│Original Len│SAG Len│SAG after RIP Len│Pack Percent│
├──────────┼────────────┼───────┼───────────────── ┼────────────┤
│NOSE.m │ 1433 │ 08057 │ 0765 │ 91 │
│ESP4ANY.m │ 2702 │ 12619 │ 1912 │ 85 │
│PPQ1.m │ 2049 │ 04411 │ 0717 │ 83 │
│kukushka.m│ 4008 │ 12985 │ 2334 │ 82 │
│IMAGIN.m │ 4196 │ 15610 │ 2398 │ 85 │
└──────────┴────────────┴───────┴───────────────── ┴────────────┘
Сразу хочу заметить, что оригинальные и конвертированные мелодии были без плейера, а пакованные файлы без
распаковщика.
Еще немного инфы: я запаковал исходный модуль PPQ1.m, и получил файл в 617 байт, т.е. пакованый исходный модуль занимает меньше, чем пакованый конвертированный
Но это не беда! Мой модуль играется плейером в 400 байт, а исходный сколько занимает? Правильно, примерно 3400 байт, и как фигово он пакуется, примерно в 2100 байтДумаю, теперь ясно, о чем я.
Ну и сразу вспомнил баг! Данная версия программы не "умеет" контролировать объем получаемого модуля. Таким образом, если
при конверсии вы заметили, что объем мелодии показывает больше 16384, то в скором времени либо все зависнет, либо
одно из двухКороче говоря, муза просто не влезет в память
Коротко об алгоритме работы.
Уточнюсь, программа понимает мелодии только от редактора Pro-Tracker v3.5x и только без плейера.
1. Раскладываем мелодию на паттерны.
2. Раскладываем каждый паттерн на каналы A, B и С.
3. Составляем список "оригинальных" каналов. Т.е. убираем дубликаты каналов из разных паттернов.
4. Конвертируем каждый канал в отдельности по моему алгоритму.
5. Создаем список пакованных каналов.
6. Расставляем каналы в соответствии с Position List мелодии, т.е., грубо говоря, расставляем паттерны, которые состоят из смещений до каждого канала.
7. Устанавливаем Loop, т.е. зацикливание мелодии.
А вот теперь самое противное. Из-за особенности алгоритма паковки, мы получаем внушительный список "НЕЛЬЗЯ", которые должен учитывать музыкант при создании своего шедевра, и это, конечно, очень печально. Но, к сожалению - это факт.
Кое-какие минусы я не мог предугадать, и вот результат - бывают глюки
Нельзя:
1. Использовать в одном из каналов паттерна чередующиеся команды DELAY.
Поясню почему, пакую я поканально, а это значит, что пакуя канал А паттерна 5, DELAY будет всегда равным текущему, и если в данном паттерне в канале B была смена DELAY, то паковка канала А на это не обратит внимания, т.к. повторюсь - паковка идет поканально !!! И, когда я пакую канал А, я знать не знаю от какого он паттерна, и, тем более, что там происходит в канале В.
2. Использовать одновременно огибающую в разных каналах.
Рассмотрим пример:
У нас в канале В была огибающая, и мы ее успешно сконвертили. Потом нам попался канал С от этого паттерна, где включалась огибающая без смены частоты, и к чему это приведет? Правильно, конвертор вставит команду включения огибающей, укажет её период, да только вот частоты огибающей не будет! Она будет равна нулю, а значит при воспроизведении занесутся нулевые значения в регистры частоты огибающей, и вы не услышите того, что было до этого в
канале В.
3. Использовать в мелодии эффекты "продолжения звука" от предыдущего паттерна. Т.е. использовать в предыдущих паттернах звук, который должен продолжать свое звучание в данном канале но уже в другом паттерне.
Конвертор в таком случае возьмет канал паттерна, в котором должен продолжаться звук и запакует его. Но, т.к. первых нот в паттерне нет, звук будет опять-таки нулевым.
4. Указывать в начале канала ноту, не содержащую информации о номере сэмпла, орнамента и громкости. Громкость-то, допустим, при паковке станет F, а вот сэмпл с орнаментом будут равны фиг знает чему, а значит, вместо звука будет дребедень и лажа. Так что не забывайте в начале каждого канала указывать реальные номера инструментов.
Это опять из-за того, что паковщик работает поканально, и он ничего не знает о том, что там до него было установлено. Каждый раз все обнуляется.
Исходя из этого, можно сделать небольшую рекомендацию:
Храните деньги в сберегательной кассе! Тьфу, глюк!
При написании мелодии старайтесь чаще использовать одинаковые каналы в разных паттернах. Например, создав одну бас-ритм партию, старайтесь все завязать на нее. Думаю, поюзав, поймете.
Данная версия очень сырая, после конвертирования одного музона второй уже не пойдетЭто погрешность скорости сборки, старался успеть перед CAFe'03, чтоб Вы, возможно, создали свой шедевр в 4К intro.
В приложении найдете компилированный под #C000 плеер музы, а также его исходники. А для тех, кому очень интересно исходник будет ниже
Теперь о том, как вообще чего сделать, и как добиться оптимального резульата.
Значится, так... О том, что делать с музой, я уже написал, а вот, что делать после конвертирования:
Рассмотрю вариант с плейером.
Для начала, отгрузите модуль SAG с плейером. Кстати, после паковки муза будет воспроизведена, и на бордере вы увидете пару полосок. Красная так просто, а вот синяя - это, собственно, тактомер плейера, - сколько же он жрет тактов?
После чего нужно примерно прикинуть, а сколько он будет занимать в пакованном виде? Грузим RIP (Real Information Packer) и пакуем музу. Видим примерный результат паковки. Прикидываем и, если все ок, пишем свою прогу дальше
Замечу, что паковать RIPом выгоднее. Он сжимает гораздо мощнее HRUSTа. И конечно, вы понимаете, что максимальный резальтат паковки вы получите только при паковке всей своей программы вместе.
Допустим, у вас уже все готово, собрано и отгружен объектный код, в дебрях которого уже есть муза с плейером. Осталось только запаковать и все.
Еще совет: для более душевного результата паковки используйте автоматический перебор окна паковки в RIP v0.25, и тогда вам возможно выиграть не один десяток байт
И напоследок скажу, что у отгруженного модуля SAG малость нестандартные адреса входа.
#C000 (49152) - Init music
#C043 (49219) - Play music
А еще есть один багЯ где-то похоже потерял регистр BC, из-за чего небольшой совет, сохраните регистр BC после вызова плейера так, чтоб он восстановился перед вызовом плейера
M1 LD BC,#0000
CALL #C043
LD (M1+1),BC
Возожно это альтернативный BC, не помню. Разберетесь, я думаю. Если этого не сделать, то возможно, в Вашей программе будут слышны глюки в музыке. Я на такие грабли наступил, когда делал интру к Izhnews #0D. Да! Кстати, там музыка в интре запакованна именно этим алгоритмом.





Ответить с цитированием