Сегодня расскажу о сортах чиптюна, долгой жизни старой портативной игровой системы, мостике между видеоигровой и клубной музыкой, необычной музыкальной субкультуре, управлении сложным музыкальным редактором с помощью всего восьми кнопок, программах с провокационными названиями, и всё это является подводкой к рассказу о моём новом проекте. В нагрузку идёт немного DIY.
▍ Всегда с тобой
Nintendo Game Boy — одна из первых портативных игровых консолей с микропроцессором, растровым монохромным LCD-экранчиком и сменными игровыми программами на картриджах. Она вышла на рынок в 1989 году и была примерно равна по возможностям нашей любимой приставке Денди, в девичестве Nintendo Famicom 1983 года. Полноценные видеоигры со сложной графикой, классной музыкой и интересными сюжетами, в кармане (огромном), задолго до смартфонов? Дайте, как говорится, две! Или даже 120 миллионов — примерно столько устройств разных версий было продано, что обеспечило платформе место в первой пятёрке наиболее продаваемых в истории.
Моя личная небольшая подборочка основных моделей Game Boy разных лет
К началу 2000-х годов, когда сменилось уже несколько поколений карманных игровых устройств, в том числе в линейке Game Boy, в которой только-только появился новый 32-битный Advance, оригинальная версия консоли объективно устарела. Однако именно тогда это 8-битное устройство странным образом обрело вторую жизнь, продолжающуюся и по сей день.
Конечно, игровые устройства прошлого, перейдя из категории старья в категорию старины становятся предметом интереса коллекционеров, примерно так же, как это происходило с виниловыми пластинками и видеокассетами. Но обычно это интересно людям, хотя бы немного заставшим ту эпоху — как правило, в силу возраста этих вещей, довольно зрелым. У Game Boy же, вероятно, по причине длительной коммерческой жизни платформы, протянувшейся из конца 1980-х в начало 2000-х, сформировалась довольно юная аудитория. Вероятно, таким образом, рождалось популярное в наши дни явление ретро-гейминга, аудитория которого состоит из представителей разнообразных возрастных групп.
Сейчас на старом добром Game Boy кипит жизнь. Активно создаются и выпускаются на физических носителях новые игры, появляются аппаратные модификации, от замены корпуса и кнопок, замены оригинального экрана ужасающего по современным меркам качества на современный чёткий TFT с подсветкой, до улучшения качества и громкости звука. Причём всё это в ассортименте доступно на банальном Алиэкспрессе — что указывает на наличие некоторого спроса.
Я не могу утверждать, с чем связана богатая после-коммерческая жизнь платформы, но предполагаю, что определённую роль в этом сыграло превращение Game Boy в музыкальный инструмент, случившееся в начале 2000-х годов и обеспечившее ему экспозицию в широких кругах, не связанных ретро-геймингом.
▍ Чиптюны в массы
Долгое время видеоигры носили стигму исключительно детского развлечения, чего-то несерьёзного и недостойного внимания взрослого человека. Хотя эта индустрия быстро начала приносить очень серьёзные деньги, вероятно, отношение взрослой аудитории к ней было сродни бизнесу по производству детских погремушек — взрослые их делают, но сами ими не гремят. Потребовалось немало времени, чтобы видеоигры смогли найти аудиторию среди всех возрастов и начать считаться значимым культурным явлением, наряду с живописью, литературой и кино, и в отдельных случаях даже претендовать на звание произведений искусства.
Видеоигровая музыка, будучи интегральной частью явления видеоигр, к тому же поначалу обладавшая специфическим звучанием с простейшими синтетическими тембрами, также долго многими воспринималось «не настоящей», «игрушечной». Тем не менее её сочинение мало чем отличается от сочинения, например, органной или гитарной музыки, как у Баха и Дидюли. Это прежде всего музыка, создаваемая таким же трудом композитора, как любая другая, и только потом, возможно, специфические тембры и технические ограничения, требующие столь же виртуозного освоения особенностей выбранного музыкального инструмента.
Появившиеся первые домашние компьютеры стали самодостаточным инструментом создания музыки, доступным массовому пользователю. Но поначалу они обладали такими же базовыми звуковыми возможностями. Так возник чиптюн — родственная видеоиграм музыкальная форма, берущая в ней своё начало, и обладающая схожим синтетическим звучанием. Принципиальная разница в том, что видеоигровая музыка создавалась ради функции эмоционального восприятия в комплексном произведении (игре), чиптюн же, как правило, создавался ради самостоятельного прослушивания. Это довольно значительное культурное явление также стало нишевым, долго не воспринимавшимся всерьёз массовым слушателем — где-то посередине между игрой на пиле и флатулизмом.
Чиптюн — музыка курильщика. Маэстро Yerzmyey за работой
Случилось немало исторических перемен, и наконец, нынешняя игровая музыка, обретя реалистичное звучание и современный подход к продюсированию, приблизилась к признанию на уровне саундтреков для кинофильмов. Музыка же из классических игр, со свойственным ей звучанием, хотя и получила признание просто за выслугу лет, в целом остаётся довольно нишевым явлением. Как и чиптюн: всё ещё довольно трудно объяснить, что созданный в подобном звучании музыкальный альбом — это тоже серьёзное произведение, в которое (возможно) был вложен большой труд и талант автора.
Тем не менее подвижки в массовом сознании к признанию права подобного звучания на своё место под солнцем за прошедшие годы происходили, и выражаются они, например, в интеграции таких элементов чиптюна, как арпеджио и простые тембры, в популярную танцевальную музыку.
Game Boy же в качестве музыкального инструмента сыграл в роль в установлении связи обратного направления — переносе актуальных, модных музыкальных жанров на его синтетическое звучание.
▍ 50 оттенков серного
К сожалению, при том, что глубоко вовлечён в тему чиптюн музыки я не могу детально описать ни историю становления, ни глубинные особенности направления Game Boy-музыки. Но я могу описать личную, довольно поверхностную перспективу, и объяснить, как же так получилось.
Дело в том, что чиптюн — это зонтичный термин, объединяющий множество разнородных направлений, объединённых схожей звуковой эстетикой и ретро-компьютерными корнями. Однако этот формат делится на множество узкоспециализированных ответвлений — по платформам, по звуковым чипам, даже по музыкальным жанрам, ведь чиптюн сам по себе — не музыкальный жанр, и может быть представлен и джазом, и роком, и дабстепом.
Здесь и музыка, создаваемая непосредственно на старых компьютерах в старых музыкальных редакторах, и музыка, создаваемая под ограничения прошлого во вновь созданных программах для современных компьютеров, и трекерная музыка родом с Commodore Amiga в нескольких сортах, и FM-синтез, и так называемые трекеры новой школы с мощным программным синтезом звука, и просто имитация общей звуковой эстетики видеоигр прошлого иными способами, или же смешивание её с другими музыкальными форматами.
Простой шведский хэви-метал чиптюн. Группа Machinae Supremacy
Долгое время представители каждого из этих многочисленных направлений бурлили эти свои арпеджио в независимых уютных болотцах, которые плавно перетекли из реального мира в зарождающийся мировой интернет, став тематическими сайтами и форумами. Но к середине 2000-х годов начали появляться ресурсы, пытающиеся объять сразу весь спектр около-чиптюновых музыкальных форматов, а также площадки для выставления своих композиций на суд искушённых слушателей. Именно там в зону моего внимания впервые попало уже несколько лет существующее явление чиптюн-музыки, созданной на Game Boy, составлявшее значительную часть публикуемого контента.
Будучи хардкорным представителем старообрядных форм чиптюна, как-то музыки для AY-3-8910 и трекерных форматов MOD/XM, я, конечно, воспринял это явление с некоторой неприязнью: какие-то молодые падаваны, не нюхавшие запаха палёных блоков питания Денди по утрам, делают какие-то грубо звучащие танцевальные треки, плюют на мелодические и аранжировочные традиции, на идеалы Тима нашего Фоллина. Да что они вообще могут знать про восемь бит и чиптюн?
Не могу говорить за других представителей комьюнити, но, думаю, мои впечатления не были уникальными, и жанрово-техническое расслоение сохранялось ещё довольно долго. На мой взгляд, это несколько обособило эту суб-культуру, и она долго продолжала существовать параллельно всему прочему чиптюну и игровой музыке.
Живое исполнение композиции на связке Game Boy'ев. Исполняет 8-BrickDMG
Но даже не интересуясь специально, я постепенно понимал, что это что-то значимое и масштабное, со множеством музыкантов, релизов, живых выступлений, и даже активных поклонников всего этого движения, готовых приходить в клубы и рубиться там под эту музыку — чем едва ли могут похвастаться даже самые «трушные» чиптюн-музыканты.
Время расставило всё по местам, и теперь Game Boy — одна из важных граней чиптюна. Он стал своего рода мостиком между классическим чиптюном и видеоигровой музыкой, и позволил расширить аудиторию слушателей за границы сообщества ретро-компьютерных гиков.
Ныне Game Boy музыканты широко представлены на last.fm, про некоторых из них есть статьи в Википедии. В 2006-2012 годах в разных странах проводилась серия фестивалей Blip Festival, где в том числе была широко представлена музыка для Game Boy. Выступления Game Boy-музыкантов уже давно стали регулярной частью около-игровых и ретро-компьютерных мероприятий.
▍ Game Boy в музыке
Вероятно, именно портативность Game Boy сыграла значительную роль в продвижении созданной на нём музыки в сторону живых исполнений и клубных тусовок — ближе к массовому слушателю, не обязательно имеющему интерес к видеоиграм и компьютерам.
Сам способ создания чиптюн-музыки, предполагающий полное предварительное программирование композиции, не очень располагает к шоу, к живому исполнению. Особенно если это компьютер и стационарный монитор, и музыкант сидит и смотрит в него, тыкая какие-то клавиши. Большая часть композиции исполняется в формате, близком к плюсу, с отличием в том, что это не зафиксированный микс. а синтезируемый в реальном времени звук.
Человек и его трекер 21 века. У меня тоже такой есть! А вы сомневались?
Портативность же позволила музыканту хотя бы устанавливать зрительный контакт с аудиторией, дала ему мобильность. Это сформировало формат, близкий к диджейству — музыкант находится рядом с воспроизводящим устройством и вносит некоторые элементы живого исполнения, прыгает, болтает головой и иначе транслирует свою энергетику в зал.
Особенности звучания современной музыки на Game Boy определены не только его звуковым синтезатором, но и спецификой создания музыки на нём самом. Ведь это делается с помощью всего восьми кнопок, на маленьком экранчике, в рамках очень ограниченной памяти. Как правило, это приводит к тому, что музыка получается громкой, звучащей в лицо, например, без широкого применения техник имитации эхо, свойственных чиптюну прошлых лет. Во многом она склоняется к танцевальным жанрам как в силу клубно-ориентированной специфики, так и в ограниченности памяти устройства, вынуждающей многократно повторять фрагменты трека.
По композициям творения музыкантов, как правило, достаточно далеки от традиционной видеоигровой музыки — они только используют схожую звуковую эстетику, простые тембры, арпеджио. За исключением специфического звучания, это скорее современная клубная танцевальная музыка, качающая, с сильной, но простой мелодической составляющей, с элементами модных на те моменты жанров электронной музыки, например, дабстепа.
Руки Danimal Cannon и его музыкальные инструменты
В отличие от чиптюн-пуристов, принципиально ограничивающих свои технические средства одним только избранным компьютером и звуковым чипом, Game Boy-музыканты легко идут на эксперименты. Кто-то использует только один Game Boy, кто-то сразу несколько, кто-то дополняет его другими устройствами и музыкальными синтезаторами. Очень часто используются микшеры для эквализации, компрессии и пространственных эффектов, для достижения более плотного, качающего звучания.
▍ Little Sound Dj
Краеугольным камнем в основе музыкальной субкультуры на Game Boy стал Little Sound Dj, также известный под сокращённым названием LSDj — главный музыкальный редактор для этого серого карманного кирпичика. Разработал его Йохан Котлински, чиптюн-музыкант из Швеции.
К слову, энтузиасты из этой страны сделали большой вклад в развитие культуры чиптюна. Там, например, родился FamiTracker, из Швеции родом группа Machinae Supremacy, одна из первых соединившая тяжёлую гитарную музыку с чиптюновыми арпеджио. Оттуда же и популярный Game Boy-музыкант Goto80. Можно сказать, достойное пополнение списка культурно-технологических достижений, помимо Икеи, Вольво, Сааба и Карлсона.
Первая версия LSDj вышла в 2000 году в формате ROM-файла и ограниченной серии картриджей. Демонстрационную версию с ограниченными функциями можно было свободно скачать с сайта и запустить в эмуляторе. Полноценную версию стала доступна для скачивания позже, в 2004 году она стоила 45 долларов.
Интерфейс LSDj, основные экраны
Первые годы автор также выпускал реальные физические картриджи небольшими партиями, которые мгновенно раскупали. Поначалу они стоили 65 долларов, к 2004 году автор, чтобы отвязаться от благодарных пользователей, требующих больше картриджей, продавал последние экземпляры за 800 (прописью: восемьсот).
Программа развивается до сих пор — да, уже 23 года. Теперь она выпускается только в виде ROM-файла, бесплатного для личного использования. Запускать её можно как в эмуляторе, так и на реальном Game Boy с использованием одного из современных Flash-картриджей.
Пожалуй, главное достижение LSDj заключается в определении концепции удобного в использовании интерфейса на устройстве с очень маленьким экраном низкого разрешения и восемью кнопок. При этом он не следует традиции Nintendo из Mario Paint с упрощённым забавным интерфейсом с цветочками и грибочками, пригодным для удобного создания простеньких мелодий, но едва ли способным на что-то большее. Нет, LSDj — это бескомпромиссный суровый трекер здорового демосценера, с паттернами, инструментами, колонками шестнадцатеричных цифр и поддержкой разнообразных эффектов.
Интерфейс LSDj, погружение в пучины чиптюна
Более того, структура композиции в LSDj даже сложнее, чем в классических демосценовых трекерах, для оптимального использования очень ограниченного объёма памяти: трек состоит из списка цепочек, состоящих фраз, состоящих из нот. Таким образом, порог вхождения довольно высокий: нужно понимать и особенности устройства звукового синтезатора консоли, и структуру композиции, и свободно оперировать шестнадцатеричными числами, и помнить множество комбинаций немногочисленных управляющих кнопок. Однако вопреки (моим личным) ожиданиям, для энтузиастов это не стало препятствием.
Современная версия включает в себя не только полную поддержку основных каналов, но и создание пользовательских инструментов на Wave-канале (табличный синтезатор), сэмплы ударных и даже синтезатор голоса в стиле Speak & Spell. Помимо этого, реализована синхронизация с внешними синтезаторами и даже MIDI-интерфейс.
▍ LittleGPTracker
LittleGPTracker, также известный как LGPT или Piggy, был создан Марком Резибойсом в 2007 году. Он стал довольно успешной попыткой расширения успеха LSDj на другие портативные платформы тех лет.
Это, прежде всего, основательно подзабытая ныне южнокорейская платформа Game Park, точнее, её версии GP2x и Caanoo — отсюда буквы GP в названии. Так как данные платформы были распространены лишь ограниченное время в кругах редких энтузиастов, и быстро исчезли с горизонта, трекер практически сразу был портирован на популярную тогда линейку китайских портативок Dingoo, а также на значительно более известную в мире Sony Playstation Portable.
Интерфейс LGPT
Интерфейс программы непосредственно копирует LSDj, что повсеместно отражено в документации, рассчитанной на предыдущее знакомство пользователей с LSDj. Звуковые возможности, однако, полностью свои: теперь это 8-канальный сэмпл-трекер, подобный форматам MOD и XM, но со структурой трека, свойственной LSDj. Это привело как к расширению звуковой палитры, так и к потере идентичности: у программы нет своего собственного легко узнаваемого звучания.
Этот проект не смог повторить успех предшественника, но заслужил определённую популярность, в частности, благодаря большей доступности — он изначально был бесплатным, и его можно было просто загрузить в память имеющейся портативки, которую можно было приобрести новой в магазине, или запустить на обычном компьютере с Windows или Linux. Для Game Boy же требовалось найти и приобрести бывшую в употреблении консоль, а также Flash-картридж — относительно дорогое по тем временам удовольствие.
▍ NTRQ и Pulsar
Говоря об LSDj, нельзя не упомянуть хотя бы в двух словах проекты NTRQ и Pulsar. Это музыкальные редакторы для игровой консоли NES, конечно, не портативной, но сравнимой по возможностям, и с таким же специфическим управлением. Оба этих проекта претендовали на звание «LSDj для NES».
Созданы они одним автором, Нейлом Балдуином, одним из лучших европейских игровых музыкантов поздней коммерческой эпохи NES и по совместительству одним из со-основателей британской компании Eurocom. В конце 2000-х годов он на некоторое короткое время влился в комьюнити музыкантов-любителей, рассказал множество интересных подробностей о временах сочинения своих коммерческих саундтреков, а также разработал целую пачку очень интересных около-музыкальных программ для NES.
Трекер NTRQ для NES. У него даже есть нескромный титульный экран
NTRQ был первой попыткой Нейла создать полноценный трекер, работающий на приставке. На момент создания он не был близко знаком с LSDj, и поэтому пошёл своим особым путём, более похожим на классические трекеры для Commodore 64, однако, неизбежно получившим определённое сходство в силу особенностей управления на этой платформе — оно такое же, как на Game Boy, четыре стрелки, две основных кнопки действия и две дополнительных. Получился действительно серьёзный инструмент, в котором реализовано множество мощнейших возможностей, включая невиданное ранее автоматическое одноканальное чиптюновое эхо.
Публика приняла NTRQ благосклонно, но так как приставочные трекеры были в то время представлены только LSDj, главным пожеланием публики было дальнейшее приближение пользовательского интерфейса к более привычному массам виду.
Трекер Pulsar. Всё ещё красивый, всё ещё непонятный
Это пожелание Нейл учёл в своём следующем проекте: Pulsar стал значительно ближе по управлению к LSDj, и даже в авторском описании говорится, что не будь LSDj, этого проекта также не случилось бы. При этом Pulsar не ограничился только лишь изменением интерфейса. Был радикально переработан звуковой движок и ещё больше расширены возможности, в относительно редкую для чиптюна сторону — обновление состояния синтезатора на частоте 180 Гц вместо стандартных 60-ти. Это открыло возможности для создания ранее неслыханного на NES звучания.
Несмотря на качественную проработку этих двух проектов и их впечатляющие, уникальные возможности, и даже на приближение интерфейса к стандарту LSDj, они до сих пор не получили заметной популярности в кругах чиптюн-музыкантов, и даже отдалённо не воспроизвели успех хотя бы даже LGPT. Что, возможно, лишний раз подчёркивает важность портативности платформы в этом вопросе.
▍ ESPBoy Tracker
И вот от преданий старины глубокой мы переходим в сегодняшний день, к рассказу о моём собственном проекте.
Как я уже упоминал в статье про портативные DIY консоли, несколько лет назад ко мне обратился за помощью Роман Соколов, автор проекта одного из подобных устройств — ESPboy. Для этой платформы требовалась поддержка в области звука — библиотека синтеза или порт музыкального движка, что-то подобное, что пригодилось бы в озвучивании игр.
С первых же обсуждений я предлагал идею нового редактора, формата и звучания, но так как это дело обещало быть относительно трудоёмким, Роману было неудобно, и он раз за разом уговаривал меня ничего этого не делать, ограничившись какими-то самыми минимальными решениями. Я долго старался не делать, но мне это даётся нелегко, и вот, годы спустя, в аккурат при написании упомянутого обзора моё терпение лопнуло: я решил-таки написать новый специализированный музыкальный редактор.
Game Boy Pocket и ESPboy1. Почти близнецы-братья
Не так давно я собрал себе коллекцию почти всех моделей Game Boy, и, глядя на них и перекладывая с места на место экземпляры сильно похожего по форм-фактору ESPboy, которым хотелось бы найти какое-нибудь применение, вспомнил про LSDj. Таким образом, я надумал делать не какой-нибудь минималистичный браузерный кросс-редактор, а довольно серьёзный проект непосредственно для устройства, в надежде, что у него будет шанс войти в ту же воду и стать своего рода killer app’ом платформы.
▍ Разработка
До начала разработки я заранее определился с планом действий: довести проект до пригодного к публикации состояния максимально быстро, чтобы не исчерпать мотивацию раньше времени, и не тратить время на возвращение в контекст после длительных перерывов. При этом первая же релизная версия должна быть максимально полной по содержанию, иметь все основные возможности, а второстепенные могли быть отложены до последующих обновлений.
Изначально было понятно, что если я хочу сделать проект быстро, разрабатывать его в Arduino IDE не вариант. Дело в том, что Arduino IDE собирает проекты для ESP8266 невероятно, мучительно медленно, при этом не предлагая никаких средств отладки, кроме печати в последовательный порт, и одна итерация тестирования каждого изменения занимает минимум несколько минут, а поиск ошибки типа случайного выхода за пределы массива может и вовсе стать проблемой на многие часы. Ранее я уже порядком намучился с этой проблемой, отлаживая прошивку для проекта hway, и повторять этот опыт не хотелось.
Чтобы радикально ускорить процесс, я решил действовать по ранее многократно опробованной мной на других платформах и задачах технологии: написать фреймворк для целевого устройства и его полный аналог для SDL, и делать основной проект без прямой работы с ресурсами платформы, однако, держа их ограниченность в уме. Это открывает возможность написания основной части кода в Visual Studio, имея в своём распоряжении высокую скорость компиляции и современные средства отладки. Для устройства же собирается заведомо рабочий код полностью готового проекта.
Таким образом, основная часть кода пишется и отлаживается на PC, и только платформо-зависимая часть, такая, как распределение и динамическое выделение памяти, работа с экраном, кнопками и файловой системой, отлаживается на устройстве.
▍ Дневники
Проект начался сразу после публикации статьи про DIY портативки. Я вёл очень краткий дневник разработки — не детальный, так как, похоже, это не очень интересный формат для чтения, но достаточный для понимания, насколько быстро или долго делаются подобные проекы. Дни в реальности шли не подряд, были пропуски.
День 1. Прочитал документацию LSDj и изучил его интерфейс, раньше был знаком с ним очень поверхностно. Написал фреймворк для SDL, реализовал основные функции интерфейса с выбором экранов.
День 2. Сделал редактор ордер-листа и паттернов, экран помощи, синтезатор звука на основе wtbeep. Наметил список параметров инструмента.
День 3. Браузер файлов, диалоги ввода и подтверждения выбора, сохранение модуля. Наметил экран настроек с первой опцией — как в моём порте tzxduino, вывод звука на встроенный динамик, на внешний пин, или туда и туда.
День 4. Загрузка инструмента и модуля из файла. Доработка связанных с загрузкой и сохранением диалогов. Редактирование всех параметров инструмента.
Первые шаги проекта
День 5. Доработки по интерфейсу, глобальное мигание курсора с настройкой частоты мигания. Браузерный файловый менеджер для ESP8266 с возможностью загрузки и скачивания файлов через WiFi.
День 6. Режим транспозиции паттернов в списке позиций. Вставка и удаления строк в паттерне и списке позиций. Копирование и вставка инструментов, паттернов, выделение и копирование фрагментов списка позиций. Наметил инструкцию, общую структуру и содержание. Наметил вывод графики на ESPboy, пока просто цветной шум.
День 7. Доделал фреймворк для ESPboy. Написал и отладил быстрый вывод текстового экрана через библиотеку nbSPI. Адаптировал работу с файлами. Проект запускается на устройстве и даже пока помещается в ОЗУ. Начал заниматься звуковым движком с инструментами и треком, пока не победил пересчёт высоты тона в делитель.
День 8. Продолжил заниматься звуковым движком, ещё больше запутался, потому что хочу предусмотреть все возможности сразу, но структура движка стала проясняться. Так как интерфейс уже оформился и больших изменений не планируется, подготовил предварительную версию богатой и красивой документации в PDF.
Вторые шаги проекта
День 9. Продолжение работ по синтезатору, в целом он почти готов. Решена проблема пересчёта питча, добавлены слайд и модуляция.
День 10. Фактически проекту уделено несколько минут, пришлось сделать паузу. Дорабатывал мелочи, однако в результате пропал звук.
День 11. Выбор шрифта, нарисован оригинальный шрифт. Написал JS-скрипт бэкапа всех файлов через WiFi. Исправление работы с файлами, восстановление звука. Добавил кэш директории для LittleFS: чтение директории очень медленное, а места в ОЗУ для предварительного чтения списка файлов нет. Поэтому список считывается и записывается в файл, который далее при отображении читается по частям.
День 12. Мелкие доработки, намётки по плееру, уточнение системы эффектов. В процессе полез в папку другого проекта, который спокойно лежал на диске десять лет, и оказалось, что он случайно удалён. Потрачено время на восстановление.
Третьи шаги проекта
Дни 13 и 14. Разработка стала подвисать, так как самое интересное уже сделано, а энтузиазм значительно снизился. Эксперименты с раскраской и украшением интерфейса в графическом редакторе, по результатам выбранная раскраска реализована в проекте.
День 15. Переработал плеер, реализовал все режимы работы. Теперь можно действительно редактировать и слышать трек. Сразу стали ясны требуемые доработки интерфейса и плеера, которые и были реализованы. Среди них быстрый переход двойным тапом на редактор паттерна и инструмента по их номеру, поддержка более чем одного эффекта на строку.
День 16. Закончил отладку эффектов. Отладил плеер, немного переделал синтезатор для решения проблемы плавного изменения питча, решил ряд моментов по редактору в целом.
Почти дошагали
День 17. Ещё доработки и отладка интерфейса. Опция подсветки одинаковых позиций ордера, вставка неиспользуемого паттерна в ордер по двойному нажатию.
День 18. Озвучивание ввода нот в паттерне и все соответствующие опции. Поддержка звука на ESPboy через внутренний динамик и наушники. Вынужденное уменьшение количества паттернов и прочих сущностей, чтобы уместить их в ОЗУ ESP8266. Отображение текущей позиции проигрывания.
День 19. Добавлена гамма-коррекция для изображения, экран реального устройства очень светлит и цветовая схема плохо читалась. Эксперименты с PWM звуком, найден вариант, как реализовать стерео без внешнего ЦАП. Собрал и поддержал все звуковые устройства. В таком виде сделан релиз первой версии.
Предрелизная демонстрация-тизер
Итого разработка от идеи до первой публичной версии, сразу же содержащий максимум из задуманного функционала, заняла 19 дней. За это время было написано чуть больше 140 килобайт исходного кода на чистом C, довольно плотный код без плюсов и классов.
▍ Интерфейс
Самой интересной частью проекта, безусловно, является пользовательский интерфейс. Он должен обеспечивать размещение на микроскопическом экранчике с разрешением 128 на 128 точек всей необходимой информации, представленной достаточно удобным способом, с возможностью чтения без микроскопа. Также он должен позволять выполнять множество действий с помощью всего восьми кнопок — включая навигацию по отдельным режимам и по треку, ввод нот, октав, текстовых строк и шестнадцатеричных значений.
Я не стал изобретать велосипед и подсмотрел в LSDj основную структуру и способ управления — это отполированное до блеска и проверенное десятилетиями решение. Однако я намеренно не стал делать и излишне близкую копию. Как показал пример NTRQ и Pulsar, если двигаться в сторону копирования, нужно делать это до конца, иначе пользователи будут постоянно немного недовольны. Делать же полный клон давно существующей программы, которую можно просто скачать и использовать, мне было бы просто неинтересно.
Так как даже у оригинального Game Boy разрешение экрана выше, а шрифт нужно было делать как минимум не мельче, и к тому же обеспечить максимально высокую скорость обновления, фактически получился текстовый режим 16 на 16 символов, в рамках которого реализуется псевдографический интерфейс. Поэтому количество элементов интерфейса и визуальных украшений на экране минимально, а в текстовых обозначениях используется множество сокращений.
В отличие от моих прочих трекерных проектов, где я часто внедряю экспериментальные принципы, например, полностью десятичные интерфейсы, или структуру композиции без списка позиций, в данном случае я решил делать классический трекерный интерфейс. Причиной этому и слишком малый размер экрана, чтобы вмещать десятичные цифры, и ограниченность оперативной памяти, вынуждающая использовать одноканальные паттерны, что ведёт к некоторому однообразию звучания, и нужно предусмотреть возможности, которые позволили бы его разнообразить.
Интерфейс EBT — основные сущности: список позиций, паттерн, инструмент
Композиция в LSDj имеет гораздо более сложную структуру, в которой довольно непросто разобраться. И хотя это дало бы значительно большую гибкость, для моего проекта простота освоения имела приоритет перед потенциальной сложностью получаемых композиций. Поэтому я упростил структуру до классической: инструменты, ноты в паттерне, список позиций.
В целом в трекере повсеместно используется принцип минимального набора параметров — так, инструменты описываются всего одним столбиком цифр, а не традиционными графиками огибающих. Для особо искушённых пользователей всегда можно будет сделать более сложный и продвинутый трекер, но сначала этим пользователям нужно появиться.
Управляющие кнопки разделены по функциям и сохраняют свой эффект повсеместно, что добавляет интуитивности управлению. Стрелки перемещают курсор, кнопка ACT редактирует значения и подтверждает выбор, кнопка ESC отменяет выбор и ускоряет перемещение курсора, кнопка LFT заведует навигацией по режимам редактирования, кнопка RGT управляет проигрыванием. Для кнопок ACT и ESC есть много контекстно-зависимых комбинаций, редко используемые функции вызываются длительным удержанием или быстрым двойным нажатием.
Интерфейс представлен экранами, посвящёнными той или иной сущности. Они организованы в виде крестообразной структуры, по которой можно перемещаться стрелками, удерживая кнопку LFT. Экраны расположены таким образом, чтобы дать максимально быстрый доступ к часто используемым сущностям: слева — только список позиций, справа — только паттерн, первым сверху идёт экран параметров трека, первым снизу — редактор инструмента. Менее часто используемые экраны требуют нескольких перемещений.
Интерфейс EBT — экран помощи, навигация, экран основных настроек композиции
Редактирование всех значений выполняется с удержанием кнопки ACT. Нажатиями влево-вправо можно менять младший разряд значения, вверх-вниз меняет старший разряд. Для нот это собственно нота и октава. Удержание кнопки предохраняет от случайных изменений, ведь список отмены действий отсутствует, на ESPboy нет для него памяти. Нажатие ACT на любом значении запоминает его, и при последующем одиночном нажатии ACT в пустом поле вводится такое же значение — это сильно ускоряет процесс ввода данных.
Экраны списка позиций и паттерна также имеют подменю, переключение между которым и основным полем редактирования осуществляется двойным нажатием ESC. Комбинация ACT+ESC удаляет или сбрасывает значение поля на дефолтное.
В зависимости от активного экрана, кнопка RGT запускает проигрывание всего трека с самого начала, трека с текущей позиции, только текущего паттерна, или проверку звучания инструмента. Высота звучания инструмента для проверки задаётся в параметрах каждого из них, и она также может быть зафиксирована — это полезно для перкуссионных звуков, которые в таком случае будут сохранять высоту независимо от вводимых нот.
Очень небольшой, но важной особенностью интерфейса является возможность перехода двойным нажатием ACT в редактор сущности: если нажать на номере паттерна, откроется редактор паттерна с ним, если нажать на инструменте — откроется редактор инструмента. Это удивительно удобно, как говорится — почему так не сделали раньше?
▍ Звуковой движок
Вопрос, как именно должен звучать ESPboy, стоял изначально и был самым сложным. Ведь своего особенного синтезатора и звучания у него нет, а чисто программный синтезатор может звучать как угодно.
Роман предлагал эмулировать существующий чип, например, AY-3-8910. Также рассматривался вариант с эмуляцией звука оригинального Game Boy. Эти идеи мне не показались привлекательными, потому что они не дают платформе собственной идентичности — точно такой такой же звук уже десятилетиями доступен на множестве других платформ. Для того же AY-3-8910 существует минимум 20 тысяч композиций, и тратить месяцы разработки для того, чтобы несколько энтузиастов написали ещё сотню, не выглядит рациональным подходом к и без того иррациональной затее.
К тому же сложность управления подобными чипами требует довольно сложных редакторов, которые едва ли возможно сделать удобными на таком устройстве, а схожесть звучания будет вызывать у пользователей дискомфорт от непохожести интерфейса на стандартные для этих чипов редакторы и постоянно тянуть проект в сторону клонирования уже существующих решений.
Вполне типичный редактор инструментов для чипа POKEY 1979 года
Поэтому было решено: звук должен быть уникальным. Более того, нужна была возможность получения достаточно разнообразного звучания при простейшем наборе параметров инструмента, практически пресетная модель, чтобы упростить редактирование и снизить порог вхождения: проблемой многих чип-трекеров является неочевидный путь от ввода ноты до получения первого звука.
Также звук должен быть очень громким и чётким, ведь в стандартной модели ESPboy очень тихий динамик и нет выхода на наушники. Очень громко звучат биперные движки на ZX Spectrum, которых я разработал великое множество. Но и их звучание в точности повторять не хотелось, ведь они тоже уже доступны на своей домашней платформе.
В итоге я решил взять за основу современный биперный движок wtbeep, разработанный utz в 2016 году. Очень малоиспользуемый, очень гибкий, но страдающий низким качеством звука из-за недостатков ресурсов на ZX Spectrum. В оригинале он предоставляет трёхканальную полифонию, 32 тембра и примитивную перкуссию, без каких-либо эффектов.
Я использовал wtbeep один раз, работать с ним мне очень понравилось — а публике понравился трек, но сильно расстраивали артефакты звучания. Мощностей же ESPboy как раз хватает, чтобы устранить все его недостатки — убрать свист, сделать больше каналов, добавить поддержку громкости и разнообразных эффектов.
Дико странный код
Если вы заглянете в код синтезатора, он покажется дико странным — непонятные сдвиги, условия. Этому есть объяснение. Изюминкой оригинального движка является способ формирования разных тембров с помощью внедрения в общий цикл синтеза кусочков самомодифицирующегося кода, «алгоритмов», которые производят различные арифметические и логические операции над содержимым счётчика канала, а также общими счётчиками модуляции. Это позволяет формировать довольно сложные звуки из одного простого линейного счётчика-накопителя.
Одной из особенностью этих алгоритмов является эксплуатация команды двоично-десятичной коррекции DAA, которая в том числе позволила сформировать прямоугольную волну с широким диапазоном сважностей. В программном синтезаторе EBT воспроизведены все эти алгоритмы, что несколько усложнило код, но дало полную совместимость по тембрам и возможность переноса музыки — таким образом, я конвертировал свой большой трек с ZX Spectrum, что помогло отладить функциональность синтезатора и проигрывателя.
Другой важный вопрос, который требовалось решить — как вообще воспроизводить звук на ESPboy. В отличие от старшего собрата ESP32, ESP8266 не имеет встроенного ЦАП, аппаратного PWM, или даже драйвера светодиодов, который часто применяют в качестве аудиовыхода.
Звуковые устройства для разъёма расширения: моно джек, стерео джек, модуль i2s ЦАП
Вместо этого есть одноканальный Sigma-Delta Modulator, которого хватает для терпимого по качеству звука. Его я сделал стандартной опцией озвучивания, с возможностью вывода на встроенный динамик, а также на контакт разъёма расширения, к которому можно подключить наушники или усилитель.
Моно — это приемлемо, но Game Boy 1989 года поддерживает стереофонический звук, и хотелось бы в 2023 году не отставать и в этом вопросе. Тем более что это поднимает интересность и читаемость звучания на другой уровень, более пригодный для обще-музыкальных целей.
Но через стандартный программный PWM приличный стереозвук на ESP8266 не сделать, для этого у него крайне низкая частота дискретизации и сопутствующие артефакты. Поигравшись с ним и с другими идеям, я было сдался. Но потом придумал вариант собственного кастомного PWM, который как раз хорошо сочетается с идеей использования однобитных звуков и небольшого количества уровней громкости.
Реализован он максимально примитивно: по прерыванию таймера вызывается процедура, которая устанавливает высокий уровень на «левом» и «правом» контактах разъёма расширения на заданное время в диапазоне 0..16 условных отсчётов, длительность которых задана просто скоростью выполнения этого кода. Это, разумеется, сильно просаживает производительность контроллера, но, тем не менее её хватает — всё-таки 160 MIPS — и качество звука при этом получается на удивление приличным.
Звучит этот PWM вот так. Запись непосредственно с контактов разъёма в линию
Ну а для наилучшего качества стереофонического звучания предусмотрена поддержка внешнего i2s ЦАП, например, на микросхеме PCM5102A. В продаже есть готовые к применению модули с таким чипом, и достаточно всего нескольких проводков, чтобы подключить такой модуль к разъёму расширения ESPboy.
▍ Передача файлов
Думаю, не нужно объяснять, почему музыкальному редактору совершенно необходима возможность передачи созданных файлов во внешний мир.
Я не знаю, как это было устроено в оригинальном LSDj, выходившем на отдельном картридже — подозреваю, что никак. По крайней мере, технически для чтения-записи было бы нужно специальное устройство. Выгрузку можно было бы сделать и звуком, по принципу одностороннего модема. На Flash-картриджах это делалось проще, файл сохранения можно извлечь с SD-карты и разобрать сторонними утилитами — это общий бинарный файл состояния, не делящийся на отдельные треки.
На ESPboy с передачей данных тоже не всё гладко. С подключением по проводу всё вообще плохо: можно заливать файлы через плагин в IDE, который не отличается надёжностью и удобством, а готовых решений для извлечения содержимого файловой системы из встроенной Flash-памяти я вообще не встречал. Поэтому с передачей по проводу я решил не связываться.
К счастью, лежащий в основе ESPboy контроллер предназначен для IoT, и потому обладает современными беспроводными интерфейсами. Проще всего было реализовать передачу файлов через WiFi, что я и сделал.
Технически беспроводной файлообмен может быть реализован в двух вариантах.
В режиме Access Point компьютер сам подключается к ESPboy, Для подключения нужен WiFi адаптер, который есть в смартфонах и ноутбуках, но редко встречается на стационарных компьютерах. При подключении к ESPboy вводится логин и пароль на стороне компьютера.
В режиме подключения к общей сети ESPboy сам подключается к существующей беспроводной сети, и становится доступным для других устройств. В этом случае нужен не отдельный адаптер, а существующая сеть. Пароль и логин вводятся на стороне ESPboy, что не очень удобно.
Обмен файлами с ноутбуком
Я решил для начала реализовать только первый вариант, как более простой, удобный, и надёжный, так как примеры второго режима у меня сходу не заработали. В обоих случаях, независимо от способа соединения. Дальнейшая работа происходит в режиме веб-сервера: ESPboy показывает веб-страничку, на которую можно зайти обычным браузером, и запросить там загрузку или скачивание файла.
Как ни странно, готового решения этой типовой задачи я не нашёл — помимо одного под лицензией GPL, а я не питаю особой любви к вирусным лицензиям, и свой проект хотел выпустить на более свободных условиях. Пришлось изобрести свой велосипед, максимально простой и, возможно, совместимый — без CSS и с минимумом JS, который применяется для пакетной передачи всех файлов разом.
▍ Название
Довольно странно выделять этот момент отдельно, но он довольно важен. Учитывая количество проектов, которые я делаю, я давно устал от проблемы нейминга. Придумать уникальное умное название, говорящее о сути проекта, которое хорошо ищется — нетривиальная задача, если делаешь её в сотый раз.
Так как на это занятие зачастую уходит неприлично много времени, которому можно найти лучшее применение, я давно экспериментирую с системами наименования, например, формирую список возможных названий композиций музыкального альбома задолго до написания самой музыки, и по её готовности выбираю наиболее подходящие названия из заготовленных.
В целом же дзен, который я постиг в этом вопросе спустя годы, сейчас выражается в одном слове: «пофигу». Ведь эмоциональная окраска и ощущение «подходит-не подходит» есть только у меня, как у вовлечённого участника, наблюдающего развитие проекта с момента задумки до публикации. В глазах же пользователя любое предложенное название звучит примерно одинаково и рано или поздно нормально прилипает к продукту, каким бы дурацким оно не было.
Для проекта трекера я подметил традицию названий, приобретающих неоднозначное и провокационное звучание в сокращённой форме. Начал это дело сам Йохан, продолжил Марк, и я решил тоже поиграть в эту игру. Тем более что наиболее очевидное название проекта — ESPBoy Tracker — удачно складывалось в аббревиатуру EBT. На английском она ничего не значит, сомнительных подтекстов не содержит, а значит, будет просто хулиганской пасхалочкой для русскоязычных пользователей.
▍ Сделал сам
Вишенкой на торте проекта музыкального редактора для ESPboy я решил сделать отказ от использования ESPboy. Точнее, я решил задействовать DIY-аспект платформы и создать свою собственную модификацию, оптимизированную именно для трекера.
Дело в том, что оригинальный ESPboy не сильно удобно использовать на практике — оригинальная версия устройства очень компактная, настолько, что его тяжеловато держать в руках, и особенно неудобно нажимать две микроскопические дополнительные кнопки, LFT и RGT. Также она использует экран диагональю 1.44 дюйма с не очень высоким качеством изображения. Специфика же проекта подразумевает необходимость часами таращиться в экран и активно нажимать комбинации кнопок.
Easy DIY версия более удобна в плане ухватистости и доступности кнопок, но она использует такой же маленький экран. Любые версии также требуют использования внешней дополнительной платки для подключения наушников.
EBTboy: начало
К сожалению, увеличение размера экрана возможно только через отказ от совместимости — экранчики на контроллере ST7735 с разрешением 128 на 128 точек бывают только такого размера. Более крупные имеют другое разрешение, при незначительном увеличении размера и таком же качестве изображения. Роман уже проводил эксперименты с подключением экрана на другом контроллере с разрешением 320 на 240, и так как потеря совместимости была неизбежна, я решил пойти тем же путём, благо такой экранчик уже был под рукой.
Помимо экрана, я хотел применить более удобные по тактильным ощущениям кнопки и расположить их более удобным образом. Для простоты я решил убрать всё ненужное: светодиод, динамик, программное управление яркостью экрана, разъём расширения, а для удобства — встроить модуль звукового ЦАП и использовать более ёмкий аккумулятор.
Таким образом, особенности моей конструкции таковы:
- Более крупный и чёткий экран с диагональю 2 дюйма.
- Более крупный форм-фактор, устройство удобнее держать.
- Кнопки на удобных местах, и сами по себе более приятные по ощущениям, чем тактовые.
- Аккумулятор относительно большей ёмкости (1500 мАч).
- Встроенный модуль i2s ЦАП для наилучшего качества звука.
В настоящей электронной самоделке должна быть синяя изолента или МГТФ. Иначе работать не будет
Во избежание путаницы заострю ваше внимание на том моменте, что это уже не ESPboy — это мой собственный EBTboy (тавтология, достойная традиций АвтоВАЗ’а), повторяющий схемотехнику оригинала, но уже не совместимый с ним из-за другого экрана.
Разумеется, для работы трекера на таком устройстве потребовались изменения в коде — нужно было поддержать как новый контроллер экрана, так и его значительно большее разрешение.
Помимо отображения, было внедрено ещё одно улучшение интерфейса, связанное с геометрическим расположением кнопок LFT и RGT. Оказалось довольно удобным поменять их местами: чаще всего нужно одновременно нажимать LFT и стрелки, а LFT и ACT/ESC — редкая комбинация, случайные нажатия которой нужно исключить. Расположение кнопки LFT справа позволило нажимать её большим пальцем правой руки, оставляя большой палец левой руки свободным для нажатия стрелок.
Результат
Что касается конструктива устройства, это традиционная DIY эстетика в виде бутерброда из двух монтажных плат, скреплённых монтажными столбиками и винтиками, с модулями и аккумулятором, расположенным между платами — такую же конструкцию имеет ESPboy easy DIY.
Из интересных моментов, моя предыдущая практика сборки устройств в подобном формате показала, что они получаются компактнее по высоте, если ставить платки модулей кверх ногами, деталями к плате. Правда, это затрудняет распайку проводов, становится легче перепутать номера контактов.
Попытка передать улучшенное изображение на более крупном экране
Разумеется, не обошлось без духа DIY, и на момент публикации статьи устройство заработало не полностью — по неизвестным причинам возникли проблемы с опросом кнопок, возможно случилась неисправная MCP23017 (дополнение через время: оказалось, что я случайно впаял MCP23S17, позор на мои седины!). И даже передать через фото значительно похорошевшее качество изображения не удаётся, светодиодная подсветка экрана очень сильно отдаёт синевой на камеру, хотя для глаз выглядит нормальной белой.
▍Итого
На данный момент опубликована первая версия редактора в версиях для реального ESPboy и для Windows. Её, вместе с исходниками, можно скачать с моего сайта или из репозитория. За счёт использования SDL исходники портабельны, теоретически их можно без проблем собрать под Linux — пока не пробовал. Также их можно адаптировать для любой другой DIY платформы с достаточными ресурсами.
В ближайших планах — версия 1.1 с экспортом данных для использования музыки в других программах, поддержка алфавитно-цифровой клавиатуры, ещё больше тембров, и многие другие улучшения.
Конечно, имеющиеся пока примеры звучания довольно неказисты, и недалеко ушли от их однобитно-спектрумовских корней. Но это только начало. Моя практика разработки музыкальных синтезаторов показывает, что, попав в руки к одарённым музыкантам, они способны извлекать из них звучание, которого сам автор и близко не ожидал — нужно только дать им время. Посмотрим, что из этого получится.
Автор: Александр Семенов