© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
(«Радиомир. Ваш компьютер» 12/2004, 1/2005)
В этой статье я хочу рассказать об очередной своей программе
конверторе музыкальных модулей из формата наиболее популярного на ZX Spectrum
редактора Pro Tracker 3 в формат редактора Impulse Tracker для PC.
Конвертор представляет собой
Этот конвертор окажется полезным, например, если вы раньше писали музыку в
Pro Tracker 3 (далее PT3), а потом решили создать улучшенную версию
Сразу отмечу, что
В конверторе дополнительно предусмотрена возможность создания текстового
файла, содержащего всю информацию об исходном
![]() |
![]() |
Возможность получения текстового файла с содержимым исходного
Кстати, если вам надо преобразовать в формат IT модуль, написанный не в PT3, а в другом спектрумовском редакторе, то можно попробовать сделать так: сначала конвертировать модуль в формат pt3 с помощью редактора Vortex Tracker II Сергея Бульбы (http://bulba.at.kz) (этот редактор «понимает» большинство форматов спектрумовских музыкальных модулей), а потом уже использовать мой конвертор.
И ещё: если вам надо преобразовать модуль не в формат IT, а в
Формат командной строки при запуске программы (необязательные параметры заключены в фигурные скобки):
pt3_it.exe {/vN1,N2,
,N15} pt3-file it-file {text-file}
Для каждого файла при необходимости может быть указан полный путь к нему.
Если путь не указан, файл считается находящимся в текущем каталоге. Если
Если вам нужно получить только текстовый файл, то вместо имени
Необязательный параметр «/v» (от «volume» «громкость»), сразу после которого следуют перечисленные через запятую пятнадцать чисел, каждое от 0 до 64, предназначен для определения таблицы, по которой будут конвертироваться значения громкости в паттернах. Этот параметр вы можете использовать, если вас не устраивает таблица по умолчанию (см. раздел 3.8.5).
Если вам нужно конвертировать несколько модулей, используя одну и ту же
свою таблицу конвертирования значений громкости, то имеет смысл создать
pt3_it.exe /vN1,N2, ,N15 %1 %2 %3
Записав этот файл под именем, скажем, «pt3_it.bat», в дальнейшем при конвертировании модулей просто указывайте его имя в командной строке вместо «pt3_it.exe»:
pt3_it.bat pt3-file it-file {text-file}
Программа возвращает операционной системе код завершения: 0 успешное завершение, 1 ошибка. Сообщение об ошибке также выводится на экран.
Программа проверяет, чтобы все указанные в командной строке файлы были
различными. Это предотвращает потерю информации, если пользователем ошибочно
указаны одинаковые имена файлов (такое может быть, например, если командная
строка для запуска программы формируется с помощью файловой оболочки типа Dos
Navigator следующим образом: курсор стоит на исходном
Конвертируемые
Файл с исходным музыкальным модулем может быть и не обязательно с
расширением «pt3», лишь бы содержимое этого файла представляло
собой компилированный
Перед началом конвертирования программа проверяет длину исходного
Теперь расскажу о том, как использовать конвертор в качестве
фильтра для файлового менеджера Dos Navigator (далее DN), чтобы по нажатию F3,
когда курсор стоит на файле с расширением «pt3», можно было
посмотреть содержимое модуля. Кстати, просматриваемый
Замечу, что я использую DN OSP 3.7.0 (http://www.dnosp.ru), в других версиях DN возможность подключения фильтров может отсутствовать.
В главном меню DN выбираем «Настройки», в появившемся меню выбираем «Программы просмотра». При этом откроется для редактирования файл «dn.vwr». В него надо добавить такую строку:
pt3:pt3_it.exe !:!\!.! nul !%F
При этом предполагается, что исполняемый файл конвертора (pt3_it.exe) находится в одном из каталогов, указанных в переменной окружения PATH (её значение задаётся в файле «autoexec.bat»). Если это не так, то перед именем файла «pt3_it.exe» надо указать полный путь к нему. Например, если этот файл находится в каталоге «c:\work», то добавляемая строка должна выглядеть так:
pt3:c:\work\pt3_it.exe !:!\!.! nul !%F
После добавления строки нажмите F2, чтобы сохранить файл, а затем нажмите Esc, чтобы закрыть окно редактора.
В PT3 выделяется 32 символа на название модуля и 32 символа на информацию об авторе. В IT выделяется 25 символов на название модуля, а специальное поле для хранения информации об авторе не предусмотрено. Зато в IT есть так называемое Message (сообщение), длина которого, судя по описанию формата модулей IT, теоретически может достигать 65535 байтов.
Конвертор помещает первые 25 символов названия
В PT3 имеется параметр Tempo, который показывает, сколько фреймов (промежутков времени определённой величины) отводится на проигрывание одной строки паттерна. Длительность одного фрейма в PT3 равна длительности промежутка между двумя кадровыми прерываниями, то есть около 1/50 секунды (точное значение зависит от конкретной модели компьютера). В IT аналогичный параметр называется Speed. Параметр Tempo тоже есть в IT, но назначение его другое. Длительность одного фрейма в IT (обозначим её x) не фиксирована, а вычисляется как раз на основе параметра Tempo: x (в секундах) = 2,5/Tempo. Чтобы длительность одного фрейма в IT была такой же, как в PT3, должно выполняться равенство 1/50=2,5/Tempo, откуда Tempo=50*2,5=125.
В формируемом
Параметр Speed в IT может принимать значения от 1 до 255 включительно, а
параметр Tempo в PT3 от 2 до 63 включительно
Если в IT сэмпл это оцифрованный звук, то в PT3 сэмпл это скорее как бы программа, по которой каждый фрейм определяется значение регистров музыкального сопроцессора, а уже сопроцессор формирует звук. Поэтому сами сэмплы не конвертируются, а конвертируются только их номера в паттернах (см. раздел 3.8.4).
Замечу, что формируемый
Орнаменты в PT3 позволяют задавать смещение высоты звука в полутонах для каждого фрейма. Орнаменты используются для реализации псевдоаккордов (когда быстрая смена частот создаёт впечатление одновременности звучания этих частот), а также в других целях. В IT орнаменты не предусмотрены (есть, правда, команда Arpeggio Jxy, но она позволяет сделать лишь малую часть того, что можно сделать в PT3 с помощью орнаментов), поэтому при конвертировании информация об орнаментах игнорируется.
В PT3+67 максимальное количество паттернов 48, а в более ранних версиях PT3 ещё меньше. В IT максимальное количество паттернов 200, так что при конвертировании трудностей не возникает, даже учитывая возможность добавления дополнительного паттерна для реализации зацикливания модуля (см. раздел 3.7).
Конвертор, с расчётом на будущее, поддерживает до 85 паттернов в исходном
В IT длина каждого паттерна может быть от 32 до 200 строк включительно, а в
PT3 от 1 до 64 строк включительно. Таким образом, при
конвертировании приходится специально обрабатывать «короткие»
паттерны (длиной от 1 до 31 строки включительно). Таким паттернам в
формируемом
Если в «коротком» паттерне должна стоять команда для реализации зацикливания модуля (см. раздел 3.7), то команда «конец паттерна» в этом паттерне уже не ставится, так как она не нужна.
О конвертировании содержимого паттернов я подробно расскажу дальше (см. раздел 3.8).
Как указано в документации к PT3+67, максимальная длина списка позиций 256, как и в IT. У меня, впрочем, в PT3+67 не получилось создать модуль с 256 позициями, только с 255. Так или иначе, трудностей с конвертированием списка позиций не возникает.
Учитывайте, что список позиций в PT3 и в IT отображается
В PT3 модуль всегда зациклен. Начало и конец цикла отмечаются в списке позиций. Зацикленный участок может начинаться с любой позиции, а заканчивается всегда в последней позиции модуля. Не так дело обстоит в IT. Там зацикливание не отмечается в списке позиций, а осуществляется с помощью помещения в нужном паттерне команды Bxx (переход к позиции xx в списке позиций; переход происходит после того, как закончится проигрывание строки, содержащей эту команду).
При переносе информации о зацикливании модуля возможны два различных
случая. Первый случай когда паттерн, указанный в последней позиции
исходного
Эта команда ставится в первом же канале, не содержащем
Второй случай когда паттерн, указанный в последней позиции
исходного
Приведу пример. Пусть список позиций в исходном
Позиция Паттерн 0 0 1 1 * 2 2 * 3 1 |
При конвертировании будет сформирован новый паттерн (номер 3),
являющийся копией паттерна 1, и в этом новом паттерне будет поставлена
команда перехода к позиции 2 (началу цикла). Список позиций
сформированного
Позиция Паттерн 0 0 1 1 2 2 3 3 |
Если при доработке полученного
Конвертор переносит в формируемый
В паттернах PT3 3 канала, а в паттернах IT 64
канала, так что проблем с недостатком каналов не возникает. Каналы A, B и C
исходного
При конвертировании нот никаких трудностей не возникает, так как диапазон допустимых нот в PT3 (от C1 до B8) укладывается в диапазон допустимых нот в IT (от C0 до B9).
Вводимая в поле ноты команда «выключить звук в канале»
(R) преобразуется в
В PT3 максимальное количество сэмплов 31. Как уже было отмечено
выше, формируемый
В PT3 первые девять сэмплов обозначаются цифрами от 1 до 9, а
следующие буквами от A до V, так как для отображения номера
сэмпла в PT3 выделяется только одна позиция. В IT номера
инструментов десятичные числа, так что в полученном
В паттернах PT3 можно указывать громкость от 1 (нулевая громкость не предусмотрена) до 15, причём в PT3 значения громкости представлены в шестнадцатеричном виде (то есть от 1 до F). В паттернах IT можно указывать громкость от 0 до 64, значения громкости представлены в десятичном виде. В PT3 зависимость уровня сигнала от значения громкости логарифмическая (она зависит ещё и от типа музыкального сопроцессора AY или YM), в то время как в IT линейная.
При выборе способа конвертирования значений громкости я исходил из приведённого в описании AY графика зависимости уровня сигнала на выходе сопроцессора от значения громкости. Из этого графика можно сделать вывод, что уменьшение громкости на 1 соответствует уменьшению уровня сигнала в sqrt(2) раз. Тогда получается такая таблица соответствия значений громкости в PT3 и IT (все значения приведены в десятичном виде):
| Громкость в PT3 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Громкость в IT | 0 | 0 | 1 | 1 | 2 | 2 | 4 | 5 | 8 | 11 | 16 | 22 | 32 | 45 | 64 |
В конверторе также предусмотрена возможность использования таблицы, определённой пользователем (см. раздел 2).
Из девяти имеющихся в PT3 команд конвертируются только те, для которых это имеет смысл, а именно команды 1dxx (Slide down), 2dxx (Slide up), 3dxx (Tone portamento), 60xy (Vibrato) и B0xx (Set tempo). Далее конвертирование этих команд будет рассмотрено подробно.
Замечу, что значения параметров в командах как в PT3, так и в IT указываются в шестнадцатеричном виде.
Эта команда обеспечивает постепенное снижение высоты звука за счёт того, что значение делителя частоты каждые d фреймов увеличивается на xx. В IT для аналогичной цели используется команда Exx (Pitch slide down), где параметр xx (скорость снижения высоты) может принимать значения от 0 до DF, а также команды EFx (Fine pitch slide down) медленное снижение высоты и EEx (Extra fine pitch slide down) ещё более медленное снижение.
Конвертор просто преобразует команду 1dxx в команду Exx (за
исключением случая, когда d=0 и/или xx=0,
см. раздел 3.8.6.6), игнорируя параметр d
и перенося без изменений параметр xx (но если он будет больше DF,
конвертор заменит его на DF). Это наиболее простой подход, не обеспечивающий
точно такого же изменения высоты звука, как в исходном
Дело в том, что автоматическое принятие решения о том, какую команду
использовать (Exx, EFx или EEx), и автоматическое
определение параметров этой команды достаточно сложная задача. Не
буду вдаваться в подробности, отмечу только следующее. В формируемом
Эта команда обеспечивает постепенное повышение высоты звука за счёт того, что значение делителя частоты каждые d фреймов уменьшается на xx (кстати, формат модулей PT3 таков, что значения xx=0 в этой команде не может быть если сохранить модуль с командой 2d00, то в сохранённом модуле эта команда будет неотличима от 1d00). В IT для аналогичной цели используется команда Fxx (Pitch slide up), где параметр xx (скорость повышения высоты) может принимать значения от 0 до DF, а также команды FFx (Fine pitch slide up) медленное повышение высоты и FEx (Extra fine pitch slide up) ещё более медленное повышение.
Конвертор преобразует команду 2dxx в команду Fxx (за исключением случая, когда d=0, см. раздел 3.8.6.6) точно так же, как он преобразует 1dxx в Exx (см. предыдущий раздел).
Эта команда обеспечивает постепенное приближение высоты звука к высоте ноты, указанной в строке с этой командой, за счёт того, что значение делителя частоты каждые d фреймов изменяется на xx в нужном направлении (но если для достижения нужной частоты надо изменить значение делителя менее чем на xx, то так и будет сделано). Действие команды останавливается, когда текущая высота сравняется с высотой указанной ноты (если, конечно, команда не будет остановлена раньше). В IT для аналогичной цели используется команда Gxx (Portamento to note), где параметр xx (скорость изменения высоты) может принимать значения от 0 до FF.
Конвертор преобразует команду 3dxx в команду Gxx (за исключением случая, когда d=0 и/или xx=0, см. раздел 3.8.6.6) аналогично тому, как это происходит с командами 1dxx и 2dxx. Единственное отличие в том, что параметр xx не ограничивается значением DF.
Эта команда обеспечивает периодическое включение и выключение звука: x количество фреймов, в течение которых звук включён, y выключен. В IT для аналогичной цели используется команда Ixy (Tremor), параметры x и y которой имеют тот же смысл.
Конвертор преобразует команду 60xy в команду Ixy (за исключением случая, когда x=0, см. раздел 3.8.6.6), перенося параметры x и y без изменений.
Замечу, что поведение команды, когда x>0, а y=0, различается в PT3 и IT. Если в PT3 такая команда просто выключит звук через x фреймов, то в IT действие команды будет таким, как если бы y=1.
Первое замечание. В PT3 любая из команд 1dxx, 2dxx,
3dxx, 60xy действует до тех пор, пока либо не встретится новая
нота, либо не будет выключен звук командой R, либо не встретится
следующая команда 1dxx, 2dxx, 3dxx, 60xy. (Команда
3dxx может закончить своё действие и раньше, как только текущая высота
сравняется с высотой указанной ноты.) В то же время аналоги этих команд в IT
(Exx, Fxx, Gxx, Ixy) действуют только во время
проигрывания строки, в которой они находятся. Таким образом, чтобы добиться
такой же продолжительности действия команды в
Конвертор так и делает, причём, когда он повторяет команду, то ставит в ней нулевое значение параметра (для Ixy обоих параметров), что означает использование предыдущего ненулевого значения. Впоследствии это облегчит вам подбор значения параметра команды при доработке полученного модуля: достаточно будет изменить значение параметра лишь в первой команде последовательности.
Второе замечание. Команды 1dxx, 2dxx, 3dxx, у которых параметр d и/или xx равен нулю (то есть фактически не производящие изменения высоты звука), а также команда 60xy, у которой x=0 (также не влияющая на звук), ни во что не преобразуются, но служат для конвертора сигналом о прекращении действия предыдущих команд 1dxx, 2dxx, 3dxx, 60xy.
Для пояснения всего вышесказанного рассмотрим пример. Пусть имеется такой
фрагмент паттерна исходного
A-4 1F.F 11.1 <-- Началось действие команды. --- .... .... E-4 .... .... <-- Закончилось действие команды. --- .... .... C-4 .... 11.2 <-- Началось действие команды. --- .... .... --- .... .... --- .... .... --- .... 1... <-- Закончилось действие команды. --- .... .... |
Тогда соответствующий фрагмент паттерна сформированного
A-4 01 64 E01 ... .. .. E00 E-4 .. .. .00 ... .. .. .00 C-4 .. .. E02 ... .. .. E00 ... .. .. E00 ... .. .. E00 ... .. .. .00 ... .. .. .00 |
Третье замечание. В PT3 любая из команд 1dxx, 2dxx,
3dxx, 60xy, действие которой не закончилось в том же паттерне, в
котором она стоит, продолжает действовать и в следующих проигрываемых
паттернах, пока не выполнится одно из условий окончания действия команды. В то
же время конвертор обрабатывает паттерны по отдельности, независимо друг от
друга, и не отслеживает такие ситуации (то есть считает, что команда может
действовать максимум до конца паттерна, в котором она расположена). Так что
при доработке полученного
При этом может понадобиться и добавление дополнительных паттернов.
Рассмотрим пример. Пусть список позиций в исходном
Позиция Паттерн 0 0 1 1 2 0 3 2 |
Пусть в паттерне 1 стоит команда, действие которой не заканчивается в
этом паттерне, а заканчивается только в следующем проигрываемом
паттерне 0. В паттерне 0 эта команда действует, только когда
он проигрывается в позиции 2, но не в позиции 0. Тогда в
Четвёртое замечание. Команды изменения высоты Exx, Fxx и
Gxx, в которые конвертируются команды 1dxx, 2dxx и
3dxx, изменяют высоту звука каждый фрейм, кроме первого фрейма строки.
И если длительность проигрывания строки всего один фрейм, то эти
команды не окажут никакого действия. Учитывайте это при конвертировании
Эта команда устанавливает количество фреймов на строку (в PT3 этот параметр называется Tempo, в IT Speed), позволяя тем самым изменять скорость проигрывания. В IT этой команде соответствует команда Axx (Set speed).
Конвертор преобразует команду B0xx в команду Axx, перенося
параметр xx без изменений (так как длительность одного фрейма в
формируемом
При конвертировании все команды изменения скорости переносятся в
A-4 .... 11.2 <-- Началось снижение высоты. --- .... .... --- .... .... --- .... B..3 <-- Установили Tempo=3, --- .... .... снижение высоты продолжается. |
В формируемом
A-4 .. .. E02 ... .. .. E00 ... .. .. E00 ... .. .. E00 <-- Здесь команда A03 помешала бы ... .. .. E00 снижению высоты. |
Спасибо Дмитрию Быстрову (Alone Coder) за описание формата модулей PT3! Без этого описания конвертор вряд ли был бы создан!
|
Другие мои статьи об
|
|
Другие мои статьи о создании и/или обработке модулей Impulse Tracker:
|