ZX-Ревю 1994 №1 1993 г.

"WHAM" The Music Box - Версия для музыкального сопроцессора AY-3-8910/12.


Темы статьи: Софт  

Развивая музыкальную тему, мы предлагаем сегодня вниманию читателей статью о музыкальном редакторе "WHAM THE MUSIC BOX", о той его версии, которая рассчитана на работу с музыкальным сопроцессором AY-3-8910/12 - поток писем на тему их применения все нарастает.

Предлагаемая статья достаточно объемна. Нам бы не хотелось мучить читателей однообразным материалом, и все же мы решили не делить её на два номера, а дать сразу целиком. Однако постараемся в будущем давать в одном номере более разнообразный материал.

Другие наши читатели могут резонно заметить: "Ну, нет в моем ZX-48 никакого музыкального процессора! Лучше бы Вы посоветовали мне, где его достать! А то в нашем небольшом городке эту штуку днем с огнем не сыскать". Предвидя такие вопросы, сообщаем, что сейчас "ИНФОРКОМ" готовит к реализации "музыкальную приставку" - отлаженную плату с музыкальным сопроцессором. Для тех, кто умеет держать в руках паяльник, подключение платы к своему Спектруму-48 или -128 отнимет не более полчаса. Об условиях распространения музыкального сопроцессора мы проинформируем всех подписчиков "ZX-РЕВЮ" в нашем информационном листке.

Откройте для себя мир музыки!

"WHAM" The Music Box

© Алексеев А.Г., 1994 г. Часть 1.

Версия для музыкального сопроцессора AY-3-8910/12

Прежде всего, условимся, что этот вариант программы будет далее по тексту называться "WHAM+AY" в отличие от своего предшественника, который будет именоваться просто "WHAM".

Являясь владельцем Новосибирского варианта "Спектрума 48К", я, как и другие владельцы 48К машин, с завистью смотрел на тех счастливчиков, которые имели 128К с музыкальным сопроцессором. Хотелось иметь такие же звуковые возможности в своем компьютере, к которому так привык за годы его бесперебойной работы. Но, увы, от тех, кто на радиорынке торговал сопроцессорами и платами для них слышалось одно: при встраивании сопроцессора в 48К машину музыка - будет, но нету музыкальных редакторов, работающих в режиме 48К, а только в 128К. Значит, начисто отметается возможность всякого самостоятельного творчества. И все же не пропадало горячее желание иметь сопроцессор в своем компьютере. Поэтому я попробовал иначе: сначала занялся музыкальными редакторами, в частности "WHAM+AY". Анализируя Бейсик-программу и устраняя элементы взаимодействия с RAM-диском, я заметил, что кроме них нет никаких принципиальных ограничений на то, какой объем ОЗУ имеет компьютер. В общем, программу без особого труда удалось адаптировать, только вместо музыки была тишина - сам сопроцессор ещё не был установлен. Но теперь это было уже дело техники. Все переделки свелись к установке небольшой платы с тремя микросхемами. Труд увенчался полным успехом, так что теперь я совершенно точно могу сказать владельцам 48-килобайтных компьютеров - можете смело приобретать музыкальные сопроцессоры и встраивать их в свои компьютеры.

Первое время можно было только наслаждаться качественным стереозвуком (воспроизведение осуществляется любой стереосистемой), тем, как гибко может меняться звучание трех звуковых каналов, да ещё обилием всяких "шумовых" эффектов. Но со временем эйфория прошла. Практическая работа с "WHAM+AY" показала, что он имеет недостатков, пожалуй, ещё больше, чем его предшественник (см. ZX-РЕВЮ № 11-12 за прошлый год, стр. 235). Поэтому я активно занялся его усовершенствованием, имея уже опыт переделки старого "WHAM". Результатами своего труда я готов поделиться с читателями "РЕВЮ". Но сначала, поскольку дело это новое и неизведанное - о том, как же работать с музыкальным редактором "WHAM+AY" с сопроцессором.

Титульное меню.

Сюда мы попадаем после загрузки программы. Оно имеет следующий вид:

. MFIHK Т1ИЕ . . . ИLI5IE ЕЕХ . .

1

LDRD

TUNE

э

5RUE

TUNE

5Y5T

MENU

&

ENUELDPE5

5

5ЕТ

TEMPD

Б

EDIT

MODE

7

HELP

PPEE

Р R Е 5 5 THE CDKKE5PDNDINE NUМ Е Е R

1ЧВЕ МРНК TIME LTD

Пункты 1 и 2 во многих версиях "WHAM+AY" различны - эти места в программе прежде всего зависят от того, кто её адаптировал. Кроме того, владельцы 128К компьютеров имеют возможность сохранения мелодий в ОЗУ, аналогично тому, как это делал "WHAM". Для 48К компьютеров такой возможности нет. Работа программы по п. 1 и 2 полностью идентична программе "WHAM", поэтому останавливаться на них нет необходимости. Следующие пункты в титульном меню удобнее рассматривать "с конца".

HELP PAGE.

Страничка-подсказка в этой версии "WHAM+AY" сильно расширена. Теперь, нажав "7" в титульном меню, мы попадаем в следующее меню, которое имеет ещё 5 пунктов:

Г1РНК TIME MUSIC EDM HELP 5ERUICE

HELP ЕУ15Т5 114 THE RHER5 EELDIil 1 LCRDINE PHD 5PUINE Э ENUELCPE5 3 KEYECRRD LRYDLIT H RMPLIFIERTIDN 5 WHITE NEI5E EFFECTS

PHE55 THE CDRRE5PDHDINE NUMBERED KEY FDR NEXT PREE DH □ TD EXIT

1. LOADING AND SAVING. В этом пункте даются пояснения по процедурам загрузки и сохранения исходных текстов мелодий. Различные версии "WHAM+AY" предназначены для разных устройств ввода-вывода. Чаще это БЕТА-диск и магнитофон, иногда только диск или магнитофон в комбинации с микродрайвом, реже - все три устройства и ещё RAM-диск для 128К компьютеров. Изменить текущее устройство ввода-вывода можно при помощи пункта 3 титульного меню программы - SYST MENU.

2. ENVELOPES - огибающие. В "WHAM+AY" можно для каждого звукового канала в любой момент времени задать огибающую амплитуды звука. Это позволяет получить разные звуковые эффекты, начиная чистым непрерывным тоном, или амплитудным вибрато и кончая звуками, имитирующими клавесин, ксилофон или другие музыкальные инструменты. При помощи "WHAM+AY" можно гибко регулировать фронт (атаку) звука, его продолжение и затухание. Всего можно задать 8 разных вариантов огибающих (каждый вариант отредактировать по своему усмотрению), которые будут применяться в одном музыкальном произведении. При сохранении исходного текста мелодии на ленте или диске, вместе с нотами сохраняются и параметры огибающих. А при удалении мелодии в памяти - огибающие сохраняются. Вернуться к первоначальным значениям можно, если перезагрузить программу заново.

3. KEYBOARD LAYOUT - управляющие клавиши. В режиме редактирования, в основном, сохранены клавиши, используемые в старом "WHAM". Надо только сказать, что наибольшее удобство достигается при использовании расширенной клавиатуры от "Спектрум+", или, что то же самое, клавиатуры компьютеров "Дельта-С".

4. AMPFLIFICATION - воспроизведение музыки производится при помощи любой стереосистемы, соединяемой с компьютером экранированным кабелем.

5. WHITE NOISE EFFECTS - эффекты, использующие "белый" шум. Могут быть проставлены в любом канале. Каждый из возможных 9 эффектов может быть отредактирован по своему усмотрению.

EDIT MODE.

А теперь подробнее рассмотрим пункт 6 титульного меню - как и в старом "WHAM" это режим редактирования. После выбора этого пункта в меню, вид экрана будет таким:

Г / / f

а

CHI сна CH3 STRTE EFFECTS CH

■titML] MU I t I IlIHRNNEL 1 | I- 1 TDHE5 ШШШ

ИИ

□15 015 015

ШИШ

В верхней части экрана Вы видите нотный стан - здесь все идентично старому "WHAM". А вот нижняя треть экрана в "WHAM+AY" несколько иная. Слева - три одинаковых табло: СН1, СН2, СН3, показывающие состояние трех звуковых каналов. При подключении к воспроизводящей стереосистеме 1 каналу соответствует звук, слышимый из левого громкоговорителя, 3 каналу - звук в правом громкоговорителе, а 2 каналу - звук в обоих громкоговорителях, то есть посередине. Каждый индикатор СН1...СН3 отображает текущую огибающую, текущий уровень громкости для чистого тона, счетчик тактов каждого канала. Если в текущем такте установлен шумовой эффект, то значение уровня громкости становится желтым, индицируя наличие эффекта.

Табло STATE отображает номер текущего канала (в котором в данный момент происходит редактирование) и номер текущей октавы (1-4).

Табло EFFECTS CH отображает состояние канала спец.эффектов.

Здесь в самый раз упомянуть о том, что в новом "WHAM+AY" фактически не три, а четыре канала. Первые три - очевидны, а вот четвертый - как бы скрытый на первый взгляд - это канал спецэффектов. Для него зарезервирована такая же область памяти, как для каждого из первых трех каналов - 1 Кб. В этом четвертом канале ставятся коды переключения огибающих, коды регулирования громкости (для чистого тона), коды скольжения тона -плавного его изменения при переходе от ноты к ноте.

Нота в "WHAM+AY" может иметь либо заданную огибающую, тогда мгновенный уровень громкости в каждый момент времени её звучания будет определен этой огибающей, а сама огибающая должна быть задана в канале спец.эффектов. Нота может не иметь огибающей, тогда это будет "чистый тон". Тогда должен быть оговорен уровень громкости этого чистого тона при помощи специального кода в канале спец.эффектов.

Справа на экране имеется индикатор выходного уровня воспроизводимого сигнала.

И, наконец, внизу экрана находится имитатор клавиатуры. На нем нажатие нотных клавишей отображается цветовой меткой. Для 1 канала - красной, для 2 - сиреневой, для 3 - зеленой.

Управляющие клавиши, используемые в режиме редактирования. Белые клавиши фортепиано задаются нижним буквенным рядом, начиная с клавиши CAPS LOCK, далее Z, X, ... M, точка, запятая. В качестве черных клавишей используются клавиши предыдущего буквенного ряда:

1 A | I S |

1 F 1 1 G 1 I H 1

1 к 1 | L 1

C. L.

Z

X

C

V

B

N

M

,

Текущая октава

Следующая октава

Например, клавиша К в режиме 2 октавы это то же самое, что клавиша А в режиме 3 октавы.

Клавишей ENTER ставится пауза (или, что то же самое - удаление ноты).

"Шумовые эффекты" - эффекты использующие "белый шум" в "WHAM+AY" значительно расширены. Помимо того, что их теперь 9 и ставятся они при помощи SYMB.SHIFT и клавишей Q...O, принцип немного иной. Теперь шумовой эффект имеет тот же статус, что и нота. Это значит, что в каждом канале независимо друг от друга можно поставить или ноту или шумовой эффект. Можно во всех трех каналах поставить шумовые эффекты. Однако злоупотреблять этим не рекомендуется - все хорошо в меру. Стирается шумовой эффект, как и нота, клавишей ENTER.

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

Клавиша W - позволяет поставить "петлю" - маркер конца мелодии, зацикливающий канал на начало. Это может быть сделано независимо в каждом из трех каналов.

Клавиша R - переход на начало мелодии.

Клавиша Р - воспроизведение мелодии по шагам, действует до тех пор, пока нажата клавиша. В отличие от клавиши Q, при воспроизведении чистого тона слышны заметные паузы между нотами.

Клавиша О - ускоренное воспроизведение мелодии. Здесь нота звучит ещё короче и паузы между нотами ещё заметнее. Но это не основной режим, он служит лишь для того, чтобы подойти поточнее к интересующему месту мелодии.

Клавишей DEL выполняется возврат (но не удаление ноты). Одно нажатие клавиши возвращает на 1 шаг

назад.

Клавишей TR.VIDEO выполняется ускоренный возврат назад. Действует до тех пор, пока клавиша не будет отпущена.

Клавиша Т переключает текущий канал - в котором производится редактирование. Попутно замечу, что при практической работе, когда идет набор мелодии, удобно действовать так. Сначала набрать, скажем, 3 канал (правый). Затем, перед набором 1 канала (левого) можно перевести регулятор стереобаланса на воспроизводящей стереосистеме влево, чтобы не был слышен правый канал и тогда набрать 1 (левый) канал. Перед набором 2 канала (центр) можно регулятор стереобаланса поставить в любое удобное положение.

Клавиши 1-4 переключатели октавы, как и в старом "WHAM".

Клавиша 5 - цвет бордюра.

Клавиша 6 - возврат к титульному меню. Такой же эффект, кстати, дает нажатие клавиши BREAK.

Клавиша 7 - удаление мелодии. Требуется подтверждение - клавишей Y.

