Программирование на языке BASIC 1990 г.

Глава 18,19 - указания. Программирование звуков.


Глава 18
                         У К А З А Н И Я
Краткое содержание: PAUSE, INKEY$, PEEK
    Если  вы решили задержать выполнение программы  на  некоторое
время, то вам следует использовать оператор      PAUSE N,
который останавливает выполнение программы и отображает картину в
течении  'N'  телевизионных  кадров ( 50 кадров в европе  или  60
кадров в америке).   'N' может быть вплоть до 65535,  что состав
ляет 22 минуты,  если N=0, то это означает, что оператор PAUSE не
имеет ограничения по времени.
    Выполнение программы всегда может быть возобновлено до  окон-
чания  времени,  определенного в операторе PAUSE,  нажатием любой
клавиши (надо помнить, что CAPS SHIFT будет вызывать прерывание).
    Пример программы моделирования секундной стрелки часов:
        10 REM FIST WE DRAW THE CLOCK FASE
        20 FOR N=1 TO 12
        30 PRINT AT 10-10*COS(N/6*PI),16+10*SIN(N/6*PI);N
        40 NEXT N
        50 REM NOW WE START THE CLOCK
        60 FOR T=0 TO 200000:REM THIS THE TIME IN SECONDS
        70 LET A=T/30*PI:REM A IS THE ANCLE OF THE SECOND
           HAND IN RADIANS
        80 LET SX=80*SIN A:LET SY=80*COS A
       200 PLOT 128,88:DRAW OVER 1:SX,SY:REM DRAW SECOND HAND
       210 PAUSE 42
       220 PLOT 128,88:DRAW OVER 1;SX,SY:REM ERASE SECOND HAND
       400 NEXT T
    Эти  часы остановятся проработав приблизительно  55,5  часов,
что  задается в операторе с номером 60,  оператор 210  производит
отсчет времени, казалось бы сдесь должен быть оператор PAUSE 50
(Европа),  для  точного отсчета одной секунды,  но тогда бы мы  не
учли время,  затраченное на выполнение остальных операторов прог-
раммы,  рассматриваемый  вариант часов обеспечивает 2%-ю точность
или иными словами уход на полчаса в день.
    Возможны и более точные способы измерения времени, но исполь-
зовать содержимое специальных областей памяти, в этом случае дан-
ные из памяти могут быть вызваны с помощью функции PEEK, подробно
это рассмотрено в главе 25, здесь  в  качестве примера рассмотрим
выражение:
          (65536*PEEK 23674+256*PEEK 23673 +PEEK 23672)/50
оно дает количество секунд, прошедших с тех пор как компьютер был
включен  (вплоть до 3-х суток и 21-го  часа),  ниже  приводится
модифицированная программа моделирования часов:
          10 REM FIRST WE DRAW THE CLOCK FASE
          20 FOR X=1 TO 12
          30 PRINT AT 10-10*COS(N/6*PI),16+12*SIN(N/6*PI);N
          40 NEXT N
          50 DEF FN T()=INT((65536*PEEK 23674+256*PEEK 23673+PEEK
             23672)/50):REM NUMBER OF SEKOND SINC START
         100 REM NOW WE START THE CLOCK
         110 LET T1=FN T()
         120 LET A=T1/30*PI:REM A IS THE ANGLE OF THE SECOND HAND
             IN RADIANS
         130 LET SX=72*SIN A:LET SY=72*COS A
         140 PLOT 131,91:DRAW OVER 1: SX,SY:REM DRAW HAND
         200 LET T=FN T()
         210 IF T<=T1 THEN GOTO 200:REM WAIT UNTIL TIME FOR NEXT
              HAND
         220 PLOT 131,91:DRAW OVER 1: SX,SY:REM RUB OUT OLD HAND
         230 LET T1=T:GOTO 120
    Эти часы обеспечивают точность 0,001% или уход на 10 секунд в
день, однако,  это возможно при условии,  что вы не использовали
оператор BEEP, ввод/вывод на магнитофон и принтер. Все эти опера-
ции увеличивают погрешность.
    Числа  PEEK 23674,  PEEK 23673 и PEEK 23672  выделяют  адреса
ячеек  памяти компьютера  и используемых для подсчета 1/50  долей
секунды, в каждой из ячеек подсчитывается сумма от 0 до 255.  По
@l@@P                              - 64 -
достижения  величины 255 в любой из ячеек,  она сбрасывается в 0.
Первой начинает отсчитывать ячейка PEEK 23672,  каждые 10 сек  ее
содержимое увеличивается на 1,  когда в ячейке накопится величина
равная 255, то она сбрасывается в 0, а значение ячейки PEEK 23763
увеличивается  на  1,  через каждые 256/50 сек.  содержимое  этой
ячейки  переходит из состояния 255 в 0, а содержимое ячейки  PEEK
23674 увеличивается на 1.
    При  значениях 0 для ячейки PEEK 23674 и 255 для  ячеек  PEEK
