Развивая музыкальную тему, мы предлагаем сегодня вниманию читателей статью о музыкальном редакторе "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 ШШШ
ИИ
В верхней части экрана Вы видите нотный стан - здесь все идентично старому "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
Вверху показаны исходные огибающие, слева, в большом окне - в увеличенном виде дана редактируемая огибающая. Она разделена на 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
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
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
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
O: IF INKEY$<>"Y" Verifying..."
VERIFY F$ CODE STR,LEN .1,26: BEEP .1,20: PAUSE 50: RETURN
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
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 - как и раньше, возврат в режим редактирования без каких-либо изменений.
* * *