Новым принципиальным отличием "WHAM+AY" является наличие расширенного режима при редактировании. Вход в расширенный режим происходит при нажатии клавиши EXT.MODE. При этом в нижней части экрана появляется подсказка, какими клавишами и что может быть выполнено.

Теперь подробнее о функциях расширенного режима.

Клавиша Е (Envelopes) ставит в канале спец.эффектов код, задающий тип огибающей одного из каналов или всех трех вместе. Возможно 8 вариантов (каждый может быть отредактирован индивидуально). После нажатия EXT.MODE и затем Е следует запрос: PRESS DESIRED ENVELOPE NUMBER - задайте номер типа огибающей (все 8 вариантов для наглядности приводятся тут же). Кроме того, можно, отказавшись от огибающей, перейти к чистому тону текущей громкости, если на запрос о типе огибающей ввести 0. После выбора одного из них клавишами 0.8, следует запрос: WHICH CHANNEL (1-3, OR 0 FOR ALL) - для какого канала требуется задать такой тип огибающей: для первого, второго или третьего или же для всех трех вместе. Нажмите соответственно 1, 2, 3 или 0.

Клавиша V (Volume) позволяет поставить код, изменяющий громкость звучания для чистого тона. Код изменения громкости имеет смысл только для чистого тона, поэтому задание уровня громкости автоматически означает отказ от огибающей. После нажатия V следует запрос: NEW VOLUME LEVEL ? (0 TO F) - новый уровень громкости (в шестнадцатеричной системе счисления). Возможно 16 градаций уровня громкости: минимальный - 0 (отсутствие звука), максимальный - F. Далее идет запрос "для какого канала", как и при задании огибающей. Задайте

номер канала или нажмите 0 для установки громкости во всех трех каналах.

Клавиша В (Blank) позволит Вам уничтожить спецэффект - поставить вместо него "паузу". её действие для канала спецэффектов такое же, как и ENTER для первых трех каналов.

Клавиша S (Slide) предназначена для задания "скольжения тона". При воспроизведении ноты тон плавно изменяется. После нажатия S следует запрос: HOW MANY SEMITONES (0 TO 7) ? - на сколько полутонов произвести скольжение, относительно исходного тона. Следующий запрос: BEND TONE UP OR DOWN - повышение или понижение тона. И последний запрос, как обычно: "для какого канала" (или для всех трех).

Клавишей R (Repeat) можно повторить предыдущий спецэффект. Здесь надо пояснить, что это имеет смысл, пожалуй, только для скольжения тона. Потому, что остальные спецэффекты и так имеют длительный характер: например, если Вы зададите громкость чистого тона, скажем, "С", то это значение будет зафиксировано до тех пор, пока не будет установлено иное. То же и с огибающими - задав огибающую, скажем, в начале мелодии, она сохранится до следующего задания новой огибающей или до команды изменения громкости. Иначе со скольжением тона. Этот спецэффект действует только на текущую ноту. Поэтому, если требуется получить более длительный скользящий тон, то надо на первой ноте поставить код при помощи клавиши S, а дальше, на каждой следующей ноте повторять этот спец.эффект при помощи клавиши R.

Клавишей Q можно повторить выбранный музыкальный фрагмент заданное число раз. По существу это копирование фрагмента. После выбора этого пункта следует ряд запросов: FOR CHAN - для какого канала выполнить копирование; BEG. - начальная нота (по счетчику тактов); END - конечная нота; АТ - куда будет выполняться копирование заданного фрагмента; HOW MANY REPETITIONS - число повторений; EFFECT CHANNEL ALSO? (Y/N) - канал эффектов тоже переносить? Отвечайте Y или N.

Например, для того, чтобы четырежды повторить один и тот же фрагмент из 8 нот, надо набрать первую восьмерку, а затем вызвать режим EXT.MODE и, нажав Q, повторить ещё 3 раза эту последовательность. Для этого надо задать следующие числа: FOR CHAN : BEG : END:8_ AT:_9 HOW MANY REPETITIONS:3

При необходимости надо повторить эту процедуру для всех трех каналов.

Клавишей L (Loop) ставится "петля", зацикливающая канал спец.эффектов на начало мелодии. При завершении мелодии, этот четвертый канал, как и первые три должен быть зациклен. В том случае, если не установлены "петли" в первых трех каналах, то будет выдано предупреждение:

NO OTHER LOOP CORRESPONDS!

ARE YOU SURE YOU WANT IT HERE?

Y/N

НЕТ ПЕТЕЛЬ В ДРУГИХ КАНАЛАХ!

ВЫ УВЕРЕНЫ В СВОИХ ДЕЙСТВИЯХ?

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

Клавиша ENTER возвращает из режима расширенного режима (EXT.MODE) в режим редактирования без установки спецэффекта.

Все действия, происходящие в расширенном режиме, происходят в Бейсике. Это открывает просто фантастический простор для творчества. Но об этом - позже.

SET TEMPO.

Как и в старом "WHAM", изменить темп можно при помощи клавиши 5 в титульном меню. Это, вообще говоря, не очень удобно, поэтому при внесении усовершенствований этот момент учтен. Но темп можно изменить и по-старому. Здесь все как в старом "WHAM" - клавишами 5 и 8 устанавливается требуемый темп, после чего нажатие любой другой клавиши переводит в режим редактирования.

ENVELOPES.

Нажав 4 в титульном меню, мы попадаем в редактор огибающих. Далее Вам предлагается для редактирования выбрать одну из огибающих клавишами 1.. .8. После выбора экран принимает следующий вид:

1 а 3 4 5 Бт. 7 s

RE55 ENTER НЕМ FINISHED

5Е FIHHDUED EY5 TD EDIT HE UFIUEFDHM

rv

Вверху показаны исходные огибающие, слева, в большом окне - в увеличенном виде дана редактируемая огибающая. Она разделена на 16 минимальных временных отрезков, каждый из которых задает мгновенный уровень

громкости. Последний, в свою очередь имеет 16 градаций.

Редактирование выполняется курсорными клавишами. При помощи "ВЛЕВО" - "ВПРАВО" выбирается временной интервал, а при помощи "ВВЕРХ" - "ВНИЗ" - мгновенный уровень громкости в выбранном временном интервале. Экспериментируя с огибающими, не производите резких изменений. Даже незначительные коррективы вносят заметные на слух изменения, особенно для фронта сигнала.

После завершения редактирования огибающей, нажмите ENTER для возврата.

SYST MENU.

Это меню имеет свой набор сервисных возможностей. Нажав 3 в титульном меню, появляется новое системное меню:

5У5ТЕП ENVIRONMENT CHRMGE MENU

1. 5ЕТ PRE5ET MEI5E UPLLE5 а . 5ЕТ EHRMMEL LEDP PRRRMETER5

3. CHRMGE 5ВУЕ A LORD PERIPHERAL FROM ТВ DD5

4. LI5TEN ТО TUNE 5 . COMPILE Й: 5ВУЕ

РВЕ55 R NUMBER СИ ТС EXIT]

Рассмотрим подробнее каждый из этих пунктов.

1. SET PRESET NOISE VALUES - редактор шумовых эффектов. Выбрав этот пункт, экран принимает

следующий вид: _

DEFINED

ENVELOPE

UPUEFCRM

5HPPE5I

^

□**<

БГН Б^ 7Р"Ч

NC KEY

FREQUENCY

ENVELOPE

VOLUME

1 □

Б

а

Ч

э ы

ЗА

а

Ч

3 Е

а

Б

а

4- Н

ЗЕ

Б

а

5 Т

л.

1

а

Б Y

13

1

а

7 U

SB

1

а

Б I

ЭБ

1

а

q и

Э0

5

а

LCUE5T

FREQUENCY

15 31 UHILE

THE

HIEHE5T

FREQUENCY 15 В

ЫН1СН PRESET TP FILTER [B=EiiIT]

Здесь представлены параметры каждого из 9 эффектов, использующих "белый" шум.

Для редактирования соответствующего эффекта надо нажать клавишу 1.9, после чего выбранный эффект будет отмечен выделенной строкой, затем последует ряд запросов: ENTER THE FREQUENCY (0 TO 31) - введите новое значение диапазона частоты "белого" шума. Здесь значение 31 соответствует низшим звуковым частотам, а 0 -высшим. Поэтому это, строго говоря, величина, тождественная не частоте, а периоду колебаний. Далее следует запрос: ENVELOPE NUMBER (1 TO 8, 0=NONE) - надо ввести номер огибающей. Сами огибающие представлены тут же - все они равнозначны и можно выбрать любую из них. Можно отказаться от какой либо огибающей, тогда вводите 0. В этом случае программа выдаст ещё один запрос: VOLUME LEVEL REQUIRED? (0 TO F) - введите уровень громкости.

При редактировании шумовых эффектов не задавайте большие значения громкости (больше 8.А) - это приведет к тому, что при воспроизведении мелодии захочется заткнуть уши.

По завершении редактирования шумовых эффектов клавиша 0 возвратит Вас к титульному меню.

2. SET CHANNEL LOOP PARAMETERS - установка параметров зацикливающей "петли". Новый "WHAM+AY" имеет возможность реализации так называемого "затакта" - некоторой последовательности (вступления), предшествующей основной мелодии. Это поясняет схема, на которой мелодия длиной 64 ноты имеет затакт 8 нот:

-8 0 <-счётчик нот-» 64

| затакт

основная мелодия

—<■—

зацикливание -*-

При выборе этого пункта в системном меню появляется таблица параметров петель для всех 4 каналов:

LOOP LIMIT

MODIFICATION

CHRNNEL 1

5TRRT + a

CHRNNEL Э

5TRRT + a

CHRNNEL Э

5TRRT + a

CHRNNEL FX

5TRRT + a

Loops are osoaLLy used For an introduction to a piECE idhich oooLd bE a FadE in, drum roLL. music irtro Etc. You nay u ish to

L5E it tO 5 E t OP thE EI1VELDFE5!

CHRNNEL 7 CI TC

4-3 OR □ TO

EXIT

Нажмите клавишу, например, 1. После этого появится следующий запрос: HOW MANY NOTES - на сколько нот отодвинуть точку зацикливания от абсолютного начала мелодии. Задаем, например, 8. После этого 1 строка изменится:

CHANNEL 1 START + 8

Чтобы не запутаться, надо задать одинаковый затакт для всех 4-х каналов, однако для каких-то целей Вам может понадобиться и отдельное задание затакта только в одном канале.

Для того, чтобы вернуть затакт на нулевое значение, надо в ответ на запрос "HOW MANY NOTES" ответить не 0, а -8, так как смещение в программе задается в относительных единицах.

3. CHANGE SAVE & LOAD PERIPHERAL - при помощи этого пункта системного меню происходит выбор текущего устройства ввода-вывода. Это зависит от конкретной версии "WHAM+AY".

4. LISTEN TO TUNE - воспроизведение мелодии. Этим пунктом системного меню удобно воспользоваться перед тем, как приступить к компиляции мелодии. Здесь готовая мелодия будет звучать в точности так же, как и скомпилированный машинно-кодовый блок. Прислушайтесь ещё раз к звучанию и внесите, если надо, некоторые коррективы в огибающие. Различие в звучании по сравнению с тем, что было в режиме редактирования при нажатии клавиши Q вызвано тем, что воспроизведение выполняется другой процедурой - переход от одной ноты к другой происходит без задержки на перерисовку экрана, как это было в режиме редактирования.