23673  и PEEK 23672 (этот момент наступит через 21 минуту)  наше
выражение примет значение:
              (55536+256*255+255)/50=1310.7
но  здесь  имеется скрытая опасность,  через следующую 1/50  сек
ячейки будут содержать следующие значения: 1, 0, 0.
    Пока производится вычисление выражения,  компьютер может оце-
нить значение ячейки PEEK 23674 как 0 до завершения  циклического
переноса, в результате получим:
               (65536*0+256*0+0)/50=0
что безнадежно неверно.
    Простое правило решить эту проблему:
    "Следует вычислять выражение дважды в некоторой последователь-
ности и использовать сохраненный ответ"
Пример:
         10  DEF FN M(X,Y)=(X+Y+ABS(X-Y))/2:REM THE LANDER OF AND Y
         20  DEF  FN  U()=(65536*PEEK  23674+256*PEEK  23673+PEEK
             23672)/50:REM TIME, MAY BU WRONG
         30  DEF FN T()=FN M(FN U(),FN U()):REM TIME RIGHT
    Вы  можете  изменять значения числовых счетчиков  так,  чтобы
получать  реальное  время  того  момента,   когда  компьютер  был
включен. Например, надо установить 10 часов вечера, вы посчитали,
что 12*60*50=180000  50-X долей секунды и значит:
         180000=65536*27+256*119+64
    Для присвоения трем ячейкам значения 27,  119 и 64 необходимо
выполнить:
         POKE 23574,27:POKE 23673,119:POKE 23672,64
    Функция INKEY$ (без аргументов) считывает с клавиатуры.  Eсли
вы нажали некоторую клавишу (или SHIFT и какую нибудь клавишу),
результатом  будет  символ,  который имеет эта клавиша  в  режиме
маркера , или пустая строка.
    Выполните программу которая использует эту функцию:
           10 IF INKEY$ <> " " THEN GOTO 10
           20 IF INKEY$=   " " THEN GOTO 20
           30 PRINT INKEY$;
           40 GOTO 10
    Помните,  что  функция  INKEY$ не будет подобно  INPUT  ждать
вас, если вы не выполните ввод, то считайте, что ваш шанс упущен.
Глава 19
          П Р О Г Р А М М И Р О В А Н И Е   З В У К О В
Краткое содержание: BEEP
    ZX  SPEKTRUM может воспроизводить звуки при помощи  оператора
BEEP:
            BEEP продолжительность, высота звука.
где  '  продолжительность' и 'высота  звука'  некоторые  числовые
выражения.  Продолжительность  задается  в секундах,  а высота  в
полутонах от основного тона 'до': при положительных числах - выше
ноты  'до'  а при отрицательных - ниже ноты  'до'.  на  диаграмме
приведены все значения нот одной октавы:
 ?     ?   ?   ? C#? ? D#?  ?  ? F#? ? C#? ? A# ?  ?  ?   ? ?   ?
 ?     ?   ?   ? DB? ? EB?  ?  ? CB? ? AB? ? BB ?  ?  ?   ? ?   ?
 ? -2  ?   ?   ? 1 ? ? 3 ?  ?  ? 5 ? ? 6 ? ? 10 ?  ?  ? 13? ? 15?
 А--В--Щ   ?   А-В-Щ А-В-Щ  ?  А-В-Щ А-В-Щ А--В-Щ  ?  А-В-Щ А-В-Щ
    ?      ?     ?     ?    ?    ?     ?      ?    ?    ?     ?
    ?      ?     ?     ?    ?    ?     ?      ?    ?    ?     ?
    ?      ?     ?     ?    ?    ?     ?      ?    ?    ?     ?
ля  ? си   ? до  ? ре  ? ми ? фа ? соль? ля   ? си ? до ?  ре ?  ми
-3  ?  -1  ?  0  ?  2  ? 4  ?  5 ?   7 ?   9  ? 11 ? 12 ?  14 ?  16
----Б------Б-----Б-----Б----Б----Б-----Б------Б----Б----Б-----Б----
              C     D     E     F    G     A      B     C
    Для получения более высоких или более низких нот,  вы  должны
