(c) Иван Рощин, Москва ZXNet : 500:95/462.53 E-mail: bestview@mtu-net.ru WWW : http://www.ivr.da.ru Конвертор Pro Tracker 3 -> Impulse Tracker ══════════════════════════════════════════ ("Радиомир. Ваш компьютер" 12/2004, 1/2005) 1. Введение ─────────── В этой статье я хочу рассказать об очередной своей программе - конверторе музыкальных модулей из формата наиболее популярного на ZX Spectrum редактора Pro Tracker 3 в формат редактора Impulse Tracker для PC. Конвертор представляет собой DOS-программу для PC, скачать его можно с сайта журнала или с моей web-страницы. Этот конвертор окажется полезным, например, если вы раньше писали музыку в Pro Tracker 3 (далее PT3), а потом решили создать улучшенную версию какого-то своего произведения, используя Impulse Tracker (далее IT). Как вы увидите дальше, конвертор может пригодиться и не только в этом случае. Сразу отмечу, что it-модуль, сформированный конвертором, надо будет ещё доработать вручную: подобрать инструменты, подобрать значения параметров в командах Pitch slide и Portamento, и так далее. В конверторе дополнительно предусмотрена возможность создания текстового файла, содержащего всю информацию об исходном pt3-модуле (см. рис. 1, 2). Этот текстовый файл может пригодиться при доработке полученного it-модуля. Например, если в процессе доработки вы просматриваете и прослушиваете исходный pt3-модуль в PT3 (с помощью реального ZX Spectrum или эмулятора), то просматривать содержимое паттернов может быть более удобно как раз в текстовом файле, а не с помощью PT3 (где показывается лишь небольшой участок паттерна, так что приходится пользоваться прокруткой). ╔══════════════════════════════════════════════════════════════╗ ║Music: New Year ║ ║ by: Ivan Roshin, Moscow, 1.01.2001 ║ ║ ║ ║Editor: Pro Tracker 3.4 ║ ║Frequence table: ASM or PSC ║ ║Tempo: 4 ║ ║ ║ ║Positions list ║ ║ ║ ║00 * 03 hex (03 dec) ║ ║01 * 01 hex (01 dec) ║ ║02 * 02 hex (02 dec) ║ ║03 * 00 hex (00 dec) ║ ║04 * 05 hex (05 dec) ║ ║05 * 06 hex (06 dec) ║ ║06 * 07 hex (07 dec) ║ ║07 * 08 hex (08 dec) ║ ║08 * 04 hex (04 dec) ║ ║ ║ ║Pattern 0 hex (0 dec) ║ ║ ║ ║00 | .... | .. | D-6 2F34 .... | D-5 1F.F .... | D-5 2F19 ....║ ║01 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║02 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║03 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║04 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║05 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║06 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║07 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║08 | .... | .. | --- .... .... | A-5 .... .... | --- .... ....║ ║09 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║10 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║11 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║12 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║13 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║14 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║15 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║16 | .... | .. | --- .... .... | D-5 .... .... | --- .... ....║ ║17 | .... | .. | --- .... .... | --- .... .... | --- .... ....║ ║18 | .... | .. | --- .... .... | A-4 .... .... | --- .... ....║ ................................................................ Рис. 1 ................................................................ ║Sample 1 (1 dec) ║ ║ ║ ║00 000 +0000 00 T-E ############### F ║ ║01 000 +0000 00 T-E ##############. E ║ ║02 000 +0000 00 T-E ############... C ║ ║03 * 000 +0000 00 T-E #########...... 9 ║ ║04 * 000 +0002 00 T-E #########...... 9 ║ ║05 * 000 +0002 00 T-E #########...... 9 ║ ║06 * 000 +0000 00 T-E #########...... 9 ║ ║07 * 000 +0000 00 T-E #########...... 9 ║ ║08 * 000 -0002 00 T-E #########...... 9 ║ ║09 * 000 -0002 00 T-E #########...... 9 ║ ║10 * -00 +0000 00 T-E #########...... 9 ║ ║ ║ ║Sample 2 (2 dec) ║ ║ ║ ║00 * 000 +0000 00 T-E ############### F ║ ║ ║ ║Ornament 1 hex (1 dec) ║ ║ ║ ║00 * +00 ║ ║01 * +03 ║ ║02 * +03 ║ ║03 * +07 ║ ║04 * +07 ║ ║ ║ ║Ornament 2 hex (2 dec) ║ ║ ║ ║00 * +00 ║ ║01 * +04 ║ ║02 * +04 ║ ║03 * +09 ║ ║04 * +09 ║ ║ ║ ║Ornament 3 hex (3 dec) ║ ║ ║ ║00 * +00 ║ ║01 * +03 ║ ║02 * +07 ║ ................................................................ Рис. 2 Возможность получения текстового файла с содержимым исходного pt3-модуля может быть полезной и в других случаях. Например, если вы в переписке с кем-то обсуждаете некоторый pt3-модуль, и вам надо привести обсуждаемый фрагмент модуля в текстовом виде. Или если нужно посмотреть содержимое какого-нибудь pt3-модуля, не используя PT3 (ниже будет описано, как для этого можно подключить конвертор к Dos Navigator'у). Кстати, если вам надо преобразовать в формат IT модуль, написанный не в PT3, а в другом спектрумовском редакторе, то можно попробовать сделать так: сначала конвертировать модуль в формат pt3 с помощью редактора Vortex Tracker II Сергея Бульбы (http://bulba.at.kz) (этот редактор "понимает" большинство форматов спектрумовских музыкальных модулей), а потом уже использовать мой конвертор. И ещё: если вам надо преобразовать модуль не в формат IT, а в какой-либо другой, то посмотрите: может быть, существует конвертор из формата IT в нужный вам формат. Тогда можно сначала преобразовать модуль в формат IT, а потом уже в нужный вам формат. 2. Работа с программой ────────────────────── Формат командной строки при запуске программы (необязательные параметры заключены в фигурные скобки): pt3_it.exe {/vN1,N2,...,N15} pt3-file it-file {text-file} Для каждого файла при необходимости может быть указан полный путь к нему. Если путь не указан, файл считается находящимся в текущем каталоге. Если какой-либо из создаваемых файлов уже существует, он будет перезаписан. Если вам нужно получить только текстовый файл, то вместо имени it-файла укажите "nul" (без кавычек). Необязательный параметр "/v" (от "volume" - "громкость"), сразу после которого следуют перечисленные через запятую пятнадцать чисел, каждое от 0 до 64, предназначен для определения таблицы, по которой будут конвертироваться значения громкости в паттернах. Этот параметр вы можете использовать, если вас не устраивает таблица по умолчанию (см. раздел 3.8.5). Если вам нужно конвертировать несколько модулей, используя одну и ту же свою таблицу конвертирования значений громкости, то имеет смысл создать bat-файл, где и задать эту таблицу, чтобы не указывать её каждый раз в командной строке. Содержимое bat-файла будет таким (вместо N1, N2... вы должны указать свои значения): 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-файле, нажимаем Ctrl-Enter - имя этого файла добавляется в командную строку; хотим, чтобы имя формируемого it-файла было таким же, как имя исходного файла (только расширение "it" вместо "pt3"), для этого ещё раз нажимаем Ctrl-Enter - имя исходного файла опять добавляется в командную строку, и вот тут, если забыть исправить расширение "pt3" на "it", то как раз и получится, что будут указаны одинаковые имена файлов, и если бы в программе не было проверки, то it-файл оказался бы записан поверх исходного pt3-файла, и содержимое исходного файла было бы потеряно). Конвертируемые pt3-модули могут быть написаны в версиях PT от 3.3 до последней на момент написания конвертора версии 3+67, либо в Vortex Tracker II. Формат формируемых it-модулей соответствует формату IT 2.14. Файл с исходным музыкальным модулем может быть и не обязательно с расширением "pt3", лишь бы содержимое этого файла представляло собой компилированный pt3-модуль - без плеера, без hobeta-заголовка. Перед началом конвертирования программа проверяет длину исходного pt3-файла: она должна быть от 216 байтов (такая длина будет у "пустого" модуля, созданного в PT3+67) до 16384 байтов, или 4000h (модуль такой длины может быть создан в PT3+67 версии "cjf"). После загрузки pt3-файла производится проверка сигнатуры: первые байты модуля должны представлять собой строку "ProTracker 3" или "Vortex Tracker II". Теперь расскажу о том, как использовать конвертор в качестве фильтра для файлового менеджера Dos Navigator (далее DN), чтобы по нажатию F3, когда курсор стоит на файле с расширением "pt3", можно было посмотреть содержимое модуля. Кстати, просматриваемый 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, чтобы закрыть окно редактора. 3. Как происходит конвертирование ───────────────────────────────── 3.1. Сведения об авторе и названии модуля ───────────────────────────────────────── В PT3 выделяется 32 символа на название модуля и 32 символа на информацию об авторе. В IT выделяется 25 символов на название модуля, а специальное поле для хранения информации об авторе не предусмотрено. Зато в IT есть так называемое Message (сообщение), длина которого, судя по описанию формата модулей IT, теоретически может достигать 65535 байтов. Конвертор помещает первые 25 символов названия pt3-модуля в название it-модуля, а полностью название и сведения об авторе помещает в Message. 3.2. Начальная скорость проигрывания ──────────────────────────────────── В 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. В формируемом it-модуле как раз и устанавливается начальное значение Tempo (Initial Tempo), равное 125. Начальное значение Speed (Initial Speed) в it-модуле устанавливается равным значению Tempo в исходном pt3-модуле. Параметр Speed в IT может принимать значения от 1 до 255 включительно, а параметр Tempo в PT3 - от 2 до 63 включительно (вообще-то можно использовать и значение 1 - модуль будет правильно проигрываться в PT3, но в плеере компилированных модулей Tempo=1 не поддерживается, по крайней мере в PT3+67). То есть диапазон значений параметра Tempo в PT3 укладывается в диапазон значений параметра Speed в IT. 3.3. Сэмплы ─────────── Если в IT сэмпл - это оцифрованный звук, то в PT3 сэмпл - это скорее как бы программа, по которой каждый фрейм определяется значение регистров музыкального сопроцессора, а уже сопроцессор формирует звук. Поэтому сами сэмплы не конвертируются, а конвертируются только их номера в паттернах (см. раздел 3.8.4). Замечу, что формируемый it-модуль создаётся не в режиме сэмплов, а в режиме инструментов. При доработке полученного модуля вы сами должны подобрать подходящие инструменты. 3.4. Орнаменты ────────────── Орнаменты в PT3 позволяют задавать смещение высоты звука в полутонах для каждого фрейма. Орнаменты используются для реализации псевдоаккордов (когда быстрая смена частот создаёт впечатление одновременности звучания этих частот), а также в других целях. В IT орнаменты не предусмотрены (есть, правда, команда Arpeggio - Jxy, - но она позволяет сделать лишь малую часть того, что можно сделать в PT3 с помощью орнаментов), поэтому при конвертировании информация об орнаментах игнорируется. 3.5. Паттерны ───────────── В PT3+67 максимальное количество паттернов - 48, а в более ранних версиях PT3 - ещё меньше. В IT максимальное количество паттернов - 200, так что при конвертировании трудностей не возникает, даже учитывая возможность добавления дополнительного паттерна для реализации зацикливания модуля (см. раздел 3.7). Конвертор, с расчётом на будущее, поддерживает до 85 паттернов в исходном pt3-модуле (именно таково ограничение формата модулей PT3). В IT длина каждого паттерна может быть от 32 до 200 строк включительно, а в PT3 - от 1 до 64 строк включительно. Таким образом, при конвертировании приходится специально обрабатывать "короткие" паттерны (длиной от 1 до 31 строки включительно). Таким паттернам в формируемом it-модуле сопоставляются паттерны длиной 32 строки; конец паттерна остаётся неиспользуемым. В последней используемой строке такого паттерна ставится команда Cxx - "конец паттерна" (эта команда выполняется после того, как закончится проигрывание строки, в которой она содержится). При выполнении этой команды происходит переход к следующей позиции модуля, и паттерн в этой следующей позиции начинает проигрываться со строки xx; так как нам надо, чтобы паттерн начал проигрываться с начала, значение параметра xx в команде устанавливается равным нулю. Если в "коротком" паттерне должна стоять команда для реализации зацикливания модуля (см. раздел 3.7), то команда "конец паттерна" в этом паттерне уже не ставится, так как она не нужна. О конвертировании содержимого паттернов я подробно расскажу дальше (см. раздел 3.8). 3.6. Список позиций ─────────────────── Как указано в документации к PT3+67, максимальная длина списка позиций - 256, как и в IT. У меня, впрочем, в PT3+67 не получилось создать модуль с 256 позициями, только с 255. Так или иначе, трудностей с конвертированием списка позиций не возникает. Учитывайте, что список позиций в PT3 и в IT отображается по-разному: в PT3 номера позиций и номера паттернов представлены в шестнадцатеричном виде, а в IT - в десятичном. В сформированном конвертором текстовом файле с содержимым исходного pt3-модуля номера позиций представляются в десятичном виде, а номера паттернов - одновременно в шестнадцатеричном и в десятичном виде (см. рис. 1). 3.7. Зацикливание модуля ──────────────────────── В PT3 модуль всегда зациклен. Начало и конец цикла отмечаются в списке позиций. Зацикленный участок может начинаться с любой позиции, а заканчивается всегда в последней позиции модуля. Не так дело обстоит в IT. Там зацикливание не отмечается в списке позиций, а осуществляется с помощью помещения в нужном паттерне команды Bxx (переход к позиции xx в списке позиций; переход происходит после того, как закончится проигрывание строки, содержащей эту команду). При переносе информации о зацикливании модуля возможны два различных случая. Первый случай - когда паттерн, указанный в последней позиции исходного pt3-модуля, до этого не встречался в списке позиций. Тогда в формируемом it-модуле именно в этом паттерне и ставится команда Bxx, где xx - номер позиции начала цикла (в шестнадцатеричном виде). Эта команда ставится в первом же канале, не содержащем какой-либо команды, в последней используемой строке паттерна (так как в IT количество строк в паттерне не может быть меньше 32, а в PT3 - может, последняя используемая строка паттерна в формируемом it-модуле не обязательно будет фактически последней строкой паттерна - см. раздел 3.5). Второй случай - когда паттерн, указанный в последней позиции исходного pt3-модуля, ранее уже встречался в списке позиций. В этом случае нельзя просто поставить в соответствующем паттерне it-модуля команду Bxx, так как она будет срабатывать при каждом проигрывании паттерна, даже когда это не нужно. Поэтому приходится копировать содержимое этого паттерна в новый, дополнительный паттерн, и уже в нём ставить команду Bxx. В последней позиции it-модуля, соответственно, будет уже номер как раз этого нового паттерна. Приведу пример. Пусть список позиций в исходном pt3-модуле выглядит так (символами "*" обозначен зацикленный участок): Позиция Паттерн 0 0 1 1 * 2 2 * 3 1 При конвертировании будет сформирован новый паттерн (номер 3), являющийся копией паттерна 1, и в этом новом паттерне будет поставлена команда перехода к позиции 2 (началу цикла). Список позиций сформированного it-модуля будет таким: Позиция Паттерн 0 0 1 1 2 2 3 3 Если при доработке полученного it-модуля необходимо будет узнать, копией какого паттерна исходного pt3-модуля является добавленный паттерн, то достаточно посмотреть, какой паттерн был в последней позиции исходного модуля. 3.8. Конвертирование содержимого паттернов ────────────────────────────────────────── 3.8.1. Общие сведения ───────────────────── Конвертор переносит в формируемый it-модуль информацию о нотах, командах (не всех - см. раздел 3.8.6.1), о номерах сэмплов и о громкости. Теряется информация из колонки смещения шума и из колонки с данными о периоде огибающей, а также информация о типе огибающей и номера орнаментов - так как в IT всех этих параметров просто нет. 3.8.2. Каналы ───────────── В паттернах PT3 - 3 канала, а в паттернах IT - 64 канала, так что проблем с недостатком каналов не возникает. Каналы A, B и C исходного pt3-модуля конвертируются соответственно в каналы 1, 2 и 3 формируемого it-модуля. Все команды изменения скорости проигрывания переносятся в 4-й канал (см. раздел 3.8.6.7). Из-за добавления команды для реализации зацикливания (см. раздел 3.7) и/или команд "конец паттерна" (см. раздел 3.5) может потребоваться и 5-й канал (если предыдущие четыре канала уже заняты). Таким образом, в сформированном it-модуле может использоваться до 5 каналов (точное значение зависит от конкретного модуля). 3.8.3. Ноты ─────────── При конвертировании нот никаких трудностей не возникает, так как диапазон допустимых нот в PT3 (от C-1 до B-8) укладывается в диапазон допустимых нот в IT (от C-0 до B-9). Вводимая в поле ноты команда "выключить звук в канале" (R--) преобразуется в it-команду "note cut" (^^^). 3.8.4. Номера сэмплов ───────────────────── В PT3 максимальное количество сэмплов - 31. Как уже было отмечено выше, формируемый it-модуль создаётся в режиме инструментов; таким образом, номера сэмплов в паттернах исходного pt3-модуля соответствуют номерам инструментов в паттернах формируемого it-модуля. Максимальное количество инструментов в IT - 99, так что с этой стороны препятствий не возникает. В PT3 первые девять сэмплов обозначаются цифрами от 1 до 9, а следующие - буквами от A до V, так как для отображения номера сэмпла в PT3 выделяется только одна позиция. В IT номера инструментов - десятичные числа, так что в полученном it-модуле вместо букв A-V будут числа 10-31. Если при доработке этого модуля вам нужно будет узнать, какая буква в исходном pt3-модуле соответствовала такому числу, то посмотрите сформированный конвертором текстовый файл с содержимым исходного pt3-модуля - в той части этого файла, где приведены сами сэмплы, указаны и их десятичные номера (см. рис. 2). 3.8.5. Громкость ──────────────── В паттернах 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│ └───────────────┴─┴─┴─┴─┴─┴─┴─┴─┴─┴──┴──┴──┴──┴──┴──┘ Табл. 1 В конверторе также предусмотрена возможность использования таблицы, определённой пользователем (см. раздел 2). 3.8.6. Команды ────────────── 3.8.6.1. Общие сведения ─────────────────────── Из девяти имеющихся в PT3 команд конвертируются только те, для которых это имеет смысл, а именно команды 1dxx (Slide down), 2dxx (Slide up), 3dxx (Tone portamento), 60xy (Vibrato) и B0xx (Set tempo). Далее конвертирование этих команд будет рассмотрено подробно. Замечу, что значения параметров в командах как в PT3, так и в IT указываются в шестнадцатеричном виде. 3.8.6.2. Команда 1dxx - Slide down ────────────────────────────────── Эта команда обеспечивает постепенное снижение высоты звука за счёт того, что значение делителя частоты каждые 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). Это наиболее простой подход, не обеспечивающий точно такого же изменения высоты звука, как в исходном pt3-модуле. При доработке полученного it-модуля вы сами должны подобрать подходящие значения в командах Exx (или, может быть, использовать команды EFx или EEx). Дело в том, что автоматическое принятие решения о том, какую команду использовать (Exx, EFx или EEx), и автоматическое определение параметров этой команды - достаточно сложная задача. Не буду вдаваться в подробности, отмечу только следующее. В формируемом it-модуле устанавливается режим линейного изменения высоты, то есть при выполнении команд, изменяющих высоту звука, величина этого изменения (в полутонах) не будет зависеть от того, какая высота была перед началом действия команды. В то же время в PT3 изменение высоты звука при выполнении команды 1dxx (а также команд 2dxx, 3dxx) - нелинейное (чем выше звук, тем быстрее изменяется его высота под действием команды). 3.8.6.3. Команда 2dxx - Slide up ──────────────────────────────── Эта команда обеспечивает постепенное повышение высоты звука за счёт того, что значение делителя частоты каждые 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 (см. предыдущий раздел). 3.8.6.4. Команда 3dxx - Tone portamento ─────────────────────────────────────── Эта команда обеспечивает постепенное приближение высоты звука к высоте ноты, указанной в строке с этой командой, за счёт того, что значение делителя частоты каждые 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. 3.8.6.5. Команда 60xy - Vibrato ─────────────────────────────── Эта команда обеспечивает периодическое включение и выключение звука: 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. 3.8.6.6. Замечания по поводу команд 1dxx, 2dxx, 3dxx, 60xy ────────────────────────────────────────────────────────── Первое замечание. В PT3 любая из команд 1dxx, 2dxx, 3dxx, 60xy действует до тех пор, пока либо не встретится новая нота, либо не будет выключен звук командой R--, либо не встретится следующая команда 1dxx, 2dxx, 3dxx, 60xy. (Команда 3dxx может закончить своё действие и раньше, как только текущая высота сравняется с высотой указанной ноты.) В то же время аналоги этих команд в IT (Exx, Fxx, Gxx, Ixy) действуют только во время проигрывания строки, в которой они находятся. Таким образом, чтобы добиться такой же продолжительности действия команды в it-модуле, какой она была в исходном pt3-модуле, приходится повторять эту команду во всех следующих строках, в течение которых действовала соответствующая команда в исходном модуле. Конвертор так и делает, причём, когда он повторяет команду, то ставит в ней нулевое значение параметра (для Ixy - обоих параметров), что означает использование предыдущего ненулевого значения. Впоследствии это облегчит вам подбор значения параметра команды при доработке полученного модуля: достаточно будет изменить значение параметра лишь в первой команде последовательности. Второе замечание. Команды 1dxx, 2dxx, 3dxx, у которых параметр d и/или xx равен нулю (то есть фактически не производящие изменения высоты звука), а также команда 60xy, у которой x=0 (также не влияющая на звук), ни во что не преобразуются, но служат для конвертора сигналом о прекращении действия предыдущих команд 1dxx, 2dxx, 3dxx, 60xy. Для пояснения всего вышесказанного рассмотрим пример. Пусть имеется такой фрагмент паттерна исходного pt3-модуля: A-4 1F.F 11.1 <-- Началось действие команды. --- .... .... E-4 .... .... <-- Закончилось действие команды. --- .... .... C-4 .... 11.2 <-- Началось действие команды. --- .... .... --- .... .... --- .... .... --- .... 1... <-- Закончилось действие команды. --- .... .... Тогда соответствующий фрагмент паттерна сформированного it-модуля будет выглядеть так: A-4 01 64 E01 ... .. .. E00 E-4 .. .. .00 ... .. .. .00 C-4 .. .. E02 ... .. .. E00 ... .. .. E00 ... .. .. E00 ... .. .. .00 ... .. .. .00 Третье замечание. В PT3 любая из команд 1dxx, 2dxx, 3dxx, 60xy, действие которой не закончилось в том же паттерне, в котором она стоит, продолжает действовать и в следующих проигрываемых паттернах, пока не выполнится одно из условий окончания действия команды. В то же время конвертор обрабатывает паттерны по отдельности, независимо друг от друга, и не отслеживает такие ситуации (то есть считает, что команда может действовать максимум до конца паттерна, в котором она расположена). Так что при доработке полученного it-модуля вам может понадобиться вручную проставить последовательность соответствующих команд в следующих (по списку позиций) паттернах, чтобы охватить всё время действия исходной команды. При этом может понадобиться и добавление дополнительных паттернов. Рассмотрим пример. Пусть список позиций в исходном pt3-модуле выглядит так: Позиция Паттерн 0 0 1 1 2 0 3 2 Пусть в паттерне 1 стоит команда, действие которой не заканчивается в этом паттерне, а заканчивается только в следующем проигрываемом паттерне - 0. В паттерне 0 эта команда действует, только когда он проигрывается в позиции 2, но не в позиции 0. Тогда в it-модуле надо будет создать дополнительный паттерн 3 - копию паттерна 0, и указать его номер во 2-й позиции списка позиций. В начале этого дополнительного паттерна и надо будет вручную проставить последовательность соответствующих команд. Четвёртое замечание. Команды изменения высоты Exx, Fxx и Gxx, в которые конвертируются команды 1dxx, 2dxx и 3dxx, изменяют высоту звука каждый фрейм, кроме первого фрейма строки. И если длительность проигрывания строки - всего один фрейм, то эти команды не окажут никакого действия. Учитывайте это при конвертировании pt3-модулей, в которых используется Tempo=1. Кстати, команды медленного изменения высоты (EFx, EEx, FFx и FEx) действуют в течение каждого фрейма. 3.8.6.7. Команда B0xx - Set tempo ───────────────────────────────── Эта команда устанавливает количество фреймов на строку (в PT3 этот параметр называется Tempo, в IT - Speed), позволяя тем самым изменять скорость проигрывания. В IT этой команде соответствует команда Axx (Set speed). Конвертор преобразует команду B0xx в команду Axx, перенося параметр xx без изменений (так как длительность одного фрейма в формируемом it-модуле равна длительности одного фрейма в PT3 - см. раздел 3.2). При конвертировании все команды изменения скорости переносятся в 4-й канал (если в строке несколько таких команд, оставляется лишь самая правая из них, так как только она имеет значение). Это нужно, чтобы эти команды не мешали при конвертировании команд 1dxx, 2dxx, 3dxx, 60xy (в IT аналоги этих команд приходится повторять в каждой строке в течение всего времени действия исходной команды - см. раздел 3.8.6.6). Для примера рассмотрим следующий фрагмент паттерна исходного pt3-модуля: A-4 .... 11.2 <-- Началось снижение высоты. --- .... .... --- .... .... --- .... B..3 <-- Установили Tempo=3, --- .... .... снижение высоты продолжается. В формируемом it-модуле в соответствующей строке 4-го канала будет поставлена команда A03, а вышеприведённый фрагмент паттерна превратится вот во что: A-4 .. .. E02 ... .. .. E00 ... .. .. E00 ... .. .. E00 <-- Здесь команда A03 помешала бы ... .. .. E00 снижению высоты. 4. Благодарности ──────────────── Спасибо Дмитрию Быстрову (Alone Coder) за описание формата модулей PT3! Без этого описания конвертор вряд ли был бы создан! ════════════════════════════════════════════════════════════════ Другие мои статьи об AY-музыке: 1. "Правильное изменение частоты огибающей в Pro Tracker 3". "Радиолюбитель. Ваш компьютер" 10,11/2000. 2. "Некоторые особенности музыкального сопроцессора". "Радиолюбитель. Ваш компьютер" 11/2000 (под псевдонимом BV_Creator). 3. "Частотная таблица с нулевой погрешностью". "Радиолюбитель. Ваш компьютер" 6/2001, "Радиомир. Ваш компьютер" 7,8/2001 (под псевдонимом BV_Creator). 4. "Оптимизация на примере intro 'Start'". "Радиомир. Ваш компьютер" 7-10/2001. (В этой статье можно найти сведения о программировании проигрывания музыки.) 5. "Повышение степени сжатия музыкальных модулей". "Радиомир. Ваш компьютер" 7/2002. 6. "Построение таблицы громкости в плеере Pro Tracker 3". "Радиомир. Ваш компьютер" 4/2004. Другие мои статьи о создании и/или обработке модулей Impulse Tracker: 1. "Изменение порядка каналов в модулях Impulse Tracker". "Радиомир. Ваш компьютер" 7/2005.