5. COMPILE & SAVE - компиляция и запись - этот пункт системного меню является итоговым в процессе создания собственной мелодии. При выполнении его на экран будет выведены результирующие длины всех каналов (до маркера "конец мелодии" ("петля"). Если хотя бы в одном из четырех каналов "петля" не установлена, то компиляция будет прервана с соответствующим сообщением.

На компиляции следует остановиться несколько подробнее. В новом "WHAM+AY" она сделана гораздо менее удачно, чем в "WHAM". Здесь несколько моментов. Во-первых, компиляция не выполняется в произвольно заданный адрес. Результирующий блок кодов будет всегда располагаться с адреса 60000. Во-вторых, если даже Ваша мелодия будет состоять из одной ноты, длина полученного блока все равно будет неизменна и равна 5024 байт. Кроме того (ну это уже мелочи), стартовым адресом блока будет адрес 64000 (а адрес загрузки - 60000). Нет режимов KEYPRESS -воспроизведение мелодии всегда зациклено и продолжается до нажатия на любую клавишу. Цвет бордюра при воспроизведении мелодии специально не задается.

Вот, в основном, все возможности, реализованные в программе "WHAM+AY". А теперь переходим к рассмотрению этой программы "изнутри".

* * *

Часть 2. Информация для "хэккеров".

Здесь я попытаюсь не только привести готовые результаты конкретных усовершенствований, но и попробую показать как все это делается - так сказать, приоткрыть дверь, показать "кухню" этого дела.

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

Бейсик-загрузчик.

Он может быть различным для разных версий программы. Последняя может состоять из одного блока кодов и Бейсик-файла. Широко распространена версия, в которой кодовый блок скомпрессирован. Длина его может быть немного более 10К. Это дает примерно полуторократную экономию. После завершения работы декомпрессора (он может вызываться по-разному) результирующий кодовый блок располагается с адреса 48000 до конца памяти - по 65535 включительно, т.е. длина его - 17536 байт. Эти данные получены из анализа блоков кодов нескомпрессированных версий. Если у Вас версия со скомпрессированным блоком кодов, то после запуска программы и выхода в титульное меню, остановите программу. Сделать это можно из титульного меню. Нажмите 1 или 2 (LOAD или SAVE). После появления запроса имени - это уже работает Бейсик - остановите программу клавишей BREAK (или ВНИЗ в зависимости от конкретной версии). После этого выйдите в TR-DOS и выполните: SAVE "wham+ay" CODE 48000, 17536

При проведении экспериментов и усовершенствований с "WHAM+AY" я пользовался монитором "MONS4". Так как в "WHAM+AY" не предусмотрено хранение мелодии в области ОЗУ 48К, то удобно оказалось на период отладки скомпоновать загрузчик таким образом, чтобы сразу загружался модуль "mons4b" CODE. Отладочный

Бейсик-загрузчик тогда будет иметь такой вид:

10 REM WHAM + MONS4 2 0 BORDER 7: CLEAR 4 0 999

30 RANDOMIZE USR 15619: REM : LOAD "mons4b"CODE 41000 40 RANDOMIZE USR 15619: REM : LOAD "wham+ay"CODE

50 POKE 23675,88: POKE 23676,255: POKE 23606,104: POKE 23607,215 60 RANDOMIZE USR 15619: REM : RUN "m.box+ay"

Окончательный Бейсик-загрузчик по аналогии со старым "WHAM" сделан двухрежимным - автоматически происходит загрузка с ленты или с диска, если интерфейс БЕТА-диска инициализирован. Результирующий вариант двухрежимного Бейсик-загрузчика приведен в Листинге_1.

Листинг_1.

Двухрежимный Бейсик-загрузчик.

Файл "WHAM+AY".

10 REM Universal Disk-Tape loader

2 0 BORDER 0: PAPER 0: INK 0: POKE 2 3 624,0: CLEAR 40999

25 IF (PEEK 23635+256*PEEK 23636)=23755 THEN POKE 23739,111: LOAD ""SCREEN$ : LOAD

""CODE : LOAD "" 30 RANDOMIZE USR 15619: REM : LOAD "wham $"CODE 16384 40 RANDOMIZE USR 15619: REM : LOAD "wham+ay"CODE 50 POKE 23675,88: POKE 23676,2 55: POKE 23606,104: POKE 23607,215 60 RANDOMIZE USR 15619: REM : RUN "m.box+ay" 100 SAVE "WHAM+AY" LINE 10: STOP 200 RANDOMIZE USR 15619: REM : SAVE "WHAM+AY"

В окончательно готовом варианте вместо монитора загружается картинка-заставка.

Строки 100 и 200 - самозапись загрузчика соответственно на магнитную ленту и на диск.

Кроме того, замечу, что при работе с усовершенствованной программой опять встал вопрос с нехваткой памяти, хотя и не так остро, как в старом "WHAM". Можно было, конечно, отказаться от места, в котором находится MONS4, и тогда все проблемы были бы разом сняты, однако хотелось сохранить себе "лазейку" для проведения дальнейших усовершенствований. Поэтому я решил сохранить значение RAMTOP равное 40999 и ограничился только заменой 0 и 1 переменными O и I.

Формат мелодии. Кодировка.

Основным принципиальным отличием нового "WHAM+AY" является несколько иная кодировка и раскладка текста мелодии в области редактирования и отгружаемом кодовом блоке. Начало области памяти, отведенной под исходный текст мелодии осталось прежним - 60000. Сохранилась и максимальная длина мелодии - 999 нот. Ячейка 60000 в этой версии не используется. С 60001 по 60999 - ноты 1 канала, с 61001 по 61999 - 2 канала, с 62001 по 62999 -ноты 3 канала, с 63001 по 63999 - коды канала спец.эффектов. При удалении мелодии область с 60000 до 63000 инициализируется - заполняется кодом 53 - это "пауза". Область с 63000 по 63999 обнуляется, 0 - это "пауза" для канала спец.эффектов. Ноты в каждом из трех нотных каналов кодируются одинаково. Самая низкая нота - "до" 1 октавы имеет код 0, следующая - код 1 и т.д. самая высокая нота имеет код 52. Маркер "конец мелодии" (или "петля") имеет код - 63 (в отличие от 64 для старого "WHAM").

Далее, с адреса 64000 в памяти расположены адреса начала областей памяти, отведенных для каждого канала. В ячейках 64000 и 64001 находится пара чисел, представляющая собой текущий адрес для 1 канала. В ячейках 64002 и 64003 - пара чисел, с которой начинается первая нота мелодии. Если затакт не установлен, то в 64002 находится 60001 - адрес 1 -й ноты в области редактирования для 1 канала. Если установлен затакт, например 8 нот, тогда в 64002 будет 60009 - это адрес, соответствующий первой ноте собственно мелодии, не считая затакт. Точно такие же числа заданы для остальных трех каналов - в адресах 64004......64015.

В ячейке 64016 записана скорость воспроизведения мелодии. (Чем больше число, тем выше скорость воспроизведения).

С адреса 64017 сохраняются описания огибающих. Здесь группами по 16 байт заданы мгновенные уровни громкости для каждой огибающей, всего: 16*8=128 байт (по адрес 64144 включительно).

В ячейке 64145 находится код 255.

С адреса 64146 заданы параметры "шумовых" эффектов по 2 байта на каждый эффект. Первый байт для каждой пары - это частота (0.31, точнее, величина, тождественная периоду колебаний). Если для эффекта не задана огибающая, то второй байт - это уровень громкости. Точнее, младший полубайт этого числа; но учитывая, что максимальная величина - 15 (F), это одно и то же. Старший полубайт в этом случае - 0. Если же для эффекта задана огибающая, то её номер задан в старшем полубайте, а младший полубайт равен 0. Всего заданы параметры для 9 возможных шумовых эффектов.

Такова раскладка мелодии в отгружаемом кодовом блоке.

Дальнейшее изложение материала построено таким образом. В Листинге_2 полностью приводится основной Бейсик-файл программы "WHAM+AY". Он называется "m.box+ay". При внесении изменений в свою версию, внимательно просмотрите все строки, так как могут быть отличия. (Кроме того, владельцы 128К в своих версиях могут сохранить элементы взаимодействия с RAM-диском.) При описании усовершенствований, будут даны ссылки

на Листинг_2.

При остановке программы Вы можете воспользоваться следующими командами: RUN - её старт.

RUN 5 - запись на диск Бейсик-файла "m.box+ay".

RUN 8 - запуск MONS4. 8 строка предназначена только для отладки и после её завершения может быть

удалена.

Листинг_2. Бейсик-файл "m.box+ay".

Символы UDG-графики - подчеркнуты.

0 REM (C) 1986 MARK TIME (C) 1990 ALANSOFT

1 GO TO 9000

2 DEF FN p(p)=PEEK p+256*PEEK (p+1)

3 POKE 43519,0

4 GO TO 0

5 GO TO 9990

6 RANDOMIZE USR 15 616

7 STOP

8 RANDOMIZE USR 41000 10 REM

30 LET P=PEEK 60000: IF P=O THEN LET P=8

32 IF P<12 8 THEN POKE 50768,191: POKE 51105,18

34 IF P>12 8 THEN POKE 50768,223: POKE 51105,26: LET P=P-128

36 POKE 50743,P

38 RANDOMIZE USR 49220

39 RETURN

4 0 RANDOMIZE USR 4 9200 42 POKE 60000,PEEK 50743

44 IF PEEK 50768=223 THEN POKE 60000,PEEK 60000+128

49 RETURN

50 PLOT 15,15: DRAW 128,O: DRAW O,120: DRAW -128,O: DRAW O,-120

52 FOR A=O TO 15: FOR B=I TO PEEK (A+ENBAS): PRINT AT 2 0-B,A+2;"|": NEXT B: FOR

B=I+PEEK (A+ENBAS) TO 15: PRINT AT 2 0-B,A+2;"H": NEXT B: NEXT A 55 RETURN 60 REM

62 PRINT PAPER 4;AT 8,20;" ";AT 9,20;" ";AT 10,20;" ";AT 11,20;" " 65 LET X=2*PEEK ENBAS: PLOT 160, 80+X

67 FOR A=I TO 15: LET Y=2*PEEK (ENBAS+A) : DRAW 2,Y-X: LET X=Y: NEXT A 69 RETURN

80 LET D$=("TR DOS" AND PEEK 4 9549=I)+("TAPE" AND PEEK 49549=2): RETURN

400 LET ADDR=ADDR-I: REM loop effects channel

401 LET ACH1=PEEK FN P(49711)

402 LET ACH2=PEEK FN P(49715)

403 LET ACH3=PEEK FN P(49719)

404 IF ACH1=63 OR ACH2=63 OR ACH3=63 THEN POKE ADDR,63: RUN

411 LET ACH1=PEEK (I+FN P(49711))

412 LET ACH2=PEEK (I+FN P(49715))

413 LET ACH3=PEEK (I+FN P(49719))

414 IF ACH1=63 OR ACH2=63 OR ACH3=63 THEN POKE ADDR+I,63: RUN

415 IF FN P(49711)+I=FN P(49713) THEN POKE ADDR+I,63: RUN

416 IF FN P(49715)+I=FN P(49717) THEN POKE ADDR+I,63: RUN

417 IF FN P(49719)+I=FN P(49721) THEN POKE ADDR+I,63: RUN 420 INPUT ;

425 PRINT #0;" NO OTHER LOOP CORRESPONDS ! ARE YOU SURE YOU WANT IT HERE ? Y/N"

430 IF INKEY$="Y" THEN POKE ADDR,63: RUN

440 IF INKEY$="N" THEN INPUT ': PRINT #0;" I THOUGHTSO": PAUSE 50: GO TO 990

450 GO TO 430

500 REM place effect

510 LET ADDR=FN P(49723)+I

520 REM IF ADDR=63000 THEN GO TO 990

530 INPUT ''':PRINT #O;AT O,O;" SPACE-return to edit-mode or: Envelope Volume Blank

Slide Loop repetitions Tempo trAnsponierung Repeat Counters music-Key Memory" 540 POKE 23658, 8

550 IF INKEY$="E" THEN GO TO 600: REM envelope

IF INKEY$="K" THEN GO TO 3800

581 IF INKEY$="T" THEN GO TO 980:

582 IF INKEY$="M" THEN GO TO 4800: 585 IF INKEY$=" " THEN GO TO 990: 590 GO TO 550 600 REM place envelope 605 INPUT '

610 FOR A=I TO 7: POKE 50004,A-I: BRIGHT I;"PR";AT 21,A*4-I;"QS" 620 PRINT #O;" PRESS DESIRED ENVELOPE NUMBER" 630 GO SUB 2500: IF V<O OR V>7 THEN GO TO 620 64 0 LET E=V

650 PRINT #O;"WHICH CHANNEL (1-3,OR 0 FOR ALL)": GO SUB 2500: IF V>3 THEN GO TO 650

660 LET BYTE=12+V+E*32

670 POKE ADDR,BYTE: GO TO 960

700 REM alter volume

705 INPUT '

710 PRINT #O;" NEW VOLUME LEVEL ? (0 TO F)" 720 GO SUB 2600

730 LET E=V/2: LET E=E-0.25: GO TO 650: REM short cut 800 REM NOTEBENDING

805 INPUT ': PRINT #0;"HOW MANY SEMITONES (0 TO 7) ?": GO SUB 2500: IF V>7 THEN GO T 805

810 LET E=V*32

815 INPUT ': PRINT #0;" BENDTONE UP OR DOWN ?"

820 IF INKEY$="U" THEN GO TO 830

822 IF INKEY$="D" THEN LET E=E+16: GO TO 830

824 GO TO 820

830 INPUT '

840 PRINT #O;"WHICH CHANNEL (1-3,OR 0 FOR ALL)": GO SUB 2500: IF V>3 THEN GO TO 840 850 LET BYTE=E+8+V 8 60 POKE ADDR,BYTE

960 REM back to play effect

961 REM FOR A=O TO 5: NEXT A:

962 FOR A=O TO 5: NEXT A: PRINT 965 LET X=65280-USR 50113: GO TO 1020 97 0 REM back to edit mode 971 INPUT ;: FOR A=O TO 5: NEXT A

975 PRINT AT O,O;: LET X=65280-USR 51096: GO TO 1020

980 REM back to set tempo

981 INPUT ;: FOR A=O TO 5: NEXT A

985 PRINT AT O,O;: LET X=65280-USR 50474: GO TO 1020

990 REM effect re-entry

991 INPUT ;: OUT 254,PEEK 49481: FOR A=O TO 5: NEXT A 995 PRINT AT O,O;: LET X=65280-USR 50008: GO TO 1020 1000 REM MAIN LOOP

1010 BORDER 7: LET X=65280-USR 50000 1020 POKE 23658,8

IF X=51 THEN GO TO 500 IF X=2 THEN GO TO 3000 IF X=3 THEN GO TO 3500 IF X=4 THEN GO SUB 2 000: RUN IF X=5 THEN GO SUB 1900: RUN IF X=59 THEN GO TO 8000

555 IF INKEY$="L" THEN GO TO 400: REM set loop

560 IF INKEY$="B" THEN POKE ADDR,O: GO TO 960: REM blank effect

570 IF INKEY$="V" THEN GO TO 700: REM set volume

572 IF INKEY$="P" THEN GO TO 4900: REM repetitions

575 IF INKEY$="S" THEN GO TO 800: REM slide tune

57 6 REM undocumented keypress

IF INKEY$="R" THEN POKE ADDR,PEEK (ADDR-I): GO TO 960: REM repeat last effect

REM tune transponierung REM set counters REM select music-key REM set tempo

REM memory LOAD & SAVE REM return to edit

577

578 IF INKEY$="A" THEN GO TO 4300

579 IF INKEY$="C" THEN GO TO 4700 5

RANDOMIZE USR 50003: PRINT AT 2 0,A*4-2;A; INK 2; : NEXT A

PRINT AT O,O; BRIGHT I;: RANDOMIZE USR 51153 RANDOMIZE USR 51153

1021 1030 1040

1045

1046 1050 1060 RUN

1900 REM LOAD A TUNE 1905 GO SUB 80: INPUT 1910 GO SUB 2800

1915 IF D$="TAPE" THEN CLS : IF F$="

CASS TAPE:": LET F$="": GO TO 1925 192 0 PRINT "SEARCHING FILE: ";F$ 1925 IF D$="TAPE" THEN LOAD F$ CODE 60000 1930 LET ERR=USR 15619: REM : LOAD F$CODE 1935 IF ERR<>O THEN GO TO 2400

1940 REM IF PEEK 60000>99 THEN RANDOMIZE USR 50011: POKE 60000,53: RUN : REM this

routine converts the old style tunes. 195 0 GO SUB 30: RETURN REM SAVE A TUNE LET LEN=417 0: GO SUB 40

GO SUB 80: INPUT ;: PRINT AT 20,O;"SAVE TO ";D$; GO SUB 2800

LET STR=60000: LET ERR=O

IF D$="TAPE" THEN SAVE F$ CODE STR,LEN IF D$="TR DOS" THEN LET ERR=USR 15619: IF ERR<>O THEN GO TO 2400 PRINT #O;"VERIFY ? (Y/N)": BEEP .1,20: LET ERR=O: INPUT ;: PRINT AT 20,O;" IF D$="TAPE" THEN VERIFY F$ CODE STR,LEN IF D$="TR DOS" THEN RANDOMIZE USR 15619: IF ERR<>O THEN GO TO 2400

PRINT #O;TAB 12; PAPER 4;" O.K. ": BEEP RANDOMIZE USR 15619: REM : CAT PRINT : GO TO 2800

FLASH I;" ERROR ";ERR;"

THEN GO TO 2550

THEN GO TO 2610

2830 2900 2910 2915 2920 3000 3010 3030

BRIGHT O: CLS

RANDOMIZE USR 50003: NEXT A

0-EXIT)": GO SUB 2500:

PRINT AT O,A*4-4;A; INK 2;

IF V>8 OR V<O THEN GO

3045 3050

3055

3056

I; INK

BEEP I,O: PAUSE O: RETURN

INPUT ;: PRINT #O;TAB 11; REM expect num sub.

LET A$=INKEY$: IF A$<"0" OR A$>"9" LET V=VAL A$: GO TO RET REM expect hex digit sub. POKE 23658,8

LET A$=INKEY$: IF A$<"0" OR A$>"F" IF A$<="9" THEN GO TO 2590

LET V=10+CODE A$-CODE "A": IF V<0 OR V>15 THEN GO TO 2610 GO TO RET REM filenames sub

DIM F$(10): INPUT AT O,O;(("Press ENTER for CATALOGUE DISK" AND D$="TR DOS")''"FILENAME: "); LINE F$ 2820 IF F$=" " AND D$="TR DOS" THEN GO TO 2300

PRINT AT 21,O;: RETURN REM RETURN+SOUND+CLBOT BEEP .01,-20: INPUT ' IF INKEY$<>"" THEN GO TO 2 915 RETURN

REM envelope editor PAPER 5: BORDER 5: INK O FOR A=I TO 8: POKE 50004,A-I BRIGHT I;"PR";AT I,A*4-3;"QS": 3040 PRINT #O;"WHICH ENVELOPE? (1 TO 8;

TO 3040 3042 IF V=O THEN RUN PRINT AT 10,O'' LET ENBAS=49728+(V-I)*16 PRINT PAPER 7; INK 2;AT O,V*4-4;V

PRINT PAPER 7;AT 14,19;"PRESS ENTER",AT 15,19;"WHEN FINISHED";AT 17,19;"USE ARROWED",AT 18,19;"KEYS TO EDIT",AT 19,19;"THE WAVEFORM", 3060 POKE USR "S",255: FOR A=USR "S"+I TO USR "S"+7: POKE A,I: NEXT A 3070 PAPER 6: GO SUB 50: PAPER 5

3080 LET A$="12 34 5 67 8 9ABCDEF": FOR A=I TO LEN A$: PRINT AT 20-A,O; PAPER 7;A$(A): NEXT A

3090 PLOT 158,78: DRAW 35,O: DRAW O,35: DRAW -35,O: DRAW O,-35

PRINT AT 2 0,O;"LOAD FROM ";D$;

THEN PRINT "LOADING ANY TUNE FROM

1940

GO TO 60000

2000 2005 2010 2020 2030 2040 2050 2060 2070 2100 2110 2120 2130 2140 2300 2310 2400 2500 2550 2590 2600 2605 2610 2620 2630 2640 2800 2810

SAVE F$CODE STR,LEN

REM

O: IF INKEY$<>"Y" Verifying..."

PAUSE

THEN RETURN

VERIFY F$ CODE STR,LEN .1,26: BEEP .1,20: PAUSE 50: RETURN

REM

3100 LET E=O

3110 PRINT AT 21,O,,AT 21,E+2; PAPER 7; FLASH I;"A": BEEP .005,O: GO SUB 62 3120 PAUSE O: IF CODE INKEY$=8 AND E>O THEN LET E=E-I: GO TO 3110 3130 IF CODE INKEY$=9 AND E<15 THEN LET E=E+I: GO TO 3110 3140 IF CODE INKEY$=11 THEN LET X=PEEK (ENBAS+E)

PRINT AT 19-X,E+2;"|": GO TO 3110 3150 IF CODE INKEY$=10 THEN LET X=PEEK (ENBAS+E)

PRINT AT 2 0-X,E + 2; PAPER 6;"S": GO TO 3110 3160 IF INKEY$=CHR$ 13 THEN GO TO 3000 3170 GO TO 3120 3300 REM PARAMS

BORDER 5: CLS

LOOP LIMIT MODIFICATION"

1 START + ";FN P(4 9713)

2 START + ";FN P(4 9717)

IF X<15 THEN POKE (ENBAS+E),X+I: IF X>O THEN POKE (ENBAS+E),X-I:

3305 PAPER 5: INK O

3310 PRINT INK I;"

3320 PRINT AT 5,3;"CHANNEL

3330 PRINT AT 7,3;"CHANNEL

3340 PRINT AT 9,3;"CHANNEL

335 0 PRINT AT 11,3;"CHANNEL

60001 61001 -62001 63001

3 START + ";FN P(4 9721)

FX START + ";FN P(49725)

3360 PRINT ''"Loops are usually used for an introduction to a piece which could be a fade in, drum roll, music intro etc. You may wish touse it to set up the envelopes!"

3370 PRINT #O;"CHANNEL ? (1 TO 4) OR 0 TO EXIT"

3380 GO SUB 2500: IF V=O THEN RUN

3385 IF V>4 THEN GO TO 3370

3390 PRINT AT 3+V*2,I;">"

33 95 INPUT "HOW MANY NOTES ";NT

3400 LET ADDR=4 97 0 9+V*4

3405 LET BYTE=FN P(ADDR)+NT

3410 IF NT>95 0 THEN GO TO 3395

3415 POKE ADDR+I,INT (BYTE/256): POKE ADDR,BYTE-2 5 6*PEEK (ADDR+I)

3420 GO TO 3300

3500 PAPER 6: BORDER 6: CLS : PRINT '" SYSTEM ENVIRONMENT CHANGE MENU"

3510 PRINT '''"1 SET PRESET NOISE VALUES"

3520 PRINT '"2 SET CHANNEL LOOP PARAMETERS"

3530 PRINT '"3 CHANGE SAVE & LOAD PERIPHERAL"

3531 PRINT " FROM ";: GO SUB 80: PRINT PAPER 7;D$; PAPER 6;" " 3540 PRINT '"4 LISTEN TO TUNE"

3545 PRINT '"5 COMPILE & SAVE"

3547 PRINT '"6 LOAD & RECOMPILE"

3548 PRINT '"7 TAKTS-PERIOD: "; PAPER 7;PEEK 50743

3550 PRINT #O;" PRESS A NUMBER (0 TO EXIT)": GO SUB 2500: IF V>7 THEN GO TO 3550

3560 IF V=O THEN RUN

3570 IF V=1 THEN GO TO 4000

3580 IF V=2 THEN GO TO 3300

3590 IF V=3 THEN GO TO 3700

3595 IF V=5 THEN GO TO 3900

3597 IF V=6 THEN GO TO 9200

3598 IF V=7 THEN INPUT "HOW MANY NOTES IN TAKTS-PERIOD:"'T: POKE 50743,T: PRINT AT 1,O: GO TO 3510

3600 RANDOMIZE USR 52503

3610 POKE 52 5 62,PEEK 49727-18: PRINT #O;" PRESS ANY KEY TO STOP THE TUNE": RANDOMIZE

USR 52500: INPUT ;: GO TO 3550

3700 LET V=PEEK 49549-I: LET V=V=O: POKE 49549,V+I: PRINT AT 1,O: GO TO 3510

3800 IF PEEK 50768=191 THEN POKE 50768,223: POKE 51105,26: GO TO 970

3810 IF PEEK 50768=223 THEN POKE 50768,191: POKE 51105,18: GO TO 970

3900 PAPER 7: BORDER 7: CLS : PRINT #O;" COMPILING TUNE"

3910 LET ER=O: FOR A=I TO 4: POKE 53571,A: LET Z=USR 53570: LET Z=Z-(5 9000+(1000*A))

3 915 PRINT "LENGTH CHANNEL ";A;": ";Z 3916 IF Z>999 THEN LET ER=I

3 92 0 NEXT A

3930 IF ER=I THEN INPUT ': PRINT ' PAPER 2; INK 7;" END MARKER OUT OF RANGE ERROR

RETURN TO EDITOR AND INSERT THE MARKER. USE THE 'W' KEY FOR THE FIRST 3 CHANNELS AND LOOP OPTIONFOR THE EFFECTS CHANNEL.",,,: PRINT #0;"Compilation Abandoned.": PAUSE O: RUN

3950 PRINT '"THE ROUTINE HAS COMPILED FROM 60000 TO 65024. CALL THE CODE WITH USR

64000. THE ROUTINE WILLRETURN ON A KEYPRESS."

3960 PRINT '"TO TAILOR SPEED POKE 64062,_"

3970 RANDOMIZE USR 53550

3980 POKE 64 0 62,PEEK 49727-18

3990 LET LEN=5 02 4: GO SUB 2010: RUN

4000 REM edit preset noise

4010 PAPER O: INK 5: BRIGHT I: BORDER O: CLS

4015 PRINT INK 6;"DEFINED ENVELOPE WAVEFORM SHAPES"

4020 FOR A=I TO 8: POKE 50004,A-I: RANDOMIZE USR 50003: PRINT AT I,A*4-4;A; INK 2;

PAPER 7;"PR"; AT 2,A*4-3;"QS": NEXT A

4030 PRINT '' PAPER I;"NO KEY FREQUENCY ENVELOPE VOLUME"

4035 LET A$="QWERTYUIO"

4040 FOR A=I TO 9

4041 LET E=PEEK (49963+(A*2))

4043 LET EN=INT (E/16): LET V=O: IF EN=O THEN LET V=E

4050 PRINT INK 5+(A/2=INT (A/2));A;TAB 4;A$(A);TAB 10;PEEK (49962+(A*2));TAB

2 0;EN;TAB 28;CHR$ (48+V+(7 AND V>9))

4060 NEXT A

4065 PRINT ''"LOWEST FREQUENCY IS 31 WHILE THEHIGHEST FREQUENCY IS 0"

4070 PRINT #O;" WHICH PRESET TO ALTER (0=EXIT) "

4080 GO SUB 2500

4090 IF V=O THEN RUN

4100 LET N=V

4105 LET AD=4 9962+V*2

4110 PRINT AT N+5,O; OVER I; INVERSE I,,

4120 INPUT "ENTER THE FREQUENCY (0 TO 31) ";FR: IF FR<O OR FR>31 THEN GO TO 4120

4130 PRINT AT N+5,10; INVERSE I;FR;" "

4135 POKE AD,FR: LET AD=AD+I

4140 PRINT #O;"ENVELOPE NUMBER (1 TO 8,0=NONE)"

4150 GO SUB 2500: IF V=9 THEN GO TO 4140

4160 IF V=O THEN GO TO 4180

417 0 POKE AD,V*16: GO TO 4 000

4180 PRINT INVERSE I;AT N+5,20;"0"

4190 PRINT #O;"VOLUME LEVEL REQUIRED ? (0 TO F)": GO SUB 2600

4200 POKE AD,V

4210 GO TO 4000

4300 INPUT AT O,O;"BEGIN (1-999): ";B'("END (";B;"-999): ");E

4310 IF B<I OR B>999 OR E<B OR E>999 THEN GO TO 4300

4320 INPUT ;: PRINT #0;"Press: U -for UP; D -for DOWN"

4325 PAUSE O: IF INKEY$<>"U" AND INKEY$<>"D" THEN GO TO 4325

4330 LET R=(INKEY$="U")-(INKEY$="D")

4335 INPUT ;: PRINT #O;"WHICH CHANNEL: 1-3; or 0 for ALL"

4340 PAUSE O: IF INKEY$<"0" OR INKEY$>"3" THEN GO TO 4340

4 35 0 LET C=VAL INKEY$

4360 INPUT "Tune change (12=Octave): ";S

4400 LET V=O: IF PEEK 62999=O THEN POKE 62999,53

4410 IF C=O OR C=I THEN LET A=60000

4420 IF C=2 THEN LET A=61000

4430 IF C=3 THEN LET A=62000

4440 GO SUB 4500: IF C=O THEN LET A=61000: GO SUB 4500: LET A=62000: GO SUB 4500

4450 IF V=O THEN LET V=I: GO TO 4410

4470 LET N=B-I: GO TO 4710

4500 FOR N=A+B TO A+E: PRINT #O; AT O,O; ("Searching..." AND V=O); ("Transponierung"

AND V=I),N-A;" "

