Радио-86РК/Радио 08-89/Музыкальный редактор

Материал из Emuverse
Версия от 12:25, 3 декабря 2008; Panther (обсуждение | вклад) (http://retro.h1.ru/RK86/Sound/SounEdit.php)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Данный материал защищён авторскими правами!

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

Автор: А. СОРОКИН

Источник: http://retro.h1.ru/RK86/Sound/SounEdit.php

Музыкальный редактор — программа, которая позволяет значительно расширить возможности компьютера. Предлагаемый музыкальный редактор реализует экранный режим работы. С его помощью можно сочинять музыку, проигрывать произведения и автоматически обрабатывать их до получения независимого модуля, написанного как на языке BASIC, так и в машинных кодах. Этот модуль можно использовать затем в любых программах на компьютере «Радио-86РК». Кроме этого, музыкальный редактор может быть использован как одноголосый клавишный музыкальный инструмент.

Для работы редактора необходим таймер К580ИВ53, подключенный по схеме, опубликованной в журнале «Радио». При этом в начале программы переменным А0, А1, А2, A3 нужно присвоить адреса портов таймера, все остальные операции по адаптации выполнит сама программа.

Набрав текст программы музыкального редактора (табл.1), запустим ее по директиве RUN. На экране с левой стороны появится изображение нотного стана, а справа — подсказки для работы. Далее отобразится вертикальная полоса из символов и сообщение «NEW?». Ответом на это сообщение будут «Y» и «N». Ответ «Y» вызовет переход программы в режим записи нот. Поступив иначе, программа будет искать конец нотной записи, которая расположена в памяти, и далее произойдет запрос параметров воспроизведения и исполнение нотной записи.

РЕЖИМ ЗАПИСИ НОТ

После ответа на вопрос «NEW?» — «Y» на экране появится указатель ноты "­ " и вверху надпись "Нота-1 ". Указатель определяет ту ноту, которая будет исполнена или записана. Указатель перемещают клавишами перемещения курсора вверх и вниз. Нажатие на одну из этих клавиш приводит к появлению звука выбранной ноты. Название нот записано в крайней левой колонке. Перемещать указатель ноты можно, нажав на клавишу, напротив которой находится нужная нота (колонка символов справа от нотного стана). После того, как выбрана нужная нота, нажатием на одну из цифровых клавиш «1 — 9» задают длительность. В ответ на ввод длительности компьютер увеличит цифру в указателе номера нот — «Нота — …», что приведет к записи ноты в память и переход к вводу следующей ноты. Указатель «Нота -…» показывает порядковый номер вводимой ноты. Если произошла ошибка, то ее можно исправить нажатием на клавишу "­ " — переход к предыдущей ноте, а затем вернуться, нажав клавишу «®».

Диезы выбирают нажатием на клавишу «АР2», после чего вводят длительность. Паузы задают нажатием на клавишу пробела и также вводят ее длительность нажатием на одну из цифровых клавиш. При этом указатель ноты исчезает.

Если нужно установить конец нотной записи, то нажимают клавишу «F1». Выходят из режима записи нот нажатием на клавишу «F3». В этом случае конец нотной записи устанавливается по максимальному значению указателя «Нота -…».

Таким способом сочинять музыку или «переводить» ее, для проигрывания на компьютере, может совершенно несведущий в нотной грамоте человек. Для перевода музыки на компьютер достаточно указатель ноты поставить в позицию на нотном стане, соответствующей позиции вводимой ноты. Длительность (табл.2) ноты выбирают следующим способом: просматривают весь текст нот для ввода и выбирают ноту с самой маленькой длительностью. Эта нота будет иметь длительность 1, все отличные ноты будут иметь длительность большую, то есть 2, 3, 4… с паузами поступают аналогично.

РЕЖИМ ВВОДА ДИРЕКТИВ

После нажатия на клавишу «F3» компьютер запрашивает параметры для воспроизведения. Возникает слово «Темп?», ответом на запрос должно быть число, равное темпу (темп в ударах в минуту), в котором исполнится запись нот (табл.3).

Таблица 3

ТЕМП ЧИСЛО УДАРОВ МЕТРОНОМА В МИНУТУ
LARGHISSIMO … < — > 40
LARGO 40 < — > 60
LARGHETTO 60 < — > 66
GRAVE 60 < — > 66
LENTO 60 < — > 66
ADAGIO 66 < — > 76
ADAGIETTO 66 < — > 76
ANDANTE 76 < — > 108
ANDANTINO 76 < — > 108
MODERATO 108 < — > 120
ALLEGRETTO 108 < — > 120
ALLEGRO 120 < — > 168
VIVACE 120 < — > 168
PRESTO 168 < — > 208
PRESTISSIMO 280 < — > …

Далее программа запрашивает дополнительную информацию о характере воспроизведения — «STAC. NORM. LEG», то есть STACCATO, NON LEGATO, LEGATO. Ответом будет одна из букв «S», «N», «L». После этого программа проиграет набранную нотную запись. При проигрывании звучащая нота показывается указателем ноты, а в указателе «Нота -…» отобразится ее номер. При проигрывании паузы появляется, код указателем номера ноты, сообщение «Пауза». По окончании исполнения нотной записи в правом верхнем углу отобразится меню директив:

  1. — повторить
  2. — дописать
  3. — исправить
  4. — распечатать
  5. — оттранслировать
  6. — NEW

Выбирают директиву нажатием на клавишу с цифрой, соответствующей данной директиве.

ОПИСАНИЕ ДИРЕКТИВ

1 — ПОВТОРИТЬ

Эта директива приводит к воспроизведению записи нот с новой настройкой параметров.

2 — ДОПИСАТЬ

По этой директиве указатель номера ноты устанавливается на последнюю ноту, а программа переходит в режим записи нот. Указатель ноты установится в позицию, на нотном стане, предыдущей ноты.

3 — ИСПРАВИТЬ

Этой директивой корректируют нотную запись. По ней программа выводит сообщение «С ноты (всего…)?», ответом на него служит номер ноты, которую нужно исправить. Компьютер устанавливает указатель номера ноты на корректируемую ноту, а указатель ноты показывает ее расположение на нотном стане.

4 — РАСПЕЧАТАТЬ

По ней распечатывается нотная запись а виде коэффициентов пересчета и длительности для создания независимого музыкального модуля на языке BASIC. На экране отображается информация:

ПРИМЕР 1 
РАСПЕЧАТКА НОТНОЙ ЗАПИСИ ДЛЯ DATA

 МЛ. БАЙТ  СТ. БАЙТ  ДЛИТ.
      155        16     1 
        0         0     1 
      137         4     2

Распечатанные данные заносят в операторы DATA такого модуля в следующей последовательности: МЛ. БАЙТ, СТ. БАЙТ, ДЛИТ. Нулевые коэффициенты отображают паузу. Музыкальный модуль может выглядеть так:

ПРИМЕР 2 

10 DATA 155,16,1, 0, 0,1,137,4, 2, ...,255 
20 READ G:IF G=255 THEN STOP 
22 REM ЕСЛИ КОЭФФИЦИЕНТ РАВЕН О, ТО ПАУЗА 
25 IF G=0 THEN READ G:POKE A3,&36:GOTO 40 
30 POKE A0,G:READ G: POKE A0,G 
40 READ G: POKE A2,200: PAUSE G*N 
50 GOTO 20

где А0, A2 — адреса портов таймера, а N — коэффициент, задающий темп. Перед созданием модуля смотрите текст музыкального редактора директивой NEW, предварительно записав информацию для DATA, а потом наберите данную программу. (Подробнее в «Радио»).

Нотную запись можно распечатать в виде частот и длительностей. Для этого режим 4 переделывают так:

ПРИМЕР 3

1480 PRINT"ЧACTOTA ДЛИТЕЛЬНОСТЬ" 
1498 REM ПЕРЕВОД КОЭФФИЦИЕНТОВ В ЧАСТОТУ
1500 T=1777778/(PEEK(BS+X)+PEEK(BS+X+1)*256)
1501 REM ОКРУГЛЕНИЕ ЗНАЧЕНИЯ ЧАСТОТЫ 
1505 TT=INT(T):IF T-INT(T)>0.5 THEN TT=INT(T)+1 
1507 PRINT TT,PEEK(BS+X+2)

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

5 — ОТТРАНСЛИРОВАТЬ

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

СВОБОДНАЯ ОБЛАСТЬ С ... ПО 75FFH
НАЧАЛЬНЫЙ АДРЕС ДЛЯ ТРАНСЛЯЦИИ (ЧЕРЕЗ &)?

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

BASIC 0Н ... 2200Н
ТЕКСТ МУЗ. РЕДАКТОРА 2200Н ... 3Е00Н
ЗАПИСЬ НОТ НЕ ОТТРАНСЛИР. 4200Н ... ВЫДАННЫЙ АДРЕС В СООБЩЕНИИ

Адрес конца текста программы не точный, но не превышает этого (зависит от плотности текста). Если запись нот не умещается в памяти, то нужно распечатать память в символьном виде в МОНИТОРЕ и изменить адрес не оттранслированной нотной записи в начале программы (переменная — BS).

Через некоторый промежуток времени (в зависимости от длины нотной записи) экран очистится, появится сообщение:

БЛОК ЗАПИСИ НОТ РАСПОЛОЖЕН: 
НАЧАЛЬНЫЙ АДРЕС ... 
КОНЕЧНЫЙ АДРЕС ...

и компьютер перейдет в режим МОНИТОРа.

6-NEW

По этой директиве из памяти стирается старая нотная запись, и музыкальный редактор переводится в режим ввода нот.

Если нажата любая другая клавиша, то управление передается монитору, а на экране возникнет сообщение:

НЕТРАНСЛИРОВАННАЯ ЗАПИСЬ 
НОТ НАХОДИТСЯ:
С АДРЕСА ... 
ПО АДРЕС ...

Нетранслированная нотная запись — запись, которую можно редактировать музыкальным редактором. Ее можно записать по директиве «О» МОНИТОРа, а потом считать с магнитофона директивой «I».

После проигрывания нотной записи ее можно отредактировать. Так как коды музыки не находятся в массивах, то если случайно вышли в МОНИТОР из программы, можно восстановить нотную запись (в отличие, если коды находились в массивах), воспользовавшись пунктами 3, 4 вышеизложенного.

ОПИСАНИЕ ТЕКСТА ПРОГРАММЫ

Программа начинается с присвоения переменным А0, А1, А2, A3 адресов портов таймера К580ИВ53. Если таймер включен по схеме, публиковавшейся в журнале, то адреса будут соответственно А000Н, А001Н, А002Н, А003Н. Далее переменной BS присваивается адрес начала текста нотной записи, с которого он расположен в памяти (4200Н). Затем в строке 640 происходит загрузка таймера управляющими словами. В 670, 680-й строках программы описываются функции FNS (X) и FNM (X). Так как в BASIC числа находятся в десятичной системе, то для записи в память его нужно разбить на два байта, что и делают функции FNM (X)-младший байт от X, FNS (X)- старший байт от X. Описание массивов данных — в 720-й строке. Эти массивы:

  • S (24) — массив старших байтов коэффициентов деления для тонов;
  • М(24) — массив младших байтов коэффициентов деления для тонов;
  • DS (24), DM (24) — массивы соответственно старших и младших байтов коэффициентов деления байтов полутонов;
  • К (24) — массив, содержащий коды клавиш соответствующим нотам.

Строки с 740-й по 980-ю отображают на экране нотный стан и поясняющие записи. Далее, в 1000—1030-й строках происходит заполнение массивов. При заполнении массивов коэффициенты деления берутся из DATA в порядке повышения тона и с помощью ранее описанных функций заносятся в массивы. Массив кодов клавиш заносится из DATA, расположенным в строках 1910, 1920. Если расположение клавиш для перемещения указателя нот не устраивает, то изменив коды клавишв DATA, вы сможете расположить управляющие клавиши по своему вкусу. В строках 130—190 происходит поиск конечного адреса нетранслированный текст нот, содержащегося в ОЗУ. В случае если текста там нет, переменной конца текста — КХ присвоится адрес начала текста и компьютер перейдет в режим записи нот. Если текст есть (ответ на вопрос «NEW?» — «N») — в строках 160, 170 происходит поиск конца текста по маркеру конца — 0FFH. Если же маркер не найден (просматривается область от 4200Н до 6200Н), то компьютер запросит длину, и по этой длине установит маркер конца. Далее происходит проигрывание записи нот.

Режим записи нот реализуется в программе — строками 240—380, в которых находится основной цикл записи нот. В цикле происходит: ввод кода нажатой клавиши — строка 240, корректировка ординаты — Y указателя записи с нот — строка 250, переход к подпрограмме возврата к предыдущей ноте — строка 260, установка конца записи по «F1»-строка 270, переход по коду к предыдущей ноте — строка 280, установка указателя записи по нажатой клавише с использованием подпрограммы выбора положения курсора по клавишам и перевод вверх или вниз указателя ноты по нотному стану — строки 300, 310, выход в режим ввода директив при нажатии на «F3», воспроизведение ноты — строка 360, определение коэффициента деления по ноте — строки 90, 100, 110, запись ноты и паузы в память — строки 370, 350. А теперь рассмотрим описание цикла более подробно.

Подпрограмма возврата к предыдущей ноте, как и программа перехода к следующей ноте, предотвращает выход за пределы нотного текста и воспроизводит ноту, на которую перешли. Подпрограмма выбора положения указателя нот по клавишам, которая используется в цикле, описана в строках 1060—1080. Подпрограмма в цикле сравнивает код введенной клавиши с кодами из массива К. В случае совпадения значение переменной цикла — I и будет ординатой указателя нот. Воспроизведение ноты реализуется загрузкой коэффициентов деления в таймер. Коэффициенты деления по ноте извлекаются из массивов S, М или DS, DM через аргумент Y. Запись ноты и паузы осуществляется в подпрограммах, которые используют один формат записи ноты: младший коэффициент деления; старший коэффициент деления, длительность, координаты курсора. Таким образом, каждая нота описывается четырьмя байтами. При записи паузы коэффициентам деления присваивается нулевое значение.

Ввод параметров воспроизведения и цикл воспроизведения описаны в строках 400—530. В строке 410 вводится темп — Z, а переменной R=28/Z корректируется для исполнения в ударах в минуту. Характер воспроизведения задается в строках 420—460. Он включает:

  • STACCATO — отрывистое звучание, которое достигается паузой между нотами, равной К=R*0.5.
  • LEGATO — без паузы между нотами.
  • NORM — среднее значение паузы между нотами K=R*0.1.

Так как интерпретатор для выполнения каждой команды затрачивает определенную долю времени, то темп игры будет незначительно отличаться от заданного, особенно при быстром темпе воспроизведения, однако в оттранслированном модуле темп игры не отличается от заданного. Сам цикл воспроизведения расположен в строках 490—530. Его аналог, за исключением отображения указателя нот, — программа, исходный текст, который приведен в табл.4.

						ТАБЛИЦА 4
;* ПРОГРАММА ИСПОЛНЕНИЯ ТЕКСТА НОТ В ФОРМАТЕ :       * 
;* МЛ.БАЙТ ДЕЛЕНИЯ;СТ.БАЙТ ДЕЛЕНИЯ;ДЛИТЕЛЬНОСТЬ.     * 
;* НА ОСНОВЕ ТАЙМЕРА К580ИВ53                        *
; 
	LXI 	Н,R0 	;ЗАГРУЗКА В HL АДРЕСА НАЧАЛА
			;ОТТРАНСЛ. НОТНОЙ ЗАПИСИ
M1: 	MOV 	А,М    	;ВЗЯТЬ ИЗ ОТТРАНСЛИРОВАН. НОТНОЙ
			; ЗАПИСИ БАЙТ
	СРI 	0FFH   	;СРАВНИТЬ С МАРКЕРОМ KOHЦA 
	RZ         	;ЕСЛИ МАРКЕР КОНЦА, ТО ВЫХОД 
	STA 	А0     	;ИНАЧЕ,ЗАГРУЗИТЬ В ТАЙМЕР 1
			; КОЭФФИЦИЕНТ ДЕЛЕНИЯ
	INX 	Н      	;ПЕРЕХОД К СЛЕДУШЕМУ БАЙТУ 
	MOV 	А,М    	;ЗАГРУЗИТЬ В А БАЙТ ИЗ ОТТРАНСЛ.
			;НОТНОй ЗАПИСИ 
	ORA 	А      	;СРАВНИТЬ С НУЛЕМ 
	JZ 	М2     	;НУЛЬ, (ВСТРЕТИЛАСЬ ПАУЗА) ТО НА М2 
	STA 	А0     	;ИНАЧЕ,ЗАГРУЗИТЬ В ТАЙМЕР 2
			;КОЭФФИЦИЕНТ ДЕЛЕНИЯ 
	MVI 	А,0С8Н 	;ЗАПУСТИТЬ 
	STA 	A2     	;ТАЙМЕР ПОСЛЕ ЗАГРУЗКИ 
	JMP 	MЗ     	;ДАЛЕЕ НА МЗ 
M2:	MVI 	A,36H 	;выключить 
	STA 	A3     	;ТАЙМЕР
MЗ: 	INX 	Н      	;ПЕРЕХОД К СЛЕДУЮЩЕМУ БАЙТУ
			; (БАЙТ ДЛИТЕЛЬНОСТИ) 
	MOV 	А,М    	;ЗАГРУЗИТЬ В А 
	INX 	Н      	;ПЕРЕХОД К БАЙТУ СЛЕДУЮЩЕЙ НОТЫ 
	АDI 	ТТ     	;ВЫЧИСЛЕНИЕ ТЕМПА 
	ADD 	А      	;ПУТЕМ СЛОЖЕНИЕ ДЛИТЕЛЬНОСТИ 
	ADD 	А      	;С КОНСТАНТОЙ ТЕМПА - ТТ 
	ADD 	А      	;И СУММИРОВАНИЕМ А+А 
	ADD 	А      	;4 РАЗА 
	MOV 	D,A    	;ЗАНЕСТИ 
	MOV 	Е,А    	;ДЛИТЕЛЬНОСТЬ 8 DE 
М4: 	DCX 	D      	;ЗАДЕРЖКА, ПУТЕМ 
	MOV 	А,0    	;ДЕКРЕМИРОВАНИЯ DE 
	ORA 	Е      	;ДО НУЛЕВОЙ 
	JNZ 	М4     	;ВЕЛИЧИНЫ 
	MVI 	А,36Н 	;ВЫКЛЮЧЕНИЕ 
	STA 	АЗ     	;ТАЙМЕРА
	LXI 	В,К    	;ЗАГРУЗКА ДЛИТЕЛЬНОСТИ МЕЖДУ НОТАМИ 
М5: 	DCX 	В      	;ЗАДЕРЖКА, ПУТЕМ 
	MOV 	А,С    	;ДЕКРЕМИРОВАЯ ВС 
	ORA 	В      	;ДО НУЛЕВОЙ 
	JNZ 	М5     	;ВЕЛИЧИНЫ
	JMP 	М1     	;ПЕРЕХОД НА ИСПОЛНЕНИЕ СЛЕДУЮЩЕЙ НОТЫ 
R0: 	EQU   	0000Н   ;АДРЕС НАЧАЛА ОТТРАНСЛИРОВАННОЙ
			;НОТНОЙ ЗАПИСИ
А0: 	EQU   	0000Н   ;АДРЕС ПОРТА А0 ТАЙМЕРА 
А2: 	EQU   	0000Н   ;АДРЕС ПОРТА А2 ТАЙМЕРА 
A3: 	EQU   	0000Н   ;АДРЕС ПОРТА АЗ ТАЙМЕРА 
К:   	EQU   	0000Н   ;КОНСТАНТА ЗАДЕРЖКИ МЕЖДУ НОТАМИ 
ТТ: 	EQU   	0000Н   ;КОНСТАНТА ТЕМПА
	END


Вывод директив редактора осуществляется в строках 560—580, а ввод и адресация по директивам — в строках 590—620.

В заключение остановимся на описании некоторых директив:

2 - ДОПИСАТЬ.

Реализуется в строках 1380, 1390, в которых указатель устанавливается на последнюю ноту в записи.

3 — ИСПРАВИТЬ.

Аналогична директиве дописать, однако номер нотной записи вводит пользователь — строки 1410, 1450.

4 — РАСПЕЧАТАТЬ.

Реализуется в строках 1470—1510 с помощью цикла, в котором функцией PEEK отображается информация из памяти, в соответствии с форматом записи.

5 — ОТТРАНСЛИРОВАТЬ.

Эта директива описана в строках 1530—1840 и использует программу воспроизведения оттранслированной нотной записи, исходный текст которой приведен в табл. 4.

А. СОРОКИН, г. Москва