прибавить или отнять 12 для каждой октавы вверх или вниз.
Например:
              10 PRINT "FRERE CUSTAV"
              20 BEEP 1,0:BEEP 1,2:BEEP .5,3:BEEP .5,2:BEEP 1,0
              30 BEEP 1,0:BEEP 1,2:BEEP .5,3:BEEP .5,2:BEEP 1,0
              40 BEEP 1,3:BEEP 1,5:BEEP 2,7
              50 BEEP 1,3:BEEP 1,5:BEEP 2,7
              60 BEEP.75,7:BEEP .25,8:BEEP.5,7:BEEP.5,5:BEEP.5,3:
                 BEEP .6,2:BEEP 1,0
              70 BEEP .75,7:BEEP.25,8:BEEP .5,7:BEEP.5,5:BEEP.5,3
                 BEEP .5,2:BEEP1,0
              80 BEEP 1,0:BEEP 1,-5:BEEP 2,0
              90 BEEP 1,0:BEEP 1,-5:BEEP 2,0
    Когда  вы запустите эту программу вы услышите похоронный марш
из  первой  симфонии мольера,  ту часть,  когда  гоблины  хоронят
рыцаря,  запись начала этой мелодии в ключе до-минор с  указанием
значений нот приведена на рисунке:
28
19
17 ------------------?-----------------?-----------?---------
15                   ?                 ?        ?  ?
14 ---------?--------?--------?--------?-----?--?--?-----?----
12          ?        ?        ?        ?  ?  ?  ?  ?  ?  ?
10 ------?--?--?-----?-----?--?--?-----?--?--?--?--?--?--?
 8       ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
 7 ---?--?--?--?--?--?--?--?--?--?--?--?--?--?--о--?--?--?
 5    ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  *     ?  ?  *
 3 ---?--?--*--?--?--?--?--?--*--?--?--?--*--------?--*----
 2    ?  *     *  ?     ?  *     *  ?
 0   -*-         -*-   -*-         -*-
      0  2  3  2  0     0  2  3  2  0     3  5  7     3  5
    Если  вы желаете исполнить мелодию в другом ключе,  вы должны
вставить  в выражение некоторую переменную  'KEY',  например  для
второй строки программы:
     20 BEEP 1,KEY+0:BEEP 1,KEY+2:BEEP .5,KEY+3:BEEP .5KEY+2:
        BEEP 1,KEY+0
    Теперь,  при  выполнении  этой программы вы можете  присвоить
переменной 'KEY' значения: 0 -для до-минор, 2 -для ре-минор, 12 -
для до-минор верхней октавы и т.д.  переменная 'KEY' может  также
принимать значения кратные 1/2, 1/4, и т.д.
    Таким  же  образом можно изменять и длительность звучания  но
помните,  что компьютер может одновременно исполнять только  одну
ноту, что не позволяет воспроизводить сложные мелодии.
    Попробуйте  запрограммировать собственную мелодию,  начните с
самой простой, если вы не знаете нотной грамоты можете изучать ее
прямо на компьютере, например фрагмент программы:
            FOR N=0 TO 1000:BEEP .5,N:NEXT N
будет исполнять последовательно ноты до предельно высоких и завер-
шится  сообщением  об ошибке 'B',  вы можете  также  параллельно
выводить значения 'N', чтобы знать значение исполняемой ноты.
    Фрагмент программы:
        10 BEEP.5,0 :BEEP .5,2 :BEEP.5,4:BEEP .5,5:BEEP .5,7:
           BEEP.5,11:BEEP .5,12:STOP
исполняет гамму до-минор,  в которой используются чистые ноты  от
среднего  до  до верхнего до,  однако в этой гамме  неестественны
интервалы, скрипач бы исполнил ее так:
         10 BEEP .5,0   :BEEP .5,2.039:BEEP .5,3.86 :BEEP .5,4.9:
            BEEP .5,7.02:BEEP .5,8.84 :BEEP .5,10.88:BEEP .5,11 :
            BEEP .5,12:STOP
    Эти же интервалы будут естественными для гаммы исполняемой  в
любом ключе, отличном от ДО.
    Некоторая  музыка,  например индийская,  использует интервалы
меньшие чем полутон,  вы можете без особого труда  запрограммиро-
вать  это в операторе BEEP,  например для звука на четверть  тона
выше среднего до надо указать значение звука равное,5.
    Вы можете сделать клавиатуру компьютера клавишами музыкально-
го инструмента выполнив переключение:
          POKE 23609,255
второе число здесь определяет продолжительность нахождения в этом
состоянии (по  20 FOR  его от 0 до 255).
    Можно  также вывести музыку на внешние устройства,  подключая
их к выходным разьемам 'MIC' и 'EAR'.



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Наш гость - Wolf Soft Group из Магадана.
BBS - список станций BBS ZXNet.
Мыльница - Errata: ошибки в Info Guide #11, ACNews #65.
История - Один день из жизни SEMEN'a.
Специальный выпуск - Международный Фестиваль компьютерного искусства Chaos Constructions '999.

В этот день...   21 ноября