Making of Eager
(всё что вы хотели узнать, и всё, что вы не хотели узнать — тоже). Как бы, застегните пристяжные ремни.
Я обещал сразу нескольким людям написать про Eager. Мне немного неудобно это делать, потому что это, наверное, выглядит как попытка привлечения внимания, тем более что, по всей видимости, дема оказалась не такой удачной, как бы мне хотелось. Жду ехидных комментов по этому поводу. Но любом случае, раз обещал, и раз некоторые люди готовы выкладывать совершенно неприспособленные для Hype тексты, давайте я лучше сам расскажу о внутреннем процессе, который привёл к созданию Eager и постараюсь разобрать ошибки, которые были сделаны.
Начало работы над Eager можно отнести к началу июня. Вообще-то я работал над другим своим долгостроем (имена пока опустим). Мне хотелось сделать секцию демы с цифровым треком и я прикидывал как поженить цифру и скроллер так, чтобы ни одно, ни другое не пострадало очень уж сильно. У меня уже давно написаны довольно качественные проигрыватели сэмплов для спектрума, и интеграция ударных с музыкой казалась следующим логическим шагом, в том смысле, что перкуссия всё же проще в реализации чем общий случай, произвольные сэмплы+ау (см. Condommed). Дополнительным (важным) условием для меня было придумать схему, которая бы работала сразу на пентагоне и на классике без переписывания кода несколько раз. И вот пока я сидел и раздумывал, простит ли мне сцена неполноэкранный скроллер в 3 фрейма или не простит, мне вдруг пришла в голову мысль поменять подход. Вместо того, чтобы играть честные ударные и думать как обернуть вокруг них музыку и эффект, почему бы мне не попробовать сделать ударные по биперной схеме?
Ударные на бипере обычно сделаны как interrupting drums. Прерывающие ударные. Имеется в виду, что когда нам нужно стукнуть в барабан, мы просто прекращаем играть какие-либо ноты и тупо делаем звук барабана. Если сделать звук барабана слишком длинным, становится слышно, что звук нот прерывался, и это нехорошо, но на коротких звуках возникает иллюзия непрерывного звука. Я знал по своему опыту работы с Octode XL, что звуки продолжительностью до 10000-20000 тактов звучат цельно, проблемы начинаются где-то с 25000 тактов. Но на бипере канал один, а на AY — три. Моя исходная интуиция была: если взять и сделать ударные допустим в 1 фрейм длинной, будет довольно несложно потратить один фрейм из N на барабан, а остальные — на видео эффект. Раз биперные барабаны длиной 20000 тактов звучат неплохо, тут у нас выйдет более чем в 3 раза более продолжительный звук, а так как каналов 3 вместо 1, пропадание одного из 3х каналов будет уже не так бросаться в глаза. Мне очень понравилась эта идея, поэтому я тут же сел и сделал своё первое техдемо: http://introspec.retroscene.org/hype/test1.sna
В основе этого демо — один паттерн из старого трека bfox RMI 2. Его довольно сложно узнать, т.к. в процессе работы возникли различные проблемы. Во-первых, когда я убрал всю исходную перкуссию и заменил её на цифровую, оказалось, что цифровые барабаны продолжительностью во фрейм недостаточно громкие, чтобы конкурировать с мощным басом на огибающей. Поэтому я был вынужден сменить тип огибающей и снизить громкость орнамента. Кроме этого, я, если честно, не понял поначалу, что трек у bfox был написан в BAC, поэтому стереопанорама вышла немного диковатая. Я показал этот трек нескольким знакомым, не могу сказать, что хотя бы кто-то был впечатлён, но меня это дело как-то пёрло, поэтому я продолжил работу. n1k-o очень помог советами; послушав эту дему он предложил (а) увеличить продолжительность звуков ударных в 2 раза или (б) переписать плейер так, чтобы дублировать звуки ударных сразу в 2 канала и тем самым решить проблему с громкостью. К середине июня у меня был переписан движок так, чтобы он позволял сразу и (а) и (б); звучал заново переделанный паттерн вот так: http://introspec.retroscene.org/hype/test2.sna
Если честно, меня этот звук прёт до сих пор. Но далеко не все были со мной согласны. В частности, diver4d сказал, что вообще не слышит там цифру. n1k-o считал, что звук всё ещё слишком сухой, из-за коротких сэмплов. Его идея была — будет лучше играть цифровые сэмплы ПОВЕРХ ударных AY, так что самое мясо ударных, атака и БУМ окажутся цифровыми, а затухающий шум и всякие реверберации — останутся сделанными на AY. Я не знал, прав он или нет, но мне в любом случае нужно было писать движок для цифровых барабанов, так что я взял и сделал полный ремикс в этом стиле трека bfox . Вот что у меня получилось в итоге: http://introspec.retroscene.org/hype/test4.sna
Прошлые примеры техдем я довольно широко показывал, чтобы понять из откликов, как люди воспринимают звук цифровых ударных. Эту техдему я не показывал почти никому, так как был уверен — из этого нужно делать дему. Я представлял себе машину, кабриолет на летней дороге, полосу асфальта уходящую в горизонт и сухой, плотный горячий воздух. Никаких мыслей или сомнений — голое ощущение. Это должно было стать моим идеальным летним демо — безмозглым и драйвовым. Саундтрек для путешествия за рулём. Трек был очень коротким, но т.к. у меня было очень мало времени, это было скорее достоинством. Поэтому передо мной стоял вопрос — как сделать демо, которое будет воспроизводить вот это знойное, пустое ощущение. Я написал bfox у и получил от него разрешение использовать трек в демо, а так же попросил его подумать о ремиксе, т.к. трек звучал немного простовато, хотя и броско.
В дизайне демо как всегда несколько составляющих — для меня — визуальная и техническая в первую очередь. Я предупредил diver4d что не буду делать дему на 3bm в этом году, но май/июнь вышли довольно депрессивными, было ощущение что никто уже ничего не делает, и мне казалось, что м.б. нужно немного встряхнуть Пермь. Взять графику мне было негде, ну и, в общем, у меня не было достаточно времени, чтобы наводить с кем-то мосты и одновременно пытаться дизайнить и кодить новое демо. Поэтому я очень рано решил, что буду делать демо без графики. Знойное летнее ощущение скорости, мне казалось, будет легче всего воспроизвести, если сделать всякую фигню, летящую в лицо на 50гц, т.е. туннели и т.п. вещи. Из-за барабанов, занимающих по 2 фрейма, было ясно, что сделать 50гц не теряя качества звука будет в общем случае непросто. Но эта проблема уже сама по себе подсказала и решение — если бы мы могли ограничиться только атрибутными эффектами, то окажется возможным генерировать кадры несинхронно с изображением. Если вдруг оказывается, что нам нужно проиграть барабан, можно приготовить заранее 2 кадра в 2 страницы видеопамяти, проиграть полбарабана, переключить экран и проиграть вторые полбарабана. Вот эта идея асинхронной генерации атрибутных кадров и была ключевой идеей в моём понимании. Визуальный дизайн вёлся уже в рамках этих ограничений и с прицелом на то, чтобы постараться хотя бы немного замаскировать ограничения движка.
Описанная схема проигрывания барабанов накладывает ограничения, что возможно и что — невозможно делать в плане эффектов. Копирование кадров в экран делается менее чем за 15*768 ~ 11500 тактов. Трек у меня был со скоростью 5, так что на каждые 5 кадров в теории мог случится один звук барабана, занимающий 2 фрейма. Ещё один фрейм, если очень грубо (11500*5), уйдёт на копирование кадров в экран. Т.е. у нас остаётся 2 фрейма на расчёт 5 кадров в буфер. На самом деле оказывается, что барабан бьёт чуть чаще чем каждую 2ю строку в трекере, т.е. грубо, один звук барабана на 10 фреймов демо. Поэтому можно за счёт буфера чуть отстать во время проигрывания барабана, и нагнать, когда барабан бить не будет. Я исходил из того, что у меня будет примерно 2 фрейма времени на то, чтобы рассчитать 4 кадра; я ставил цель уложиться в 30000 тактов рассчётов на кадр, местами это правило чуть нарушено, но в целом, это оказалось правильной оценкой. Повторно оптимизировать в процессе пришлось только копировщик кадров с отражениями (первый вариант кода был неудачным) и хаос зумер (из-за бага в кодогенераторе).
Некоторые идеи были у меня уже достаточно давно. В демо Bomb от Atebit (СС) мне всегда очень нравился хитро сделанный твистер — Bomb целиком сделана атрибутами, но твистер кажется чанковым, благодаря тому, что растровые «чанки» варьируются в размере по мере удаления от оси твистера. Я давно думал, что это очень хороший способ сделать атрибутный туннель, т.к. это позволит прикрыть главную проблему такого туннеля — шум дискретизации из-за низкого разрешения в центре. Поэтому я сразу знал, что буду делать туннель.
В итоге я сделал 2 разных туннеля: посложнее, но с 4й вращательной симметрией, и попроще, но без симметрий. Туннель посложнее сделан основным, т.к. расчёт в нём сделан по принципу плазмы, т.е. фактически с субпикселями, это даёт ему плавность и разнообразие в движении. Симметрия отражения реализована на стадии копирования буфера в экран — оказалось, что можно адаптировать старый трюк с ldi для копирования чанков ещё и для копирования данных в экран с поворотами и отражениями (я делал немного похожую вещь в демо для mmcm):
Тунель попроще — статическая карта позиций в текстуре. Меняя текстуру, можно получить иллюзию движения. Но т.к. текстура всего 16х16, выходит что движение грубоватое и фаз не очень много (никаких субпикселей). Все основные туннели сделаны по первой технологии. По второй технологии сделаны стрелочки на зацикливании демы.
Другая идея была сделать атрибутный chaos zoomer. Мне нравился этот эффект в амижных демах и мне казалось, что если заменить амижные текстурные трюки хорошо подобранной «мраморной» палитрой, может выйти неплохо, тем более что на спектруме я видел только одну реализацию — 1К от alone. Но я не понимал как работает честный chaos zoomer и кодить его оказалось лично мне крайне интересно. Я не хочу рассказывать здесь главный секрет эффекта, т.к. у меня в планах переписывание его в четырёхкратном разрешении. В плане кода же оказалось, что хаос зумер очень здорово делается развёрнутым кодом по типу:
с возможностью кучи оптимизаций. В 1990е такой эффект наверное сделали бы ассемблерным кодогенератором; я написал свой кодогенератор в Processing (все эффекты в Eager были сначала написаны в Processing, чтобы быстро подобрать параметры и улучшить внешний вид эффектов). Конечно, на самом деле не нужно тупо перегружать HL для каждого пиксела; часто оказывается нужно делать LD L,n или INC HL или DEC HL или даже не делать совсем ничего. Считайте, это тоже запилятор, просто очень специального рода. В запарке, я собрал пативерсию Eager с выключенным флажком оптимизации кода в Processing, так что пативерсия реализует Chaos Zoomer так, как его делать ни в коем случае не нужно.
С двумя псевдочанковыми эффектами, было ясно, что очень не хватает хотя бы чего-то в растре. Я давно прикидывал, что мои любимые 4-х фазные полосатые анимации должны отлично делаться в цвете. То есть, вместо чёрно-белой картинки берётся цветная, и после показа 2-х нормальных и 2-х инвертированных фаз, мы можем просто сдвинуть палитру на 1 шаг. Помимо увеличения числа кадров, это внешне замедляет движение, что очень важно при показе анимаций в 50гц. Так как анима всегда однообразная и так как движок не позволял быстро перегрузить графику растров, было сразу ясно, что поверх анимы нужно класть что-то ещё; в моём случае — это оказался текст.
Кроме эффектов, нужны были фишки. Одну я придумал от бедности: так как трек был зацикленным, было нужно как-то прервать демо на середине звуковой дорожки. bfox пообещал подумать о расцикливании, но звучал он очень неувенно, так что я не знал насколько я могу рассчитывать на его помощь. Поэтому я придумал оборвать демо в конце показа заставкой докачивающего видео утюба. У меня стойкое ощущение, что я где-то это уже видел, но найти где я не смог и решил считать своим изобретением. Из других фишек, я сообразил, что можно сделать все надписи в атрибутной изометрии. От этого был только один шаг до названия демо в изометрии с фейковой перспективой.
Исходно дема должна была называться 3bm2u. Это совершенно дурацкое название, но оно чётко показывает исходный прицел и мотивацию демо. По мере работы, сделалось понятно, что дема должна спешить, как бы всё время немного опаздывать. Сам себе я сказал, я делаю демо Гоблиниша, т.е. такое демо, которое всё время торопится показать что у неё есть, может быть даже немного не додерживая эффекты для нормального рассматривания. По мере работы придумалось более подходящее название Keen, но т.к. Keen — очень неэмоциональное слово, я заменил его сначала на Keen and Eager и потом на Eager. Что именно мы Eager выходит непонятно, поэтому к названию добавилось (to live), чтобы придать немного больше чёткости и завершённости.
Все основные эффекты были написаны в Processing где-то за неделю работы. Основное время там ушло даже не столько на код, сколько на подбор палитр и текстур. После этого пришлось заняться новым ядром, и ядро съело практически всё время с 20х чисел июня до выходных дихальта. Главная проблема заключалась в том, что я долго не мог решить, как именно мне добиться синхронизации видео со звуком. Я совершенно точно знал, что не хочу делать демо без детальной проработки синхронизации, но я не был уверен, что каждый из моих эффектов уложится в имеющееся время и поэтому я знал, что я не мог делать ядро где кадры жёстко привязаны к фреймам. В то же самое время, чтобы сменить эффект, мне было нужно В КАКОЙ-ТО МОМЕНТ перестать генерировать кадры одного эффекта и начать генерировать кадры следующего. Меня беспокоил выбор этого момента. Я попробовал несколько схем, от которые пришлось отказаться. Что я сделал в итоге — это два уровня скриптов. Общий скрипт распаковывает, инициализирует и запускает отдельные эффекты. Он выбирает точный момент, когда кадры нового эффекта должны начать показываться, и говорит эффекту, сколько всего кадров нужно сгенерировать. Т.е. эффект может сгенерировать все кадры и вернуться в ядро, а ядро может показываеть кадры из буфера и готовиться к включению следующего эффекта. Собственно скриптование подробностей оказалось удобнее делать внутри каждого эффекта отдельно. Так сделан мелкий фикс и вариации эффектов.
Ядро более-менее заработало вечером дихальта. В нём оставались баги, и есть пара неприятных багов даже сейчас, которые я обошёл на уровне скриптов. Если я решу вернуться к такой асинхронной схеме работы с эффектами, мне придётся, я думаю, переписать ядро заново. Я не был готов к реальной многопоточности, как в этой деме, и проблемы, которые возникли у меня в процессе работы — клинч, война за ресурсы — классика многозадачного программирования. Очень сказалось то, что я никогда серьёзно не работал с кодом такого рода.
В этот же день вышел на связь bfox , сказать, что он не смог заняться ремиксом трека. Что было особенно плохо, так это то, что за недели работы над ядром и движком, трек начал очень здорово меня утомлять. Я надеялся, что ремикс добавит треку объёма и разнообразия, но, без ремикса, я начал всерьёз сомневаться в своём выборе трека. Поэтому я набрался наглости и связался с n1k-o . Я предложим ему выбрать между ремиксом трека bfox a или оригинальным треком. Я был в полном восторге относительно трека Synchronization и хотел примерно того же драйва. Я рассказывал ему, как здорово ехать летом на машине с ветром дующим в морду. Я показал ему клип «Gimme All Your Lovin'» группы ZZ Top:
Олежа ушёл и прислал мне в понедельник тест показывающий переход от трека в центральном канале к расширению стереобазы.
Сказать что я охренел — значит ничего не сказать. Мой план демы, написанный по треку bfox , летел к чертям. Я не мог выключить играющий трек, я не мог кодить, я больше не хотел иметь дему на 1-2 минуты, я хотел тупо сидеть так, ветер в морду, бесконечно. Почти сразу сделалось ясно, что трюк с подкачкой утюба в конце не сработает. В то же самое время, расширение стереобазы было моментом, который я был ОБЯЗАН обыграть, и я забросал Олежу просьбами вставить паузу в 1-2 секунды перед расширением. Олежа реально не понимал, что я несу за чушь, и впервые увидел сборку, показывающую что там происходит, только за двое суток до компо, но он мужественно вынес все эти мучения и сделал всё в итоге даже лучше чем мне там воображалось.
Потом время очень сильно скомпрессировалось. Я не мог непрерывно работать над демой в июне и начале июля, но последняя неделя перед пати была посвободнее и я погрузился в намного более детальную работу. Титры вышли отлично. Немного не хватало место в треке, чтобы показать всё нарисованное, но Олежа очень ловко вставил лишний паттерн там, где его не должно было быть. Название Eager изначально подразумевалось нарисованным спрайтом, но после бодрых титров статика не смотрелась, а скролл явно не сработал бы даже в теории, т.к. простой скролл атрибутов нарушил бы иллюзию перспективы. Времени было мало, в запарке я подумал, что может прокатить простое дискретное переключение тени по мере движения букв по экрану. Не знаю, можно ли было закодить это красиво, мой код некрасив, но итог выглядел гораздно лучше чем я ожидал, так что я удлиннил название пояснением (Eager to live our life to the full), чисто чтобы было время рассмотреть скролл. Текст немного cheesy, но в тот момент мне как-то нравилась эта пафосность. В итоге, этот спонтанно придуманный на ходу скролл оказался, как я сейчас понимаю, моментом демы, который зацепил больше всего людей.
Про утюб рассказать нечего, я нарисовал графику и сделал гигаскриновые полутона за час-два, наверное. Всё вышло в точности как я хотел.
Главная проблема заключалась в том, что визуально, расширение стереобазы должно было быть подкреплено каким-то визуальным фейерверком, а у меня осталось примерно полтора суток времени до пати, чтобы довести это всё до ума. В принципе, дела обстояли не так плохо, как это может звучать со стороны, т.к. эффекты были уже закожены в Processing, с уже известными параметрами эффектов, текстур и т.д. Кроме того, у меня уже были готовые наброски внутренних циклов для каждого из эффектов. Но, конечно, это совершенно не оставляло мне времени на доводку, и любые вещи, которые бы не заработали так хорошо, как мне хотелось бы, были обречены остаться как получилось. И так, собственно, и вышло в итоге. Я успел плюс-минус закодить все запланированные эффекты (кроме туннеля попроще), и собрать демо в некое подобие композиции. Но возникли проблемы.
Во-первых, туннель оказался очень сложным в скриптинге. Поскольку туннель сделан таблицами, которые по сути двумерные, довольно непросто сделать эффекты размазывания со скоростью и другие вещи, о которых я мечтал. Вообще, оказалось довольно неудобно рисовать текстуру в ассемблере и подбирать движение в скрипте. Поэтому туннель оказался довольно туповат, в пати версии — очень туп, в финалке — намного лучше, но всё равно слишком однообразен, и, в итоге, затянут. Решение сделать псевдочанки означало, по сути, что я лишил себя возможности двигать туннель по сторонам, что только добавило проблем в этом плане. Урок тут такой: туннель нужно рассчитывать из 3д и делать для себя какой-то тул для интерактивной настройки скриптов движения и текстурирования. Без этого хороший туннель сделать нельзя.
Во-вторых, анима оказалась в чём-то сложной в реализации, т.к. (а) я допустил ошибку в генерации перекодировочной таблицы, и (б) оказалось, что пикселы выключенные, чтобы избежать клэшинга, просвечивают «насквозь» аниму из-за быстрой смены однообразных по растру кадров. Единственное решение этой проблемы, с моей точки зрения, — гораздо более тщательная работа с исходными кадрами. Анимация, которая вошла в пати-версию была очень шумной; переделанная версия этой анимации для финальной версии демо вышла почти идеально. Вторая анимация, которую я не успел сделать для пати, получилась хуже, т.к. крутящиеся квадраты оказываются намного ближе друг к другу, чем хотелось бы.
В-третьих, работая с сэмплами, мы в основном полагались на Spectaculator. Проблема была в том, что все эмуляторы звучали по-разному. Fuse давал какой-то дикий шум. Unreal давал очень странный звук, как будто цифровые звуки находятся на расстоянии от звуков из чипа. ZXMAK2, вроде основанный на Unreal, давал звук ближе к спектакулятору. Во время показа демо на пати я был поражён тем, насколько ритм-секция на туннеле задавила солирующие инструменты. Сперва я списал это на невысокое качество трансляции, но потом riskej записал звук с реального +3 и мы поняли, что по этому поводу что-то нужно делать. Связанная проблема заключалась в том, что очень мало кто вообще говоря понял, что у нас сделаны цифровые ударные — блендинг с AY сыграл с нами злую шутку. Поэтому мы потратили несколько дней на переделку сэмплов и доводку звука. Я постарался подобрать сэмплы, которые бы чётче звучали, и я немного переделал логику плейера барабанов, чтобы барабаны не отставали немного на ударных долях, как в пати версии. Итоговый трек звучит чётче, злее и «цифровее». n1k-o должен был переделать шум для ACB версии трека, и он поколдовал над проблемными паттернами, чуть усилив соло инструмент и чуть уменьшив шум, заменив его на шумовую пульсацию: http://zxart.ee/eng/music/authors/n/nq/furious-acb-mix/
В четвёртых, графика для интро, которую я мужественно нарисовал за несколько дней в июне, видимо впечатлила только меня :) Кстати, n1k-o сразу вспомнил, откуда пришло вдохновение для этой сцены:
За пару дней до релиза финалки diver4d вызвался почистить графику. Кнопка получилась прекрасно, а вот риски регулятора громкости оказалось сложно подсветить не теряя цвета. Поэтому я быстро закодил мою старую идею с интерлейсным мультиколором; по-моему получилось очень мило.
В финальной версии я постарался разрешить все основные проблемы пати версии. У меня было время как следует поработать со скриптами и палитрами, это заняло основное время. Так как мне хотелось зациклить демо, но так, чтобы это не вполне раздражало, я разложил свой контент по зацикленному треку так, чтобы повтор трека не вполне соответствовал повтору видеоряда. Я сделал 2 вариации туннеля и 4 (ок, 2 на самом деле, но немного разные) вариации хаос зумера, так что повторы раздражают чуть меньше.
Мне сложно объективно оценить итог. Я вижу сейчас, что идея «швырять что-нибудь в лицо» не вполне годна для демодизайна. Этого недостатночно для адекватного фикса и это создаёт проблемы при доводке, т.к. приходится слишком сильно полагаться на удачу при доводке эффектов. Мне повезло в том плане, что титры получились очень бодро практически сами, и что скроллер закодился удачно на ходу, но в итоге, эти находки в начале демо скорее создали проблему, что концовке демо не хватает какого-то убойного эффекта. Дополнения к скриптам улучшили расклад, но всё же не вполне разрешили проблему.
Есть ещё проблема с моими инстинктами. Меня критикуют за центрированные композиции кадров и в этом, конечно, есть элемент правды. Я действительно тяготею к этому при дизайне сцен, но я не вижу в этом какой-то существенной проблемы, т.к. это ограничение — в чём-то просто совпадение. Более существенная проблема в том, что меня очень тянет на зацикливание, особенно при работе над быстро задизайненными демами, и видимо, это мой способ избежать придумывания развязки, что не очень просто сделать когда время ограничено. Решение видимо простое: нужно делать меньше дем в запарке, нужно делать больше дем не спеша. Буду исправляться.
ОК, наболтал так, что никому мало не покажется. Вот такой бардачный у меня внутренний процесс. Спасибо за внимание! Извините, если что! :)
P.S. Самая последняя версия демо лежит вот тут. Благодаря diver4d , у нас так же есть запись демо со звуком снятым с реальной пентевы:
Я обещал сразу нескольким людям написать про Eager. Мне немного неудобно это делать, потому что это, наверное, выглядит как попытка привлечения внимания, тем более что, по всей видимости, дема оказалась не такой удачной, как бы мне хотелось. Жду ехидных комментов по этому поводу. Но любом случае, раз обещал, и раз некоторые люди готовы выкладывать совершенно неприспособленные для Hype тексты, давайте я лучше сам расскажу о внутреннем процессе, который привёл к созданию Eager и постараюсь разобрать ошибки, которые были сделаны.
Начало работы над Eager можно отнести к началу июня. Вообще-то я работал над другим своим долгостроем (имена пока опустим). Мне хотелось сделать секцию демы с цифровым треком и я прикидывал как поженить цифру и скроллер так, чтобы ни одно, ни другое не пострадало очень уж сильно. У меня уже давно написаны довольно качественные проигрыватели сэмплов для спектрума, и интеграция ударных с музыкой казалась следующим логическим шагом, в том смысле, что перкуссия всё же проще в реализации чем общий случай, произвольные сэмплы+ау (см. Condommed). Дополнительным (важным) условием для меня было придумать схему, которая бы работала сразу на пентагоне и на классике без переписывания кода несколько раз. И вот пока я сидел и раздумывал, простит ли мне сцена неполноэкранный скроллер в 3 фрейма или не простит, мне вдруг пришла в голову мысль поменять подход. Вместо того, чтобы играть честные ударные и думать как обернуть вокруг них музыку и эффект, почему бы мне не попробовать сделать ударные по биперной схеме?
Ударные на бипере обычно сделаны как interrupting drums. Прерывающие ударные. Имеется в виду, что когда нам нужно стукнуть в барабан, мы просто прекращаем играть какие-либо ноты и тупо делаем звук барабана. Если сделать звук барабана слишком длинным, становится слышно, что звук нот прерывался, и это нехорошо, но на коротких звуках возникает иллюзия непрерывного звука. Я знал по своему опыту работы с Octode XL, что звуки продолжительностью до 10000-20000 тактов звучат цельно, проблемы начинаются где-то с 25000 тактов. Но на бипере канал один, а на AY — три. Моя исходная интуиция была: если взять и сделать ударные допустим в 1 фрейм длинной, будет довольно несложно потратить один фрейм из N на барабан, а остальные — на видео эффект. Раз биперные барабаны длиной 20000 тактов звучат неплохо, тут у нас выйдет более чем в 3 раза более продолжительный звук, а так как каналов 3 вместо 1, пропадание одного из 3х каналов будет уже не так бросаться в глаза. Мне очень понравилась эта идея, поэтому я тут же сел и сделал своё первое техдемо: http://introspec.retroscene.org/hype/test1.sna
В основе этого демо — один паттерн из старого трека bfox RMI 2. Его довольно сложно узнать, т.к. в процессе работы возникли различные проблемы. Во-первых, когда я убрал всю исходную перкуссию и заменил её на цифровую, оказалось, что цифровые барабаны продолжительностью во фрейм недостаточно громкие, чтобы конкурировать с мощным басом на огибающей. Поэтому я был вынужден сменить тип огибающей и снизить громкость орнамента. Кроме этого, я, если честно, не понял поначалу, что трек у bfox был написан в BAC, поэтому стереопанорама вышла немного диковатая. Я показал этот трек нескольким знакомым, не могу сказать, что хотя бы кто-то был впечатлён, но меня это дело как-то пёрло, поэтому я продолжил работу. n1k-o очень помог советами; послушав эту дему он предложил (а) увеличить продолжительность звуков ударных в 2 раза или (б) переписать плейер так, чтобы дублировать звуки ударных сразу в 2 канала и тем самым решить проблему с громкостью. К середине июня у меня был переписан движок так, чтобы он позволял сразу и (а) и (б); звучал заново переделанный паттерн вот так: http://introspec.retroscene.org/hype/test2.sna
Если честно, меня этот звук прёт до сих пор. Но далеко не все были со мной согласны. В частности, diver4d сказал, что вообще не слышит там цифру. n1k-o считал, что звук всё ещё слишком сухой, из-за коротких сэмплов. Его идея была — будет лучше играть цифровые сэмплы ПОВЕРХ ударных AY, так что самое мясо ударных, атака и БУМ окажутся цифровыми, а затухающий шум и всякие реверберации — останутся сделанными на AY. Я не знал, прав он или нет, но мне в любом случае нужно было писать движок для цифровых барабанов, так что я взял и сделал полный ремикс в этом стиле трека bfox . Вот что у меня получилось в итоге: http://introspec.retroscene.org/hype/test4.sna
Прошлые примеры техдем я довольно широко показывал, чтобы понять из откликов, как люди воспринимают звук цифровых ударных. Эту техдему я не показывал почти никому, так как был уверен — из этого нужно делать дему. Я представлял себе машину, кабриолет на летней дороге, полосу асфальта уходящую в горизонт и сухой, плотный горячий воздух. Никаких мыслей или сомнений — голое ощущение. Это должно было стать моим идеальным летним демо — безмозглым и драйвовым. Саундтрек для путешествия за рулём. Трек был очень коротким, но т.к. у меня было очень мало времени, это было скорее достоинством. Поэтому передо мной стоял вопрос — как сделать демо, которое будет воспроизводить вот это знойное, пустое ощущение. Я написал bfox у и получил от него разрешение использовать трек в демо, а так же попросил его подумать о ремиксе, т.к. трек звучал немного простовато, хотя и броско.
В дизайне демо как всегда несколько составляющих — для меня — визуальная и техническая в первую очередь. Я предупредил diver4d что не буду делать дему на 3bm в этом году, но май/июнь вышли довольно депрессивными, было ощущение что никто уже ничего не делает, и мне казалось, что м.б. нужно немного встряхнуть Пермь. Взять графику мне было негде, ну и, в общем, у меня не было достаточно времени, чтобы наводить с кем-то мосты и одновременно пытаться дизайнить и кодить новое демо. Поэтому я очень рано решил, что буду делать демо без графики. Знойное летнее ощущение скорости, мне казалось, будет легче всего воспроизвести, если сделать всякую фигню, летящую в лицо на 50гц, т.е. туннели и т.п. вещи. Из-за барабанов, занимающих по 2 фрейма, было ясно, что сделать 50гц не теряя качества звука будет в общем случае непросто. Но эта проблема уже сама по себе подсказала и решение — если бы мы могли ограничиться только атрибутными эффектами, то окажется возможным генерировать кадры несинхронно с изображением. Если вдруг оказывается, что нам нужно проиграть барабан, можно приготовить заранее 2 кадра в 2 страницы видеопамяти, проиграть полбарабана, переключить экран и проиграть вторые полбарабана. Вот эта идея асинхронной генерации атрибутных кадров и была ключевой идеей в моём понимании. Визуальный дизайн вёлся уже в рамках этих ограничений и с прицелом на то, чтобы постараться хотя бы немного замаскировать ограничения движка.
Описанная схема проигрывания барабанов накладывает ограничения, что возможно и что — невозможно делать в плане эффектов. Копирование кадров в экран делается менее чем за 15*768 ~ 11500 тактов. Трек у меня был со скоростью 5, так что на каждые 5 кадров в теории мог случится один звук барабана, занимающий 2 фрейма. Ещё один фрейм, если очень грубо (11500*5), уйдёт на копирование кадров в экран. Т.е. у нас остаётся 2 фрейма на расчёт 5 кадров в буфер. На самом деле оказывается, что барабан бьёт чуть чаще чем каждую 2ю строку в трекере, т.е. грубо, один звук барабана на 10 фреймов демо. Поэтому можно за счёт буфера чуть отстать во время проигрывания барабана, и нагнать, когда барабан бить не будет. Я исходил из того, что у меня будет примерно 2 фрейма времени на то, чтобы рассчитать 4 кадра; я ставил цель уложиться в 30000 тактов рассчётов на кадр, местами это правило чуть нарушено, но в целом, это оказалось правильной оценкой. Повторно оптимизировать в процессе пришлось только копировщик кадров с отражениями (первый вариант кода был неудачным) и хаос зумер (из-за бага в кодогенераторе).
Некоторые идеи были у меня уже достаточно давно. В демо Bomb от Atebit (СС) мне всегда очень нравился хитро сделанный твистер — Bomb целиком сделана атрибутами, но твистер кажется чанковым, благодаря тому, что растровые «чанки» варьируются в размере по мере удаления от оси твистера. Я давно думал, что это очень хороший способ сделать атрибутный туннель, т.к. это позволит прикрыть главную проблему такого туннеля — шум дискретизации из-за низкого разрешения в центре. Поэтому я сразу знал, что буду делать туннель.
В итоге я сделал 2 разных туннеля: посложнее, но с 4й вращательной симметрией, и попроще, но без симметрий. Туннель посложнее сделан основным, т.к. расчёт в нём сделан по принципу плазмы, т.е. фактически с субпикселями, это даёт ему плавность и разнообразие в движении. Симметрия отражения реализована на стадии копирования буфера в экран — оказалось, что можно адаптировать старый трюк с ldi для копирования чанков ещё и для копирования данных в экран с поворотами и отражениями (я делал немного похожую вещь в демо для mmcm):
ld a,(hl) ; исходный байт (верхняя четверть слева, идём слева направо)
ld (nn),a ; верхняя четверть справа, идём сверху вниз
ld (mm),a ; нижняя четверть слева, идём снизу вверх
ld (bc),a ; нижняя четверть справа, идём справа налево
ldi ; меньше 15t на байт
Тунель попроще — статическая карта позиций в текстуре. Меняя текстуру, можно получить иллюзию движения. Но т.к. текстура всего 16х16, выходит что движение грубоватое и фаз не очень много (никаких субпикселей). Все основные туннели сделаны по первой технологии. По второй технологии сделаны стрелочки на зацикливании демы.
Другая идея была сделать атрибутный chaos zoomer. Мне нравился этот эффект в амижных демах и мне казалось, что если заменить амижные текстурные трюки хорошо подобранной «мраморной» палитрой, может выйти неплохо, тем более что на спектруме я видел только одну реализацию — 1К от alone. Но я не понимал как работает честный chaos zoomer и кодить его оказалось лично мне крайне интересно. Я не хочу рассказывать здесь главный секрет эффекта, т.к. у меня в планах переписывание его в четырёхкратном разрешении. В плане кода же оказалось, что хаос зумер очень здорово делается развёрнутым кодом по типу:
ld hl,nn : ldi
с возможностью кучи оптимизаций. В 1990е такой эффект наверное сделали бы ассемблерным кодогенератором; я написал свой кодогенератор в Processing (все эффекты в Eager были сначала написаны в Processing, чтобы быстро подобрать параметры и улучшить внешний вид эффектов). Конечно, на самом деле не нужно тупо перегружать HL для каждого пиксела; часто оказывается нужно делать LD L,n или INC HL или DEC HL или даже не делать совсем ничего. Считайте, это тоже запилятор, просто очень специального рода. В запарке, я собрал пативерсию Eager с выключенным флажком оптимизации кода в Processing, так что пативерсия реализует Chaos Zoomer так, как его делать ни в коем случае не нужно.
С двумя псевдочанковыми эффектами, было ясно, что очень не хватает хотя бы чего-то в растре. Я давно прикидывал, что мои любимые 4-х фазные полосатые анимации должны отлично делаться в цвете. То есть, вместо чёрно-белой картинки берётся цветная, и после показа 2-х нормальных и 2-х инвертированных фаз, мы можем просто сдвинуть палитру на 1 шаг. Помимо увеличения числа кадров, это внешне замедляет движение, что очень важно при показе анимаций в 50гц. Так как анима всегда однообразная и так как движок не позволял быстро перегрузить графику растров, было сразу ясно, что поверх анимы нужно класть что-то ещё; в моём случае — это оказался текст.
Кроме эффектов, нужны были фишки. Одну я придумал от бедности: так как трек был зацикленным, было нужно как-то прервать демо на середине звуковой дорожки. bfox пообещал подумать о расцикливании, но звучал он очень неувенно, так что я не знал насколько я могу рассчитывать на его помощь. Поэтому я придумал оборвать демо в конце показа заставкой докачивающего видео утюба. У меня стойкое ощущение, что я где-то это уже видел, но найти где я не смог и решил считать своим изобретением. Из других фишек, я сообразил, что можно сделать все надписи в атрибутной изометрии. От этого был только один шаг до названия демо в изометрии с фейковой перспективой.
Исходно дема должна была называться 3bm2u. Это совершенно дурацкое название, но оно чётко показывает исходный прицел и мотивацию демо. По мере работы, сделалось понятно, что дема должна спешить, как бы всё время немного опаздывать. Сам себе я сказал, я делаю демо Гоблиниша, т.е. такое демо, которое всё время торопится показать что у неё есть, может быть даже немного не додерживая эффекты для нормального рассматривания. По мере работы придумалось более подходящее название Keen, но т.к. Keen — очень неэмоциональное слово, я заменил его сначала на Keen and Eager и потом на Eager. Что именно мы Eager выходит непонятно, поэтому к названию добавилось (to live), чтобы придать немного больше чёткости и завершённости.
Все основные эффекты были написаны в Processing где-то за неделю работы. Основное время там ушло даже не столько на код, сколько на подбор палитр и текстур. После этого пришлось заняться новым ядром, и ядро съело практически всё время с 20х чисел июня до выходных дихальта. Главная проблема заключалась в том, что я долго не мог решить, как именно мне добиться синхронизации видео со звуком. Я совершенно точно знал, что не хочу делать демо без детальной проработки синхронизации, но я не был уверен, что каждый из моих эффектов уложится в имеющееся время и поэтому я знал, что я не мог делать ядро где кадры жёстко привязаны к фреймам. В то же самое время, чтобы сменить эффект, мне было нужно В КАКОЙ-ТО МОМЕНТ перестать генерировать кадры одного эффекта и начать генерировать кадры следующего. Меня беспокоил выбор этого момента. Я попробовал несколько схем, от которые пришлось отказаться. Что я сделал в итоге — это два уровня скриптов. Общий скрипт распаковывает, инициализирует и запускает отдельные эффекты. Он выбирает точный момент, когда кадры нового эффекта должны начать показываться, и говорит эффекту, сколько всего кадров нужно сгенерировать. Т.е. эффект может сгенерировать все кадры и вернуться в ядро, а ядро может показываеть кадры из буфера и готовиться к включению следующего эффекта. Собственно скриптование подробностей оказалось удобнее делать внутри каждого эффекта отдельно. Так сделан мелкий фикс и вариации эффектов.
Ядро более-менее заработало вечером дихальта. В нём оставались баги, и есть пара неприятных багов даже сейчас, которые я обошёл на уровне скриптов. Если я решу вернуться к такой асинхронной схеме работы с эффектами, мне придётся, я думаю, переписать ядро заново. Я не был готов к реальной многопоточности, как в этой деме, и проблемы, которые возникли у меня в процессе работы — клинч, война за ресурсы — классика многозадачного программирования. Очень сказалось то, что я никогда серьёзно не работал с кодом такого рода.
В этот же день вышел на связь bfox , сказать, что он не смог заняться ремиксом трека. Что было особенно плохо, так это то, что за недели работы над ядром и движком, трек начал очень здорово меня утомлять. Я надеялся, что ремикс добавит треку объёма и разнообразия, но, без ремикса, я начал всерьёз сомневаться в своём выборе трека. Поэтому я набрался наглости и связался с n1k-o . Я предложим ему выбрать между ремиксом трека bfox a или оригинальным треком. Я был в полном восторге относительно трека Synchronization и хотел примерно того же драйва. Я рассказывал ему, как здорово ехать летом на машине с ветром дующим в морду. Я показал ему клип «Gimme All Your Lovin'» группы ZZ Top:
Олежа ушёл и прислал мне в понедельник тест показывающий переход от трека в центральном канале к расширению стереобазы.
Сказать что я охренел — значит ничего не сказать. Мой план демы, написанный по треку bfox , летел к чертям. Я не мог выключить играющий трек, я не мог кодить, я больше не хотел иметь дему на 1-2 минуты, я хотел тупо сидеть так, ветер в морду, бесконечно. Почти сразу сделалось ясно, что трюк с подкачкой утюба в конце не сработает. В то же самое время, расширение стереобазы было моментом, который я был ОБЯЗАН обыграть, и я забросал Олежу просьбами вставить паузу в 1-2 секунды перед расширением. Олежа реально не понимал, что я несу за чушь, и впервые увидел сборку, показывающую что там происходит, только за двое суток до компо, но он мужественно вынес все эти мучения и сделал всё в итоге даже лучше чем мне там воображалось.
Потом время очень сильно скомпрессировалось. Я не мог непрерывно работать над демой в июне и начале июля, но последняя неделя перед пати была посвободнее и я погрузился в намного более детальную работу. Титры вышли отлично. Немного не хватало место в треке, чтобы показать всё нарисованное, но Олежа очень ловко вставил лишний паттерн там, где его не должно было быть. Название Eager изначально подразумевалось нарисованным спрайтом, но после бодрых титров статика не смотрелась, а скролл явно не сработал бы даже в теории, т.к. простой скролл атрибутов нарушил бы иллюзию перспективы. Времени было мало, в запарке я подумал, что может прокатить простое дискретное переключение тени по мере движения букв по экрану. Не знаю, можно ли было закодить это красиво, мой код некрасив, но итог выглядел гораздно лучше чем я ожидал, так что я удлиннил название пояснением (Eager to live our life to the full), чисто чтобы было время рассмотреть скролл. Текст немного cheesy, но в тот момент мне как-то нравилась эта пафосность. В итоге, этот спонтанно придуманный на ходу скролл оказался, как я сейчас понимаю, моментом демы, который зацепил больше всего людей.
Про утюб рассказать нечего, я нарисовал графику и сделал гигаскриновые полутона за час-два, наверное. Всё вышло в точности как я хотел.
Главная проблема заключалась в том, что визуально, расширение стереобазы должно было быть подкреплено каким-то визуальным фейерверком, а у меня осталось примерно полтора суток времени до пати, чтобы довести это всё до ума. В принципе, дела обстояли не так плохо, как это может звучать со стороны, т.к. эффекты были уже закожены в Processing, с уже известными параметрами эффектов, текстур и т.д. Кроме того, у меня уже были готовые наброски внутренних циклов для каждого из эффектов. Но, конечно, это совершенно не оставляло мне времени на доводку, и любые вещи, которые бы не заработали так хорошо, как мне хотелось бы, были обречены остаться как получилось. И так, собственно, и вышло в итоге. Я успел плюс-минус закодить все запланированные эффекты (кроме туннеля попроще), и собрать демо в некое подобие композиции. Но возникли проблемы.
Во-первых, туннель оказался очень сложным в скриптинге. Поскольку туннель сделан таблицами, которые по сути двумерные, довольно непросто сделать эффекты размазывания со скоростью и другие вещи, о которых я мечтал. Вообще, оказалось довольно неудобно рисовать текстуру в ассемблере и подбирать движение в скрипте. Поэтому туннель оказался довольно туповат, в пати версии — очень туп, в финалке — намного лучше, но всё равно слишком однообразен, и, в итоге, затянут. Решение сделать псевдочанки означало, по сути, что я лишил себя возможности двигать туннель по сторонам, что только добавило проблем в этом плане. Урок тут такой: туннель нужно рассчитывать из 3д и делать для себя какой-то тул для интерактивной настройки скриптов движения и текстурирования. Без этого хороший туннель сделать нельзя.
Во-вторых, анима оказалась в чём-то сложной в реализации, т.к. (а) я допустил ошибку в генерации перекодировочной таблицы, и (б) оказалось, что пикселы выключенные, чтобы избежать клэшинга, просвечивают «насквозь» аниму из-за быстрой смены однообразных по растру кадров. Единственное решение этой проблемы, с моей точки зрения, — гораздо более тщательная работа с исходными кадрами. Анимация, которая вошла в пати-версию была очень шумной; переделанная версия этой анимации для финальной версии демо вышла почти идеально. Вторая анимация, которую я не успел сделать для пати, получилась хуже, т.к. крутящиеся квадраты оказываются намного ближе друг к другу, чем хотелось бы.
В-третьих, работая с сэмплами, мы в основном полагались на Spectaculator. Проблема была в том, что все эмуляторы звучали по-разному. Fuse давал какой-то дикий шум. Unreal давал очень странный звук, как будто цифровые звуки находятся на расстоянии от звуков из чипа. ZXMAK2, вроде основанный на Unreal, давал звук ближе к спектакулятору. Во время показа демо на пати я был поражён тем, насколько ритм-секция на туннеле задавила солирующие инструменты. Сперва я списал это на невысокое качество трансляции, но потом riskej записал звук с реального +3 и мы поняли, что по этому поводу что-то нужно делать. Связанная проблема заключалась в том, что очень мало кто вообще говоря понял, что у нас сделаны цифровые ударные — блендинг с AY сыграл с нами злую шутку. Поэтому мы потратили несколько дней на переделку сэмплов и доводку звука. Я постарался подобрать сэмплы, которые бы чётче звучали, и я немного переделал логику плейера барабанов, чтобы барабаны не отставали немного на ударных долях, как в пати версии. Итоговый трек звучит чётче, злее и «цифровее». n1k-o должен был переделать шум для ACB версии трека, и он поколдовал над проблемными паттернами, чуть усилив соло инструмент и чуть уменьшив шум, заменив его на шумовую пульсацию: http://zxart.ee/eng/music/authors/n/nq/furious-acb-mix/
В четвёртых, графика для интро, которую я мужественно нарисовал за несколько дней в июне, видимо впечатлила только меня :) Кстати, n1k-o сразу вспомнил, откуда пришло вдохновение для этой сцены:
За пару дней до релиза финалки diver4d вызвался почистить графику. Кнопка получилась прекрасно, а вот риски регулятора громкости оказалось сложно подсветить не теряя цвета. Поэтому я быстро закодил мою старую идею с интерлейсным мультиколором; по-моему получилось очень мило.
В финальной версии я постарался разрешить все основные проблемы пати версии. У меня было время как следует поработать со скриптами и палитрами, это заняло основное время. Так как мне хотелось зациклить демо, но так, чтобы это не вполне раздражало, я разложил свой контент по зацикленному треку так, чтобы повтор трека не вполне соответствовал повтору видеоряда. Я сделал 2 вариации туннеля и 4 (ок, 2 на самом деле, но немного разные) вариации хаос зумера, так что повторы раздражают чуть меньше.
Мне сложно объективно оценить итог. Я вижу сейчас, что идея «швырять что-нибудь в лицо» не вполне годна для демодизайна. Этого недостатночно для адекватного фикса и это создаёт проблемы при доводке, т.к. приходится слишком сильно полагаться на удачу при доводке эффектов. Мне повезло в том плане, что титры получились очень бодро практически сами, и что скроллер закодился удачно на ходу, но в итоге, эти находки в начале демо скорее создали проблему, что концовке демо не хватает какого-то убойного эффекта. Дополнения к скриптам улучшили расклад, но всё же не вполне разрешили проблему.
Есть ещё проблема с моими инстинктами. Меня критикуют за центрированные композиции кадров и в этом, конечно, есть элемент правды. Я действительно тяготею к этому при дизайне сцен, но я не вижу в этом какой-то существенной проблемы, т.к. это ограничение — в чём-то просто совпадение. Более существенная проблема в том, что меня очень тянет на зацикливание, особенно при работе над быстро задизайненными демами, и видимо, это мой способ избежать придумывания развязки, что не очень просто сделать когда время ограничено. Решение видимо простое: нужно делать меньше дем в запарке, нужно делать больше дем не спеша. Буду исправляться.
ОК, наболтал так, что никому мало не покажется. Вот такой бардачный у меня внутренний процесс. Спасибо за внимание! Извините, если что! :)
P.S. Самая последняя версия демо лежит вот тут. Благодаря diver4d , у нас так же есть запись демо со звуком снятым с реальной пентевы:
40 комментариев
Перевожу: я хочу сгенерировать 6 кадров, со спрайтом «2015», шириной 19 знакомест, стартуя с позиции 7+5*5,8 (атрибутный спрайт будет сдвигаться по 5 знакомест влево от кадра к кадру, так что на последнем шестом кадре его левый верхний окажется в позиции (7,8)). Данная команда только инициализирует генератор кадров и создаёт самый первый кадр.
Вот эта команда сказала ядру, где находится процедура генерации последующих кадров. Кадры пока всё ещё не генерируются.
Тут мы разрешили прерывания, демо поехало.
Вот эта команда новая у меня в ядре: она запускает показ кадров и работает до тех пор, пока не создаст запрошенное число кадров в буфер. Показ кадров идёт независимо от генерации. Если показ обгоняет генерацию — показ просто повторяет последний доступный кадр. Если генерация обгоняет показ, она просто забивает буфер кадрами и ждёт, пока там не освободится место для ещё кадров. После показа последнего запрошенного кадра показ автоматически останавливается.
Вторая половина команды — это скроллинг, который убирает надпись с экрана за 7 кадров:
По точно такой же схеме делается вылетание второй надписи:
Статья познавательная получилась, спасибо — узнал про processing на javascript, теперь свой чанковый велосипед выкину и заменю на их Array 2D. Демо очень стильное, но немного критики не повредит:
* Дигитальных сэмплов лично я не распознал, пока отдельно о них не прочитал. Где-то дигитальность потерялась, отсюда крутизну кода и задумки без отдельного пояснения не оценить.
* Мультиколорный регулятор громкости вписался так органично, что не видно мультиколора. Не бросается в глаза совсем. Хорошо это или плохо — можно спорить, но, на мой взгляд, подачу эффекта выгоднее делать такой, чтобы зритель не смог пропустить и обратил внимание, а вот ставить ли такую цель при создании демо — уже отдельный вопрос.
* Растровый рисунок в Chaos Zoomer не такой плавный, как мог бы быть, из-за чего бросается в глаза «круг» по центру.
* В целом коротко, такого хочется больше :)
и это была одна из причин опубликовать дизник демы.
странно, но гигантский обьём работы, как ни странно, сейчас теряется и не заметен при просмотре.
и мы в этом, увы, уже не виноваты.
в средине 90х все бы охуели от звука.
… а драмс таки ж нужно будет искать именно яркие, заметно живые.
учтём ;)
Про «развитие работы над эффектом» я не понял — ты о чём конкретно говоришь сейчас?
Ну и собственно о матане. Мультиколор этот я закодил быстрее чем типа тривиальный скроллер с перспективой. Почему в таком случае я должен уделять этому мультиколору больше экранного времени? Этот эффект позволил мне сделать мягкую штору и риски без потери цвета, в сравнении с кнопкой. Моя задача была решена. Зачем заострять на этом внимание?
Тег «явзвительно» поставлю далее по тексту чтобы было понятно
В плане демомейкинга как такового тебя послушали и оценили и похвалили, без вопросов.
А негативные психологические посылы — тема отдельного обсуждения. И я очень не хочу в это углубляться и разбирать, к тому же я не специалист по психологии.
Скажу проще — ты не лучшим образом _оформляешь_ свои мысли чтоб тебя услышали, скажем так, много людей, после этого действительно хочется окуклиться, а не слушать.
Имею право, имхо.
В конце — ну можно наверное подумать, что я такой весь из себя неуверенный, что лечиться нужно. Но когда я писал уверенно, народ просто на стены лез, почему я всем всё диктую. Короче, я не боюсь ни первого, ни второго. Мне не страшно обсуждать мои прососы, если это реальные прососы. И, конечно, куча решений при работе над демо — компромиссы, и в этом плане, мне не хочется создавать иллюзию, что бывает как-то иначе.
Это же не относиться к просчетам в демках, тут как раз и происходил смешивание личного и «профессионального» (ну то есть кодерского) чем у нас и так люди грешат (прямо скажем — переходы на личности), и что тебе в результате самому же похоже не нравиться.
;)
демки что бы глядеть сравнивать и анализировать
Все хорошо расписано что и как и _почему_ так.
«Одним — пример, другим — наука»
Про Condommed вобще молчу :) я щас долно выслушивал нет ли там цифровых ударников.
«Пляшушие» красные зубцы я чтото не понял но скролл между ними прикольный.
Тунель мне больше нравиться сине-желтый, остальные — посмазаннеее как то. «По-тракиковки» могу «поворчать» — в наше время все на бейсике встроенном считали, без всяких процессингов :)
Не понял про анимацию с крутящимися квадратми — по моему все смотриться прикольно и глюков особо нету в отличии от патийной версии.
Да ну и насчет запарки. Почему то слишком часто самые лучшие демы делаться в спешке и доделываются на патиплейс. Ты слишком рано начал :)
Второй туннель пострадал оттого, что я хотел зарелизить финалку. Скрипт в нём — негодный, но скрипт первого туннеля занял полный день и на повтор меня не хватило. Сказался негодный инструментарий.
В аниме с квадратами, я посмотрел вчера вечером, действительно баги. Один — который я сделал сознательно, чтобы не перерисовывать растр, он даёт такое мигание по центру и чуть-чуть мусора, там же, в центре. Второй — который я думал что это обман зрения, а нифига, там реально пропустились пикселы. Поправлю второй баг на неделе.
Ты вообще видел _КАК_ она выглядела в трансляции — я еще расспрошу ребят как они так умудрились подключить реал :)
Были ли (авторские) комментарии в IRC? Зал то встретил дему аплодисментами.
Из железа там были гасмановские 128к и +2. У +2 не было стереомода, а 128к внезапно начал глючить с DivMMC (или как она там называется). У гасмана была ещё сетевая карта, но она грузила тоже очень ненадёжно на 128к. Фактически, гасман был малодушно настроен показать в моно на +2, но я направил его на путь истинный, и мы показали всё в стерео на 128к, загружая демы по аудио с писи, т.е., фактически, по-честному, с кассеты :)
Хотелось бы мне увидеть показ New Wave при таком раскладе с железом ;)
К сожалению, при подключении возникла ещё одна проблема — композитное видео почему-то не подружилось с железом проектора, они там что-то нахачили на скорую руку, из-за чего показ был в итоге с небольшим искажением пропорций, но довольно сильным шумом и очень существенными искажениями цвета.
В irc я комментировать показ не мог — сидел в первом ряду далеко от своего компьютера. Музыка реально впечатлила людей, хотя, конечно, мало кто понимает, где там цифра, где там чип. Я думаю, нам удалось главное: сделать довольно неспектрумовский звук на спектруме.
К сожалению записал только днем, там всякие граффикс компо, а вчерер не записал.
Поток у них был слабый вот эта часть выглядела не очень — по краям все очень смазанной кашей крутиться и статика в центре.
Ну и аплодисменты в эфир тоже попали.
Но мне нравится ход твоей мысли!
Просто не подумал даже, если честно.
Я, в общем, согласен. В следующий раз будем делать 1970-е диско :)
Только гангста-реп, дабстеп и прочий трибхоб спасёт оца русской интеллигенции! ;)
Мечты о «точнейшей эмуляции» начинают сбываться?
А раз звук записан с реала, 48.828125 — единственный правильный ответ.