4510 IF PEEK N=63 THEN RETURN

4515 IF PEEK N>=53 THEN GO TO 4550

4520 LET T=S*R+PEEK N

4530 IF V=O THEN IF T>52 OR T<O THEN GO TO 4600

4540 IF V=I THEN POKE N, T

4550 NEXT N: RETURN

4600 INPUT ;: PRINT #O;"Tune ";("1" AND N<61000);("2" AND N>61000 AND N<62000);("3"

AND N>62000);" Channel is wery ";("high." AND R=I);("low" AND R=-I)

4610 PRINT #O;"Transponierung is not available.": BEEP I,O: PAUSE O: GO TO 990

4700 INPUT "COUNTERS: ";N

4710 RANDOMIZE 4720 RANDOMIZE 4730 RANDOMIZE 4740 RANDOMIZE 4750 GO TO 970

4800 INPUT ;: PRINT #O;AT 2,O;AT O,O;"S-SAVE tune to memory"

4810 IF PEEK 43519=1 THEN PRINT #O;"L-LOAD tune from memory"'"E-EXCHANGE tune

memory<->editor" 4 82 0 PAUSE O

4830 IF INKEY$="S" THEN POKE 43519,1: GO SUB 40: RANDOMIZE USR 55225: INPUT ;: PRINT

