Ввод параметров при помощи оператора INPUT.
Для того, чтобы сформировать звук, надо в диалоге задать несколько исходных
параметров: дискретность тона, период начального тона, величина ступеньки тона, число ступенек тона, число повторений. Для человека, первый раз запустившего программу, эти параметры - "китайская грамота". Что такое, например, дискретность тона? Даже если указать пределы, в которых может изменяться вводимый параметр, например так: INPUT "ДИСКРЕТНОСТЬ ТОНА (1-2000) "; C
то это еще немногим поможет, так как все параметры взаимоувязаны между собой и, скорее всего, величина, взятая наобум из указанного диапазона, приведет к тому, что звука не получится, так как результирующие параметры выйдут за допустимые пределы. Чтобы не блуждать в темноте с завязанными глазами, программа должна подсказывать оператору возможные варианты ответа - такие, что если все время соглашаться с этими ответами (нажимая ENTER), то в конце получится что-нибудь осмысленное. Так должно быть в идеале.
Реализуются эти требования следующим образом. Например, если дискретность тона обозначить C, то процедура ввода может выглядеть так (номера строк даны условно): 3010 LET C=5
3020 PRINT AT 21,0;"ДИСКРЕТНОСТЬ ТОНА": INPUT ("(1-2000) : ";С; " : "); LINE F$: IF F$<>""
THEN LET C=VAL F$ 3030 IF C<1 OR C>2000 THEN GO TO 3020
При этом в строке 3010 или где-либо в другом месте, например, в начале программы, указывается то значение, которое будет принято программой по соглашению (если Вы просто нажмете ENTER, ничего не вводя). В строке 3020 на экран выводится наименование параметра, требующего ввода, далее идет информация о допустимых пределах и затем предлагается вариант для ввода. Если согласен с ответом - нажимай ENTER, если нет - то задай свое значение и нажми ENTER. Для реализации этого способа потребовалось вместо числового значения C вводить стринг F$, а чтобы при вводе не появлялись кавычки, как обычно при вводе стринга, то вместо INPUT F$ используется INPUT LINE F$.
Строка 3030 проверяет вводимый параметр на допустимые пределы, например, набирая "1000", у Вас случайно набрался лишний ноль, но Вы этого не заметили и уверены в правильности ввода. Если программа просто откажется принять введенное число, то это вызовет у Вас недоумение: "Как же так, ведь было сказано ввести число от 1 до 2000, я и ввел 1000, а что-то программа отказывается работать". В таком случае строка 3030 вернет программу на строку 3020, где Вам будет "показано" введенное Вами ошибочное число. Теперь Вы имеете возможность исправить ошибку, повторив ввод.
Заканчивая лирическое отступление отмечу, что на протяжении всей программы ввод параметров осуществляется такими процедурами. А теперь возвращаемся к работе программы, когда на экране второе меню.
При выборе первого пункта меню, строка 310 переводит программу на строку 1000. С этой строки выполняются действия по созданию в памяти основы нового звука. Строка 1020 увеличивает на 1 число созданных звуков (В), затем этот новый звук становится текущим (P=B), затем подготавливается значение (N) для оператора INPUT в следующей строке. N -это номер примера из набора демонстрационных звуков. Если Вы хотите выбрать какой-то конкретный понравившийся пример, то введите его номер, если нет, то нажмите ENTER, при этом будет взят один из примеров. Обратите внимание на активизацию блока "ON ERROR GO ТО" при работе INPUT. Конструкция: RANDOMIZE 1030: GO SUB 10
в строке 1030 вернет программу на эту строку в случае ошибки при вводе. Строка 1040 также вернет программу для повторного ввода на строку 1030 в том случае, если вводимая величина выходит за допустимые пределы.
После вывода на экран комментария, строки 1060 и 1070 произведут переброску блока кодов длиной 32 байта из области памяти примеров звуков в область памяти для создания и редактирования звуков. Конструкция: RANDOMIZE 1060: GO SUB 10
"подстраховывает" процесс создания в памяти основы звука. Так как этот процесс занимает порядка 1 секунды, то можно успеть в это время нажать "BREAK". В этом случае процесс создания основы звука будет повторен сначала и работа программы не пострадает. Строка 1080 передает управление на строку 3000 - это основная часть по редактированию
звука. О ней - через один абзац.
В том случае, если находясь во втором меню, Вы выберете 2 пункт, то строка 320 передаст управление на строку 2000 - эта часть программы позволяет задать номер звука для редактирования из создаваемого блока звуков. По соглашению, редактируемым является последний созданный Вами звук, но Вы можете выбрать любой из тех, которые создали. Работа оператора INPUT аналогична рассмотренной выше. Строка 2030 определяет начальный адрес текущего звука. Строка 2040 передает управление на основную часть программы по редактированию звука - строку 3000.
В строке 3010 происходит присвоение параметров выбранного примера звука числовым переменным для дальнейшего использования их в качестве "предлагаемых по соглашению" параметров при работе оператора INPUT. Далее идет несколько запросов параметров. Строки 3020, 3030 - ввод "дискретности звука". Строка 3040 - занесение полученных значений в память. Строки 3050-3070 аналогично ввод "периода начального тона". Далее в строках 3060, 3090 происходит подготовка параметров для работы следующего, вспомогательного меню со строки 400, которое вызывается как подпрограмма, чтобы можно было не беспокоиться о номере строки для возврата из этого меню в программу редактирования звука. Это меню задает параметр Z - повышение тона или понижение тона. Если задано повышение тона (то есть уменьшение периода колебаний), то Z=-1 и в память вводится число 82, так как 237, 82 - это коды команды SBC -вычитание. Если задано понижение тона (то есть увеличение периода колебаний), то Z=1 и в память вводится число 90, так как 237, 90 - это коды команды ADC - сложение. После возврата по RETURN в строке 410 или 420 - продолжение программы со строки 3110.
Строки 3120-3140 - ввод значения величины "ступеньки тона". Строки 3150-3170 -ввод "числа ступенек тона".
Далее можно подвести некоторые предварительные итоги, проверив взаимоувязку параметров между собой. Для этого в строке 3180 подсчитывается величина тона, получающаяся при завершении звука, то есть на "последней ступеньке" тона. Изменение тона не должно приводить к тому, что тон выйдет за допустимые пределы. Если это все же происходит, то программа возвращается назад, на строку 2500. Здесь выводится сообщение о недопустимом изменении тона и рекомендуется, что надо сделать для корректировки. После предупредительного звукового сигнала и паузы в строке 2530, переходим опять на начало редактирования звука, на строку 3000. В процессе нового ввода Вам будут показаны введенные Вами значения и Вы сможете скорректировать их согласно указаниям строк 2500 - 2520.
Если проверка в строке 3180 прошла успешно, то программа переходит к следующей проверке в строке 3190. Здесь производится приблизительный подсчет времени звучания одного (H=1) "скольжения" тона. Для этого вызывается подпрограмма со строки 70. Если время звучания не превышает 10 секунд, то - возврат в программу, ничего не делая. Если превышает 10 секунд, то в строке 72 происходит перевод этого времени в минуты и секунды для вывода предупреждения. Оно выводится строкой 74. При этом даются рекомендации, что надо сделать, чтобы уменьшить время звучания. Однако, может быть, Вам специально нужно сделать звук такой длины. Поэтому Вы можете продолжить работу программы, дав согласие на демонстрацию звука, нажав "Y". В противном случае строка 3190 вернет программу во второе меню. Если вместо "Y" нажать "BREAK", то сразу окажемся на строке 3000 - то есть без возврата в меню начинается повторное редактирование. Это происходит благодаря установке в строке 3160 блока "ON ERROR GO ТО" на строку 3000.
Теперь, когда пройдены все проверки, в строке 3200 Вы можете услышать результаты своего труда. Здесь Вам демонстрируется одно "скольжение" тона. Если Вам результаты сразу не нравятся, Вы можете нажать "BREAK" и, минуя меню, быстро вернуться на строку 3000 для повторного редактирования. (Как Вы помните, блок "ON ERROR GO TO" настраивается на эту строку в строке 3160). Если результаты вас устраивают, то продолжается редактирование звука со строки 4000.
Строка 4000. Сюда мы попадем, также, если во втором меню выбрать третий пункт (см. строку 330). Эта часть программы задает число повторений "скольжений". Строки 4010-4040 - ввод значения в память - аналогично тому, как это делалось раньше. Далее, в строке 4050 еще раз производится проверка времени звучания заданного числа "скольжений" тона. И если оно больше 10 секунд, то, как и раньше, требуется подтверждение "Y" для демонстрации звука, иначе - возврат во второе меню. При этом, если вместо "Y" Вы нажмете "BREAK", то сразу же попадете на строку 4020 согласно последней установке блока "ON ERROR GO TO", которое было сделано в строке 4020. Если была нажата клавиша "Y", то в строке 4050 демонстрируется готовый звук, после чего процесс редактирования заканчивается и строка 4060 возвращает программу во второе меню.
Если во втором меню выбран четвертый пункт, то есть соединение двух звуков в один, то необходимо сначала убедиться в том, что эти два звука у нас имеются в наличии. Эта проверка выполняется в строке 340. Если число созданных звуков больше или равно двум, то разрешается дальнейшая работа, где строка 345 переводит программу на строку 5000, иначе - вывод предупредительной таблички со звуковым сигналом и возврат во второе меню.
Программа со строки 5000 - это соединение двух звуков. Соединение производится путем замены команды RET в конце кодового блока первого звука, командой NOP, в результате чего после завершения первого звука не произойдет возврат в Бейсик, а начнется выполнение следующего по порядку звука.
Естественно, что первый звук можно соединить только со вторым, второй - только с третьим и т.д. Если создано всего два звука (В=2), то других вариантов, кроме как соединить первый со вторым - не может быть и программа со строки 5000 переходит на строку 5100, а если звуков несколько, то следует запрос: надо указать номер первого из двух смежных звуков, которые надо соединить. Ввод этого значения - в строках 5010 -5030. После того, как в строке 5100 произойдет непосредственно замена команды RET командой NOP, вам демонстрируется получившийся звук. Если он Вам не понравится, Вы можете опять разъединить звуки, если в момент паузы в строке 5120, после вывода на экран комментария, нажать "BREAK". При нажатии "BREAK" программа переходит на строку 5200, где команда NOP опять заменяется командой RET. В завершение этой части программы запускается второе меню.
Если во втором меню выбрать пятый пункт - демонстрация звуков, то в строке 350, как и в первом меню (см. строку 220), вызывается подпрограмма демонстрации звуков GO SUB 50, после чего опять запуск второго меню. Этим режимом можно также воспользоваться, если Вы просто хотите посмотреть, сколько звуков уже создано. Для этого, как только на экране появится: "ЧИСЛО ЗВУКОВ:", прервите выполнение этой подпрограммы, нажав "BREAK".
При выборе шестого пункта второго меню - записи звуков - выполняется большая подпрограмма записи GO SUB 6000, аналогично тому, как она выполнялись из первого меню. Отмечу только один момент. Например у вас создано три звука. При этом Вы соединили между собой второй и третий звуки, заменив команду RET в конце второго звука командой NOP (при этом второй звук стал вдвое большей длины). Теперь у Вас имеется два звука: первый - обычной длины, и второй - двойной длины. Это необходимо учесть при записи звуков. Так, если Вы хотите записать результаты работы на магнитофон, то в ответ на запросы о номере начального и конечного звуков для записи, Вы логично ответите: 1 и 2. При этом программа сама должна разобраться в том, что в конце блока кодов длиной 32*2=64 байта отсутствует RET. Иначе записанный блок кодов окажется неработоспособным. То есть, если в конце отсутствует RET, то длина кодового блока для записи увеличивается на 32 байта, после чего опять должна быть выполнена проверка на наличие RET в конце блока. Эта проверка выполняется в строке 6090, после чего следует запись (строки с 6100). После записи на экран выводятся краткие комментарии по дальнейшему использованию звуков в Ваших программах. После завершения подпрограммы записи - возврат туда, откуда подпрограмма была вызвана - в первое или второе меню.
При выборе седьмого пункта второго меню - загрузки звуков, программа в строке 370 переводится на строку 7000. Перед началом загрузки блок "ON ERROR GO TO" в строке 7000 настраивается на переход на строку 7100 в случае ошибки магнитофона. Далее идет загрузка блока кодов с ленты в область памяти, непосредственно за последним созданным звуком (строка 7010). Далее определяется длина загруженного блока кодов (строка 7020). Текущим устанавливается первый звук из загруженного блока звуков, а общее число звуков увеличивается на число загруженных звуков (строка 7030), которое индицируется на экране (строка 7040). Далее - вызов второго меню. В случае ошибки магнитофона или нажатия "BREAK" при ожидании загрузки программа переходит на строку 7100. Можно возобновить загрузку, нажав "Y", иначе - переход во второе меню.
В том случае, если во втором меню будет выбран восьмой пункт - удаление звуков, то строка 360 вызывает новое меню, которое расположено со строки 500. Здесь два варианта: удаление последнего звука или вообще удаление всех звуков путем перезапуска программы. При этом в обоих случаях требуется подтверждение для удаления звуков, иначе строка 504 возвратит программу во второе меню. Строка 510 - уменьшение на 1 числа созданных звуков, строка 520 - перезапуск всей программы аналогично перезагрузке с ленты.
И, наконец, последний пункт второго меню - возврат в главное меню. Вообще говоря, этот пункт меню лишний, возврат в главное меню производится точно так же при помощи нажатия на клавишу "BREAK", однако помня об идеологии меню, то есть если Вы активно пользуетесь джойстиком, то этот пункт меню может придать большее удобство при работе.
Для того, чтобы реализовать возможность перехода из второго меню в главное меню, в программе "SOUND" применима несколько иная логика работы блока "ON ERROR GO ТО", по сравнению с программой "PRIM". Там при нажатии "BREAK", находясь в первом или втором меню, можно было перезапустить программу сначала с выводом титульной заставки (аналогично перезагрузке с ленты), для чего в начале строки 30 - в начале подпрограммы меню стояла конструкция, активизирующая переход при ошибке (нажатий "BREAK") на строку 3. В программе "SOUND" такое нажатие "BREAK" (случайное, конечно) было бы крайне опасно, так как оно может в один миг уничтожить все созданные Вами звуки, то есть все результаты труда. Поэтому, когда на экране какое-нибудь меню, программа должна по разному реагировать на нажатие "BREAK" в зависимости от ситуации.
Рассмотрим подробнее реакцию программы в различных меню на нажатие "BREAK". Прежде всего, теперь в подпрограмме меню GO SUB 30 Вы не видите конструкции, активизирующей блок "ON ERROR GO ТО". Эта активизация должна быть выполнена при входе в соответствующее меню до начала выполнения подпрограммы GO SUB 30. Это происходит в строках 200, 300 и т.д., то есть в начальных строках каждого меню. А теперь конкретно о каждом меню.
Первое меню. Строка 200. Конструкция RANDOMIZE 190: GO SUB 10 вызывает при нажатии "BREAK" опять же это первое меню, переходом на строку 190. То есть, нажимая "BREAK", невозможно никуда попасть дальше первого меню. Так предохраняются от уничтожения результаты редактирования. Кроме этого, появляется небольшое дополнительное удобство на практике - быстрый переход на первый пункт меню из середины меню: вместо многократного или длительного нажатия "ВВЕРХ" или "ВНИЗ" достаточно один раз нажать "BREAK".
Второе меню. Строка 300. При нажатии "BREAK" произойдет переход на строку 390, то есть возврат в первое меню.
Меню "повышение - понижение тона". Строка 400. Здесь при нажатии "BREAK" будет переход на строку 402, то есть та же реакция, что и на нажатие ENTER, то есть принятие параметра по соглашению.
Меню удаления звуков. Строка 500. Здесь при нажатии "BREAK", как и любой другой клавиши, происходит переход на строку 504, то есть возврат во второе меню. В этом меню какие-либо действия возможны только при подтверждении Вашего желания - нажатии "Y".
Немного изменена логика работы блока "ON ERROR GO TO" и в подпрограмме GO SUB 20 - "нажмите любую клавишу". В строке 22 RANDOMIZE 22 заменено на RANDOMIZE 24, то есть при нажатии на любую клавишу, в том числе и "BREAK", работа программы будет продолжена.
Нулевая строка и коды, размещенные в ней, в основном такие же, как и в дебюте программы "PROG". Отличие лишь в том, что вместо SOUND1 - SOUND2 находятся SOUND1 - SOUND20. Это демонстрационные примеры тех звуков, которые могут быть созданы при помощи этой программы.
Для получения блока кодов "sound1-20" можно воспользоваться программой: 10 CLEAR 43775: PRINT "PLEASE WAIT..." 20 LET a=43776: LET s = 0 30 FOR n=1 TO 20 40 RESTORE 200
50 FOR a=a TO a+31: READ y: POKE a, y: LET s=s+y: NEXT a 60 NEXT n
70 LET a=43776: RESTORE 300 80 FOR p=1 TO 8: READ m: LET s=s+m
90 FOR n= 1 TO 20: READ y: POKE (a+32*(n-1) +m),y: LET s=s + y: NEXT n 100 NEXT p: CLS
110 IF s<>57522 THEN PRINT AT 0, 0; FLASH 1; "ERROR" : STOP 120 SAVE "sound1-20"CODE 43776,640 130 STOP
200 DATA 14,0,6,0,33,0,0,197,17,0,0,229,205,181,3,225,17,0,0,237,0,193,16,239,62,0,12, 185,32,228,0,201
300 DATA 3,5,100,40,50,40,30,25,30,5,50,15,20,20,40,5,7,8,20,4,5
310 DATA 5,244,200,5,1,144,232,32,136,232,20,136,16,200,32,232,160,16,136,32,40
320 DATA 6,1,0,0,0,1,3,3,19,3,0,19,39,0,3,3,15,39,19,78,0
330 DATA 9,70,10,5,1,3,3,5,5,50,15,3,5,9,1,100,4,1,5,8,3
340 DATA 17,40,2,10,100,10,20,7,5,50,50,15, 200,144,200,50,100,244,244, 5,5,40
350 DATA 18,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0
360 DATA 20,82,90,9090,90,90,90,90,82,90,82,82,90,90,82,82,82,82,82,90
370 DATA 25,1,1,5,2,3,1,2,1,2,2,3,1,2,5,2,5,5,1,1,80
1000 FOR s=1 TO 20: RANDOMIZE USR (43776+32*(s-1)): PAUSE 20: NEXT s
Если все набрано правильно, то после того, как Вы сделаете RUN, программа выдаст для записи на магнитофон блок кодов "sound1-20" длиной 640 байт. Вы сразу же можете прослушать Получившиеся звуки, сделав RUN 1000.
Вернемся к нулевой строке. Всего за оператором REM должно быть:
Симв. набор 768 байт UDG-графика 168 байт ON ERROR GO ТО 73 байт SOUND 1-20 640 байт Всего: 1649 байт
Если вы уже набрали дебют программы "PROG", то можно поступить следующим образом. Сначала сохраним на ленте необходимые коды из нулевой строки "PROG": SAVE "code" CODE 23760,1009
Это будут коды нулевой строки, кроме SOUND1-2. Дальше надо сформировать нулевую строку заданной длины. Когда Вы будете создавать такую строку при помощи программы "REM FILL", (см. "ZX-РЕВЮ", стр.197) то на запрос о числе добавочных байтов после REM Вы должны ответить: 1649. После того, как нулевая строка заданной длины будет сформирована, загружаем в нее коды: LOAD "code" CODE 23760 LOAD "sound1-20" CODE 24769
Теперь эту нулевую строку можно соединить с текстом программы "SOUND" при помощи MERGE.
Рассматривая в этой и предыдущих статьях различные приемы, при помощи которых можно усовершенствовать простые программы на Бейсике, мы невольно начали касаться программирования в машинных кодах. Пока что это небольшие кодовые блоки, вызываемые из Бейсика. Но таких кодовых блоков может быть достаточно много. Вы и в дальнейшем будете выискивать в других программах (в частности в "SUPERCODE") интересные эффекты, получаемые при помощи машинных кодов и все больше использовать их в своих разработках. В результате постепенно будет создаваться Ваша личная библиотека. Важно то, что для Вас уже не существует непреодолимой границы между Бейсиком и машинными кодами. Ваша программа станет все больше состоять из машинных кодов, которые в конечном итоге заменят всю Бейсик-программу, останется только Бейсик-загрузчик. Такой путь возможен, если идея, заложенная в программе, оказалась удачной и вышла за рамки "повседневных задач", с которых все началось.
Рассматривая некоторые приемы, я поделился лишь одним из огромного множества направлений, таким, которое в итоге приведет вас к полному переходу на програмирование в машинных кодах. А может быть, Вы выберете другой путь, например применение "диалектов" Бейсика - MEGABASIC, BETABASIC и т.д. Или компилирование Бейсик-программ. Каждый свободен в своем выборе.
Уважаемые читатели!
"ИНФОРКОМ" уже не первый раз печатает работы, присланные нашим постоянным корреспондентом Алексеевым А.Г. Мы надеемся, что многие из предложенных автором идей помогли Вам или еще помогут взять максимум того, что может дать Ваш "Спектрум".
Творческий поиск не стоит на месте и мы, конечно же, не в состоянии опубликовать все возможные идеи и новые разработки, а стараемся останавливаемся на вопросах, имеющих, как нам кажется, массовый интерес и широкое применение.
Для получения более специфичной информации мы можем предложить Вам напрямую связаться с нашим корреспондентом по адресу:
141220, Московская обл., Пушкинский район, п/о Черкизово-2, ул. Б.Тарасовская, д.113, кв.21. Алексееву Андрею Георгиевичу
При обращении просьба вкладывать заполненный конверт с обратным адресом.
В ответном письме Вы получите список авторских разработок служебных программ и вспомогательных драйверов, которые могут быть приобретены по почте за весьма скромную цену (плюс почтовые расходы).
Среди них, например, программный драйвер для программы AST-STUDIO, который позволяет использовать этот графический редактор вместе с принтером для тех, кто не имеет стандартных интерфейсов, поддерживаемых этой программой, а пользуется компьютерами с программируемым портом КР580ВВ55А или с интерфейсом LPRINT II/III. Таких пользователей у нас очень и очень много и до сих пор использовать графический редактор с принтером им было проблематично.
Этот драйвер позволит взять от редактора максимум: печать разномасштабных копий, печать как поперек листа, так и вдоль, подключать принтеры, имеющие и 8 и 7 иголок, получать полутоновые картинки с имитацией цвета оттенками серого.
Драйвер имеет небольшую длину. Вы всегда сможете набрать его самостоятельно и подключить к программе ARTSTUDIO, следуя подробным инструкциям.
Если у вас при этом нет оригинальной (настроечной) версии программы "ARTSTUDIO", а есть уже инсталлированная и неперенастраиваемая программа, этот вопрос тоже может быть решен.
Среди прочих разработок, предлагаемых Вашему вниманию, стоит отметить универсальный программный драйвер, позволяющий реализовать все графические возможности Вашего принтера. Будучи подключенным к текстовому редактору, такой драйвер позволит Вам формировать и распечатывать документы достаточно сложной фактуры. Это могут быть, например, фирменные бланки, виньетки, визитные карточки и т.п.
Исчерпывающую информацию и условия оплаты Вы получите, обратившись письменно по указанному выше адресу.
ВНИМАНИЕ
Уважаемые читатели!
"ИНФОРКОМ" проводит исследование, посвященное игровым программам для IBM-совместимых компьютеров.
Мы знаем, что многие из вас имеют доступ к IBM-совместимой технике в учебных заведениях, на работе, в клубах, через друзей, а некоторые и дома.
Нам очень ценно ваше мнение о значении игровых программ и мы будем очень рады, если Вы сможете написать нам несколько слов о самых любимых играх. Если Вы напишете названия нескольких любимых игр, по-возможности названия фирм, их выпустивших, и год выпуска - этого будет вполне достаточно, чтобы составить представление о том, как распространены эти программы в вашей стране и какой популярностью они пользуются. Свои отклики Вы можете отправлять на простой почтовой открытке.
Мы будем особенно признательны, если Вы сможете указать свой возраст и род занятий, поскольку изучение приверженности разных возрастных групп к разным игровым программам - одна из задач этого исследования.
Ваше мнение поможет в проведении этого интересного и, надо сказать, уникального эксперимента.
Ждем ваших откликов по адресу 121019, Москва, Г-19, а/я 16.
Если же Вас лично интересуют те исследования, которые мы ведем по игровым программам для IBM-совместимых компьютеров (а любители игровых программ оценивают их как очень интересные), то Вы можете ежемесячно знакомиться с ними на страницах журнала "МОНИТОР", который предоставляет для этого центральные полосы каждого номера. Планируется и выпуск отдельной книги массовым тиражом.