ЗВУК_
PLAY, SOUND, SON, SREP, SOFF
Дополнительные звуковые возможности MegaBasic реализуются двумя операторами: PLAY и SOUND. Совместно с SOUND работают операторы SON, SREP и SOFF, играющие роль переключателей.
Оператор PLAY воспроизводит заданные звуки непосредственно в момент своего выполнения интерпретатором MegaBasic. При этом, естественно, выполнение каких-либо других операторов возможно лишь после завершения действий, предписанных PLAY (аналогично оператору ВЕЕР Spectrum-Бейсика).
Иначе работает оператор SOUND. Он лишь закладывает в специальный «звуковой буфер» данные, необходимые для воспроизведения звука, а «спусковым крючком» служит оператор SON, запускающий отработку данных. В этом случае на фоне воспроизводимого звука возможно продолжение хода программы (работа в среде так называемого «генератора звука на прерываниях»).
Прежде чем рассматривать назначение параметров, входящих в операторы PLAY и SOUND, сделаем несколько общих оговорок. Во-первых, высота звука указывается не в герцах или нотах той или иной октавы, а в условных единицах в интервале от 1 до 256. При выходе значений за эти пределы учитывается только остаток от деления на 256. Во-вторых, длительность звучания ноты задается не в единицах времени, а просто количеством звуковых колебаний, поэтому при прочих равных условиях более высокие звуки оказываются короче.
Отдельно работающие операторы PLAY и SOUND не позволяют составлять музыкальные фразы, основное их назначение — генерация разнообразных звуковых эффектов.
Операторы PLAY и SOUND используют по пять параметров:
PLAY_m,s,f,r,q[,r,q...]
SOUND_a,m,q,r,n
Сначала рассмотрим параметры, которые в обоих операторах имеют одинаковый смысл, и, естественно, обозначены одинаковыми буквами, хотя они и стоят на разных позициях:
m - «качество» звука: 0 — чистый тон, ненулевое значение — шум;
г - число шагов изменения частоты в пределах одного цикла звучания. В операторе PLAY значение этого параметра может быть сколь угодно большим, а в операторе SOUND только от 1 до 256. Поскольку действие оператора PLAY не удается прекратить даже командами MegaBasic ESCAPE (Space/E) и RESET (Space/R), то в случае «перебора» значения параметра г в операторе PLAY проще перезагрузить MegaBasic, чем дожидаться окончания трелей;
q - смещение частоты от шага к шагу в условных единицах (1...256). Значения параметра от 1 до 127 соответствуют
повышению частоты, а от 129 до 256 — понижению. При q=0 или q=l 28 высота звука не меняется.
Можно помещать в один оператор PLAY несколько пар параметров г и q с разными значениями, что позволяет разнообразить звук. Например:
PLAY_0,10,10ОО, 10,10,20,20
Следующие два параметра используются только в операторе PLAY:
s - темп звучания. Ни в одной из версий MegaBasic не удалось заметить, что значение этого параметра как-то влияет на работу PLAY;
f - начальная частота звука (1 ...256)75.
В операторе SOUND тоже имеются два параметра, которым нет аналогов в PLAY:
а — способ заполнения звукового буфера: при а=0 данные в буфере заменяются, а при ненулевом значении параметра добавляются к содержимому буфера. Звуковой буфер оператора SOUND довольно емкий, но не «резиновый». При его переполнении возможен сбой программы, поэтому следует помнить, что SOUND с нулевым параметром а очищает буфер;
п - число повторений (1...256) циклов, заданных параметром г.
Как уже говорилось, генерация звука, «заложенного» в буфер оператором SOUND, запускается оператором
SON
Вспомогательный оператор
SREPm
обычно «ходит в паре» с оператором SON. Инструкция SREP.J) задает однократное воспроизведение последовательности звуков из буфера, а ненулевое значение m приводит к циклическому повторению звукового эффекта, прервать которое можно только оператором
SOFF
Естественно, звук прерывается также при остановке программы.
Использование всех пяти операторов MegaBasic, управляющих звуком, иллюстрируется следующим примером:
10 LET m=0
15 GO SUB 2000
20 SON: PAUSE 50: GO SUB 1000
30 SOFF: LET m=NOT m: GO TO 15 1000 PLAY_0f 10,1000,10,10: RETURN: REM Музыка 2000 SOUND_1,m,100,5,5:SREP_1: RETURN: REM Шум