Русский
Русский
English
Статистика
Реклама

Ay-3-8912

Как заставить Arduino петь как ZX Spectrum. Часть 1 исторический экскурс

26.10.2020 18:07:34 | Автор: admin

ZX Spectrum 128 и его многочисленные клоны имели встроенный звукогенератор AY-3-8912, благодаря чему как зарубежные музыканты, так и наши соотечественники успели написать огромное количество музыки под этот компьютер.

В двух частях этой статьи, приправленных щепоткой ностальгии, мы вспомним основные способы звукоизвлечения на ZX Spectrum 128, обозначим характеристики музыкального сопроцессора AY-3-8912, перечислим наиболее известные музыкальные редакторы, продизассемблируем музыкальный модуль от популярной игры Dizzy IV и воссоздадим его на Arduino. Приглашаем под кат всех любителей компьютерной музыки, DIY, а также тех, кто заинтересовался, почему словосочетание музыкальный сопроцессор мы взяли в кавычки.

Скриншот стартового экрана Dizzy IVСкриншот стартового экрана Dizzy IV

Помню, первый компьютер - клон ZX Spectrum Компаньон - мы с братом никак не могли подключить к телевизору. Как я сейчас понимаю, в компьютере был только низкочастотный видеовыход, который мы пытались подключить к высокочастотному входу черно-белого телевизора. Удивительно, но каким-то образом видеосигнал пробивался через все эти гетеродины, так что можно было разглядеть смутные очертания символов, но только если ты знаешь, что там было написано Поэтому какое-то время наши возможности ограничивались написанием почти вслепую простейших программ на бейсике и загрузкой с магнитофона игр, в которые было не поиграть.

Одной из игр, которая привлекала внимание, была Legend of the Amazon (или Амазоники, как мы их тогда называли). На старте была отличная музыка, воспроизводимая через 1-битный динамик. Ее можно было запустить вслепую и слушать до бесконечности. Мы замучили кассету так, что еле прочитали игру, когда наконец подключили Компаньон к низкочастотному входу телевизора и стало все видно. Увы, но других воспоминаний от игры у меня не осталось - gameplay был посредственный (ну или я ничего не понял).

Научившись паять, я собрал больше информации о ZX Spectrum и смог подключить к нашему многострадальному на тот момент Компаньону магический музыкальный сопроцессор. Тогда это был YAMAHA YM2149F, аналог AY-3-8912, устанавливавшегося в оригинальных ZX Spectrum 128. Следует отметить, что название музыкальный сопроцессор неверно, потому что чип не выполняет никакого кода, а является конечным автоматом. В документации на чип предлагается название программируемый звуковой генератор, поэтому в дальнейшем в статье я буду называть чип звукогенератором.

Эксперимент завершился и удачей, и разочарованием. С одной стороны, звукогенератор работал, с другой стороны, оказалось, что во многих играх память в 48К была занята под завязку и на музыку ее уже не оставалось. В те времена было принято выносить музыкальные модули в дополнительные страницы памяти, которые были в 128-килобайтном спектруме, но отсутствовали в нашем 48-килобайтном Компаньоне, поэтому звукогенератор в большинстве случаев оставался лишним балластом. Однако в журнале ZX Ревю, из которого я и взял схему подключения, была заметка о том, как его проверить: музыкальный модуль от игры Dizzy IV загружался в память отдельно от игры и его можно было запустить. На картинке выше - скриншот стартового экрана игры.

Для ностальгирующих - вот как загружался дополнительный модуль:

CLEAR 30000LOAD  CODERANDOMIZE USR 49152RANDOMIZE USR 49180

Периодически мне нравилось загружать этот модуль и слушать ту чудесную стартовую музыку (сейчас ее можно послушать тут; это не только стартотвая музыка, но и мелодия внутри игры).

О возможностях звукогенератора AY-3-8912

Звукогенератор AY-3-8912 фирмы General Instrument, который устанавливался в ZX Spectrum 128, а также его аналоги, - достаточно популярный способ добавить музыкальные возможности в компьютеры того времени. Это семейство чипов устанавливали, в том числе в компьютеры Amstrad CPC и в японские MSX.

AY-3-8912 имел 3 канала для генерации сигналов прямоугольной формы (тона); один генератор шума; генератор огибающей, позволяющий производить амплитудную модуляцию сигналов тона и шума; микшер сигналов для смешения сигналов тона, шума и огибающей; модуль контроля громкости и цифро-аналоговый преобразователь.

