ß Программирование
структур
звукового
оформления
Адрес
документа: |
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 ( выходим
из режима
редактирования
и компиляция,
т.е. все
бай-бай ) \ текст
программы
окончен. |
Рассмотрим
варианты
расположения
исходных
файлов
библиотек
текстов и
получение
конечного
продукта –
исполняемого
файла.
Библиотеки
подключаются
по мере
требований
для решения
задачи.
Скомпилированное
слово
находиться в
корне. Рядом
с главным
файлом
компиляции.
При таком
варианте подготовки
программ главное
слово –
является
сутью задачи.
Исполняемый
файл
получается
рядом. Возможные
подключаемые
библиотеки в
подкаталогах.
Удобно
расширять и
изменять.
Минус
такого
решения - на
каждую задачу
придется
«готовить»
главное
слово.
Надо
сохранять
все
библиотеки.
Вариант
второго
решения
более удобен,
т.к.
позволяет
накапливать
опыт в
решениях
своих задач.
Переход
от задачи к
задаче –
осуществляется
лишь
подключением
новой
библиотеки в
главном
слове
S”
\zadacha2\zadach2.f” INCLUDED
Далее
выполняется
компиляция
библиотек, которые
работали
ранее. Затем
отрабатывается
новая задача.
Программист
знает, что
работает не с
нуля. И
всегда может
проверить
исполнение
или
вернуться к прежней
задачи.
Хранить
требуется
весь каталог
с библиотеками
своих
реализаций и
задачами.
Отвлечение
руководителя
анекдот - на
лекции не
озвучивать;
·
Главным
фактором
при выборе
нижнего
белья
должно быть
удобство - то
есть ей
удобно это
носить, ему -
снимать. |
Основная
задача
алгоритма - выбор
звука по
событию. Например:
Ниже
алгоритм
последовательной
проверки и выдача
звукового
отклика.
\ начало
текста 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 (
выходим из
режима
редактирования
и
компиляция,
т.е. все бай-бай
) \
текст программы
окончен. |
Отвлечение
руководителя
анекдот - на
лекции не
озвучивать;
·
Если
орбитальная
космическая
станция "Мир"
имела все
удобства - то
почему
космонавты
всё время
выходили в
открытый
космос? |
Пример
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-й уровень
понимания.
Новые
свойства –
2-ой уровень
понимания.
Изменения
алгоритма –
3-ий уровень
понимания и
создания.
Задача
практической
полезности
Отвлечение
руководителя
анекдот - на
лекции не
озвучивать;
·
Только
что понял,
почему
мужская
ширинка расстегивается
справа,
а женская
слева: чтобы
удобнее
и быстрее
было
расстегивать
той же
рукой… |
Внимание!
Задачи
выполняются и
передаются
руководителю
на электронную
почту с
соблюдением
правил оформления. Архив
должен
содержать; титульный
лист – 1 файл,
Текст задачи
– на каждую
задачу свой
текстовый
файл.
Исполняемый
файл. Имя
текстового
файла задачи
должно
соответствовать
имени
исполняемого
файла.
На
практических
занятиях
каждый
обучаемый в
группе
должен
выполнить
выше, приведенные
задачи.
Решение и
обоснование
выбора
решения, стиль
отображения,
ошибки в
работе
программы -
определяют
оценку
обучаемого.
Количество
задач и их
оценивание задано
по условию
=ИЛИ= Т.е. если
предполагается ответ
на 5 то все
предыдущие
уровни
предоставлять
не надо.
Ред. 21:24
16.03.16
Автор Шабронов
Андрей
Анатольевич
тс. 913-905-8839 shabronov@ngs.ru