|
Звук в программах на БейсикеСегодня звуковое сопровождение является неотъемлемой частью многих компьютерных программ. В первую очередь нужно отметить игры. Другой пример — специальные программы для обучения иностранному языку, где пользователю предоставляется возможность не только услышать правильное (записанное в соответствующей стране) произношение слов, но и самому попрактиковаться в устной речи (звук с микрофона подается в компьютер, где происходит сравнение произношения обучаемого с “эталонным” и на экран выводится наглядный график). Как известно, в операционной системе Windows можно к тем или иным действиям (открытие программы и т.п.) “привязать” определенные звуковые эффекты. Конечно, пользоваться готовыми высококачественными программами всегда приятно, но интересно было бы и самим научиться использовать звук в своих разработках. Ведь даже в сугубо расчетной программе, например, служащей для вычисления корней квадратного уравнения, звук может сыграть важную роль для индикации различных ситуаций; если же расчеты по программе занимают значительное время, очень удобно подать звуковой сигнал по их окончании — пользователь может, задав исходные данные, отлучиться от монитора, и компьютер сам “позовет” его, когда все будет готово. Давайте посмотрим, какими возможностями мы располагаем для решения этой задачи при разработке программ на языке Бейсик. “Звуковых” операторов в Бейсике три: PLAY, SOUND и BEEP. Первый из них наиболее сложен и служит для воспроизведения закодированных нотных записей, в том числе с имитацией многоголосности, изменения громкости (но это всего лишь имитация — ведь амплитуда подаваемых на динамик цифровых импульсов остается постоянной) и даже позволяет обеспечить звучание мелодии одновременно с отработкой компьютером других команд программы. Общий формат данного оператора следующий: PLAY <текстовая строка или имя символьной переменной> Текстовая строка (записанная в кавычках как символьная константа или содержащаяся в указанной символьной переменной) кодирует ноты и музыкальные эффекты с помощью символов латинского алфавита, цифр и математических знаков (их перечень и назначение показаны в таблице). В операторе PLAY допускаются и более сложные возможности, например, вызов фрагментов по команде X + VARPTR$(<строка>) или отдельное управление звуковым буфером с помощью команд PLAY ON, PLAY OFF, PLAY STOP, но их мы здесь рассматривать не будем. Таким образом, оператор PLAY чаще всего используется именно для воспроизведения мелодий, хотя при желании можно и реализовать с его помощью некоторые не очень сложные звуковые эффекты: CONST Cuckoo$ = "T45L16MLO3BF#" CONST Zap$ = "T255L64MLO4BAGFEDC<BAGFEDC<BAGFEDC<BAGFEDC<BAGFEDC" CONST Tifweet$ = "T255L32O4MLDGD<G>DGDDGDGBAGF#EE" CONST Zang$ = "T255L64MLO2BCADGEFEGDACBCADGEFEGDACB" CONST Downer$ = "T150L64MSO4BGEC<AFL16D" CONST UpScale$ = "T150L64MSO3DFA>CEGL16B" CONST Tweedle$ = "T240L64MLO4EGEGEGCFCFCFGEGEGE" CONST Whoople$ = "T255L64O4CDEFGABO3CDEFGABO2CDEFGAB" CONST Bongee$ = "T255L64MLO1BAGFEDC<BAGFEDCP16>CDEFGAB>CDEFGABP32" CONST Uhoh$ = "T255L64MLO1CDEFGAB>CDEFGABP16<BAGFEDC<BAGFEDCP32" CONST BobWhite$ = "T120L16O4C#P16T255L64MLC#DD#EFF#GG#AA#BO5CC#DD#EF" CONST Whung$ = "T255L32MLO3CD<CD>>CD<<CD>>CD<<CD>CD" CONST Phone$ = "T240L64MLO4EGEGEGEGEGEGEGEGEGEGEGEGEGEGEG" CONST Tweet$ = "O4T255L64MLB-BB-BAGAG>EGG>EGG" CONST Wolf$ = "T200L64MLO4C#DD#EFF#GG#AA#B>CC#DD#EFP8<C#DD#EFF#GG#AA#B>CC#DD#EFFED#DC#C <BA#AG#GGF#FED#DC#" CONST Fweet$ = "T255L64MSO4C#DD#EFF#GG#AA#B>CC#DD#EF" Вызвать любой из них можно командой PLAY <имя переменной>, например, команда PLAY Phone$ довольно точно имитирует звонок телефонного аппарата. Однако, как легко видеть, самостоятельное кодирование звуковых эффектов — задача достаточно сложная для новичка и требующая определенного (даже можно сказать — специфического) навыка. Другой оператор Бейсика — SOUND — несколько проще “в обращении” и позволяет воспроизвести один звук с указанной частотой и длительностью: SOUND <частота>, <длительность> Частота указывается в герцах (от 37 до 32 767), а длительность — количеством отсчетов внутреннего таймера компьютера в течение требуемого времени звучания (от 0 до 65 535, причем в одной секунде “укладывается” 18,2 отсчетов таймера). Нулевая длительность означает выключение звука. Этот оператор напрямую предназначен для получения звуковых эффектов, но здесь для этого потребуется организовать его циклический вызов. Примеры нескольких эффектов приведены ниже (предлагаю читателям воспроизвести соответствующие звуки в программе, придумать для каждого звука название и прислать названия в редакцию). '1 FOR I = 800 TO 2000 STEP 100 SOUND I, .2 NEXT I FOR I = 2000 TO 50 STEP -100 SOUND I, .2 NEXT I '2 FOR I = 1000 TO 40 STEP -20 SOUND I, .2 NEXT I '3 FOR I = 10 TO 50 STEP 10 FOR J = 50 TO 10 STEP -10 SOUND I * I + J * J, .1 NEXT J NEXT I '4 FOR Z = 1 TO 100 SOUND (SIN(Z) + 40) * 50, .2 NEXT Z ’5 FOR I = 30 TO 60 STEP 10 FOR J = 60 TO 30 STEP -10 SOUND I * J, .2 NEXT J NEXT I '6 FOR Z = 1 TO 45 SOUND (SIN(Z) + 20) * 30, .2 NEXT Z '7 FOR Y = 100 TO 80 STEP -1 SOUND (TAN(Y) + 36) * 25, .8 SOUND (SIN(Y) + 20) * 50, .4 NEXT Y '8 FOR Y = 100 TO 80 STEP -1 SOUND (TAN(Y) + 50) * 25, .4 NEXT Y '9 FOR Y = 1 TO 10 SOUND 1195, .4 SOUND 2571, .4 NEXT Y '10 FOR Y = 1 TO 3 SOUND 550, 9 SOUND 400, 9 NEXT Y '11 FOR Z = 3 TO 12 SOUND 120 + Z ^ 4, .1 SOUND 0, .1 NEXT Z '12 FOR Z = 12 TO 3 STEP -1 SOUND 120 + Z ^ 4, .1 SOUND 0, .1 NEXT Z '13 FOR I = 40 TO 15 STEP -1 SOUND I * 90, .1 SOUND I * 80, .1 SOUND I * 70, .1 SOUND I * 60, .1 SOUND I * 50, .1 NEXT I '14 FOR I = 1 TO 10 SOUND 1195 — 50 * I, .3 SOUND 1195 + 50 * I, .3 NEXT I '15 FOR I = 0 TO 150 STEP 10 SOUND 1295 — I, .4 SOUND 1095 + I, .4 NEXT I '16 FOR I = 1 TO 20 SOUND I * 50, .1 SOUND I * 100, .1 SOUND I * 150, .1 NEXT I '17 FOR I = 10 TO 50 STEP 10 FOR J = 50 TO 10 STEP -10 SOUND I * J, .1 NEXT J NEXT I Легко видеть, что оператор SOUND является более гибким (по сравнению с PLAY) средством получения звуковых эффектов хотя бы потому, что не ограничивает частоты получаемых звуков только музыкальными тонами. Но самостоятельное создание новых эффектов здесь не менее сложно, чем в PLAY, да и фрагменты программы более громоздки. Что же касается последнего из “бейсиковских” операторов для работы со звуком — BEEP, то он позволяет выдавать только простейший звуковой сигнал, обычно используемый в расчетных программах для сообщений об ошибках. Частота и длительность этого сигнала определяются средствами BIOS. От редакции1. Мы поддерживаем предложения автора в части названий звуков и ждем ваших ответов. Читателям, знакомым с языком Паскаль, сообщим, что аналогом оператора SOUND в этом языке является сочетание трех операторов: SOUND, DELAY и NOSOUND. 2. Читателям, имеющим музыкальное образование, предлагаем подготовить программы, воспроизводящие фрагменты музыкальных произведений (известных или собственного сочинения), и также прислать их в редакцию. Дм. Юр. Усенков |