• avatar tsl
  • 1
Слишком много сида, побольше АУ и трекеров.
Пора на пати стадии для музыки запрашивать? :)
Радио — это круто.
  • avatar Shiru
  • 1
Вариант с halt правильный, вряд ли есть другой. Проблема в том, что все компоненты проекта, как и сам 1tracker, не отличаются изящным дизайном и оптимальностью. В результате постоянно получается, что минутный фикс превращается в многочасовую пляску с бубном. И это, конечно, сильно напрягает.

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

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

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

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

Поэтому пока мысли либо убрать опрос вообще, чтобы избавиться от головной боли, либо закомментировать определение в исходнике, и кому нужна поддержка, пусть экспортирует исходник и раскомментирует. Но тогда проблема глючного опроса в экспортированных TAP/SCL останется.
  • avatar Shiru
  • 1
Спасибо. Посмотрел, с наскока добавить не получится, нужно много переделывать (убирать паттерны, условную компиляцию, переформатировать многострочный код), так что добавлю позже.
Ммм, я не подумал про AY. Хорошо, я прикину как сделать другой вариант теста…
  • avatar Shiru
  • 1
Вариант с halt не будет работать в 1tracker, так как в AY-файлах не гарантируется ни работающий обработчик прерываний, ни наличие ПЗУ вообще, и движок сразу же виснет. Думаю, лучше просто убрать опрос Kempston, так как желания тратить время на поиск обходных путей нет никакого.
Вот ссылка на последнюю версию Octode XL: introspec.retroscene.org/beeper/octode_xl_v1.zip
Исходник модифицированного конвертора xm2octodexl.cpp лежит там в папке «other».
Тест кемпстона в старом октоде сделан вот так:

	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 Shiru
  • 4
Для тех, кто заинтересован разобраться во внутреннем устройстве биперных движков, utz недавно написал весьма подробный гайд на английском языке: randomflux.info/1bit/viewtopic.php?id=21
  • avatar Shiru
  • 2
Могу поправить, но с прямым указанием где и что изменить будет гораздо быстрее.

К слову, может быть заодно добавить и Octode XL?
  • avatar Nuts_
  • 0
а сколько видео здесь еще не выложено…
DenisGrachev , офигенная дема!
Жаль, в этом году выбраться не получилось, но по видео и продам — пати получилась замечательной, хоть уже не просто попойка :)
Ведущему — +100 в карму! :D
Быстрый вопрос: а почему было принято решение так жёстко связаться с конкретным движком? из-за числа каналов? Мне просто кажется, что некий промежуточный формат мог бы быть полезен, чтобы добавить возможность подбора ещё и движка, который бы давал наиболее подходящий звук.
  • avatar sq
  • 3
Я как заворожённый наблюдаю за каждой новостью о биперной музыке и как зачарованный слушаю каждый новый биперный трек. Для меня это — непостижимая магия. Всем, что связано со спектрумовским бипером, я восхищаюсь даже больше, чем некоторым кододрочерством в области эффектов.
Но я совершенно в этом не разбираюсь. Для меня загадка, как вы всё это делаете.
Поэтому просто спасибо.
Очень хорошая новость — я давно выцеливался сделать одну маленькую вещь в Phaser, но мне не хватало второго голоса в Phaser1, чтобы взять аккорд, и не хватало яиц, чтобы осилить Phaser2 в голом виде.

Вопрос по касательной — раз обновилась версия 1tracker, нет ли желания обновить движки немного? Дело в том, что тесты клавиатуры в нескольких движках (Phaser2, Octode) могут работать ненадёжно на машинах с плавающей шиной. Я могу сделать поправки в коде, там всё довольно тривиально в общем, просто чтобы потом не фиксить индивидуальные треки.
  • avatar tsl
  • 2
«Veel on aega päästke noored hinged...»
Никакой связи, просто слово вспомнилось. =)
  • avatar Nuts_
  • 1
Но не в такой же степени :)
Я бы скорее это назвал сатирой. Уподобление в таких случаях полюбому хоть какое-то должно быть.
  • avatar Nuts_
  • 2
ну если совсем точно то это не пародия, а уподобление плохим блогерам в еще более худшей форме