На выходе у генератора было 3 аналоговых канала, именуемых A, B и C. В оригинальных спектрумах сигналы объединялись в один и получался моно-сигнал, однако каналы можно было соединять попарно и получать стерео сигнал. Мне чаще попадалось объединение A + C -> левый канал, B + C -> правый канал, т.е. канал C отправлялся и в левый, и правый выходы, являясь средним каналом. До момента написания этой статьи такое соединение мне представлялось каноническим. Но оказалось, что часто средним делали канал B и иногда в софте можно было найти настройку, какой канал считать средним.

Справедливости ради стоит добавить, что было несколько модификаций чипа. Вот самые распространенные из них:

  • AY-3-8910 - выпускался в корпусе DIP 40 и дополнительно имел 2 восьмибитных порта ввода/вывода;

  • AY-3-8912 - выпускался в корпусе DIP 28 и дополнительно имел только один восьмибитный порт ввода/вывода;

  • YAMAHA YM2149F - полностью совместим с AY-3-8910, но имел некоторые дополнительные возможности.

Используя порты ввода-вывода AY-3-8910, к компьютеру можно было подключить еще и, например принтер с параллельным интерфейсом. Но насколько мне известно, для клонов спектрума так никто не делал.

Музыкальные редакторы для спектрума

Любой спектрум, даже не оборудованный звукогенератором, мог воспроизводить звуки при помощи 1-битного выходного канала. Сигнал выводился на встроенный миниатюрный громкоговоритель, как в оригинальном спектруме, а в клонах вместо него иногда применяли пьезо-пищалки или иные воспроизводящие звук устройства. Интересно, что в оригинальном спектруме за ввод/вывод с магнитофона и за воспроизведение звуков отвечал всего лишь один вывод микросхемы ULA. Встроенный бейсик поддерживал команду BEEP, которая принимала два параметра - смещение в полутонах относительно ноты до первой октавы и длительность звука в секундах (можно в долях). Вооружившись операторами DATA и FOR, можно было воспроизвести любую одноголосную мелодию.

Самым известным редактором для бипера стал Wham! The Music Box или просто Wham!. Думаю, что отсылка к музыкальному поп-дуэту Wham с участием Джорджа Майкла была не случайна - редактор поставлялся с несколькими демо-композициями, одной из которых была песня Careless Whisper того времени. Но какого-либо подтверждения этому факту я не нашел.

Версия Джорджа Майкла
1-битная версия Wham!

Wham! позволял одновременно воспроизводить 2 голоса или звуковой эффект, что для бипера в то время было редкостью.

Тут стоит упомянуть хоть и не редактор, но игру Manic Miner, в которой в 1983 году (всего через год после появления ZX Spectrum) на стартовом экране была попытка воспроизводить 2 звука одновременно, а во время игры звучала музыка, что требовало немалого процессорного времени. Но после написания этой статьи мой мир никогда не будет прежним - проверяя свои воспоминания, я обнаружил, что автор игры Matthew Smith в одном из интервью говорит, что использовал для написания игры компьютер TRS-80, подключенный к спектруму через порт расширения. Какое жульничество! (шутка)

Звуки игры

Начиная с 3:20

Manic Miner и GTA

Истории создания игр Manic Miner и Jet Set Willy посвящены некоторые видео на Youtube, там не все так просто. Например, многие помнят, что в Manic Miner был cheat-код 6031769, дававший бесконечное количество жизней. Этот код был основан на номере автомобиля автора игры. Думаю, было мало людей, прошедших эту игру без кода.

Этот же код использовался и в Grand Theft Auto и тоже давал бесконечное количество жизней. Пруф

На изображении - обложка игры для пользователей США (источник), по иронии судьбы мало знакомых с ZX Spectrum в целом и с Manic Miner в частности.

До звукогенератора мы с братом тоже проводили эксперименты по созданию многоголосной музыки. Процессор Z80 был достаточно медленный, чтобы генерировать многоголосный сигнал на ходу, но если его сгенерировать заранее и поместить в оперативную память, то выводить данные в звуковой порт можно было с достаточной скоростью. Тогда я еще не знал что такое ШИМ

Наш подход позволял воспроизводить большое количество звуков, каждый с различной громкостью. Проблема заключалась в том, что в момент генерации сигнала в оперативной памяти звук прерывался. В итоге звуки, издаваемые нашим бипером, напоминали игру на плохой балалайке, поэтому дальнейшее развитие эта идея не получила. Беглый поиск на Youtube показывает, что из спектрумовского бипера можно было выжать гораздо больше, и энтузиасты так развлекаются до сих пор.

