Единственная возможность получения звука, которую предоставляет Spectrum- бейсик - это оператор ВЕЕР. Его формат:
Указанное нотоисчисление не очень точно, поэтому взгляните на рис. 3. Там в верхней строчке приведены приблизительные, а в нижней - точные параметры оператора ВЕЕР для первой октавы.
Музыкальный диапазон BEEP достаточно широк - от -60 до 69. Он охватывает 18.5 октав, но самые низкие и самые высокие из них не представляют практического интереса для создания музыки, хотя вполне могут использоваться в звуковых эффектах.
И в заключение можно добавить об удобстве, которое Spectrum-бейсик предоставляет нам в записи десятичных дробей. Если такая дробь меньше единицы, то ноль перед точкой можно не ставить. Таким образом
Создание эффектов на ВЕЕРе.
Диапазон звучания дополнительных ВЕЕРов можно ограничить:
Последний эффект интересен тем, что в нем второй и третий ВЕЕРы вступают постепенно. Эффект можно замедлить с помощью оператора PAUSE:
В первом из этих примеров попробуйте поменять шаг или направление изменения длительности, начальное её значение.
Следующий вариант - вложенные циклы, которых может быть сколько угодно. ВЕЕРы могут встречаться в любом из них:
Все перечисленные выше методы создания эффектов могут использоваться совместно, в любой комбинации.
Ищите, пробуйте, и Вы найдете среди множества парочку подходящих для Вашей программы эффектов.
Создание музыки на ВЕЕРе.
К сожалению, на операторе ВЕЕР невозможно создать сложную музыку, но наиграть
простенькую мелодию на нем можно.
Первое, что приходит в голову при попытке создать мелодию, это составить цепочку из ВЕЕРов, которая обещает быть весьма неопределенных размеров. Этот способ примитивен, неудобен, занимает много места и вообще не очень красив. Ему существует несколько достойных замен. Например, можно использовать такой цикл:
И где-нибудь в программу вставить строку, начинающуюся с оператора DATA, и содержащую длительности и высоты нот мелодии. В данном примере их должно быть по десять.
В некоторых музыкальных произведениях бывают паузы. Чтобы исполнять такие мелодии, приведенный выше цикл придется немного модифицировать:
Теперь достаточно в данные вставить 0, а за ним длительность паузы в секундах. Вы, наверное, заметили, что значение паузы умножается на 50. Это делается потому, что параметр оператора PAUSE исчисляется в пятидесятых долях секунды.
В таблице 1 приведено соответствие нот длительностям операторов ВЕЕР и PAUSE. В этой таблице даны стандартные значения нот и пауз, но в принципе можно использовать любые числа.
Вот, к примеру, программа, исполняющая куплет детской песенки "В лесу родилась елочка":
В эту программу можно ввести возможность изменения темпа. Для этого необходимо первые три строки заменить следующими:
Теперь Вы можете добиться желаемого темпа исполнения мелодии, подставляя различные значения в пятую строку. Однако не советую Вам вставлять туда 0 и очень большие числа.
Можно ещё усовершенствовать эту программку. Например, вставить контроль нажатия клавиши, сделать её более гибкой в отношении длины мелодии, оформить как подпрограмму и т. д. Конечный вариант может выглядеть так:
Удалите все строки с 5 по 30 предыдущей программы и введите эти. Теперь Вы можете вызывать мелодию на исполнение оператором GO SUB 9100. Кроме того, теперь не надо старательно вычислять количество нот в мелодии: достаточно в её конец вставить число 100 (что собственно и сделано в строке 9090). Также Вы можете в любой момент прервать исполнение, нажав любую клавишу. Если мелодия кончится - подпрограмма также закончит свою работу. При повторном запуске мелодия начнется сначала, но, если убрать оператор RESTORE 9000, то она продолжится с того места, где была прервана (если, конечно, Вы не использовали оператор READ или RESTORE после её вызова).
Можно сделать проигрывание циклическим. Для этого придется поменять ещё пару строк:
Теперь вернуться из подпрограммы можно только по нажатию клавиши. Зато мелодия будет звучать пока кому-нибудь совсем не надоест.
Программы такого типа идеальны для простого исполнения, без замены и сохранения мелодии, но, если Вы хотите записать свое произведение на магнитофон, и загружать его прямо из работающей программы, то Вам подойдет следующий фрагмент:
Для того чтобы он заработал, перед его запуском необходимо объявить и заполнить массив D, содержащий такую информацию о мелодии:
Его можно загрузить с кассеты, подав прямую команду
LOAD "name" DATA D()
или заполнить из строчек DATA, следующей программкой:
Обратите внимание, что первые две цифры данных должны быть количеством нот и темпом.
Созданный таким образом массив можно сохранить на ленте, командой
SAVE "name" DATA D()
Приведу ещё один пример подобной программы, оформленный по последнему писку моды:
Массив для этой подпрограммы должен быть таким:
Заметьте, что количество нот указывать не надо. На основе этого примера можно сделать даже музыкальный редактор.
Теперь вернемся к составлению цепочек данных.
Допустим, на нотном стане Вы увидели ноту точь в точь, как на рис. 4. Это ЛЯ первой октавы. Из рисунка 3 видно, что её частота запишется как 8.84.
Это одна четвертая, и, взглянув на таблицу 1, можно определить, что её длительность будет .25. Таким образом, пара данных для этой ноты будет .25,8.84. Для всех последующих нот вычисления будут такими же.
- где t - длительность звука в секундах, a f - высота в полутонах. Чтобы ноту повысить или понизить на октаву необходимо её значение соответственно увеличить, или уменьшить на 12. Так
воспроизведет ноту ДО первой октавы в течение полсекунды, а
- ту же ноту ДО, но уже второй октавы.
Указанное нотоисчисление не очень точно, поэтому взгляните на рис. 3. Там в верхней строчке приведены приблизительные, а в нижней - точные параметры оператора ВЕЕР для первой октавы.
Музыкальный диапазон BEEP достаточно широк - от -60 до 69. Он охватывает 18.5 октав, но самые низкие и самые высокие из них не представляют практического интереса для создания музыки, хотя вполне могут использоваться в звуковых эффектах.
И в заключение можно добавить об удобстве, которое Spectrum-бейсик предоставляет нам в записи десятичных дробей. Если такая дробь меньше единицы, то ноль перед точкой можно не ставить. Таким образом
можно записать как
Создание эффектов на ВЕЕРе.
Диапазон звучания дополнительных ВЕЕРов можно ограничить:
Бейсик ZX:
10 FOR A=0 TO 69
20 BEEP .01,A
30 IF A>20 AND A<40 THEN BEEP .01,A+8
40 NEXT A
или так:
10 FOR A=0 TO 69
20 BEEP .0003,A-6: BEEP .001,A-3: BEEP .01,A
30 NEXT A
Последний эффект интересен тем, что в нем второй и третий ВЕЕРы вступают постепенно. Эффект можно замедлить с помощью оператора PAUSE:
Бейсик ZX:
10 FOR A=10 TO 40 STEP 2
20 BEEP .01,A: PAUSE 2
30 NEXT A
Можно в течение воспроизведения менять длительность:
10 LET T=.01
20 FOR A=10 TO 60: BEEP T,A
30 LET T=T-.0002: NEXT A
10 FOR A=0 TO 60
20 BEEP A/500,60-A
30 NEXT A
В первом из этих примеров попробуйте поменять шаг или направление изменения длительности, начальное её значение.
Следующий вариант - вложенные циклы, которых может быть сколько угодно. ВЕЕРы могут встречаться в любом из них:
Бейсик ZX:
10 FOR A=2 TO 5: BEEP .01,A
20 FOR B=20 TO 30: BEEP .01,B
30 NEXT B: NEXT A
10 FOR A=1 TO 40 STEP 10
20 FOR B=A TO A+20
30 BEEP .03,B
40 NEXT B: NEXT A
Попробуйте объединить несколько циклов. Например:
10 FOR A=12 TO 69: BEEP .001,A
20 NEXT A
30 FOR A=69 TO 12 STEP -1
40 BEEP.001,A: NEXTA
И, наконец, во всю эту коллекцию можно добавить элемент случайности:
10 FOR A=1 TO 10: LET F=RND*50
20 BEEP .1,F: BEEP .1,F+7: BEEP .1,F+4
30 NEXT A
10 FOR A=1 TO 20
20 BEEP .1,RND*20+40
30 NEXT A
10 FOR A=1 TO 20
20 BEEP RND/6,RND*60
30 NEXT A
Ищите, пробуйте, и Вы найдете среди множества парочку подходящих для Вашей программы эффектов.
Создание музыки на ВЕЕРе.
К сожалению, на операторе ВЕЕР невозможно создать сложную музыку, но наиграть
простенькую мелодию на нем можно.
Первое, что приходит в голову при попытке создать мелодию, это составить цепочку из ВЕЕРов, которая обещает быть весьма неопределенных размеров. Этот способ примитивен, неудобен, занимает много места и вообще не очень красив. Ему существует несколько достойных замен. Например, можно использовать такой цикл:
Бейсик ZX:
10 FOR A=1 TO 10
20 READ T,F: BEEP T,F
30 NEXT A
И где-нибудь в программу вставить строку, начинающуюся с оператора DATA, и содержащую длительности и высоты нот мелодии. В данном примере их должно быть по десять.
В некоторых музыкальных произведениях бывают паузы. Чтобы исполнять такие мелодии, приведенный выше цикл придется немного модифицировать:
Бейсик ZX:
10 FOR A=1 TO 10: READ T,F
20 IF T=0 THEN PAUSE F*50: NEXT A
30 BEEP T,F: NEXT A
Теперь достаточно в данные вставить 0, а за ним длительность паузы в секундах. Вы, наверное, заметили, что значение паузы умножается на 50. Это делается потому, что параметр оператора PAUSE исчисляется в пятидесятых долях секунды.
В таблице 1 приведено соответствие нот длительностям операторов ВЕЕР и PAUSE. В этой таблице даны стандартные значения нот и пауз, но в принципе можно использовать любые числа.
Вот, к примеру, программа, исполняющая куплет детской песенки "В лесу родилась елочка":
Бейсик ZX:
10 FOR A=1 TO 29: READ T,F
20 IF T=0 THEN PAUSE F*50: NEXT A
30 BEEP T,F: NEXT A
9000 DATA .25,7.02,.25,15.86,.25,15.86,.25,14.039,.25,15.86
9010 DATA .25,12,.25,7.02,.25,7.02,.25,7.02,.25,15.86,.25,15.86
9020 DATA .25,14.039,.25,20.84,.5,19.02,0,.5,.25,19.02,.25,8.84
9030 DATA .25,8.84,.25,16.98,.25,16.98,.25,15.86,.25,14.039,.25,12
9040 DATA .25,7.02,.25,15.86,.25,15.86,.25,14.039,.25,15.86,.5,12
В эту программу можно ввести возможность изменения темпа. Для этого необходимо первые три строки заменить следующими:
Бейсик ZX:
5 LET N=.5
10 FOR A=1 TO 29: READ T,F
20 IF T=0 THEN PAUSE F*N*50: NEXT A
30 BEEP T*N,F: NEXT A
Теперь Вы можете добиться желаемого темпа исполнения мелодии, подставляя различные значения в пятую строку. Однако не советую Вам вставлять туда 0 и очень большие числа.
Можно ещё усовершенствовать эту программку. Например, вставить контроль нажатия клавиши, сделать её более гибкой в отношении длины мелодии, оформить как подпрограмму и т. д. Конечный вариант может выглядеть так:
Бейсик ZX:
9090 DATA 100
9100 LET N=.5: RESTORE 9000
9110 READ T,F
9120 IF T=100 OR INKEY$<>"" THEN RETURN
9130 IF T=0 THEN PAUSE F*N*50: GO TO 9110
9140 BEEP T*N,F: GO TO 9110
Удалите все строки с 5 по 30 предыдущей программы и введите эти. Теперь Вы можете вызывать мелодию на исполнение оператором GO SUB 9100. Кроме того, теперь не надо старательно вычислять количество нот в мелодии: достаточно в её конец вставить число 100 (что собственно и сделано в строке 9090). Также Вы можете в любой момент прервать исполнение, нажав любую клавишу. Если мелодия кончится - подпрограмма также закончит свою работу. При повторном запуске мелодия начнется сначала, но, если убрать оператор RESTORE 9000, то она продолжится с того места, где была прервана (если, конечно, Вы не использовали оператор READ или RESTORE после её вызова).
Можно сделать проигрывание циклическим. Для этого придется поменять ещё пару строк:
Бейсик ZX:
9120 IF INKEY$<>"" THEN RETURN
9125 IF T=100 THEN GO TO 9100
Теперь вернуться из подпрограммы можно только по нажатию клавиши. Зато мелодия будет звучать пока кому-нибудь совсем не надоест.
Программы такого типа идеальны для простого исполнения, без замены и сохранения мелодии, но, если Вы хотите записать свое произведение на магнитофон, и загружать его прямо из работающей программы, то Вам подойдет следующий фрагмент:
Бейсик ZX:
10 FOR A=3 TO D(1)*2+2 STEP 2
20 IF D(A)=0 THEN PAUSE D(A+1)*D(2)*50: NEXT A
30 BEEP D(A)*D(2),D(A+1)
40 NEXT A
Для того чтобы он заработал, перед его запуском необходимо объявить и заполнить массив D, содержащий такую информацию о мелодии:
Код:
D(l) - количество нот
D(2) - темп исполнения
D(3) - длительность 1
D(4) - нота 1
.
.
.
D(N) - длительность N
D(N+l)-нота N
Его можно загрузить с кассеты, подав прямую команду
LOAD "name" DATA D()
или заполнить из строчек DATA, следующей программкой:
Бейсик ZX:
10 DIM D(20): RESTORE
20 FOR A=1 TO 20: READ D(A)
30 NEXT A
Обратите внимание, что первые две цифры данных должны быть количеством нот и темпом.
Созданный таким образом массив можно сохранить на ленте, командой
SAVE "name" DATA D()
Приведу ещё один пример подобной программы, оформленный по последнему писку моды:
Бейсик ZX:
100 LET A=2
9110 IF D(A)=100 THEN GO TO 9100
9120 IF INKEY$<>"" THEN RETURN
9130 IF D(A)=0 THEN PAUSE D(A+1)*D(1)*50: GO TO 9150
9140 BEEP D(A)*D(1),D(A+1)
9150 LET A=A+2: GO TO 9110
Массив для этой подпрограммы должен быть таким:
Код:
D(l) - темп исполнения
D(2) - длительность 1
D(3) - нота 1
.
.
.
D(N) - длительность N
D(N+l)-нота N
D(N+2) - 100
Заметьте, что количество нот указывать не надо. На основе этого примера можно сделать даже музыкальный редактор.
Теперь вернемся к составлению цепочек данных.
Допустим, на нотном стане Вы увидели ноту точь в точь, как на рис. 4. Это ЛЯ первой октавы. Из рисунка 3 видно, что её частота запишется как 8.84.
Это одна четвертая, и, взглянув на таблицу 1, можно определить, что её длительность будет .25. Таким образом, пара данных для этой ноты будет .25,8.84. Для всех последующих нот вычисления будут такими же.