11. УПРАВЛЕНИЕ ЗВУКОМ

Возможность записывать, а потом воспроизводить звуковые комментарии или фоновую музыку тоже можно отнести к средствам общения с пользователем. Для реализации этой возможности разработана команда #sound или короче #so. Эта команда позволяет программисту включать в программу операции с звуковыми файлами. Хотя уже существует много программ, проигрывающих и записывающих звук, полезно иметь эти средства в рамках единого общего инструмента, каким является программа vkACL. Главные цели операций со звуком -- это (1) записывать звук (обычно речь пользователя) с микрофона и спасать его в файл, (2) изменять параметры записанного звука с целью регулировать размер файла и свойства звука, (3) проигрывать звук как фон при показе изображений, (4) делать полномасштабную презентацию с картинками и звуком. Данная команда реализует только две операции из этого набора, а именно, rsf (record sound file) и psf (play sound file). Первая операция записывается так

 #so [op=rsf; xsh=; ysh=; rat=; siz=; mo=; sty=; b=; le=;]

Она дает возможность пользователю записать произвольное число звуковых клипов и спасти их в различных файлах. Она открывает диалог, который позволяет пользователю выбрать имя файла (без расширения) и сделать запись. В процессе записи показывается прошедшее время. Диалог имеет простую и легкую для работы структуру. Размер окна диалога фиксирован, а положение на экране задается параметрами [xsh] и [ysh] (отсчитывая от левого верхнего угла экрана). Качество записываемого звука задается через параметры [rat] (rate), [siz] (size) и [mo] (mode). Параметр [rat] определяет SoundFrameRate как число равное обычно 8000, 11025, 16000, 22050 и 44100. Последнее значение соответствует качеству CD, первое используется для записи речи. Конечно это значение может быть произвольным, но другие значения не удовлетворяют стандартам. Параметр [siz] определяет SoundFrameSize как число равное 8 или 16 (один или два байта). Третий параметр [mod] может быть 1 для записи моно звука или 2 для записи стерео звука. Все три параметра задают формат записи звука. Программа использует PCM (pulse code modulation) кодировку и это изменить нельзя.

Параметр [sty], с другой стороны, задает тип файла для записи звука. Он может быть равен 1 для WAVE (расширение .wav), 2 для AU (расширение .au), и 3 для AIFF (расширение .aif). Другие форматы файлов не поддерживаются. Файлы будут записаны в "рабочую" папку интерпретатора. Диалог имеет кнопку [Help], при выборе которой на экране показывается текст, записанный предварительно в текстовый массив t() начиная с индекса [b] и числом знаков [le]. Иными словами данная операция вызывает готовую программу с ограниченными возможностями, но все же кое-что программист варьировать может. Программа позволяет записать сразу много звуковых файлов через микрофон, что очень удобно для записи звуковых комментариев к автоматическому показу слайдов или анимации (см. далее). Вторая операция

 #so [op=psf; c=; n=; siz=; sty=; mo=; le=;] FT FT ...

позволяет пользователю проигрывать звук из файлов в "рабочей" папке интерпретатора. Она может проигрывать несколько файлов по очереди и изменять параметры звука при проигрывании. Число файлов для проигрывания определяется параметром [n]. Имена файлов указываются как аргументы команды (форматированный текст), каждое имя в отдельном аргументе. Параметр [c] задает канал звучания от 1 до 10. Если запустить сразу несколько проигрывателей по различным каналам, то звук будет накладываться создавая эффект работы сразу нескольких проигрывателей. Параметр [siz] определяет громкость звучания, которая может быть и громче и тише записанной в файле. Исходный звук проигрывается если [siz=100;]. Меньшее или большее значения будут модифицировать громкость. Отмечу, что MIDI файлы не могут быть громче и для них [siz] может быть только меньше или равно 100. Файлы типа WAVE, AU, AIFF могут быть громче. Другие типы файлов не проигрываются.

Параметр [sty] определяет свойство, называемое PAN, которое позволяет перенаправлять звук между двумя динамиками. Обычно [sty=0;]. Область значений для [sty] находится между -100 и +100. Если [mo=0;] файлы будут проигрываться только один раз, в противном случае, например, если [mo=1;], файлы будут повторяться в цикле. В этом случае звук можно остановить только командой #ini. Эта команда восстанавливает нормальную работу циклов, если она была заблокирована тем или иным способом и выключает все звуковые проигрыватели. Использовать эту команду можно разными способами. Но пока до сих пор не реализован механизм опроса сигналов с клавиатуры есть только один способ. Прежде чем запускать команду #so [op=psf;] открыть анимационное окно командой #ag [op=o;] (см далее). Затем организовать циклы, чтобы удержать программу в работе. Если поместить после этого команду #ini, то при закрытии анимационного окна все циклы перед #ini будут заблокированы, команда #ini остановит звук. Это удобно, потому что как раз анимация обычно сопровождается музыкой и остановка анимации будет автоматически останавливать звук. Параметр [le] влияет на звуковой процесс необычным образом. Его обычное значение равно 100 (или 99). Изменение к другому значению приводит к некоторым эффектам и может быть протестировано эмпирически. Отмечу, что нормальный звук получается только если число открытых окон на экране и число проигрывателей минимально и программа не делает тяжелой вычислительной работы. Причиной может быть уменьшение свободной памяти, что влияет на загрузку компьютера.

В заключение следует отметить, что эта команда и ее операции были разработаны давно, во время работы с версией Java 1.4.2. При работе с Java VM этой версии вторая операция (проигрыватель) продолжает работать нормально. Но программа уже не способна запускать эту версию JVM. Однако при работе с версией Java VM после 1.6.0u4 операция psf не работает. При этом никаких изменений в описании самого языка Java не сделано. Скорее всего это просто ошибка разработчиков виртуальной машины. Как на это реагировать я так и не понял.