+==================================================+
+ DR. JIM'S MARVELLOUS MARIO JUKEBOX +
+==================================================+
+ By Jim Waterman, 11-18 December 2023 for WOOT! +
+ for all models of 128K Spectrum +
+==================================================+
+ All music originally composed by +
+ Koji Kondo, 1985-1988 +
+==================================================+
Вводная болтовня
Вслед за успехом выпусков Grand Gargoyle's Quest (2020) и Fantastic Final Fantasy (2022) из серии джукбоксов, сделанных при помощи команды PLAY в 128 BASIC (которую мало кто из нас вообще использовал, не говоря уже о том, чтобы научиться делать это по-человечески...), Dr. Jim совместно с WOOT! представляет третий выпуск в серии, и самый масштабный на сегодняшний день: Marvellous Mario Jukebox!
Здесь собраны всевозможные фоновые мелодии и мелодичные звуковые эффекты из трёх игр серии Super Mario Bros. для NES. Ну... «из трёх из четырёх», поскольку вы справедливо можете заметить, что Super Mario Bros. 2 в Японии довольно сильно отличалась от того, чем потчевали нас на Западе (то есть в Европе и 'MURICA) — и это, по сути, был первый в мире РОМ-хак оригинала. Когда я говорю «Super Mario Bros. 2», я имею в виду западную версию («вообще-то, это РОМ-хак Yume Kojo: Doki Doki Panic...» «...ну, ВООБЩЕ-ТО, она с самого начала и задумывалась как игра про Марио...» и так далее, и тому подобное, ad infinitum, ad nauseam). Так или иначе, ВЫ ПРЕКРАСНО ПОНИМАЕТЕ, О КАКИХ ТРЁХ ИГРАХ РЕЧЬ. В одной Марио бегает, прыгает и топчет ходячие грибы и черепах, во второй поднимает бродячих существ в масках, а в третьей, если подумать, занимается и тем, и другим понемножку.
Что делать с программой
Загружайте её в режиме 128K через (Tape) Loader или LOAD "" в 128/+3 BASIC. Не забудьте сначала ввести LOAD "t:", если у вас +3. Если вы запустите её в 48 BASIC или на любом 48K Спектруме, вы получите очень грубое сообщение о том, что вы тупица. Не вините меня в своих ошибках.
Программа запустится автоматически: нажимайте клавишу с буквой мелодии в меню, чтобы прослушать её, и нажимайте ENTER для перехода к следующему меню. Всего меню занимает четыре страницы. Кроме того, есть парочка СОВЕРШЕННО СЕКРЕТНЫХ ПАСХАЛОК (...да, в некоторых супермаркетах пасхальные яйца появляются уже до Рождества... нет, правда!), которые вам, скорее всего, придётся искать, копаясь в листинге, либо надеяться на удачу.
***************************************************************************
* ОЧЕНЬ ВАЖНО: *
* Единственное, о чём программа умалчивает — иначе бы поплыли экраны — *
* чтобы вернуться в меню, нужно НАЖАТЬ И УДЕРЖИВАТЬ ENTER! *
***************************************************************************
Иными словами, зажмите ENTER и дождитесь момента, когда в звучании возникнет неизбежная крошечная пауза. Не вздумайте просто нажимать BREAK и начинать заново, потому что вы останетесь с редактором, разбитым вдребезги пользовательским набором символов, и вам придётся вслепую вводить POKE 23607,60, чтобы исправить ситуацию! Опять же, не вините меня, если накосячите.
Также имейте в виду: если мелодии в двух играх абсолютно идентичны (например, тема Starman в первой и третьей частях), она будет указана лишь однажды — в более ранней игре.
Техническая болтовня
Все эти саундтреки были цинично слизаны с нот, найденных на просторах интернета, о существовании которых во времена NES никто за пределами хардкорного гик-сообщества даже не подозревал. Так что огромную благодарность стоит выразить не только великому и легендарному Koji Kondo — оригинальному композитору, — но и пользователю «XiaoMigros» с сайта MuseScore, сделавшему фортепианные аранжировки всех этих мелодий.
Смотрите здесь:
https://musescore.com/user/33605901/sets/5168720
И по отдельности:
https://musescore.com/user/33605901/scores/6642763 — Super Mario Bros.
https://musescore.com/user/33605901/scores/8528330 — Super Mario Bros. 2
https://musescore.com/user/33605901/scores/6831481 — Super Mario Bros. 3
У NES был весьма примитивный звуковой чип с двумя каналами прямоугольных импульсов, одним треугольным и одним шумовым каналом — но это всё равно больше, чем у AY-3-8912 в Spectrum 128K, где есть три прямоугольных канала, и на этом всё. В качестве компромисса я выбросил дорожку «ударных» (то есть канал шума) из этих аранжировок, за исключением мест с совсем уж пустотами, где казалось уместным заполнить паузу капелькой белого шума с помощью параметра «M».
Большая часть мелодий воспроизводится без особых изысков: ведущая партия звучит на «V15», вторая на «V13», а бас — на «V12», хотя кое-где для элементарных эффектов лучше подошли параметры «U»/«X»/«W». Единственное, что так и не удалось нормально воссоздать — это эффект затухающего эха в теме карты World 7 в Super Mario Bros. 3: при использовании формы волны «W7» звучало всё совершенно не так, поскольку в Бейсике невозможно задать глубину нарастания и затухания для каждого шага.
В целом, некоторые мелодии звучат удачнее других — и чем новее игра, тем больше вероятность отклонений от оригинала.
Я впервые попытался упаковать музыкальный код в массивы. Удивительно, но команда PLAY игнорирует любые пробелы в конце строк массива, однако порой их приходилось вырезать вручную, если требовалось объединить две строки. Тем, кто всё ещё пытается освоить команду PLAY, придётся либо изучить две другие мои музыкальные шкатулки (где код PLAY оформлен в виде наглядных строк прямо в листинге), либо распечатать массив S$ (их три штуки, по одному на каждую игру, с разными размерностями).
Кроме того, в итоге получилась настолько здоровенная программа, что мне пришлось задействовать RAM-диск. Все три массива с музыкой для каждой из игр попросту не влезают в память одновременно — они занимают в сумме 43 424 байта, так что каждый массив приходится загружать заново по мере необходимости. Создавать две отдельные программы под 128K/+2 и +3/+2A не потребовалось, так как в коде проверяется ячейка через PEEK, определяющая модель компьютера, и программа сама выбирает нужную строку с синтаксисом SAVE ! или SAVE "m:". НЕ ПЫТАЙТЕСЬ редактировать строки с SAVE ! на машинах +3/+2A — встроенный редактор +3 BASIC не распознает эту строку, и её придётся полностью удалить! Не вините меня, если... ну, вы и сами всё понимаете.
Если кто-то заметил — скажем, поковырявшись в программе-загрузчике — да, это временный набор символов, хранящийся в операторе REM, который никогда не отобразится нормально при выводе листинга, а короткая LDIR-подпрограмма для его переноса в нужную область памяти помещена во второй REM. Это удобный способ добавить немного элементарного машинного кода в загрузчик, позволяющий мне напечатать (PRINT) загрузочный экран в фоне, а затем загрузить поверх него атрибуты. Анимированный загрузочный экран был сделан с помощью «Flashdance» от Dave Hughes, шедшей в комплекте с WOOT! 2020, а затем доработан в ZX Paintbrush, чтобы избавиться от мерцающих элементов (FLASH) в правой части экрана, которая остаётся статичной и требует текста.
В общем, на сегодня у меня всё...
...AND THE MASTER SWORD SLEEPS... FOREVER!
...стоп... не та игра. Ну и ладно. А теперь уходите.
Поделитесь вашим мнением о статье