ß                                Программирование структур звукового оформления

 

Адрес документа:

http://shabronov_s2.dyn-dns.ru/temp/gr_mi38_37_mp7_sh/gr_mi38_37_mp7_sh.doc  инд 2-95-1-л7

 

В данной лекции рассматривается  программирование  вариантов звуковой тревожной сигнализации с помощью файлов форматов звука.  Применение звуковых файлов разных форматов. Особенности звуковых файлов.  Рассматриваются методы создания удобных для программиста способов работы.

 

Содержание:

 

 

«Что на месте лежит, то само в руки бежит»  Чем  создать удобства в работе с программой.

 

В процессе подготовки программ, каждый  сталкивается с ситуацией, что ему, что-то неудобно или он так делать не привык!  Например:

 И так далее… 

 

Ситуация простая. Где хранить и как использовать накопленный опыт обучения?

 

Где хранить –  хранить  в файлах. В текстах программ, которые Вы сами создали или изменили под свою задачу. Где хранить файлы  - это уж Ваша «головная боль».

Но основное правило – места хранения должны быть ФИЗИЧЕСКИ НЕЗАВИСИМЫЕ. Например: на своем компьютере, на «флешке», на отдельном жестком диске. Хранить  файлы в одном месте – это «носить яйца в одной корзине».

 

Как использовать -  подключать словом  INCLUDED 

Варианты подключения  файлов текстов  программ:

Если доступны файлы по сети, то допускается и сетевой подключение.

Необходимо учитывать  доступ к файлам по сети. Варианты доступа – читаться и писаться. Шутка автора - не путайте ударение. А так же, администратор совсем не допустит к Вашей папке на компьютер. Вывод – надо дружить с администратором. 

Конструкция  S” …..любой текст ….”    - называется литералом.

·         При компиляции программы, т.е. подготовки программы, резервируется область памяти в теле программы, которая имеет Аn – адрес начала  текста, и Ni – количество  байт введенных символов.

·         При выполнении программы – на стек выдается Аn Ni – адрес и количество байт, где находиться текст.

Таким образом, для дальнейших функций и выполняемых слов все подготовлено.

Литералом может быть и путь к  файлу подключения библиотеки, и просто сообщение в меню.  Возможны варианты использования литерала как хранилище данных и небольших переменных до 8 0x10 байт.  Все зависит от Вашей задачи.

                     

Пример 1.  Подключение библиотеки  test_muz1.f  для файла  test2.f   Два  файла расположены рядом c компилятором.

 Скопировать в два файла  и скомпилировать программой компилятора forth.

\ начало  текста  test_muz1.f

\ Выполнение музыкального нажатия клавиш

\  подключение функций системы для формирования звуковых  колебаний, т.е. генерации сигналов.

WINAPI: MessageBeep   USER32.DLL ( пищание системного динамика )

WINAPI: Beep KERNEL32.DLL        ( ФУНКЦИЯ  т-МС  F-ГЦ -- )

: ZWUK (   Т-мс F-гц --- )   Beep DROP  ;

DECIMAL

: test_muz1  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

CR   S"  Для выхода из программы нажать клавишу ПРОБЕЛЛ, для продолжения любую другую "  ANSI>OEM TYPE 

 1  ( K -- )

BEGIN

    0x10 *  100  SWAP

    2DUP . .    ZWUK

    KEY DUP 0x20 = UNTIL  ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )

;

\EOF 

Инетерпретатор прекращает работу и закрывает файл.

После  слова \EOF можно писать любые  тексты и сообщения  

Наклонная черта не требуется

Обратите внимание что в библиотеки последнее  слово -  test_muz1

Оно может быть исполняемым,  если его включить в комиляцию exe. Если в MAIN не указать, звуков не будет

текст программы окончен.

 

---------------------------

 

\ начало  текста  test2.f

 S" test_muz1.f"  INCLUDED    ( подключаем текст файла  test_muz1.f )

: MAIN 

  test_muz1 (  исполняемое слово меняем на обозначеное в библиотеке )

 ;

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\ текст программы окончен.

 

Рассмотрим варианты расположения исходных файлов библиотек  текстов и получение конечного продукта – исполняемого файла.

  1. Вариант выходной исполняемый файл – рядом с главным словом компиляции.

 

 

Библиотеки подключаются по мере требований для решения задачи. Скомпилированное слово находиться в корне. Рядом с главным файлом компиляции. При таком варианте подготовки программ  главное слово – является сутью задачи. 

Исполняемый файл получается рядом. Возможные подключаемые библиотеки в подкаталогах. Удобно расширять и изменять.

Минус такого решения -  на каждую задачу придется «готовить» главное слово.  Надо сохранять все библиотеки.

 

  1. Вариант входной задачи и выходного файла в отдельном каталоге, а у программиста свой каталог с подключаемыми библиотеками.  

 