#O;" O.K. - tune in memory.": BEEP .1,26: PAUSE 50: GO TO 990

4840 IF PEEK 43519<>1 THEN GO TO 990

4850 IF INKEY$="L" THEN RANDOMIZE USR 55237: GO SUB 30: INPUT ;: PRINT #O;" O.K.

- tune is loaded.": BEEP .1,20: PAUSE 50: GO TO 970 4860 IF INKEY$="E" THEN GO SUB 40: RANDOMIZE USR 55200: GO SUB 30: INPUT ;: PRINT

#O;" O.K. - tunes are exchangen.": BEEP .1,26: BEEP .1,20: PAUSE 50: GO TO 970 4870 GO TO 990

4900 INPUT AT 0,0;"FOR CHAN.:";BW;" START:";FW;" END:";LW'" TO CHAN.:";EW;"

START:";AW'"HOW MANY REPETITIONS:";RW'"EFFECT CHANNEL ALSO ? (Y/N)";Q$: INPUT ;: PRINT #0;"****** PLEASE WAIT! ****** "

4910 FOR Q=O TO RW-I: FOR W=5 9000+1000*BW+FW TO 5 9000+1000*BW+LW: LET PW=W+(AW-

FW)+Q*(I+LW-FW)+(EW-BW)*1000: IF PW/1000<>INT (PW/1000) THEN POKE PW,PEEK W: NEXT W: NEXT Q

4920 IF Q$="Y" THEN LET BW=4: LET EW=BW: LET Q$="N": GO TO 4910 4930 GO TO 990

5000 PRINT "HELP - LOAD & SAVE"

5010 PRINT '''"Tunes can be saved and loaded toTR-DOS disc or TAPE. Owners of other disc systems should have no trouble in modifying the tapesave to suit their own systems."

5020 PRINT ''"Tunes are saved with the currentvalues of the envelopes and the status of white noise presets, Therefore the save is also a wayof preserving your waveforms."

5030 PRINT ''"The peripheral device used can be selected with the system

menuoption." 5040 GO TO 7999 5500 PRINT "HELP - ENVELOPES"

5510 PRINT '"Envelopes are volume variations over a note period, volume rangeis 0 to F (F is 15 decimal) mostenvelopes are discussed in termsof ADSR (Attack Decay Sustain & Release)" 5520 PRINT AT 15,O;" A D S R "

5530 PLOT O,30: DRAW 24,70: DRAW 16,-20: DRAW 40,O: DRAW 24,-50

5540 PRINT AT 18,O;"The editor allows you to vary the ADSR portion at will."

5560 GO TO 7999

6000 PRINT "HELP - KEYBOARD LAYOUT"

6010 PRINT '"The keys ""CS"" to ""."" are mapped to a piano keyboard. Keys ""l"" &

"","" can be used to extend this." 6015 PRINT '"Octave changes are made with thekeys ""1"" to ""4"". Whilst the ""t""

key changes the current channel." 6020 PRINT '"From edit mode the ""EXTEND MODE""key is used to place the desiredeffect (all menu driven)."

6040 PRINT '"The preset noises a re placed in the current channel by holding

""SYMB.SHIFT"" and pressing a key in the row (""Q"" to ""O"")." 6050 PRINT '"Please consult the manual for a full description of the other control

keys." 6060 GO TO 7999

6500 PRINT "HELP - AMPLIFICATION"

6510 PRINT '''''"The sound output of the spectrumis also present at the 'mic'

socket and can be connected to most hi fi systems with a lead."''"Your local hi fi or computer dealer may be able to advise youon this subject." 6540 GO TO 7999 7000 PRINT "HELP - NOISE"