Существовала версия Wham! и для 128-килобайтного спектрума с AY-3-8912, но идеи, сработавшие в предыдущей версии, стали серьезным ограничением в текущей - нельзя было воспроизвести ноту большой длительности. Да и нотная запись для 8-битной музыки не самая подходящая.

Огромным прорывом для любителей компьютерной музыки стал выпуск польского трекерного редактора Sound Tracker для ZX Spectrum (отметим, что это не первый трекерный редактор вообще, он первый только для спектрума).

Это был переход от традиционной нотной записи музыки к буквенной записи нот в 3 колонки, по количеству каналов в звукогенераторе.

Под спойлером вы найдете основные понятия, которые используются в редакторах с интерфейсом типа трекер. Специально не останавливаюсь на всех тонкостях восьмибитной музыки, перечисляю здесь лишь основные понятия, которые мы будем использовать во второй части статьи, когда перейдем к разбору кода музыкального модуля Dizzy IV.

Основные понятия
  • Pattern (или паттерн) - строительный блок, музыкальная композиция делится на небольшие куски. Обычно состоит из нескольких музыкальных тактов и содержит 1-2 фразы.

  • Position (или позиция) - слоты, в которые можно вставить паттерны. Они определяют, в какой последовательности должны исполняться паттерны, какие паттерны должны повторяться. Написав несколько коротких паттернов и в дальнейшем комбинируя их в разном порядке с помощью позиций, можно создать достаточно длинную, пусть и несколько однообразную мелодию, впрочем, так и принято было делать.

  • Sample (инструмент) - описание изменения характеристик звуков с течением времени. С частотой 50 Гц плеер музыки рассчитывал относительную высоту звука, который проигрывался в канале, его громкость, накладывал звуковые эффекты. Инструменты позволяли наложить окраску звукам, можно было настроить плавное нарастание или затухание, фронт и т.д.

  • Ornament (орнамент) - аналогично сэмплу орнамент определяет относительную высоту звука, но в данном случае она определяется тем, насколько тонов необходимо сместить звук. Из-за того, что звукогененратор имеет всего лишь три канала, а хочется намного больше, появились орнаменты, которые позволяли поочередно с большой частотой проигрывать несколько звуков на одном канале. Орнаменты - эффективное средство воспроизвести на одном канале звуки одной октавы или даже аккорды, например трезвучия. Кончено, звуки воспроизводились поочередно с большой частотой и напоминали балалайку, но это тоже было за гранью возможности для трех каналов, т.е. супер круто.

Другим весьма известным музыкальным редактором был ASC Sound Master (ASM) А.Сендецкого. К сожалению, автора этого редактора уже нет с нами (пруф). Этот редактор мне запомнился, как очень крутой, ведь автор даже не поленился, а разработал свою собственную файловую систему, чтобы сохранять музыкальные композиции. Помню, там была композиция Boom, которая мне очень нравилась. Я слушал ее бесконечно, тогда не зная, что это была музыка из одноименного французского фильма.

Без музыки на тот момент обходилась редкая демо-сцена. Лучшие образцы (например, Insult или Satisfaction) можно нагуглить до сих пор. А одним из самых зрелых редакторов был Pro Tracker, который появился достаточно поздно - в 1995 году. С его помощью было написано довольно много музыки.

Наверняка у каждого, кто был знаком с играми на спектруме, есть свои любимые музыкальные воспоминания. На меня в свое время неизгладимое впечатление произвел загрузчик с дискет под названием ZYX. Эта программа запускалась самой первой, показывала каталог программ, которые были на диске, и позволяла загрузить одну из них. Существовало огромное множество этих загрузчиков с разной популярной музыкой того времени. Особенно мне нравился Jean Michel Jarre.

Jean Michael Jarre

Удивительно, но демки разрабатывают до сих пор. Для AY-3-8912 даже существует вполне современный музыкальный редактор Vortex Tracker, который позволяет писать 8-битную музыку под Windows.

На этом я закончу свой исторический экскурс. Во второй части статьи будем дизассемблировать музыкальный модуль Dizzy IV и писать прошивку для Arduino, которая повторит музыку из этой игры, эмулируя музыкальный процессор и используя музыкальный модуль Dizzy IV.

Продолжение следует

Автор статьи: Антон Дмитриевский