Вариант второго решения более удобен, т.к. позволяет накапливать опыт в решениях своих задач.

Переход от задачи к задаче – осуществляется лишь подключением новой библиотеки в главном слове

S” \zadacha2\zadach2.f” INCLUDED  

Далее выполняется компиляция библиотек, которые работали ранее. Затем отрабатывается новая задача. Программист знает, что работает не с нуля. И всегда может проверить исполнение или вернуться к прежней задачи.

Хранить требуется весь каталог с библиотеками своих реализаций и задачами.

 

  Отвлечение руководителя анекдот - на лекции не озвучивать;

·          Главным фактором при выборе нижнего белья должно быть удобство - то есть ей удобно это носить, ему - снимать.

 

Алгоритм  звукового оформления мониторинга;

Основная задача алгоритма -  выбор звука по событию. Например:

 

Ниже алгоритм последовательной проверки и выдача звукового отклика.

Пример 2.  Звуковые тревожные события находятся в подкаталоге muz_trw  в формате mid. Скачать архив zip и  распаковать  в месте работы программы.   Текст программы приведен ниже в таблице.  Нажатие клавиш 1 2 3 …9  вызывает соответствующую  «тревожную» мелодию. Скомпилировать программой компилятора forth.

 

\ начало  текста  test2.f   выполнение тревожных музыкальных сообщений из библиотеки тревог файлы формата mid

 

 WINAPI: SetConsoleCursorPosition KERNEL32.DLL ( установка курсора )

 WINAPI: mciSendStringA           WINMM.DLL ( выдает звуковые файлы )

 WINAPI: MessageBeep              USER32.DLL ( пищание системного динамика )

 WINAPI: Beep                     KERNEL32.DLL  ( ФУНКЦИЯ  т-МС  F-ГЦ -- )

 WINAPI: CopyFileA                KERNEL32.DLL  (  копирование файлов  по их наименованию  )

 

 

: ZWUK (   Т-мс F-гц --- )   Beep DROP  ;

: PAUSE1 ( N --> пауза в N  милисекунд 0> )  Sleep DROP  ;  (  формирование паузы )

: COPY-FILE  ( A1n n  A2n n -- 0=ERR  -1 <> OK   копирование 1го в 2ой файл )

   DROP SWAP DROP SWAP   (  A1n A2n -- )  0 -ROT    CopyFileA (  pz  -- 0=ERR  -1 <> OK  )  

  ;

 

: ?KEY1  ( K --> код клавиши )

   KEY?  ( читать признак события ) IF KEY ( PENDING-CHAR @ -->   действие читать код ) ELSE 0 THEN

  ;

 

 

CREATE BUF_ADR_MUZ  0x4 0x9 * ALLOT (  заняли 9 слов по 4 байта )

 

: MUZ1  S" muz_trw\muz1.mid" ;   ' MUZ1  BUF_ADR_MUZ  0 4 * + !   (  сохранили адрес )

: MUZ2  S" muz_trw\muz2.mid" ;   ' MUZ2  BUF_ADR_MUZ  1 4 * + !   (  сохранили адрес )

: MUZ3  S" muz_trw\muz3.mid" ;   ' MUZ3  BUF_ADR_MUZ  2 4 * + !   (  сохранили адрес )

: MUZ4  S" muz_trw\muz4.mid" ;   ' MUZ4  BUF_ADR_MUZ  3 4 * + !   (  сохранили адрес )

: MUZ5  S" muz_trw\muz5.mid" ;   ' MUZ5  BUF_ADR_MUZ  4 4 * + !   (  сохранили адрес )

: MUZ6  S" muz_trw\muz6.mid" ;   ' MUZ6  BUF_ADR_MUZ  5 4 * + !   (  сохранили адрес )

: MUZ7  S" muz_trw\muz7.mid" ;   ' MUZ7  BUF_ADR_MUZ  6 4 * + !   (  сохранили адрес )

: MUZ8  S" muz_trw\muz8.mid" ;   ' MUZ8  BUF_ADR_MUZ  7 4 * + !   (  сохранили адрес )

: MUZ9  S" muz_trw\muz9.mid" ;   ' MUZ9  BUF_ADR_MUZ  8 4 * + !   (  сохранили адрес )

: MUZ10 S" muz_trw\muz10.mid" ;  ' MUZ10 BUF_ADR_MUZ  9 4 * + !   (  сохранили адрес )

\ имена звуковых файло могут быть разные и при необходимости они корректируются

\ но их адрес сохранения идет по порядку  и используется при открытии файла

 

CREATE   M_LEN1    0x100 ALLOT  ( память для выдачи звуков  в теле программы доступна )

: BEEP_M3 (  цыганочка с выходом вар 3  )

  8 0 DO   0x80 I 0x10 * +  0x400 I 0x100 * + ZWUK     LOOP

   ;

  

