Можно ещё хранить байты спрайтов -1 вместо как сейчас. Тогда прозрачный пиксел будет 255, и каждую пару inc d: dec d можно заменить на просто inc d, это ещё -8 тактов.
Денис, очень интересный пост и прикольные задачки. Немного переписал макрос для вывода пикселей спрайта, надеюсь что не напортачил на сонную голову:
MACRO SPRITE_LINE_FAST
pop de : ld a,(hl)
inc e : dec e : jp nz,1f
jr 2f
1:
and b : or e : nop
2:
; 17+18+12=47t
inc d : dec d : jp nz,1f
jr 2f
1:
and c : or d : nop
2:
ld (hl),a
; 18+12+7=37t
ENDM
; overall: 84t
Забыл ответить точнее на твои варианты. Движков через AND или XOR я не знаю (AND звучит как неважная идея, XOR может и заработать, не пробовал). Идея с чередованием — предпоследняя в моём списке, так делают многие старые движки, да и новые тоже. Недостаток этой идеи: трудно сделать много каналов, т.к. часто делаем out, причём такая схема требует высокой частоты дискретизации (из-за частого переключения порта, мы производим больше высокочастотных помех). Из-за этого, например, движок Wham так сильно свистит.
Squeeker смешивает звуки по OR, что может звучать странно, но работает неплохо. Мой Octode XL как бы складывает каналы вместе и использует сумму как итоговую скважность (фактически, PWM).
Было бы интересно сделать биперный движок на PDM. К сожалению, не знаю как синтезировать PDM с нужной скоростью.
Есть много подходов. Вот прямо из головы несколько:
* Можно выводить звук каждого канала тонкими иголками (тонкими = намного уже периода цикла дискретизации). Тогда громкость можно изобразить меняя ширину иголки. Так были устроены движки Фоллина, и это довольно популярный подход.
* Так как иголки сравнительно узкие, а периоды нот сравнительно длинные, большую часть времени ничего выводить не нужно. Поэтому можно сделать иголки пошире, например шириной в период дискретизации, или даже в несколько. Это идея довольно редкая, но так устроен, например, Octode XL.
* Можно думать об этом как о чём-то вроде ШИМ. Тогда можно просто сделать движок как что-то типа ШИМ движка, и кормить ему сэмплы, как в обычном цифровом движке. utz делал несколько современных движков по такому принципу, и наверное не он один (но я не вспомню сейчас их названия).
* Можно выводить текущее состояние каждого канала звука раз в цикл дискретизации. Типа, 2 канала выдают прямоугольники, каждый со своим периодом, тогда выводим в звуковом цикле поочерёдно состояние каждого из каналов. Так работают Wham the Music Box, Savage, из новых движков Tritone, ну и многие др., это чуть ли не самая «модная» стратегия.
* Можно смешивать подход с иголками и подход с прямоугольниками. Это тоже довольно редкая идея, но Squeeker устроен как раз так. Плюс такой идеи в том, что прямоугольники лучше воспроизводят басы, а иголки дают более разнообразное звучание.
Вроде ничего фундаментального я не забыл, но пишу второпях. Надеюсь, что Shiru дополнит/поправит, если что.
Вот список треке в старом сборнике, кот я делал в 1994: SAVAGE 1, SAVAGE 2, SAVAGE 3, MiG-29, GOLDEN AXE, CHRONOS, RAMPARTS, SOLDIER OF FORTUNE, FAIRLIGHT, SABOTEUR 2, FOX FIGHTS BACK, GRYZOR, RACE AGAINST TIME.
В 2013 я переделал этот сборник, существенно расширив его. Но Cybernoid 2 у меня всё равно не попал. И даже если бы я брал что-то на этом движке, я бы 100% взял титульный трек из Stormlord.
Поскольку я очень любил бипер, а слушать бипер на реале можно только загружая софт, что медленно даже с дисководом, я делал себе сборник своей самой любимой выдранной биперной музыки. Возможно тебе будет приятно узнать, что Saboteur 2 у меня там был выдран. Но в остальном, скажу честно, у меня там наверное больше несовпадений со списком Shiru, чем совпадений. Просто не выберешь TOP 10 или ТОП 20 чтобы угодить всем.
Ничего себе, получается, что я закодил свой первый биперный движок раньше тебя, году в 1994 или в 1995.
Выбор любимых треков вещь очень индивидуальная, трудно обсуждать её в деталях. Но мне было очень интересно узнать, что ты пришёл на спектрум через денди и это в какой-то степени определило твои вкусы и приоритеты. Ты как бы мерял всё что видел в терминах денди и поэтому, даже в этом посте, неоднократно за бипер извиняешься (чисто для примера, «биперная музыка звучала крайне примитивно даже для не самого искушённого уха»). Может быть в силу того, что я довольно долго просидел на 48К машине (примерно года 4 или 5), я впитал бипер совершенно органически, до такой степени, что почти всю подряд АУ музыку 1990х я агрессивно не любил (а АУ музыку 1980х просто воспринимал как «блямканье»). Отчасти это можно попробовать объяснить музыкой, которую я слушал вне спектрума — в то время я слушал много инди-рока, и звук АУ был просто агрессивно в этом смысле неправильным, раздражающе «игрушечным» (в то время как фэйд-ауты на скважности, типичные для бипера, имеют примерно те же самые тембры что перегруженая гитара, так что «роковый» звук треков Фоллина не случайное совпадение).
Но мне кажется, тут есть ещё одно измерение. Я бы сравнил АУ с чем-то типа графического сопроцессора у популярных консолей 1980х. Они, конечно, помогают центральному процессору с отрисовкой графики и расширяют диапазон того, что можно вообще показать. Но ещё они предоставляют достаточно ограниченный набор инструментов и, в итоге, впихивают то, что все делают, в достаточно узкие рамки, сужая в итоге разнообразность визуальных или звуковых эффектов. Демосцене в каком-то смысле повезло с АУ, т.к. демосцена придумала радикально новый способ использования АУ, благодаря реинтерпретации смысла огибающей. Фактически, демосцена открыла в АУ новый канал.
А бипер, развивая эту же мысль, это способ звукоизвлечения очень натуральный для спектрума. Это просто центральный процессор которому доверено делать всё что угодно, и хотя он не самый мощный, он как раз достаточно мощен для того, чтобы сделать плюс минус всё что требуется. Отсутствие графического сопроцессора в играх привело к сравнительно худшему качеству картинки, но это также привело к появлению 3д и изометрических игр, жанров которые на консоли того времени пробиться почти не смогли. Точно также, бипер, если его воспринимать как отсутствие музыкального сопроцессора, — это именно что свободная стихия, где твои возможности действительно не ограничены форматом железа. Поэтому мы и имеем невероятное разнообразие звуков и текстур, всё в наших руках.
Вот эта свобода и есть то, что заставляет меня возвращаться к биперу снова и снова.
Ммм. У меня в голове это укладывается следующим образом: текущая длина ссылки является «состоянием». Поэтому если ты вставляешь команду изменения длины ссылки, ты бы должен по идее как-то сохранять смену состояния декомпрессора. Типа, при парсинге вперёд, ты бы должен по идее фиксировать, для каждой позиции в данных, не просто текущий оптимальный результат сжатия до этой позиции, а 8 результатов сжатия — по одному для каждого текущего состояния длины ссылки. Понятно что если такой контекст и влияет на результат, то довольно слабо, но хочется понять, как ты избегаешь учёта контекста совсем.
Артём, спасибо, действительно душевно. Посетить пати у меня возможности не было, но атмосферу почувствовал, это главное. И, как настоящий софасценер, не могу не поблагодарить за отличные ссылки по касательной, особенно на книжку по real-time rendering и на MSDF. Реально вот этого в старых отчётах по-моему никогда не было, а я прямо с удовольствием потыкал и внёс в букмарки.
Скажу честно, мне бы хотелось более подробных, глубоких вопросов. М.б. что-то о технике, что-то о мотивации и источниках вдохновения. Что бы он хотел достичь в графике на ц64, какие у него цели и ориентиры. Чисто технически, было бы здорово как-то более чётко разделить версии на 2х языках — либо более тщательным оформлением, либо радикально, разбивая пост на части, чтобы можно было читать всё подряд на одном языке.
Но по сути это всё вторично по сравнению с главным: у нас всегда, исторически, было довольно мало контактов с западной сценой, уж тем более сценой за пределами спектрума. Поэтому вот такие интервью очень ценны и я очень надеюсь, что ты продолжишь этим заниматься.
За прошедший год я немного улучшил оба декомпрессора. Компактный распаковщик удалось сократить до 88 байт (если у кого-то будут мысли, как его можно ещё сократить — буду очень благодарен, так как
у меня там уже начались реально неприятные оптимизации). Быстрый распаковщик тоже удалось ускорить на несколько процентов, ещё и сократив его до 229 байт, в т.ч. благодаря идеям uniabis.
Последний компактный распаковщик (88 байт): unmegalz_small.asm
Последний быстрый распаковщик (229 байт): unmegalz_fast.asm
Внимание, я немного поменял систему нумерования версий, теперь версия указана внутри файла. Поэтому по этим ссылкам всегда можно будет взять самые последние версии распаковщиков.
Тут я, кстати, всё ещё не догоняю, как ты насчитал +7 байт? Я ещё раз посчитал, никак у меня 7 не выходит: ld a,h: add 7: ld h,a: jr…
Про таблицу дошло. Но твой код, где ты будешь пихать байты между байтами своей таблицы я даже представлять себе не хочу. Я бы заплатил и 200 тактов, только чтобы никогда у себя такого не видеть. Но как решение, вообше, ок, почему нет, действительно может пригодиться когда всё будет совсем плохо.
Squeeker смешивает звуки по OR, что может звучать странно, но работает неплохо. Мой Octode XL как бы складывает каналы вместе и использует сумму как итоговую скважность (фактически, PWM).
Было бы интересно сделать биперный движок на PDM. К сожалению, не знаю как синтезировать PDM с нужной скоростью.
* Можно выводить звук каждого канала тонкими иголками (тонкими = намного уже периода цикла дискретизации). Тогда громкость можно изобразить меняя ширину иголки. Так были устроены движки Фоллина, и это довольно популярный подход.
* Так как иголки сравнительно узкие, а периоды нот сравнительно длинные, большую часть времени ничего выводить не нужно. Поэтому можно сделать иголки пошире, например шириной в период дискретизации, или даже в несколько. Это идея довольно редкая, но так устроен, например, Octode XL.
* Можно думать об этом как о чём-то вроде ШИМ. Тогда можно просто сделать движок как что-то типа ШИМ движка, и кормить ему сэмплы, как в обычном цифровом движке. utz делал несколько современных движков по такому принципу, и наверное не он один (но я не вспомню сейчас их названия).
* Можно выводить текущее состояние каждого канала звука раз в цикл дискретизации. Типа, 2 канала выдают прямоугольники, каждый со своим периодом, тогда выводим в звуковом цикле поочерёдно состояние каждого из каналов. Так работают Wham the Music Box, Savage, из новых движков Tritone, ну и многие др., это чуть ли не самая «модная» стратегия.
* Можно смешивать подход с иголками и подход с прямоугольниками. Это тоже довольно редкая идея, но Squeeker устроен как раз так. Плюс такой идеи в том, что прямоугольники лучше воспроизводят басы, а иголки дают более разнообразное звучание.
Вроде ничего фундаментального я не забыл, но пишу второпях. Надеюсь, что Shiru дополнит/поправит, если что.
В 2013 я переделал этот сборник, существенно расширив его. Но Cybernoid 2 у меня всё равно не попал. И даже если бы я брал что-то на этом движке, я бы 100% взял титульный трек из Stormlord.
Выбор любимых треков вещь очень индивидуальная, трудно обсуждать её в деталях. Но мне было очень интересно узнать, что ты пришёл на спектрум через денди и это в какой-то степени определило твои вкусы и приоритеты. Ты как бы мерял всё что видел в терминах денди и поэтому, даже в этом посте, неоднократно за бипер извиняешься (чисто для примера, «биперная музыка звучала крайне примитивно даже для не самого искушённого уха»). Может быть в силу того, что я довольно долго просидел на 48К машине (примерно года 4 или 5), я впитал бипер совершенно органически, до такой степени, что почти всю подряд АУ музыку 1990х я агрессивно не любил (а АУ музыку 1980х просто воспринимал как «блямканье»). Отчасти это можно попробовать объяснить музыкой, которую я слушал вне спектрума — в то время я слушал много инди-рока, и звук АУ был просто агрессивно в этом смысле неправильным, раздражающе «игрушечным» (в то время как фэйд-ауты на скважности, типичные для бипера, имеют примерно те же самые тембры что перегруженая гитара, так что «роковый» звук треков Фоллина не случайное совпадение).
Но мне кажется, тут есть ещё одно измерение. Я бы сравнил АУ с чем-то типа графического сопроцессора у популярных консолей 1980х. Они, конечно, помогают центральному процессору с отрисовкой графики и расширяют диапазон того, что можно вообще показать. Но ещё они предоставляют достаточно ограниченный набор инструментов и, в итоге, впихивают то, что все делают, в достаточно узкие рамки, сужая в итоге разнообразность визуальных или звуковых эффектов. Демосцене в каком-то смысле повезло с АУ, т.к. демосцена придумала радикально новый способ использования АУ, благодаря реинтерпретации смысла огибающей. Фактически, демосцена открыла в АУ новый канал.
А бипер, развивая эту же мысль, это способ звукоизвлечения очень натуральный для спектрума. Это просто центральный процессор которому доверено делать всё что угодно, и хотя он не самый мощный, он как раз достаточно мощен для того, чтобы сделать плюс минус всё что требуется. Отсутствие графического сопроцессора в играх привело к сравнительно худшему качеству картинки, но это также привело к появлению 3д и изометрических игр, жанров которые на консоли того времени пробиться почти не смогли. Точно также, бипер, если его воспринимать как отсутствие музыкального сопроцессора, — это именно что свободная стихия, где твои возможности действительно не ограничены форматом железа. Поэтому мы и имеем невероятное разнообразие звуков и текстур, всё в наших руках.
Вот эта свобода и есть то, что заставляет меня возвращаться к биперу снова и снова.
Но по сути это всё вторично по сравнению с главным: у нас всегда, исторически, было довольно мало контактов с западной сценой, уж тем более сценой за пределами спектрума. Поэтому вот такие интервью очень ценны и я очень надеюсь, что ты продолжишь этим заниматься.
у меня там уже начались реально неприятные оптимизации). Быстрый распаковщик тоже удалось ускорить на несколько процентов, ещё и сократив его до 229 байт, в т.ч. благодаря идеям uniabis.
Последний компактный распаковщик (88 байт): unmegalz_small.asm
Последний быстрый распаковщик (229 байт): unmegalz_fast.asm
Внимание, я немного поменял систему нумерования версий, теперь версия указана внутри файла. Поэтому по этим ссылкам всегда можно будет взять самые последние версии распаковщиков.
Про таблицу дошло. Но твой код, где ты будешь пихать байты между байтами своей таблицы я даже представлять себе не хочу. Я бы заплатил и 200 тактов, только чтобы никогда у себя такого не видеть. Но как решение, вообше, ок, почему нет, действительно может пригодиться когда всё будет совсем плохо.