7010 PRINT '''"White noise effects are placed on any channel in stead of notes.Only

one effect is interpreted so assign one channel for noise." 7020 PRINT '"When a channel is playing noise the envelope / volume level

(FN P (49713)-1+N)

(FN P (49717)-1+N)

(FN P (49721)-1+N)

(FN P (49725)-1+N)

POKE 4 9711,PEEK 23670 POKE 4 9715,PEEK 23670 POKE 4 9719,PEEK 23670 POKE 49723,PEEK 23670

POKE 4 9712,PEEK 23671 POKE 4 9716,PEEK 23671 POKE 4 972 0,PEEK 23671 POKE 4 9724,PEEK 23671

status window willturn yellow." 7030 PRINT '"An extra envelope is available for use with white noise and canbe

edited with the music types." 7040 PRINT '"For help on placement of noise in a tune see 'KEYBOARD'." 7050 GO TO 7999

7999 PAUSE 0: CLS

8000 REM HELP! 8010 BORDER 7: CLS

8020 PRINT "MARK TIME MUSIC BOX HELP SERVICE"

8030 PRINT ''" HELP EXISTS IN THE AREAS BELOW"

8040 PRINT '"1 LOADING AND SAVING"

8050 PRINT '"2 ENVELOPES"

8060 PRINT '"3 KEYBOARD LAYOUT"

8070 PRINT '"4 AMPLIFICATION"

8080 PRINT '"5 WHITE NOISE EFFECTS"

8100 PRINT #O;"PRESS THE CORRESPONDING NUMBEREDKEY FOR NEXT PAGE (OR 0 TO EXIT)"

8110 GO SUB 2500

8120 IF V=O THEN RUN

8130 IF V>5 THEN GO TO 8100

8140 CLS : GO TO 4500+500*V

9000 REM SETUP PARAMETERS

9010 LET RET=2 900: LET O=0: LET I = 1

9090 GO TO 1000

9200 BORDER 7: PAPER 7: CLS : PRINT AT 12,0;"Loading routine and recompiling.": GO SUB 1900

9210 LET P=PEEK 64062+18: IF P>252 THEN LET P=252 9220 RANDOMIZE USR 55250: POKE 49727,P

9230 INPUT ;: PRINT #0;" Recompiling is O.K.": BEEP .1,20: PAUSE 50: GO TO 3500

9700 RANDOMIZE USR 52500: GO TO 9100

9990 RANDOMIZE USR 15619: REM : ERASE "m.box+ay"

9992 RANDOMIZE USR 15619: REM : SAVE "m.box+ay"

9994 LET ERR=USR 15619: REM : VERIFY "m.box+ay"

9996 IF ERR=0 THEN PRINT INVERSE 1;" O.K. ": BEEP .1,26: BEEP .1,20

9998 IF ERR<>0 THEN PRINT FLASH 1; "ERROR!!!": BEEP 1,0

9999 BORDER 7: PAPER 7: INK 0

Бейсик. Старт программы.

После старта программы с начальной строки через строку 9000 мы попадаем на строку 1000 - основной цикл программы. В строке 1010 вызывается кодовый блок программы с его стартового адреса 50000. При нажатии заранее предусмотренных клавишей происходит возврат в Бейсик.

Дальнейшее распределение по процедурам в зависимости от нажатой клавиши выполняется строками 1021.. .1050, после чего программа зацикливается командой RUN в строке 1060. Назначение строк 1021.1050.

1021 - EXT.MODE - переход в расширенный режим из режима редактирования. 1030 - ENVELOPES - переход в редактор огибающих из титульного меню. 1040 - SYST MENU - вызов системного меню из титульного.

1045 - SAVE - вызов подпрограммы записи из титульного меню.

1046 - LOAD - вызов подпрограммы загрузки из титульного меню. 1050 - HELP PAGE - вызов меню помощи из титульного меню.

Загрузка и запись.

При внесении усовершенствований в "WHAM+AY" прежде всего были изменены процедуры загрузки и записи (GO SUB 1900 и GO SUB 2000 - см. строки 1045 и 1046).

Подпрограмма GO SUB 2800 предназначена для ввода имени файла. При работе с дисководом, аналогично старому "WHAM" (см. прошлый выпуск "РЕВЮ"), используется хорошо зарекомендовавший себя прием вывода каталога диска при нажатии ENTER в момент запроса имени без ввода последнего (строки с 2300).

При загрузке и записи предусмотрен перехват ошибок TR-DOS. Это строки 1930, 1935 - для загрузки и 2050, 2060 - для записи. Вывод сообщения об ошибке TR-DOS происходит в строках с 2400. Для краткости выводится только код ошибки, без его расшифровки. В последней, как правило, не бывает необходимости.

Усовершенствования, введенные в программу, касаются не только Бейсик-файла. Многие изменения произведены в блоке кодов. При их рассмотрении будут даны "выдержки" из блока кодов и прокомментированы изменения. Для расположения дополнительных блоков кодов использовано свободное место с адреса 54620 (D55CH).

Блок кодов. Старт программы>1. Рассмотрим подробнее (при помощи MONS) блок кодов, начиная с адреса его старта 50000 - см. Листинг_3

ниже.

Особый интерес представляет адрес C503H. Здесь выполняется подпрограмма сканирования клавиатуры C3CAH. Подпрограмма выполняется до тех пор, пока не будет зафиксировано нажатие на клавишу. В этом случае произойдет возврат из неё на адрес C506H, где начинается анализ нажатой клавиши. В том случае, если это клавиши 1.4, или 7, произойдет завершение подпрограммы и выход в Бейсик. Если это клавиша 5, то переход на адрес C527H. Это стартовый адрес подпрограммы SET TEMPO - установка скорости воспроизведения мелодии. Если нажата клавиша 6, то произойдет переход на адрес C783H. Это стартовый адрес режима EDIT MODE - переход в режим редактирования. После завершения анализа (адрес C524H) программа зацикливается, возвращаясь на опрос клавишей с адреса С503Н. Таким образом, анализируя программу с её стартового адреса мы выделили основной цикл опроса клавишей и вышли на стартовые адреса процедур SET TEMPO и EDIT MODE.

Листинг_3. Стартовый блок "WHAM+AY"

C350

C314C4

JP

#C414

C414

CD18C9

CALL

#C918

C417

CD1FBE

CALL

#BE1F

C41A

C300C5

JP

#C500

C500

CDB9BD

CALL

#BDB9 ;

Очистка экрана, установка цветов экрана, бордюра и т.д.

C503

CDCAC3

CALL

#C3CA

Опрос

C506

CDADBD

CALL

#BDAD

клавиатуры.

C509

3EFE

LD

A, #FE

C50B

B9

CP

C ;

Если нажата клавиша 1,

C50C

C8

RET

Z

то возврат в Бейсик.

C50D

3D

DEC

A ;

C50E

B9

CP

C ;

Если нажата клавиша 2,

C50F

C8

RET

Z

то возврат в Бейсик.

C510

3D

DEC

A ;

C511

B9

CP

C ;

Если нажата клавиша 3,

C512

C8

RET

Z

то возврат в Бейсик.

C513

3D

DEC

A ;

C514

B9

CP

C ;

Если нажата клавиша 4,

C515

C8

RET

Z

то возврат в Бейсик.

C516

3EC3

LD

A, #C3

C518

B9

CP

C ;

Если нажата клавиша 6,

C519

CA27C5

JP

Z,#C52 7

то переход на SET TEMPO.

C51C

3C

INC

A ;

C51D

B9

CP

C ;

Если нажата клавиша 6,

C51E

CA83C7

JP

Z,#C7 83

то переход на EDIT MODE.

C521

3C

INC

A ;

C522

B9

CP

C ;

Если нажата клавиша 7,

C523

C8

RET

Z

то возврат в Бейсик.

C524

C303C5

JP

#C503 ;

Зацикливание на опрос клавиатуры

Прорисовка клавиатуры.

При старте "WHAM+AY", первое, что бросается в глаза, это титульное меню, похожее на то, которое было в "WHAM", но только без клавиатуры в нижней части экрана. Из-за этого экран выглядит каким-то "куцым".

В кодовый блок, выполняемый при старте программы, можно ввести процедуру, "рисующую" клавиатуру в нижней части экрана.

Вывод на экран клавиатуры может быть выполнен при помощи печати строки UDG-символов, изображающих клавиши. Вы можете напечатать клавиатуру из Бейсика такой командой:

PRINT AT 19,0;"_"; #0; AT 3,0; AT

0,0;"KMLKMMLKMLKMMLKMLKMMLKMLKMMLKMLKKMLKMMLKMLKMMLKMLKMMLKMLKMMLKMLKIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ": PAUSE 0

В новом варианте вместо подпрограммы BDB9H по адресу С500Н (см. Листинг_3) выполняется новая подпрограмма D55CH, "печатающая" клавиатуру. Для этого сделаем такое изменение: C500 CD5CD5 CALL #D55C ;и далее, см. Листинг_4.

Новый блок D55CH - машиннокодовый аналог Бейсик-процедуры "рисования" клавиатуры символами UDG, которая представлена слева. Сама строка UDG-символов расположена в памяти с адреса D58AH и имеет длину 134 байта. Вот её шестнадцатеричный дамп: D5 8AH:

160300160000 9A9C9B9A9C9C9B9A9C9B9A9C9C9B9A9C9B9A9C9C9B9A9C9B9A9C9C9B9A9C9B9A9A9C9B9A9 C9C9B9A9C9B9A9C9C9B9A9C9B9A9C9C9B9A9C9B9A9C9C9B9A9C9B9A98 98 98 98 98 98 98 98 98 98 98 98 98 98 98

9898989898989898989898989898989898999999999999999999999999999999999999999999999999999 9999999999999

Листинг_4. Прорисовка клавиатуры

D55C

CDB9BD

CALL

#BDB9 ;

Выполнение прежней подпрограммы

D55F

3E02

LD

A, #02

Открытие канала экрана.

D561

CD0116

CALL

#1601 ;

D564

3E16

LD

A, #16

Печать: AT

D566

D7

RST

#10 ;

D567

3E13

LD

A, #13

Печать: 19

D569

D7

RST

#10 ;

D5 6A

3E00

LD

A, #00

Печать: 0

D5 6C

D7

RST

#10 ;

D56D

3E11

LD

A, #11

Печать: PAPER

D56F

D7

RST

#10 ;

D570

3E04

LD

A, #04

Печать: 4

D572

D7

RST

#10 ;

D573

0620

LD

B, #20

20 повторений

D575

3E5F

LD

A, #5F

Печать: "_"

D577

D7

RST

#10 ;

D578

10FB

DJNZ

#D575 ;

D57A

3E01

LD

A, #01

Открытие канала клавиатуры -

D57C

CD0116

CALL

#1601 ;

печать в нижних строках экрана.

D57F

118AD5

LD

DE,#D5 8A

Начало печатаемой строки текста

D582

018600

LD

BC,#0086

Длина строки текста.

D585

CD3C20

CALL

#203C ;

Печать строки текста.

D588

C9

RET

;

Режим редактирования.

Рассмотрим теперь более детально основной режим работы - EDIT MODE - режим редактирования - см. Листинг_5. Его адрес, как Вы помните, определен из Листинга_3 (стартовый блок).

Из Листинга_5 определяются практически все процедуры и подпрограммы, в которые можно попасть из режима редактирования. Эта информация является ключевой для внесения изменений и усовершенствований.

Листинг_5.

Режим редактирования EDIT MODE

C783

2160EA

LD

HL,#EA60

Подготовка исходных параметров

C786

112FC2

LD

DE,#C22F

для инициализации счетчиков нот

C789

01E803

LD

BC,#03E8

(для 4-х каналов - см. далее)

C7 8C

CDA6C7

CALL

#C7A6

Инициализация счетчиков нот -

C78F

CDA6C7

CALL

#C7A6

- эта процедура последовательно

C792

CDA6C7

CALL

#C7A6

повторяется для всех

C795

CDA6C7

CALL

#C7A6

четырех каналов.

C798

CD18C9

CALL

#C918 ;

Прорисовка верхней части экрана

C79B

0E01

LD

C, #01

Проводить вертикальную линию.

C7 9D

CD3EC6

CALL

#C63E ;

Прорисовка 1 шага нотных линеек

и вертикальной линии.

C7A0

CD1BC6

CALL

#C61B ;

Скроллинг на 1 шаг влево.

C7A3

C378C3

JP

#C378 ;

На осн. цикл опроса клавишей.

C378

CDD1C7

CALL

#C7D1 ;

Прорисовка нижней части экрана.

C37B

CD01C8

CALL

#C801 ;

Прорисовка огибающих 3-х каналов

C37E

AF

XOR

A ;

C37F

CD94C0

CALL

#C094 ;

Прорисовка индикатора уровня.

C382

CDCAC3

CALL

#C3CA

Опрос клавиатуры.

C385

79

LD

A, C

C386

FEFF

CP

#FF ;

Если клавиша не нажата,

C388

28F1

JR

Z,#C37B

то зацикливание.

C38A

FEFA

CP

#FA

Если нажаты кл. 1...4 то переход

C38C

3044

JR

NC,#C3D2

на процедуру изменения октавы.

C38E

FEBE

CP

#BE ;

Если нажата другая клавиша,

C390

3048

JR

NC,#C3DA

то переход на дальнейший анализ.

C3D2 D6FA SUB #FA ;Изменение октавы

C3D4 3248C1 LD (#C148),A,^ зацикливание

C3D7

C37BC3

JP

#C37B

на опрос клавиатуры.

C3DA

FEC8

CP

#C8

Если нажата клавиша Т то переход

C3DC

CAC8C4

JP

Z,#C4C8

на изменение текущего канала.

C3DF

FEBE

CP

#BE

Если нажата клавиша P то переход

C3E1

CAC1C3

JP

Z,#C3C1

вперед на 1 ноту.

C3E4

FEBF

CP

#BF

Если нажата клавиша O то переход

C3E6

CA1DC4

JP

Z,#C41D

быстро вперед на 1 ноту.

C3E9

FEE6

CP

#E6

Если нажата клав. DEL то переход

C3EB

CAB8C6

JP

Z,#C6B8

назад на 1 ноту.

C3EE

FEC7

CP

#C7

Если нажата TR. VIDEO то переход

C3F0

CAB8C6

JP

Z,#C6B8

быстро назад на 1 ноту.

C3F3

FED2

CP

#D2

Если нажата клавиша R то переход

C3F5

CA83C7

JP

Z,#C7 83

на начало мелодии.

C3F8

FEC5

CP

#C5

Если нажата клавиша 7 то переход

C3FA

CA31C4

JP

Z,#C4 31

на удаление мелодии.

C3FD

FEDC

CP

#DC

Если нажата клавиша Q то переход

C3FF

CAD7C4

JP

Z,#C4D7

на воспроизведение мелодии.

C4 02

FEC3

CP

#C3

Если нажата клавиша 5 то переход

C404

CAEBC4

JP

Z,#C4EB

на изменение цвета бордюра.

C407

FED1

CP

#D1

Если нажата клавиша W то переход

C4 0 9

CA54C4

JP

Z,#C4 54

на установку "петли" в канале.

C4 0C

FECD

CP

#CD

Если нажата EXT.MODE, то возврат

C40E

C8

RET

Z

в Бейсик.

C40F

FEC4

CP

#C4

Если нажата другая клавиша, то

C411

C278C3

JP

NZ,#C37 8

зацикливание на опрос клавиатуры

C414

CD18C9

CALL

#C918

C417

CD1FBE

CALL

#BE1F

C41A

C300C5

JP

#C500

Зацикливание см. Листинг_3. Листинг_6. Формирование нотоносцев

C61B

210040

LD

HL,#4000

Эта процедура производит

C61E

11FE3F

LD

DE,#3FFE

скроллинг влево на 1 ноту (два

C621

010010

LD

bc,#1000

знакоместа), обеспечивая переход

C624

EDB0

LDIR

вперед на 1 шаг.

C626

2A2FC2

LD

HL, (#C22F) ;B HL - показания счетчика

текущего адреса.

C62 9

115FEA

LD

DE,#EA5F

B DE - 59999 - точка отсчета.

C62C

ED52

SBC

HL, DE

Теперь в HL - количество нот.

C62E

0E00

LD

C, #00

Нулевое значение регистра С соответствует "вертикальную линию не проводить".

C630

CB1D

RR

L

При помощи тройного сдвига впра-

C632

380A

JR

C,#C63E

во проверяется, делится ли число

C634

CB1D

RR

L

нот на 8. Если нет (есть младшие

C636

3806

JR

C,#C63E

биты), то переход на процедуру

C638

CB1D

RR

L

прорисовки нотных линеек. Иначе

C63A

3802

JR

C,#C63E

в регистре С задается 1, что оз-

C63C

0E01

LD

C, #01

начает "надо проводить вертикальную

линию". Далее - прямой проход на процедуру прорисовки нотных линеек.

Процедура прорисовки нотных линеек

C63E

211E40

LD

HL,#4 01E

C641

111F00

LD

DE,#001F

C644

0680

LD

B, #80

C646

AF

XOR

A

C647

77

LD

(HL),A

C648

23

INC

HL

C649

79

LD

A, C

C64A

77

LD

(HL),A

C64B

AF

XOR

A

C64C

19

ADD

HL, DE

C64D

10F8

DJNZ

#C647

C64F

21BF48

LD

HL,#4 8BF

Адрес в дисплейном файле, соответствующий нижней линии нижнего нотоносца.

C652

3D

DEC

A

C653

0605

LD

B, #05

Цикл для 5 нотных линий.

C655

77

LD

(HL),A

C656

2B

DEC

HL

Переход к предыдущей линии.

C657

77

LD

(HL),A

C658

ED52

SBC

HL, DE

C65A

10F9

DJNZ

#C655

C65C

21FF40

LD

HL,#4 0FF

Адрес в дисплейном файле, соответствующий нижней линии верхнего нотоносца.

C65F

0605

LD

B, #05

Цикл для 5 нотных линий.

C661

77

LD

(HL),A

C662

2B

DEC

HL

Переход к предыдущей линии.

C663

77

LD

(HL),A

C664

ED52

SBC

HL, DE

C666

10F9

DJNZ

#C661

C668

C9

RET

Счетчики нот.

Начиная с адреса С783Н (см. Листинг_5) в регистрах задается: HL=60000; DE=49711; BC=1000. Область памяти с 49711 длиной 16 байт копирует содержимое счетчиков каналов - с адреса 64000 (см. выше раскладку мелодии в области редактирования). При помощи подпрограммы С7А6Н, вызываемой 4 раза, происходит инициализация счетчиков текущего адреса - для всех четырех каналов происходит установка на начало мелодии. Благодаря инициализации при переходе из титульного меню в режим редактирования мы оказываемся каждый раз в начале мелодии. Практика показала, что это неудобно. Представьте себе, что набирается длинная мелодия, при этом периодически приходится сохранять результаты своего труда при помощи SAVE из титульного меню. Возвращаясь же в режим редактирования (клавиша 6) мы оказываемся опять в начале мелодии и приходится долго "прокручивать" ее, пока вновь не окажемся на требуем месте в конце мелодии. Поэтому точка входа в режим EDIT MODE изменена: теперь это С798Н - режим редактирования начинается как бы не с начала, исключается инициализация счетчиков нот (см. Листинг_5), поэтому войдя в режим редактирования, мы оказываемся на том же месте, из которого перешли в титульное меню. Для реализации этого надо изменить всего одну команду в Листинге_3: C51E CA83C7 JP Z,#C7 98

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

Теперь ещё о некоторых усовершенствованиях.

Тактирование.

Другим неудобством, как показала практика, является то, что вертикальные полосы, ведущие тактирование мелодии, отсчитывают каждые 8 нот. И только так. Поэтому практически невозможно, не сбившись, набрать мелодию, скажем, в вальсовом ритме, где тактирование кратно трем - желательно было бы, чтобы вертикальные линии отмечали, скажем, каждые 6 нот. Поэтому рассмотрим теперь процедуру, формирующую нотоносцы: нотные линейки и вертикальную линию, отмечающую такты (см. Листинг_6 выше).

Изменениям подвергся блок кодов, производящий деление на 8. В новом варианте деление заменено вычитанием. Теперь область с адреса С626Н выглядит так:

C626

2A2FC2

LD

HL,(#C22F)

C629

ED5B31C2

LD

DE, (#C231)

C62D

1B

DEC

DE

C62E

1B

DEC

DE

C62F

0E01

LD

C, #01

C631

B7

OR

A

C632

ED52

SBC

HL, DE

C634

2808

JR

Z,#C63E

C636

110800

LD

DE,0008

C639

30F6

JR

NC,#C631

C63B

0E00

LD

C, #00

C63D

00

NOP

C63E

Вычитание числа, заданного в DE (для примера это 8) производится до тех пор, пока не произойдет обнуление (или переполнение) счетчика нот HL. При вычитании происходит анализ остатка в HL. Если остаток равен нулю, то это означает, что деление выполнено без остатка и нужно проводить вертикальную линию. Если же переполнение есть, а нуля в HL не зафиксировано, значит при делении есть остаток, то есть число нот не кратно содержимому DE, значит вертикальную линию проводить не надо - в регистр С заносится ноль.

Самое замечательное в новой процедуре то, что числовой параметр, для которого проверяется кратность, занесен в регистр DE. Меняя это число из Бейсика при помощи POKE, можно задавать любое тактирование: кратное трем, четырем, пяти и т.д. - как угодно. Это выполняет строка 3598 в Бейсике (Листинг_2).

Установка счетчиков нот.

Другим важным усовершенствованием, вытекающим из информации о хранении текущих адресов каналов, является возможность произвольно задавать адрес для того, чтобы мгновенно оказаться в заданном месте мелодии, избегая утомительной "прокрутки" ее.

Текущее значение счетчиков нот хранится в ячейках 49711, 49715, 49719 и 49723. Поэтому, если при помощи POKE заносить в эти ячейки числа, вводимые по запросу, то можно сразу при входе в режим редактирования оказываться в заданном месте. Необходимые расчеты с учетом заданной величины затакта производятся строками с 4700 (см. Листинг_2).

Нотные ключи.

Другим усовершенствованием является прорисовка нотных ключей при входе в режим редактирования. Причем ключ на нижнем нотоносце можно переключать: басовый или скрипичный. В соответствии с этим будет происходить и прорисовка линеек на нижнем нотоносце: в зависимости от нотного ключа со смещением на одну линию. Измененный блок будет выглядеть так (сравните с Листингом_5):

C798

CD18C9

CALL

#C918

C79B

00

NOP

C79C

00

NOP

C7 9D

CD1BC6

CALL

#C61B

C7A0

CD12D6

CALL

#D612

C7A3

C378C3

JP

#C378

По адресу С7А0Н выполняется новая подпрограмма D612H. Это вывод на экран нотных ключей. Новая процедура печати размещена с адреса D612 по D63AH включительно (см. Листинг_7). Принцип - тот же, что и при выводе на экран клавиатуры - печать строки текста. Однако, если при "печати" клавиатуры можно было воспользоваться готовыми UDG-символами, то элементы, из которых состоят нотные ключи скомпонованы в специальный блок. То есть в памяти находится как бы часть специального символьного набора, переключившись на который, можно выполнить печать, а затем вернуться к прежнему символьному набору. Для обеспечения печати нотных ключей понадобилось 23 символа (начиная с пробела и кончая символом "5") по 8 байт на каждый символ -получилось 176 байт. Макетирование нотных ключей и формирование элементов дополнительного символьного набора было произведено при помощи программы "ARTSTUDIO". Дополнительный "символьный набор" -расположен следом за процедурой печати 6D12H - с адреса D63BH по адрес D6EAH включительно. А сами строки символов, при помощи которых происходит печать нотных ключей - с адреса D6FBH.

Листинг_7.

Печать нотных ключей

D612

11FBD6

LD

DE,#D 6FB

; Начало строки, печатающей

;басовый нижний ключ.

D615

012200

LD

BC,#0022

;Длина строки.

D618

1806

JR

#D62 0

; Переход на печать верхнего ключа

D61A

111DD7

LD

DE,#D71D

; Начало строки, печатающей

;скрипичный нижний ключ.

D61D

012700

LD

BC,#0027

;Длина строки.

D620

2A365C

LD

HL,(#5C3

6) ; Сохранение прежнего значения

D623

E5

PUSH

HL

;CHARS на стеке.

D624

213BD5

LD

HL,#D53B

;Установка нового

D627

22365C

LD

(#5C36),:

HL ;значения CHARS.

D62A

CD3C20

CALL

#203C

; Печать строки символов - ключа.

D62D

1144D7

LD

DE,#D7 4 4

; Начало строки, печатающей

;скрипичный верхний ключ.

D630

012F00

LD

BC,#002F

;Длина строки.

D633

CD3C20

CALL

#203C

;Печать верхнего нотного ключа.

D636

E1

POP

HL

;Восстановление прежнего

D637

22365C

LD

(#5C36),:

HL ;значения CHARS.

D63A

C9

RET

;

Процедура печати нотных ключей имеет две точки входа: D612H и D61A, соответственно происходит печать нижнего басового ключа и верхнего скрипичного или нижнего и верхнего скрипичных ключей. В зависимости от того, какой должен быть нижний нотный ключ, Бейсик-строки 3800 или 3810 произведут при помощи POKE изменения в кодовых блоках, подставляя по адресу С7А0Н соответственно или CALL #D612, или CALL #D61A.

Дамп дополнительного символьного набора:

D63B I 00 00 00 00 00 00 00 00 D643 I FF 00 00 00 00 00 00 00

2C

Q П

80

4C

Q П

80

4C

Q П

80

4C

Q П

80

4C

Q П

80

58

78

70

70

60

83

83

87

86

8E

C0

40

40

40

40

BB

BB

B7

B7

B6

FC

FC

4E

46

46

93

99

88

84

83

44

44

48

50

E0

86

8F

8F

8E

87

40

40

40

80

00

06 Q П

0F

Q П

0F

Q П

0E

Q П

07

Q П

80 88

80 90

80 90

80 9E

80 9F

E0

Q П

60 Q П

76

Q П

76

Q П

70

Q П

80 70

80 70

80 66

80 66

80 60

80

81

81

83

82

80

80

00

00

00

90

A0

80

80

80

Дамп строк символов, печатающих нотные ключи: Нижний басовый ключ:

D6FBH

10

00

11

07

(34 байта)

16

09

1C

2F

30

16

0A

1C

31

32

16

0B

1C

33

34

16

0C

1C

35

21

16

0D

1C

21

21

16

0E

1C

20

20

Нижний скрипичный ключ:

D71DH

10

00

11

07

(39 байт)

16

08

1C

2E

20

16

09

1C

2E

22

16

0A

1C

23

24

16

0B

1C

25

26

16

0C

1C

27

28

16

0D

1C

29

2A

16

0E

1C

2D

2C

Верхний скрипичный ключ:

D744H

16

00

1D

20

(47 байт)

16

01

1D

20

16

02

1C

20

22

16

03

1C

23

24

16

04

1C

25

26

16

05

1C

27

28

16

06

1C

29

2A

16

07

1C

2B

2C

16

08

1C

2E

20

16

0F

1D

20

Формирование нотоносцев.

Кроме того, что при переключении нотных ключей происходит вызов разных процедур для печати самих ключей (D612H или D61AH), необходимо в процедуру, рисующую нотные линейки нижнего нотоносца внести изменения для обеспечения смещения на 1 линию в зависимости от нижнего нотного ключа. Для этого в числовой параметр, задающий базовый адрес для изображения нижнего нотоносца (см. Листинг_6) вносится корректировка. Для скрипичного нижнего ключа должно быть: C64F 21DF48 LD HL,#48DF

Адрес, задаваемый в HL, больше прежнего на 32 байта - именно столько нужно для того, чтобы получить печать со смещением на одну строку.

Параметр в команде по адресу C64FH меняется при помощи Бейсик-строк 3800 или 3810 в зависимости от типа нотного ключа.

Сохранение мелодии в памяти.

Изначально "WHAM+AY" не предназначен для хранения в памяти (в рамках ОЗУ 48Кб) мелодии. Однако все-таки есть возможность сохранения в памяти хотя бы одной мелодии. Вспомните о том, что при отладке много места занимает MONS4. Но при обычной работе "WHAM+AY" его там не будет. Так что область памяти с 41000 до 48000 остается свободной и на этом месте вполне можно организовать буфер для промежуточного временного сохранения одной мелодии. Для реализации этого добавлены новые блоки кодов, выполняющие переброски кодов:

D64B

00

10

28

D653

FF

80

80

D65B

FF

5C

58

D663

FF

80

81

D66B

FF

E0

C0

D673

FF

9C

99

D67B

FF

E0

F8

D683

FF

B6

B3

D68B

FF

46

46

D693

FF

80

80

D69B

FF

40

40

D6A3

FF

00

00

D6AB

80

80

80

D6B3

FF

87

8C

D6BB

FF

80

C0

D6C3

FF

9F

8E

D6CB

FF

70

70

D6D3

FF

80

80

D6DB

FF

C0

C0

D6E3

FF

84

88

1. SAVE - сохранение мелодии в буфере - переброска блока кодов из области редактирования 60000 в буфер по адресу 43520.

2. LOAD - восстановление мелодии - переброска блока кодов из буфера 43520 в область редактирования

60000.

3. EXCHANGE - обмен содержимого буфера и области редактирования с сохранением обоих. Новые блоки кодов показаны в Листинге_8.

Вызов этих процедур происходит из Бейсика строками с 4800.

Листинг_8. Сохранение мелодии в памяти

D7A0

1100AA

LD

DE,#AA0 0

D7A3

2160EA

LD

HL,#EA60

Процедура обмена

D7A6

0611

LD

B, #11

содержимого буфера 43520

D7A8

C5

PUSH

BC

и области редактирования

D7A9

0600

LD

b, #00

60000 между собой

D7AB

7E

LD

A,(HL)

с сохранением

D7AC

F5

PUSH

AF

содержимого обоих

D7AD

1A

LD

A,(DE)

кодовых массивов.

D7AE

77

LD

(HL),A

Эта процедура построена

D7AF

F1

POP

AF

по аналогии с

D7B0

12

LD

(DE),A

процедурой < 2 7 из

D7B1

23

INC

HL

известного пакета

D7B2

13

INC

DE

"SUPERCODE", которая

D7B3

10F6

DJNZ

#D7AB

была подробно

D7B5

C1

POP

BC

рассмотрена в "ZX-РЕВЮ"

D7B6

10F0

DJNZ

#D7A8

< 1-2 1993г. стр. 2.

D7B8

C9

RET

D7B9

2160EA

LD

HL,

#EA60

;Процедура сохранения

D7BC

1100AA

LD

DE,

#aa0 0

;мелодии в буфере.

D7BF

010011

LD

BC,

#1100

D7C2

EDB0

LDIR

D7C4

C9

RET

D7C5

2100AA

LD

HL,

#aa0 0

; Процедура загрузки

D7C8

1160EA

LD

DE,

#EA60

;мелодии из буфера.

D7CB

010011

LD

BC,

#1100

D7CE

EDB0

LDIR

D7D0

C9

RET

Регулировка темпа.

Как показала практика, диапазон регулирования темпа воспроизведения в "WHAM+AY" недостаточен для того, чтобы можно было набрать медленную плавную мелодию. Поэтому изменения были внесены и в подпрограмму регулировки темпа SET TEMPO, адрес которой был определен из Листинга_3. Исходный вариант этой процедуры приведен в Листинге_9.

Листинг_9. Регулировка темпа

C527 ... ... ...

C540

213FC2

LD

HL,#C23F

Ячейка, в которой задается темп.

C543

7E

LD

A,(HL)

Теперь это значение в А.

C544

D6DC

SUB

#DC ;

В А - величина, пропорционально темпу

C546

47

LD

B, A

Организация цикла печати пробелов.

C547

0E20

LD

C, #20

Подготовка к печати "пробела".

C549

3E16

LD

A, #16

Печать

C54B

D7

RST

#10 ;

AT;

C54C

3E12

LD

A, #12

Печать

C54E

D7

RST

#10 ;

18;

C54F

AF

XOR

A ;

Печать

C550

D7

RST

#10 ;

0;

C551

79

LD

A, C

Печать

C552

D7

RST

#10 ;

"линии" из пробелов

C553

10FC

DJNZ

#C551 ;

в цикле.

C555

CDD9C8

CALL

#C8D9 ;

C558

3E03

LD

A, #03

C55A

CD2 6BD

CALL

#BD2 6

C55D

E5

PUSH

HL ;

C55E

CDCAC3

CALL

#C3CA

Сканирование клавиатуры.

C561

E1

POP

HL ;

C562

FE04

CP

#04 ;

Если нажата клавиша 5, то

C564

2815

JR

Z,#C57B

переход на уменьшение темпа.

C566

FE13

CP

#13 ;

Если нажата клавиша 8, то

C568

2806

JR

Z,#C57 0

переход на увеличение темпа.

C5 6A

CDADBD

CALL

#BDAD

Если нажата иная клавиша, то

C56D

C378C3

JP

#C378 ;

переход в режим редактирования

C570

7E

LD

A,(HL)

В А - значение темпа.

C571

FEFB

CP

#FB ;

Проверка на максимум.

C573

2 8CE

JR

Z,#C54 3

Если он достигнут, то возврат.

C575

34

INC

(HL)

Иначе - увеличение на 1.

C576

CD86C5

CALL

#C586

Задержка.

C579

18C8

JR

#C543 ;

C57B

7E

LD

A,(HL)

В А - значение темпа.

C57C

FEDD

CP

#DD ;

Проверка на минимум.

C57E

2 8C3

JR

Z,#C543

Если он достигнут, то

возврат

C580

35

DEC

(HL)

Иначе - уменьшение на

1.

C581

CD86C5

CALL

#C586

Задержка.

C584

18BD

JR

#C543 ;

C586

015802

LD

BC,#0258

; Эта процедура

C589

10FE

DJNZ

#C589

; обеспечивает задержку

C58B

0D

DEC

C

; при обработке

C58C

20FB

JR

NZ,#C589

;нажатия клавишей.

C58E

C9

RET

;

В результате внесенных изменений диапазон регулировки темпа был расширен вдвое (в сторону более медленного воспроизведения). При этом дискретность регулировки составляет не 1, как раньше, а 2. Как показала практическая работа, более "грубая" дискретность нисколько не ухудшила работу редактора. Ниже приводится новый блок кодов SET TEMPO - изменения внесены с адреса С540Н:

C540

213FC2

LD

HL,#C23F

C543

CB86

RES

0,(HL)

C545

7E

LD

A,(HL)

C546

CB3F

SRL

A

C548

D65E

SUB

#5E

C54A

47

LD

B, A

C54B

0E20

LD

C, #20

C54D

3E16

LD

A, #16

C54F

D7

RST

#10

C550

3E12

LD

A, #12

C552

D7

RST

#10

C553

AF

XOR

A

C554

D7

RST

#10

C555

79

LD

A, C

C556

D7

RST

#10

C557

10FC

DJNZ

#C555

C559

CDD9C8

CALL

#C8D9

C55C

3E03

LD

A, #03

C55E

CD2 6BD

CALL

#BD2 6

C561

E5

PUSH

HL

C562

CDCAC3

CALL

#C3CA

C565

E1

POP

HL

C566

FE04

CP

#04

C568

2813

JR

Z,#C57D

C5 6A

FE13

CP

#13

C5 6C

2806

JR

Z,#C57 4

C56E

CDADBD

CALL

#BDAD

C571

C378C3

JP

#C378

C574

7E

LD

A,(HL)

C575

FEFC

CP

#FC

C577

2 8CC

JR

Z,#C54 5

C579

34

INC

(HL)

C57A

34

INC

(HL)

C57B

1807

JR

#C584

C57D

7E

LD

A,(HL)

C57E

FEBE

CP

#BE

C580

2 8C3

JR

Z,#C54 5

C582

35

DEC

(HL)

C583

35

DEC

(HL)

C584

01B002

LD

BC,#02B0

C587

10FE

DJNZ

#C587

C589

0D

DEC

C

C58A

20FB

JR

NZ,#C5 87

C58C

18B5

JR

#C543

Теперь темп задается только четными числами. Но не нарушается и работа с записанными ранее мелодиями, где темп может быть задан и нечетным числом: просто не учитывается младший бит.

Рекомпиляция.

Компиляция в новом "WHAM+AY" выполняется несколько иначе, чем в старом "WHAM". Теперь, как уже говорилось, блок кодов не является релоцируемым. Поэтому процесс компиляции значительно упрощен (к сожалению, в ущерб возможностям для пользователя): не надо рассчитывать новые адреса переходов в зависимости от адреса загрузки. Происходит пара перебросок - и на этом процесс компиляции завершается. Компилирующая процедура запускается в строке 3970 и имеет вид:

53550:

2160D1

LD

HL,53600

1100FA

LD

DE,64000

010004

LD

BC,01064

EDB0

LDIR

C303FA

JP

64003

64003:

2113C2

LD

HL, 4 9683

1112FA

LD

DE,64018

012C01

LD

BC,00300

EDB0

LDIR

C9

RET

При введении в программу возможности рекомпиляции, была составлена противоположная процедура. Она размещена по адресу 55250 (D7D2H).

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

Процедура рекомпиляции:

55250: 2100FA

LD

HL,64000

1160D1

LD

DE,53600

010004

LD

BC,01064

EDB0

LDIR

2112FA

LD

HL,64018

1113C2

LD

DE,49683

012C01

LD

BC,00300

EDB0

LDIR

C9

RET

Транспонирование мелодии.

Эта часть программы реализована только при помощи Бейсика, без использования процедур в машинных кодах. Транспонирование выполняется в два этапа: сначала проверка всей мелодии на возможность редактирования, и только после этого собственно изменение кодов. Все происходит аналогично тому, как это было описано в прошлом номере "РЕВЮ". Этим занимается группа строк с 4300.

Некоторые итоги.

Рассмотрим теперь в комплексе те усовершенствования, которые внесены в новый "WHAM+AY". Как уже говорилось раньше, фантастический простор для этого дает расширенный режим при редактировании - EXT.MODE. При нажатии на эту клавишу в нижней части экрана появляется строка-подсказка: что и какими клавишами может быть выполнено. Это осуществляется Бейсик-строкой 530. Нижняя часть экрана выглядит при этом так:

SPACE-return to edit-mode or: Envelope Volume Blank Slide Loop repetitions Tempo trAnsponierung Repeat Counters music-Key Memory

Подчеркнутые символы выделены при помощи режима INV.VIDEO.

Выход из расширенного режима без внесения изменений происходит теперь при помощи клавиши SPACE, а не ENTER, как это было раньше. Такое изменение вызвано тем, что если задержать руку чуть дольше на клавише ENTER, то после возврата из расширенного режима в режим редактирования в самом неподходящем месте мелодии могла образоваться пауза - ведь ENTER в режиме редактирования ставит паузу. Пробел же в режиме редактирования ничего не делает, поэтому с его помощью можно выйти из расширенного режима в режим редактирования абсолютно деликатно.

Режимы: Envelope, Volume, Blank, Slide, Loop, Repeat - оставлены без каких-либо изменений. Режим повторения блока мелодии, который вызывался клавишей Q, теперь закреплен за клавишей Р (rePetitions).

При помощи клавиши Т (Tempo) теперь можно скорректировать скорость воспроизведения мелодии без выхода в титульное меню. При помощи клавиши А можно войти в режим транспонирования мелодии (trAnsponierung). При помощи клавиши С (Counters) - мгновенно переместиться в заданную точку мелодии. Клавишей К (music-Key) переключается нотный ключ на нижнем нотоносце в ходе набора мелодии. А при нажатии клавиши М (Memory) - вызывается новое меню, при помощи которого можно сохранить мелодию в буфере, а также, если она уже была там сохранена, загрузить её в область редактирования или обменять между собой мелодии в буфере и области редактирования.

Входные точки во все эти режимы Вы можете увидеть, анализируя Бейсик-строки 550.. .590.

Дополнено некоторыми новыми функциями и системное меню SYST MENU, вход в которое происходит при нажатии клавиши 3 в титульном меню (строки с 3500). Сюда добавлены новые пункты:

6 LOAD & RECOMPILE

7 TAKTS-PERIOD: 8

При нажатии клавиши 6 происходит запрос имени загружаемого скомпилированного блока кодов для его загрузки и рекомпиляции, а при нажатии клавиши 7 можно изменить период тактирования - прорисовки вертикальной тактирующей линии.

Прочие усовершенствования.

При нажатии нотной клавиши происходит установка ноты на следующем очередном шаге. Это удобно: нажали клавишу - поставили ноту, проиграли её и передвинулись на 1 шаг вперед. Если же ставится спец.эффект при помощи расширенного режима, то надо учесть, что он будет поставлен на предыдущем шаге, поэтому для того, чтобы его "проиграть" (отработать), необходимо вернуться на 1 шаг назад и затем опять продвинуться на 1 шаг вперед. Внесенные изменения устраняют этот недостаток: теперь спецэффект ставится точно так же, как и нота: на следующем по порядку шаге, при этом сразу же происходит его отработка. Изменения внесены в Бейсик-строки 400, 411.417, 510, где учтена разница в одну ноту (в соответствующих местах Вы можете увидеть ... +I или ... -I). Кроме того, при помощи REM "отключена" строка 520 (можно вообще её удалить), не позволявшая ставить спецэффект в начале мелодии.

Удобно также оказалось внести коррективы в сохраняемую мелодию: теперь в неиспользуемой ячейке 60000 закодирована информация о периоде тактирования и о типе нотного ключа на нижнем нотоносце. При этом сохранена совместимость с прежними записями: если в ячейке 60000 находится ноль, то значит нижний нотный ключ - басовый и период тактирования равен 8 - как в исходном варианте "WHAM+AY". В новом же варианте старший бит ячейки 60000 отвечает за тип нотного ключа: если он равен 0, то басовый, если 1 - то скрипичный. Младшие 7 битов определяют период тактирования. При загрузке и записи выполняются подпрограммы GO SUB 30 и GO SUB 40, которые оперируют с ячейкой 60000.

И в заключение, о взаимодействии Бейсика и машинных кодов в расширенном режиме (EXT.MODE). В исходном варианте "WHAM+AY" оно было организовано по следующей схеме. При нажатии клавиши EXT.MODE происходит возврат в Бейсик в точку вызова - строку 1010. Далее через строку 1021 происходит переход в расширенный режим (строки с 500). После отработки команды расширенного режима должен быть опять вызван кодовый блок, но не как раньше, со стартового адреса 50000, а через новую точку входа: адрес 50008. Эту функцию выполняет группа строк с 990, обеспечивая возврат "на то же место", откуда произошел вход в расширенный режим. При введении усовершенствований аналогично строкам с 990 организовано ещё несколько новых точек входа, каждая из которых выполняет различные действия. Это строки 960, 970 и 980.

Строка 960 обеспечивает возврат в режим редактирования без очистки экрана с "проигрыванием" одной ноты (или спец.эффекта) и передвижением вперед на один шаг.

Строка 970 - вход в режим редактирования с очисткой экрана и вызовом подпрограммы изображения нотных

ключей.

Строка 980 - вход в режим регулирования скорости воспроизведения, аналогично тому, как это выполняется при нажатии клавиши 5 в титульном меню.

Строка 990 - как и раньше, возврат в режим редактирования без каких-либо изменений.

* * *




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Ремонт - ZX Spectrum/Pentagon найтроска и ремонт.
Beatles - Эта песня пеpвоначально была помещена на обоpотную стоpону "соpокопятки" с песней "Элиноp Pигби" (август 1966 г).
Реклама - Реклама и объявления.
Разборки - прохождение квестовой игры Seaquest.
Байки из склепа - PLANET ENLIGHT'97.

В этот день...   20 апреля