: OUT_MUZ_FRAGMENT ( Amuz  --  вкл откл   проигрывание, на входе адрес названия файла в каталоге )

        @  EXECUTE   ( An n -- )

       S" muz.mid"      COPY-FILE  ( A1n n  A2n n -- 0=ERR  -1 <> OK   копирование  файлов )

       0= M_LEN1 @  0= AND  ( 1й признак нет файлов и 2ой -признак память буфера музыки 0= т.е первый запуск )

         IF  S"  <--  нет файлов! Внимание не обнаружен каталог !" ANSI>OEM TYPE BEEP_M3   EXIT THEN

              ( An n -- файл скопирован в рабочий каталог он разный по размеру, но имя одно и тоже  muz.mid )

       0 0x100  M_LEN1   S" OPEN muz.mid ALIAS MUSIC"  DROP   mciSendStringA ( P1 ok --> ) 

       0= IF     0 0x100  M_LEN1   S" PLAY MUSIC"   DROP  ( Ai 0  n Аn --> )  mciSendStringA   DROP

                 0 0x100  M_LEN1   S" status MUSIC  Mode" DROP                mciSendStringA   DROP

                 S"  ВКЛЮЧЕНО ОПОВЕЩЕНИЕ "

         ELSE    0 0x100  M_LEN1  S" STOP MUSIC"  DROP  ( Ai 0  n Аn --> )    mciSendStringA   DROP

                 0 0x100  M_LEN1  S" CLOSE MUSIC"  DROP  ( Ai 0  n Аn --> )   mciSendStringA   DROP

                 S"  выключено оповещение"

        THEN  ANSI>OEM TYPE 

         ;

 

: KONTROL_MUZ_TRWG ( K -- контроль и выдача по звуку мелодии )

  0x9 0 DO I  0x31 +  OVER = IF  I 4 *  BUF_ADR_MUZ +  ( A -- мuz-филе  --  ) DUP @  EXECUTE ( Amuz  An n -- )

             CR   TYPE  ( смотрим название файла ) OUT_MUZ_FRAGMENT (  Amuz --  вкл/выкл музыкальный файл  )

                             THEN    LOOP  ( K -- )   DROP   ( -- )

;

 

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

 \   STARTLOG ( ВКЛЮЧИТЬ ФАЙЛ ОТЧЕТА SPF.LOG )

 \   ENDLOG (  выключить файл отчета )   

CR   S" Для выхода из программы нажать клавишу ESC "  ANSI>OEM TYPE 

CR   S" Тревога по нажатию цифровых клавиш 1...9   "  ANSI>OEM TYPE 

 1  ( K -- )

 BEGIN  ( k - код клавиши в стеке )

    KONTROL_MUZ_TRWG ( K -- контроль и выдача по звуку мелодии )

    0x100 PAUSE1  (  иммитируем работу получения данных )

    ?KEY1 DUP 0x1B = UNTIL     DROP  BYE

 ;

 

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\  текст программы окончен.

 

 

  Отвлечение руководителя анекдот - на лекции не озвучивать;

·          Если орбитальная космическая станция "Мир" имела все удобства - то почему космонавты всё время выходили в открытый космос?

·         Функция mciSendStringA  имеет много возможностей для воспроизведения и записи. Команды приведены в литературе. В данной реализации все команды задаются литералом через определение S” < тело литерал >”   Поскольку, литерал в форт слове имеет и длину – он убирается командой DROP.  Для выполнения функции в среде windows-api достаточно только адреса, но обязательно выделенное поле памяти с кодами литерала должно заканчиваться байтом нуля. Таким образом Windows определяет размер заданной области памяти.

 

Пример 3  Воспроизведение звуков файла формата WAV   Используем пример 2 как библиотеку. Для этого сформируем файл test_bibl_muz.f     в который и поместим пример 2 до слова =MAIN=     Поместим файлы wav и библиотеку в каталог liber1 Скачать  архив zip и поместить в место работы программы.  Скомпилировать программой компилятора forth.

 

 

\ начало  текста  test2.f   выполнение тревожных музыкальных сообщений из библиотеки тревог файлы формата wav

S" liber1\test_bibl_muz.f"   INCLUDED    ( подключаем текст файла библиотеки с музыкой  )

 