P.S. Мы публикуем наши статьи на нескольких площадках Рунета. Подписывайтесь на наши страницы в VK, FB, Instagram или Telegram-канал, чтобы узнавать обо всех наших публикациях и других новостях компании Maxilect.

Подробнее..

Как заставить Arduino петь как ZX Spectrum. Часть 2 музыка Dizzy IV на Arduino Nano

12.11.2020 16:17:09 | Автор: admin

В этой части статьи мы перейдем к самому интересному - будем разбирать музыкальный модуль Dizzy IV по винтиками и воспроизводить мелодию сначала на Windows, а потом и на Arduino Nano. За подробностями добро пожаловать под кат.

(скриншот стартового экрана Dizzy 4)(скриншот стартового экрана Dizzy 4)

О чем идет речь, я подробно объяснял в первой части статьи.

Disclaimer:
Хочу отметить, что проект я реализовал исключительно для фана, понимая, сколько лет прошло с момента, когда спектрум был актуален. Хотелось вспомнить былое и прикоснуться к коду, написанному для восхитительного процессора Z80. Для меня этот процессор был первым.

Музыкальную тему для игры Dizzy 4 создавал David Whittaker - достаточно известный композитор музыки для игр (пруф: ссылка 1 и ссылка 2).

Мне не удалось точно установить, в каком музыкальном редакторе была сделана эта музыка. В 1987 году композитор в одном из интервью сообщал, что пишет музыку в софте, специально разработанном им самим, как сказано в заметке драйвере, на компьютере Tatung Einstein (тоже имевшем AY-3-8910) и передает ее по RS-232 в спектрум. Но игра была выпущена в 1989 году и способ создания музыки к тому времени мог поменяться. Из кода плеера видно, что в него заложена кроссплатформенность - в нем используется буфер для регистров звукогенератора. Вместо прямого доступа через порты ввода-вывода, значения для регистров звукогенератора сначала записываются в буфер в памяти, что кажется оверхедом. Данные из буфера в регистры переносятся в простом цикле. Процесс создания музыки на другой платформе, а также существование игры с той же музыкой для Amstrad CPC, объясняет наличие такого буфера.

Разбираем музыкальный модуль

Я извлек музыкальный модуль из tap-файла и подверг анализу в эмуляторе Unreal Speccy и в дизассемблере IDA Pro. Полный листинг модуля с моими комментариями можно найти тут.

Если вкратце, это модуль длиной 0x4000 (или 16384, ах, какие числа) байт. Он загружается по адресу 0xC000 и имеет две мелодии с адресами 0xC000 и 0xD300. Обе мелодии укомплектованы идентичным плеером, так что сначала идет код плеера, а сразу за ним располагаются данные позиций, паттерны и инструменты. Думаю, так поступали в большинстве случаев - один плеер на несколько мелодий делали редко, несмотря на возможную экономию.

Сам плеер интересен тем, что для каждой позиции позволяет настроить свой банк инструментов, таким образом один и тот же паттерн может звучать по-разному, в зависимости от того, какие инструменты настроены. Это можно в какой-то мере сравнить с цветовой палитрой в старых графических режимах.

