Phaser2 в 1tracker

То, чего давно ждали немногие энтузиасты, наконец свершилось — появился редактор для биперного движка Phaser2, разработанного ещё в 2011 году и до сих пор никем ни разу не использованного. К сожалению, это не Beepola, а всего лишь 1tracker, но уже лучше, чем ничего. Напомню, по причине использования в движке гибко настраиваемых тональных инструментов и ударных конвертор из XM или других форматов не имел бы практического смысла.

Скачать 1tracker


В текущей версии 1tracker движок Phaser2 выбран по умолчанию. Формат редактора паттерна и назначение полей в каналах в целом остались прежними и действуют аналогично Phaser1 (в Beepola и 1tracker), только вместо одного канала с поддержкой инструментов теперь есть два.

Другие важные изменения коснулись самих инструментов и ударных. Чтобы попасть в редактор инструментов, нажмите F4. При этом если курсор находился в канале тона, откроется редактор тонального инструмента (до 63 штук), иначе откроется редактор ударного инструмента (8 штук). Чтобы переключаться между инструментами в редакторе используйте Numpad ±, чтобы менять значения — стрелки влево-вправо или Enter и непосредственный ввод цифры.

В тональных инструментах произошла замена параметра Multiple на Semitone — теперь можно задавать не только повышение тона второго генератора на N октав, но и другие смещения в полутонах, что даёт своеобразные тембры. Уменьшился диапазон параметра Detune, так как его компенсирует Semitone. Появился параметр режима смешивания каналов — в Phaser1 был только XOR, теперь также доступны OR и AND, что помогает создавать новые тембры.

Полностью переделаны ударные инструменты. Как и раньше, они прерывают звук тональных каналов, но теперь вместо предопределённого набора сэмплов или сомнительных генерируемых кодом звуков есть возможность настраивать характер звучания. Новые ударные могут иметь разную длительность, она компенсируется в тональных каналах для удержания стабильного темпа. Можно задать начальную высоту тона и скорость слайда вниз или вверх, либо выключить тон, установив высоту в 0. Также можно задать частоту шума или выключить его.

Для удобства использования новой системы ударных в движке по умолчанию настроен джентльменский набор из бочки, малого, двух хэтов и четырёх томов.
  • avatar
  • [просмотров: 3476]
  • +13

14 комментариев

avatar
Очень хорошая новость — я давно выцеливался сделать одну маленькую вещь в Phaser, но мне не хватало второго голоса в Phaser1, чтобы взять аккорд, и не хватало яиц, чтобы осилить Phaser2 в голом виде.

Вопрос по касательной — раз обновилась версия 1tracker, нет ли желания обновить движки немного? Дело в том, что тесты клавиатуры в нескольких движках (Phaser2, Octode) могут работать ненадёжно на машинах с плавающей шиной. Я могу сделать поправки в коде, там всё довольно тривиально в общем, просто чтобы потом не фиксить индивидуальные треки.
avatar
Могу поправить, но с прямым указанием где и что изменить будет гораздо быстрее.