: OUT_WAV ( An n -- )

 S" muz.wav"      COPY-FILE  ( A1n n  A2n n -- 0=ERR  -1 <> OK   копирование 1го в 2ой файл )

   0= M_LEN1 @  0= AND  ( 1й признак нет файлов и 2ой -признак память буфера музыки 0= т.е первый запуск )

         IF  S"  <--  нет файлов! Внимание не обнаружен каталог !" ANSI>OEM TYPE BEEP_M3   EXIT THEN

       0 0x100  M_LEN1   S" OPEN muz.wav ALIAS MUSIC"  DROP   mciSendStringA ( P1 ok --> ) 

       0= IF     0 0x100  M_LEN1   S" PLAY MUSIC"   DROP  ( Ai 0  n Аn --> )  mciSendStringA   DROP

                 0 0x100  M_LEN1   S" status MUSIC  Mode" DROP                mciSendStringA   DROP

         ELSE    0 0x100  M_LEN1  S" STOP MUSIC"  DROP  ( Ai 0  n Аn --> )    mciSendStringA   DROP

                 0 0x100  M_LEN1  S" CLOSE MUSIC"  DROP  ( Ai 0  n Аn --> )   mciSendStringA   DROP

        THEN      

         ;

 

: KONTROL_MUZ_TRWG_WAV ( K -- контроль и выдача WAV )

 DUP [CHAR] 1 = IF S" liber1\sound1.wav"  OUT_WAV ( An n -- )    THEN

 DUP [CHAR] 2 = IF S" liber1\sound2.wav"  OUT_WAV ( An n -- )   THEN

 DUP [CHAR] 3 = IF S" liber1\sound3.wav"  OUT_WAV ( An n -- )  THEN

  DROP

;

\ -------------------  все что выше в библиотеку перенеси ------------------------

 

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

 \   STARTLOG ( ВКЛЮЧИТЬ ФАЙЛ ОТЧЕТА SPF.LOG )

 \   ENDLOG (  выключить файл отчета )   

CR   S" Для выхода из программы нажать клавишу ESC "  ANSI>OEM TYPE 

CR   S" Тревога по нажатию цифровых клавиш 1..3   "  ANSI>OEM TYPE 

 1  ( K -- )

 BEGIN  ( k - код клавиши в стеке )

    KONTROL_MUZ_TRWG_WAV ( K -- контроль и выдача WAV )           

    0x100 PAUSE1  (  иммитируем работу получения данных )

    ?KEY1 DUP 0x1B = UNTIL     DROP  BYE

 ;

 

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\  текст программы окончен.

 

 

Список задач программирование  звуковой тревоги;          

 

Модификация – 1-й уровень понимания.

  1. В примере 1 – ввести  библиотеку для компиляции  исполняемого файла.
  2. В примере 2 – ввести библиотеку для звуков, оставить только главное слово =main=
  3. В примере 2 – ввести в цвете сообщение, что нет библиотеки звуков. Цвет фона красный, текст зеленый.

 

Новые свойства – 2-ой уровень понимания.

  1. В  примере 2 – ввести кнопку клавиша =d= переход на сайт для скачивания  библиотеки звуков.
  2. В примере  2 – заменить музыкальные файлы на свои mid и обозначить их новое имя. Сделать три новых файла.

Изменения алгоритма – 3-ий уровень понимания и создания.

  1. В примере 2 расширить до 20 файлов. Добавить файлы, вызываемые  по клавишам под цифрами, т.е. =q w e r t y u I o p=
  2. В примере 2  выполнять по времени только  10 секунд, и затем звуковое сообщение прерывается.
  3. В примере 2  добавить к отображению файла и отображение текста, обозначающего назначение функции. Например « тревога в помещении»  « входной клапан  не работает» и т.п.
  4. В примере 3 заменить для  выполнения  воспроизведение файлов формата mp3  и avi.

 

Задача практической полезности

  1. Программа для подавления звукового шума. Цель программы  понизить в помещении шум.  Один приемник (микрофон) ловит сигнал  и выделяет шум  из него, а другой динамик  передает противофазный шумовой сигнал в это же помещение. Сигнал от динамика складывается с  звуком в помещении и общий шум понижается. 

 

  Отвлечение руководителя анекдот - на лекции не озвучивать;

·          Только что понял, почему мужская ширинка расстегивается справа, а женская слева: чтобы удобнее и быстрее было расстегивать той же рукой…

 

Внимание! Задачи  выполняются  и передаются руководителю на электронную почту  с соблюдением правил оформления.  Архив должен содержать; титульный лист – 1 файл, Текст задачи – на каждую задачу свой текстовый файл. Исполняемый файл. Имя текстового файла задачи должно соответствовать имени исполняемого файла.

 

На практических занятиях каждый обучаемый в группе должен выполнить выше, приведенные задачи. Решение и обоснование выбора решения, стиль отображения, ошибки в работе программы -  определяют оценку обучаемого.  Количество задач и их оценивание задано по условию =ИЛИ= Т.е. если предполагается  ответ на 5 то все предыдущие уровни предоставлять не надо.

Литература

Выводы:

 

 

Ред. 21:24 16.03.16

Автор Шабронов Андрей Анатольевич тс. 913-905-8839  shabronov@ngs.ru