Модуль состоит из следующих блоков (где это возможно, будет указан и адрес окончания блока):

  • 0xC000 - 0xC01B - (init) - блок инициализации, здесь происходит установка начальной скорости, адресов позиций и инструментов.

  • 0xC01C - 0xC032 - (play_loop) - главный цикл. В нем благодаря команде 'halt' осуществляется задержка в 20 мс, т.е. тело цикла выполняется 50 раз в секунду. Здесь же осуществляется управление мелодией и проверка, не нажали ли в данный момент клавишу пробел, чтобы выйти из плеера. Этот код нужен был, чтобы можно было прослушать мелодию без дополнительного кода, но в играх он был бесполезен, потому что там был свой код, выполняющийся по прерыванию каждые 20 мс и вызывающий код плеера, чтобы тот сменил состояние мелодии. Так мелодии можно было проигрывать в фоне, не блокируя выполнение кода игры.

  • 0xC033 - (play_frame) - именно это место должно вызываться 50 раз в секунду, чтобы звучала мелодия. Здесь идет подсчет количества вызовов. Если оно превышает скорость, заданную автором композиции, происходит смена нот. В этих мелодиях скорость всегда постоянна, а переход к следующей ноте происходит каждое седьмое прерывание, т.е. скорость всех мелодий в модуле - 7. Современную музыку для AY-3-8912 стараются писать со скоростью 3, так можно уместить больше деталей. Очевидно, чем меньше число, задающее скорость, тем чаще происходит смена нот.

  • 0xC043 - (init_next_note) - код вызывается при каждой смене нот.

  • 0xC051 - (init_next_position) - если ноты в паттерне заканчивается, то надо перейти к следующей позиции или начать мелодию сначала.

  • 0xC06C - (init_pattern) - код инициализации следующего паттерна.

  • 0xC082 - (init_next_note_in_current_pattern) - большой кусок кода по инициализации следующей ноты в паттерне. Здесь четырежды вызывается подпрограмма init_note_in_channel, которая читает управляющие команды и высоту нот, которые надо проиграть из данных паттерна, и сохраняет эти данные в оперативной памяти. Замечу, что четвертый канал отсутствует в звукогенераторе. Очевидно, этот псевдо канал задумывался для специальных команд управления состоянием. Не ясно, почему эти команды нельзя было помещать в оставшиеся три канала, сэкономив память. Кстати, здесь широко используются индексные регистры ix и iy, которые выгодно отличали процессор Z80 от его прародителя Intel 8080. При должном использовании они являлись своего рода контекстом исполнения, эдакий this, если угодно. Использование iy также указывает, что плеер не старались сделать универсальным, потому что этот регистр использовался во встроенном бейсике и изменять его в прерываниях (а плеер мог вызываться и через прерывания) не рекомендовалось.

  • 0xC0B4 - (manage_current_note) - если сменять ноты надо было не каждые 20 мс, а в соответствии с заданной скоростью, то текущие проигрываемые ноты нуждались в обслуживании постоянно. Этот код трижды вызывает подпрограмму manage_current_note_in_channel, обслуживающую инструменты, - по одному разу для каждого канала. Напомним, что инструменты могут динамически менять частоту ноты (сэмпл) или высоту тона ноты (орнамент).

  • 0xC0F5 - 0xC1E2 - (manage_current_note_in_channel) - обслуживание инструмента для данной ноты в канале. Наряду с инструментом, здесь же обрабатываются и шумовые эффекты. По результатам вычисления нового состояния для инструментов в этой процедуре заполняется буфер регистров, который позже передается в регистры звукогенератора.

  • 0xC1E3 - (ay_out) - перенос данных из буфера в регистры звукогенератора.

Про часто использовавшийся хак, который недоступен современным программистам

Рассмотрим код счетчика количества нот в паттерне, который по завершении паттерна переходит к следующей позиции:

По адресу 0xC043 в регистр 'A' загружается значение 0x3A. Казалось бы, это бесполезное действие, потому что следующая команда уменьшает это значение на единицу. Почему бы сразу не загрузить в регистр 'A' значение 0x39?

Идея заключается в том, что команда по адресу 0xC048 записывает уменьшенное (и, кстати, защищенное от переполнения благодаря инструкции 'AND 3Fh') значение по адресу операнда первой команды (0xC043), прямо в код программы, так что в следующий раз команда 'LD A, ...' считает значение на единицу меньше, через раз - еще меньше и так далее. Другими словами, по адресу 0xC044 хранится счетчик, который уменьшается на единицу, каждый раз при выполнении данного кода.

К счастью, сейчас память программ доступна только для чтения либо по аппаратным причинам, как например в микроконтроллерах, либо из-за запрета прямой записи в область кода операционными системами и процессорами.

Реализация на Windows

Я начал с того, что написал бОльшую часть кода сначала для Windows, чтобы было легче производить отладку. Борьбу с Arduino оставил на момент адаптации кода к аппаратным возможностям платы. Мою реализацию для Windows можно собрать самостоятельно (каталог win-implementation у меня на GitHub; понадобится компилятор от Visual Studio 2017) или запустить готовые сборки: мелодия 1, мелодия 2.

Пара комментариев о том, как все реализовано.

Чтобы не возникло потом проблем с переносом, я старался писать код, ориентируясь на восьмибитную природу микроконтроллеров ATMega. Поэтому он изобилует типами 'uint8_t' и 'uint16_t'.

Для преобразования исходного музыкального файла в код, пригодный для компиляции, я написал небольшой скрипт на python (каталог extractor у меня на GitHub), который копирует данные мелодии в массив байт и извлекает некоторые адреса:

  • адрес начала данных мелодии (без учета плеера),

  • адрес таблицы позиций,

  • адрес таблицы банков инструментов для позиций.