К слову, может быть заодно добавить и Octode XL?
avatar
Тест кемпстона в старом октоде сделан вот так:

	in a,(#1f)
	and #1f
	ld a,OP_NOP
	jr nz,$+4
	ld a,OP_ORC
	ld (soundLoop.checkKempston),a

а собственно проверка — такая:

.checkKey
	in a,(#1f)
	and #1f
	ld c,a
	in a,(#fe)
	cpl
.checkKempston=$
	or c
	and #1f
	jp z,readNotes

Главная проблема с этим такая: на машине без кемпстона in a,(#1f): and #1f, как правило, не ноль, так что 5 из 8 линий клавиатуры исключаются из опроса. Что особенно противно, in a,(#1f) может ещё и читать атрибуты/пикселы с плавующей шины и разрешать опрос нужной клавиши, так что опрос часто всё ещё работает, но очень плохо предсказуемо. Наконец, на машине с плавающей шиной in a,(#1f): and #1f может запросто выдать Z (допустим на чистом экране залитом чёрным по чёрному с шины читается довольно много нулей). При таком неудачливом раскладе движок вообще будет считать что клавиатура нажата почти всё время (т.е. всё время, когда in a,(#1f) сбрасывает нужные нам биты).

В Phaser2 основная проблема устранена ( in a,(#1f): ld c,a: xor a ), но тест кемпстона всё ещё не вполне надёжен. В Octode XL я сделал вот так:

	ei
	halt			; must ensure that test is done during the border
	in a,(#1f)
	inc a
	jr nz,haveKempston
	ld (maskKempston),a
haveKempston:

и собственно опрос

	in a,(#1f)
	and #1f
maskKempston: EQU $-1
	ld c,a
	in a,(#fe)
	cpl
	or c
	and #1f

Проблем вроде пока не видел. Ещё в QChan была какая-то похожая проблема (столкнулся, когда собирал Dat Fuzz вместе с utz), но, емнип, там вообще опрос был немного редковат, так что там я просто развёл опрос клавиатуры и джойстика.

Я был бы очень рад если бы Octode XL появился в 1tracker. К сожалению, я слегка поправил там формат музыки (основное соображение было ничтожно ускорить переход от строки к строке и добавить ещё одну низкую ноту), так что совсем прямолинейная замена не получится. Но модификации очень простые, я даже сознательно не стал менять расчёт высоты нот, т.к. это убило бы старые октодовские треки, настроенные детьюном.
avatar
Вариант с halt не будет работать в 1tracker, так как в AY-файлах не гарантируется ни работающий обработчик прерываний, ни наличие ПЗУ вообще, и движок сразу же виснет. Думаю, лучше просто убрать опрос Kempston, так как желания тратить время на поиск обходных путей нет никакого.
avatar
Ммм, я не подумал про AY. Хорошо, я прикину как сделать другой вариант теста…
avatar
Вариант с halt правильный, вряд ли есть другой. Проблема в том, что все компоненты проекта, как и сам 1tracker, не отличаются изящным дизайном и оптимальностью. В результате постоянно получается, что минутный фикс превращается в многочасовую пляску с бубном. И это, конечно, сильно напрягает.

Есть много решений этой проблемы, но все они неудобные и некрасивые.

Можно добавлять в AY-файл полное ПЗУ (в последнее время так и делаю) и попытаться заставить работать обычный обработчик прерывания. Можно нагородить пустой IM2 где-нибудь в экранной области. И то и другое приведёт к двум веткам генерации кода — одна для трекера, вторая для экспорта, а этого очень хочется избежать. Сейчас всё просто (затрачены значительные усилия, чтобы осуществить эту схему): один ассемблерный исходник движка плюс ассемблерный вывод компилятора музыки — ассемблер — бинарник — AY-файл — опционально TAP/SCL; на всех этапах может делаться экспорт; тот же самый AY-файл играется редактором.

Можно было бы сделать условную компиляцию этого halt'а. Но её в моём ассемблере нет, и добавить — перекопать 1500 строк на AngelScript, написанных два года назад. Конечно, по-хорошему этот ассемблер требует переписывания с нуля, но это тяжёлая задача. Можно сделать хак, собирать исходник движка из двух кусков текста, вставляя между ними строку с halt при сборке не для AY-файла — опять же см. выше, и само по себе очень некрасиво.

Можно отдать определение Kempston'а на усмотрение программиста, брать на входе ещё один регистр, помимо указателя на данные музыки. Тоже сомнительное решение.

Поэтому пока мысли либо убрать опрос вообще, чтобы избавиться от головной боли, либо закомментировать определение в исходнике, и кому нужна поддержка, пусть экспортирует исходник и раскомментирует. Но тогда проблема глючного опроса в экспортированных TAP/SCL останется.
avatar
Вот ссылка на последнюю версию Octode XL: introspec.retroscene.org/beeper/octode_xl_v1.zip
Исходник модифицированного конвертора xm2octodexl.cpp лежит там в папке «other».
avatar
Спасибо. Посмотрел, с наскока добавить не получится, нужно много переделывать (убирать паттерны, условную компиляцию, переформатировать многострочный код), так что добавлю позже.
avatar
Там не убраны паттерны, я просто чуть покрутил код для более оптимального обсчёта строки. Изменения скорее косметические. Короче, не парься, я погляжу на твой исходник для старого Октода и скорее всего сделаю порт без особых проблем. Больше времени уйдёт сборку настроить. Но скорее всего я сделаю это осенью, сейчас нужно закрыть пару других проектов.
avatar
Я имею в виду, что в оригинальном Octode, который шёл с конвертером из XM, были паттерны, а в версии для 1tracker их нет. И если делать как проще, надо убрать паттерны и в XL. Либо сделать как (существенно) сложнее, но эффективнее — компилятор с оптимальной разбивкой на паттерны. Я пока планирую сделать по первому варианту, без паттернов, в скором времени.
avatar
Добавил Octode XL в 1tracker. Конфигурации движка выбираются в редакторе инструмента.
avatar
Здорово! Просто реально здорово :)
avatar
Я как заворожённый наблюдаю за каждой новостью о биперной музыке и как зачарованный слушаю каждый новый биперный трек. Для меня это — непостижимая магия. Всем, что связано со спектрумовским бипером, я восхищаюсь даже больше, чем некоторым кододрочерством в области эффектов.
Но я совершенно в этом не разбираюсь. Для меня загадка, как вы всё это делаете.
Поэтому просто спасибо.
  • sq
  • +3
avatar
Для тех, кто заинтересован разобраться во внутреннем устройстве биперных движков, utz недавно написал весьма подробный гайд на английском языке: randomflux.info/1bit/viewtopic.php?id=21
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.