В оригинальном спектруме звукогенератор AY-3-8912 производил сигналы прямоугольной формы, которые раньше мне казались грубоватыми. Изначально цели добиться аутентичного звучания передо мной не стояло, поэтому в первой версии я пробовал генерировать синусоидальные сигналы, вместо меандра. Оказалось, что вместе с прямоугольной формой сигнала ушли и все гармоники, из-за чего звук стал очень глухой. Так что от синусоидальной формы сигнала пришлось отказаться. Также в реализацию была добавлена таблица маппинга громкости. Напомню, что амплитуда выходного сигнала звукогенератора имеет 15 градаций. Энтузиасты, разрабатывающие эмуляторы AY-3-8912, установили, что зависимость между значением в регистре громкости и напряжением на выходе вовсе не линейная. Так появились таблицы для соответствующего преобразования. В больших эмуляторах такие таблицы 16-битные, в нашем же эмуляторе для быстроты расчетов используется 4 бита. Поэтому если заглянуть в исходники, можно увидеть, что уровни громкости от 0 до 3 вообще не воспроизводятся, а уровни от 4 до 9 имеют незначительную громкость на выходе. Действительно, субъективно я это почувствовал еще во время моих экспериментов по написанию музыки. Думаю, что инженеры, разрабатывающие звукогенератор, сделали это намеренно, в соответствии с законом Вебера-Фехнера (интенсивность ощущения пропорциональна логарифму интенсивности раздражителя).

В музыкальном модуле от Dizzy IV используются несложные шумовые эффекты. Их удалось реализовать при помощи простого генератора случайных чисел, работающего по алгоритму xorshift.

Реализация на Arduino

Поскольку проект делался исключительно для веселья, я выбрал плату Arduino Nano. У нее широко распространенный микроконтроллер, но он менее всего подходит для решения этой задачи. Можно было бы выбрать, например STM32, но там есть даже ЦАП, поэтому было бы совсем неинтересно, тем более на STM32 удалось запустить эмуляцию ZX Spectrum, включая генерацию видеосигнала. Что уж говорить о Raspberry Pi и аналогах, ведь на них можно эмулировать спектрум, не написав ни строчки кода.

Генерация ШИМ сигнала обеспечивается TIMER2, вывод OC2B или PD3 (или вывод D3 в терминологии Arduino). Частота ШИМ сигнала выбрана достаточно высокой - 31373 Гц, поэтому выход Arduino удалось подключить напрямую к портативной колонке без каких-либо фильтрующих цепей, посторонние призвуки отсутствовали.

На плате Arduino Nano можно управлять только двумя светодиодами. Я сделал так, что интенсивность одного из них зависит от громкости мелодии. Для простоты реализации, ШИМ-сигнал для этого светодиода формируется из прерывания второго таймера. Это происходит достаточно часто, но до тех пор пока нет цели сэкономить процессорное время, можно оставить так. Другой светодиод управляется через преобразователь uart -> usb, тут удалось вывести на него индикацию канала шума.

Выбор мелодии пока жестко задан программно, но его можно легко поменять, вызывая функцию 'get_music_data_1' или 'get_music_data_2'. Для первой композиции главный голос находится в канале A, для второй - в канале B, это надо учитывать при визуализации мелодии на светодиодах.

Проект можно собрать из каталога arduino-sketch и послушать мелодии на своем Arduino или посмотреть получившийся результат на видео.

Видео мелодии 1
Видео мелодии 2

Как я уже писал, все исходники проекта можно найти на Github.

Автор статьи: Антон Дмитриевский, Максилект.

P.S. Когда-то мы с другом делали клон известной игры Color Lines (тогда было модно делать клоны именно этой игры, их тысячи) и там в дополнение к красивой графике у нас тоже была достойная, на мой взгляд, музыка. Представляю вашему вниманию интро для этой игры. А если возникнет желание послушать внутриигровую музыку, то придется запустить игру в эмуляторе - образ диска TR-DOS можно скачать здесь, после запуска необходимо нажать на пункт меню Выбор мелодии.

Видео с интро

P.P.S. Выражаю благодарность всем авторам эмулятора Unreal Speccy, участникам проекта speccy.info.

P.P.P.S. Мы публикуем наши статьи на нескольких площадках Рунета. Подписывайтесь на наши страницы в VK, FB, Instagram или Telegram-канал, чтобы узнавать обо всех наших публикациях и других новостях компании Maxilect.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru