Учебная работа. Реферат: Обзор элементов языка программирования
Введение …………………………………………………………………………….5
1. Общая часть …………………………………………………………………………6
1.1. Обзор частей языка программирования…………………………………..6
2. Особая часть ………………………………………………………………….8
2.1. Общая постановка задачки ……………………………………………………..8
2.2. Описание программ комплекса ………………………………………………10
2.2. Макро блок- схема комплекса………………………………………………..12
2.4. Таблица идентификаторов комплекса …………………………………………13
2.5. Описание наборов данных …………………………………………………….14
2.6. структура записей файлов ……………………………………………………14
2.7. Постановка проблемной программки (процедуры) …………………………16
2.7.1. Описание проблемной программки ……………………………………16
2.7.2. Блок – схема проблемной программки …………………………………16
3. Организация производства ………………………………………………………..17
3.1. Комплекс технических средств, нужный для решения задачки……….17
3.2. инструкция юзеру по работе с программкой ……………………….18
Заключение …………………………………………………………………………20
Приложения …………………………………………………………………………21
Перечень применяемых источников ………………………………………………..35
лист
4
Введение
Цель выполнения курсовой работы заключается в том, чтоб научиться обрисовывать предметную область настоящего мира – объект и его атрибуты, закрепить способности использования главных процедур, методов их описания и главных операции над ними.
Вправду, с помощью TurboPascal довольно не попросту сделать программку, которая бы показывала работу с ПК , сделать всё-таки базу и саму суть формирования вывода звука для встроенного динамика, размещенного в системном блоке компа.
В данной для нас курсовой работе разглядим программирование звука и видео. Сначала разглядим, как программируется вывод звука для встроенного динамика и видео, для вывода изображения на монитор. Потом познакомимся с главными принципами программирования для звуковой и видео карты.
Нереально представить для себя современный индивидуальный комп без устройств вывода звука и видео. Нормой сделалось оснащение компа особым устройством – звуковой картой, позволяющей творить со звуком самые истинные чудеса. «Озвученный» комп – это настоящий музыкальный центр. Он даёт юзеру возможность перевоплотиться в исполнителя, играющего на разных музыкальных инструментах, он может даже стать хорошим рассказчиком, «проговаривая» набранный в электрическом формате текст.
Индивидуальные компы за крайние годы существенно подтянулись в качестве. вкупе с центральными микропроцессорами эволюционировали и другие составляющие компа. Соответственно, требования юзеров к компу повсевременно увеличивается. И если 20-25 годов назад был хрипящий звук встроенного в корпус малеханького динамика (РС – спикер), то сейчас обязательным атрибутом индивидуального компа является спец звуковая подсистема.
Для того, чтоб уверенно ориентироваться в современном многообразии разных устройств, служащих цели «озвучить» индивидуальный комп, нужно верно и на достаточном уровне представить для себя все процессы, происходящие снутри компа, которые были соединены звуком.
лист
5
1 Общая часть
1.1
Обзор частей языка программирования
Что представляет собой звук?
Свое знакомство с программированием звука на Турбо Паскале мы начнем с использования встроенного динамика. До этого всего замечу, что модуль Crt содержит две процедуры, созданные для работы с динамиком. 1-ая из них- Sound(Hz) — включает динамик на звуковой частоте, задаваемой значением параметра Hz (типа Word) в герцах. Динамик генерирует звук до того времени, пока он не будет отключен вызовом процедуры NoSound, не имеющей характеристик Процедура Sound обеспечивает достаточно бедную интонацию, поэтому что она употребляет лишь целочисленные частоты. Ну и интегрированный динамик, к огорчению, дает звук самого низкого свойства Он не допускает управления громкостью, весьма по-разному резонирует на различных частотах. Не ожидайте от него многого’ Тем не наименее, мы попытаемся хотя бы отчасти поправить положение и разработаем свои собственные процедуры для модуля Speaker.
До этого всего, познакомимся ближе с работой встроенного динамика. Источником звуковых акустических колебаний является его диффузор. Он может находиться в одном из 2-ух вероятных положений. Для управления работой динамика ему посылаются прямоугольные импульсы определенной частоты. В течение первой половины всякого цикла диффузор {перемещается} в одно положение, а потом, в течение 2-ой половины цикла, в другое. Это вызывает движение воздуха. В процессе генерации акустических колебаний прямоугольный импульс, который порождает неприятно звучащую нотку, несколько сглаживается. Так возникает звуковой сигнал.
сейчас несколько слов о технических деталях. Комп содержит микросхему 8255, которую именуют «программируемым периферийным интерфейсом» (PPI — Programmable Peripheral Interface). PPI управляет работой динамика, используя микросхему таймера 8254 (PIT — Programming Interval Timer). Микросхема 8255 имеет разные порты, включая порт вводавывода $61 размером («шириной») в один б с битами b7…b0. Запись в порт $61 нулевого или единичного значения бита b0 дозволяет установить режим управления динамиком. Если b0 = 1, то динамиком управляет 2-ой канал микросхемы таймера. Микросхема таймера имеет 3 канала, любой из которых предназначен для решения собственных задач. Нулевой канал обслуживает системные часы, 1-ый канал обслуживает микросхему прямого доступа к памяти (DMA). 2-ой канал связан со интегрированным динамиком. Обычно он запрограммирован на генерацию последовательности прямоугольных импульсов, что дает при включении динамика непрерывный тон определенной частоты. Управление интегрированным динамиком соединено до этого всего с программированием второго канала таймера.
Для работы с таймером употребляются порты (всего 4), на которых для нас Энтузиазм представляют порт $42 (порт второго канала таймера) и порт $43 (порт управляющего слова — открыт лишь для записи). Любой канал имеет собственный
лист
6
счетчик, содержимое которого миниатюризируется от некого наибольшего значения. Для второго канала определена константа $1234DD. Это
Итак, мы узнали, что единичное бит b1равен единице. Таковым образом, до этого всего нужно научиться «включать» биты b0 и b1, записывая в их единичные Word, назад пропорциональным частоте, и что на выходе должен быть прямоугольный импульс, в порт микросхемы таймера $43 обязано быть записано
лист
7
2 Особая часть
2.1 Общая постановка задачки
Темой данной курсовой работы, который был выполнен в процессе исследования курса “Базы алгоритмизации и программирования” является, — «Обработка потока, поступающего с видео и аудио устройства».
Дальше мы обсудим: что такое DirectShow, для что он предназначен, как он работает и разглядим технологию программирования звука. Позже нам предстоит написать программку, которая генерирует последовательности прямоугольных звуковых импульсов (стр. 21-22)
DirectShow – это архитектура для проигрывания, перехвата и обработки потоков мультимедиа. При помощи этого API можно:
· проигрывать мультимедийные файлы различного формата, такие как MPEG (Motion Picture Experts Group), AVI (Audio-Video Interleaved), MP2 (MPEG Audio Layer-2), DVD и естественно WAV;
· перехватывать видео-поток с различного рода TV-карт, видеокамер и т.п.;
· создавать неординарные обработчики мультимедиа-потоков и свои собственные форматы файлов;
· обращаться конкретно к видео и аудио потокам, чтоб выводить их на SurfaceDirectDraw.
DirectShow интегрирован с DirectX так, что употребляет DirectDraw и DirectSound для вывода изображения и звука, и, при наличии аппаратного убыстрения, автоматом им воспользуется.
В концепции DirectShow мультимедийные данные – это поток, который проходит через несколько обрабатывающих блоков. Блоки, обрабатывающие поток данных, передают данные по цепочке друг другу, таковым образом можно представить для себя несколько “устройств”, каждое из которых делает какую-то обработку данных и передает их примыкающему “устройству”. Эти “устройства” либо “блоки обработки” данных именуют фильтрами. Цепочка, по которой передаются данные, содержит несколько фильтров, связанных определенным образом.
В DirectShow имеются готовые фильтры, из которых, будто бы из детских кубиков, программер может выстроить ту либо иную цепочку обработку данных, не считая того, естественно, можно сделать свои, неординарные фильтры.
Для сотворения таковой “цепочки обработки” (которая, к слову, официально именуются Filter Graph – “граф фильтров” либо, в несколько свободном переводе — “схема соединения фильтров”), итак вот для сотворения схемы соединения фильтров, предназначен самый базисный и лежащий в базе всех основ компонент DirectShow, под заглавием Filter Graph Manager – МенеджерГрафа Фильтров.
К примеру, программка показывающая видео из AVI-файла может выстроить таковой граф фильтров:
лист
8
В этом примере 5 фильтров, 1-ый (File Source) просто читает данные с диска, 2-ой фильтр (AVI Splitter) делит данные на кадры и передает упакованные видео данные фильтру AVI Decompressor, который их распаковывает и передает фильтру Default DirectSound Device, выводящему звук. AVI Decompressor передает распакованные данные фильтру Video Renderer, который выводит кадры видео на экран.
Фильтры делятся на три типа:
Фильтры-источники (Sourcefilters) — эти фильтры просто получают данные из какого-то источника, с диска (как фильтр File Source (Async) на рисунке), с CD либо DVD дисковода либо с TV – карты либо карты, к которой подключена цифровая камера.
Фильтры-преобразователи (Transform filters) – эти фильтры как видно из наименования конвертируют поток данных, проходящий через их любым образом, к примеру – делит поток данных на кадры, создают декомпрессию и т.п. На нашем рисунке к таковым фильтрам относятся AVI Splitter и AVI Decompressor.
Фильтры вывода (Renderer filters) – фильтры, которые получают на сто процентов обработанные данные и выводят их на монитор, звуковую карту, пишут на диск либо выводят на еще какое-нибудь устройство.
Итак из фильтров-кубиков можно выстраивать граф. Делается это при помощи интерфейса IGraphBuilder. Сделать объект типа IGraphBuilder можно так:
тут переменная MyGraphBuilderимеет тип IGraphBuilder; идентификатор класса CLSID_FilterGraphи IID_IGraphBuilderобьявлены в файле DShow.pas, потому не забудьте добавить:
Итак, интерфейс IGraphBuilder получен. Можно выстроить граф фильтров, таковой, какой нам необходимо. Вообщем, все не так трудно, IGraphBuilder довольно интеллектуален, он может сам, автоматом, выстроить граф, зависимо от
того какие файлы мы собираемся воспроизводить. интерфейс IGraphBuilder имеет способ RenderFile, который получает имя файла в качестве параметра и, зависимо от типа файла (которое определяется по расширению и по
особым сигнатурам в файле), сканирует реестр, в поисках нужной для построения графа инфы, делает нужные фильтры и строит
лист
9
граф, созданный для проигрывания файлов этого типа (WAV, AVI, MP2, MPG и т.д.).
2.2 Описание программ комплекса
Опосля построения графа, DirectShow готов к проигрыванию. Для управления потоком данных через граф обработки предназначен интерфейс IMediaControl – он имеет способы Run, Pause и Stop.
Пример:
интерфейс IVideoWindow содержит способы для управления заголовком, стилем, местоположением и размерами окошка в каком проигрывается видео.
Давайте попробуем переработать наш пример так, чтоб видео выводилось не в отдельном окошке, а, скажем на компоненте TPanel, расположенном в нашей форме. Добавьте на форму компонент TPanel, пусть он именуется Panel1.
лист
10
программка Speaker1 создана для генерации последовательности прямоугольных звуковых импульсов:
Двоичное бит b1 записывается единица), потом, опосля
маленькой задержки, отключается и так повторяется до нажатия случайной
лист
11
клавиши. Опосля нажатия клавиши выполнение цикла прекращается. Принципиально то, что оба младших бита будут содержать нулевые значения, и при всех следующих воззваниях к динамику остальных программ он будет работать верно. Программка генерирует тон частотой приблизительно 100Гц .
2.3 Макро блок — схема комплекса
Существует много методов описания, представления алгоритмов. Мы остановимся на 4: естественном языке, графическом языке, алгоритмическом языке и языке программирования.
Любой вид представления имеет средства описания алгоритмов, направленные на собственного исполнителя:
— естественный язык — слова на естественном языке общения;
— графический язык — графические схемы (блок-схемы) с описанием действий;
-алгоритмический язык — определенные слова естественного языка, которым придается
—язык программирования — команды языка программирования.
Во всех предложенных методах представления метода, не считая крайнего исполнителем является человек, а в крайнем четвертом случае исполнитель-компьютер.
Алгоритмический язык — это система обозначений и правил для единообразной и четкой записи алгоритмов и их выполнения.
Алгоритмический язык, с одной стороны, близок к обыкновенному языку, потому читается и записывается как обычный текст. С иной стороны, по собственной форме алгоритмический язык приближается к языкам программирования, что дает возможность резвее освоить языки программирования для ЭВМ .
Алгоритмический язык имеет собственный словарь. Базу его составляют слова, представляющие команды этого языка. В алгоритмическом языке также употребляются слова, смысл и метод потребления которых не меняется. Они именуются служебными словами.
Служебные слова алгоритмического языка подчеркиваются и записываются, как правило, в сокращенной форме и предусмотрены для дизайна метода.
Синтаксические конструкции языка разделяются на два типа: описания данных (величин) и операторов (установок).
Начало метода;
Конец метода;
процесс либо группа действий;
Выбор деяния зависимо от истинности либо ложности;
Повторение действии данное количество раз
Ввод (вывод) значений переменных;
Направление вычисления.
2.4 Таблица идентификаторов комплекса
Для написания программки Speaker1, мы употребляли последующие идентификаторы:
Speaker1
Этот идентификатор является
заглавием программки
Crt
В модуле CRT реализованы особые процедуры и функции для работы с текстовой информацией на мониторе, дозволяющие: управлять текстовыми режимами, организовывать окна вывода на экран, настраивать цвета знаков на дисплее, управлять курсором. Не считая того, в модуль включены функции опроса клавиатуры и процедуры управления интегрированным в ПЭВМ динамиком.
Speaker_port
имя константы, которому присвоено значение %61.
Portval
Заглавие порядкового типа данных, которое имеет Byte
Порядковый тип данных. Длина, б=1;
Спектр значений 0…255
Delay
Эта процедура приостанавливает выполнение программки на данное число миллисекунд.
KeyPressed
Возвращает один знак, еще не прочитанный программкой.
лист
13
2.5 Описание наборов данных
В базе иерархии классов, обеспечивающих функционирование наборов данных в приложениях баз данных, лежит класс TDataSet. Хотя он практически не содержит способов, реально обеспечивающих работоспособность главных устройств набора данных, тем не наименее его
Этот класс задает структурную базу функционирования набора данных. Иными словами, это скелет набора данных, к способам которого нужно только добавить требуемые вызовы соответственных функций настоящих технологий.
При решении более всераспространенных задач программирования в процессе сотворения приложений баз данных класс TDataSet не нужен.
Тем не наименее познание главных принципов работы набора данных постоянно полезно. Не считая этого, класс TDataSet может употребляться разрабами в качестве базы для сотворения собственных компонент. Потому разглядим главные механизмы, реализованные в наборе данных.
2.6 структура записей файлов
Multimedia Streaming – это архитектура, применяемая в DirectShow для облегчения жизни программера. Эта архитектура дозволяет работать с мультимедиа данными, как с абстрактным потоком, не вдаваясь в подробности форматов хранения мультимедиа-файлов либо специфику устройств-источников мультимедиа. Используя эту архитектуру, программер концентрируется не на расшифровке и преобразовании данных, а на управлении потоком данных, кадрами видео либо аудио семплами.
На верхушке иерархии находится базисный объект MultimediaStream, который является контейнером для объектов MediaStream. объект Multimedia Stream может содержать один либо несколько объектов Media Stream. В то время как любой объект типа Media Stream предназначен для работы с данными какого-то 1-го типа (видео, аудио и т.п.) – Multimedia Stream – просто содержит способы для воззвания к содержащимся в нем объектам MediaStream и не зависит от типа данных.
на данный момент мы сделаем объект типа IAMMultiMediaStream. Этот интерфейс унаследован от IMultimediaStream и содержит, не считая остального, функцию OpenFile, которая автоматом строит граф фильтров для проигрывания файла:
тут переменная AMStreamимеет тип IAMMultiMediaStream.
Мы сделали контейнер для мультимедийных потоков. Сверяемся с рисунком — мы на верхнем уровне иерархии. У нас есть объект типа IMultimediaStream – сейчас в этот контейнер необходимо проинициализировать и добавить один либо несколько мультимедиа потоков, подходящего нам типа. Поначалу инициализация:
лист
14
При инициализации указываем, что будут создаваться мультимедиа потоки для чтения, передав
способ IDirectDrawStreamSample.UpdateвыводиточереднойкадрнаSurface. При достижении конца потока он возвратит ошибку с кодом $40002 (MS_S_ENDOFSTREAM), я в этом случае просто перематываю поток к началу, способом Seek.
В данной для нас программке инициализируется DirectDraw, создается Surface , а потом на него выводится видео из avi-файла.
лист
15
2.7 Постановка проблемной программки (процедуры)
2.7.1 Описание проблемной программки
У программки Speaker1 (стр. 21) есть значимый недочет. Обработка центральным микропроцессором прерываний во время её выполнения влияет на точность соблюдения временных задержек. Попробуем подвигать мышью во время работы программки, и мы услышим перерывы в звучании динамика. По данной для нас причине внедрение процедуры задержки DELAY является ненужным. Процедура вывода звука, не считая того, «захватывает» центральный машина — комплекс технических средств, предназначенных для автоматической обработки информации в процессе решения вычислительных и информационных задач) (либо вычислительной системы) которое делает арифметические и логические операции данные программкой преобразования инфы управляет вычислительным действием и коор, и сразу выполнение остальных процедур оказывается неосуществимым. Усовершенствованный вариант программки употребляет 2-ой канал таймера (программка speaker 2, стр. 22 ).
нужно держать в голове, что для использования таймера нужно поначалу подключить динамик ко второму каналу PPI, а потом записать единичные значения 2-ух младших битов в порт динамика.
Опосля манипуляции с мышью уже не будут приводить к прерывающемуся звучанию динамика.
2.7.2 Блок — схема проблемной программки
Блок-схема программки speaker2 (стр. 34) различается от блок-схемы speaker1 (стр. 33) тем, что он наиболее совершенен и не имеет такового недочёта как трудности с мышью при его движении. Наиболее наглядно можно поглядеть на
лист
16
3 Организация производства
3.1 Комплекс технических средств, нужный для решения задач
Для настоящей работы наших программки speaker1 и speaker2 нужен звук, который будет описан ниже.
Встроенный AC-linkконтроллер в Intel 82801ВА I/OControllerHub (ICH2), имеющий поддержку AMRи CNR;
СтереоАС’97-аудиокодекAnalog Devices AD 1885;
На плате размещены пластмассовые разъёмы с цветной РС99 маркировкой (микрофонный вход, линейный выход, линейный вход), также два внутренних разъёма — AUXin, CDin.
Программная часть:
Набор П/О SoundMAXwithSPX от AnalogDevices с весом дистрибутива драйверов в 54 Мбайт. Заявлена оптимизация под ММХ и SSE2 SIMD аннотации для микропроцессоров IntelPentiumIII и Pentium 4.
Драйвера:
Win98 SE, WinME иWin2K.
Сопоставимость с игровыми 2D SoundAPI:
— DirectSound/DirectX 8.0;
— Sound Production extensions (SPX);
— EAX2.0;
— A2D 1.0;
— Sensaura Macro FX / ZoomFX;
— IA-SIGI2DL2. свойства аудиокодека:
— полный дуплекс прямо до 16 бит 48 кГц;
— SNR = 94дБА;
— THD = 0,01 %;
— IMD=90дБ ;
— FR = 20 Гц — 20 кГц +/- 0.1 дБ .
— MIDI:
— wavetable синтезатор 4 Мбайт DLS2, 128 GM-инструментов;
— 1.2 Мбайт, 260 XGlite-инструментов;
— 1024 MAX voice программных голоса;
— SPX — SoundProductioneXtention — разработка аудиорендеринга новейшего поколения.
Синтезом звука создатели управляют впрямую из игр и мультимедиа-приложений. ЗD-звук от Sensaura:
— EnvironmentFX, звуковой рендер 2D с 26 пресетами и полной поддержкой ЕАХ1.0/2.0, I2DL2 реверберации;
— эффекты близкого поля SensauraMacroFX;
— эффекты далекого поля SensauraZoomFX;
лист
17
— разработка, использующая отдельные HRTF-фильтры для наушников, 2/4/6 колонок DigitalEar (вероятен апдейт до технологии персональной подстройки HRTF-фильтров VirtualEar);
— разработка VirtualTheaterSurround для прослушивания 4 и 5.1-канальных саундтреков в фильмах (вероятен апдейт до аналогичной технологии для наушников HeadphoneVirtualTheaterSurround).
Установка
В комплекте с материнской платой идут драйвера под Win98 SE, WinME и Win2K. Драйвера звуковых устройств выполнены в виде WDM-драйверов.
Конфигурация тестового компа:
— материнская плата Intel D815EFV;
— машина — комплекс технических средств, предназначенных для автоматической обработки информации в процессе решения вычислительных и информационных задач) (либо вычислительной системы) которое делает арифметические и логические операции данные программкой преобразования инфы управляет вычислительным действием и коор Intel РЗ-550Е;
— видеоплата GeForce2 MX;
— звуковая плата EgoSys WaveTerminal 2496;
— сетевая карта Realtek 8029.
— Операционная система Win98SErus 4.10.2222А, DirectX 8.0а rus.
По дефлоту автоинсталлятор от Intel устанавливает все нужные патчи и сам автоматом перезагружает комп в процессе при необходимости, что весьма приятно (не необходимо посиживать и всё время глупо жать клавишу Дальше). Но опосля всех установок в системе стоит SoundMAX версии 2, невзирая на то, что на компакте имеется дистрибутив крайней версии драйверов — SoundMAX2. Опосля корректного удаления 2-ой версии ставим третью:
Опосля перезагрузки в системном трее возникает синенькая эмблемка AnalogDevices.
Опосля выбора верхнего пт возникает панель управления бессчетными опциями SoundMAX2.0.
Настройка динамиков дозволяет избрать три варианта: наушники, расположенные стереоколонки, разнесённые на некое расстояние стереоколонки. Звуковые среды — это выбор типа среды окружения. Доступно выше 10-ка пресетов. виртуальное пространственное звучание- функция сотворения виртуальных источников в наушниках либо колонках. Клик на картину переносит нас на веб-сайт Sensaura в виртуальный магазин, где можно приобрести этот апдейт (предназначенный лишь для SonudMAX2.0) либо загрузить 21-дневную trial-версию.
3.2 инструкция юзеру по работе с программкой
Эта инструкция создана для программки zvuko_zapis, который наглядно показан в приложении В (стр. 23). Для начала, чтоб получить работоспособную программку нужно её текст вставить в Турбо Паскаль и откомпилировать её и она (наша программка) сохранится там, где сохранён исходник программки. Дальше у нас покажется екзешник (т.е. файл с расширением .EXE) – это и есть наша программка. сейчас осталось её запустить. Опосля пуска наша программка будет иметь таковой вид:
лист
18
здесь с её внедрением всё просто. Если имеется микрофон, то можно сходу записывать звук нажав на клавишу «Запись», который выделен красноватым цветом. Клавиша «Start» создана для проигрывания записанного звука. Клавиша «Stop» останавливает запись и подготавливает его для проигрывания.
Записанный звук сохраняется под расширением .WAV. Клавиша «Входы» предназначен для приёма и показа звука с 1-го из входов. Звук показывается на рабочей области программки кривыми линиями. Кривые полосы — это спектр звука.
лист
19
Заключение
Выполняя нашу курсовую работу, мы задались целью узнать, какие есть методы программирование звука и видео и по способности внести что-то свое. Выяснив, что на данный момент существует несколько методов программирование звука, мы решили написать программку звука на языке Турбо Паскаль.
В данной для нас курсовой работе мы обрисовали в главном 3 программки: speaker1, speaker2 и zvuko_zapis.
В базу разработанной программки звука на языке Турбо Паскаль заложена программка speaker1 созданная для генерации последовательности прямоугольных звуковых импульсов и его усовершенствованный вариант — программка speaker2. Учтено, что манипуляции с мышью не обязано приводить к прерывающемуся звучанию динамика, и применено вещественное 1-го из входов.
Также рассмотрена работа DirectShow, для что он предназначен и как он воспроизводит видео форматы.
Рассмотрев много языков программирования, которые разрешают производить программирование звука и видео, мы приостановили собственный выбор на языке Турбо Паскаль.
Выполненное работа дает возможность внедрение программку, как педагогам, так и студентам, для этого довольно только установить данную программку на комп.
лист
20
Приложения
приложение А
Текст программки
speaker
1
Листинг
:
лист
21
приложение Б
Текст программки
speaker
2
Листинг :
лист
22
приложение В
Текст программки
Листинг:
unit zvuko_zapis;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, MMSystem, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Image1: TImage;
Button2: TButton;
Label2: TLabel;
BitBtn1: TBitBtn;
CheckBox1: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Button2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
procedure OnWaveIn(var Msg: TMessage); Message MM_WIM_DATA;
{ Public declarations }
end;
TData16 = array [0..127] of smallint;
PData16 = ^TData16;
tWaveFileHdr = packed record
riff: array[0..2] of Char;
len: DWord;
cWavFmt: array[0..7] of Char;
dwHdrLen: DWord;
wFormat: Word;
wNumChannels: Word;
dwSampleRate: DWord;
лист
23
Продолжение Приложения В
dwBytesPerSec: DWord;
wBlockAlign: Word;
wBitsPerSample: Word;
cData: array[0..2] of Char;
dwDataLen: DWord;
end;
constBufSize=11000; { Размербуферана 1 сек}
var
Form1: TForm1;
implementation
var
WaveIn: hWaveIn;
hBuf: THandle;
BufHead: TWaveHdr;
m:array[1..bufSize] of smallInt;
h,w,h2:integer;
zs:boolean=false;//запущен звук
//Для записи в wav
rec:boolean=false; //идет запись
mz :array of smallInt;
waveHdr:tWaveFileHdr;
qz:integer; //записано звука;
{$R *.DFM}
PROCEDURE iniWav;
begin
WaveHdr.riff:=’RIFF’;
WaveHdr.cWavFmt:=’WAVEfmt ‘;
WaveHdr.dwHdrLen:=16;
WaveHdr.wFormat:=1;
WaveHdr.wNumChannels:=1;
WaveHdr.dwSampleRate:=11000;
WaveHdr.wBlockAlign:=4;
WaveHdr.dwBytesPerSec:=22000;
WaveHdr.wBitsPerSample:=16;
WaveHdr.cData:=’data’;
WaveHdr.dwDataLen:=qz*2;
end;
лист
24
Продолжение
Приложения
В
procedure TForm1.Button1Click(Sender: TObject);
var
header: TWaveFormatEx;
BufLen: Word;
buf: pointer;
begin
if zs then exit;
with header do begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := 1; // количество каналов
nSamplesPerSec := 11000;// частота
wBitsPerSample := 16; // бит на отсчет
nBlockAlign := nChannels * (wBitsPerSample div 8);
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
cbSize := 0;
end;
WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header),Form1.Handle, 0, CALLBACK_WINDOW);
BufLen := header.nBlockAlign * BufSize;
hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen);
Buf := GlobalLock(hBuf);
with BufHead do begin
lpData := Buf;
dwBufferLength := BufLen;
dwFlags := WHDR_BEGINLOOP;
end;
WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead));
WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));
zs:=true;
WaveInStart(WaveIn);
End;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not zs then Exit;
WaveInReset(WaveIn);
WaveInUnPrepareHeader(WaveIn, addr(BufHead), sizeof(BufHead));
WaveInClose(WaveIn);
GlobalUnlock(hBuf);
GlobalFree(hBuf);
zs:=false;
end;
лист
25
Продолжение Приложения В
procedureTForm1.OnWaveIn;
var
data16: PData16;
i,d,z,s,x,y,xx,max,s0: integer;
begin
//сходу пустим запись далее чтобы не прерывалась
WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam),SizeOf(TWaveHdr));
data16 := PData16(PWaveHdr(Msg.lParam)^.lpData);
//перепишем звук из массива в который пишется
//в массив который обрабатывается чтобы запись его не портила
move(data16^[0],m,BufSize*2);
if data16^[0]<>m[1] then showMessage(‘Неуспела’);
//Обработказвука
s:=0;
s0:=0;
max:=0;
for i := 1 to BufSize do begin
z:=m[i];
inc(s0,z);
z:=абс(z);
inc(s,z);
if z>max then max:=z;
end;
//показзвука
s:=s div bufSize;
s0:=s0 div bufSize;
label1.caption:=’Среднее: ‘+intToStr(s)+
‘, Максимум: ‘+intToStr(max)+
‘, Неизменный уровень: ‘+intToStr(s0);
with form1.image1.Picture.Bitmap.canvas do begin
fillRect(rect(0,0,w,h));
pen.color:=$CCCCCC; moveTo(w,h2); lineTo(0,h2);
pen.color:=0;
max:=абс(max-abs(s0));
if max<16 then max:=16;
if checkBox1.checked then d:=BufSize else d:=w;
for x:=1 to w do begin
xx:=x*BufSize div d;
лист
26
Продолжение Приложения В
y:=h2+(m[xx]-s0)*h2 divmax;
if x=1 then moveTo(0,y) else lineTo(x,y);
end;
end;
if rec then begin
//запись в массив для файла
setLength(mz,qz+bufSize+1);
move(m[1],mz[qz+1],BufSize*2);
inc(qz,BufSize);
form1.label2.caption:=’Записано ‘+formatFloat(‘0.00′,qz*2/1000000)+’ мб’;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
w:=image1.width;
h:=image1.height;
h2:=h div 2;
image1.Picture.Bitmap.width:=w;
image1.Picture.Bitmap.height:=h;
Form1.Button1Click(Sender);
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Form1.Button2Click(Sender)
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
winExec(‘SndVol22.exe /r’,SW_SHOW);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var fw:file;
begin
if rec then begin
rec:=false;
if qz>0 then begin
//вывод в файл wav
iniWav;
assignFile(fw,’sound.wav’);
rewrite(fw,1);
blockWrite(fw,waveHdr,sizeOf(waveHdr));
лист
27
Продолжение Приложения В
blockWrite(fw,mz[1],qz*2);
closeFile(fw);
showMessage(‘Записано в «sound.wav»‘);
label2.visible:=false;
BitBtn1.caption:=’Запись’;
end;
end
else begin
qz:=0;
rec:=true;
label2.visible:=true;
BitBtn1.caption:=’Стой’;
end;
end;
end.
constBufSize=11000; { Размер буфера на 1 сек}
var
Form1: TForm1;
implementation
var
WaveIn: hWaveIn;
hBuf: THandle;
BufHead: TWaveHdr;
m:array[1..bufSize] of smallInt;
h,w,h2:integer;
zs:boolean=false;//запущен звук
//Для записи в wav
rec:boolean=false; //идет запись
mz :array of smallInt;
waveHdr:tWaveFileHdr;
qz:integer; //записано звука;
{$R *.DFM}
PROCEDUREiniWav;
begin
WaveHdr.riff:=’RIFF’;
WaveHdr.cWavFmt:=’WAVEfmt ‘;
WaveHdr.dwHdrLen:=16;
WaveHdr.wFormat:=1;
лист
28
Продолжение Приложения В
WaveHdr.wNumChannels:=1;
WaveHdr.dwSampleRate:=11000;
WaveHdr.wBlockAlign:=4;
WaveHdr.dwBytesPerSec:=22000;
WaveHdr.wBitsPerSample:=16;
WaveHdr.cData:=’data’;
WaveHdr.dwDataLen:=qz*2;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
header: TWaveFormatEx;
BufLen: Word;
buf: pointer;
begin
if zs then exit;
with header do begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := 1; // количество каналов
nSamplesPerSec := 11000;// частота
wBitsPerSample := 16; // бит на отсчет
nBlockAlign := nChannels * (wBitsPerSample div 8);
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
cbSize := 0;
end;
WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header),Form1.Handle, 0, CALLBACK_WINDOW);
BufLen := header.nBlockAlign * BufSize;
hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen);
Buf := GlobalLock(hBuf);
with BufHead do begin
lpData := Buf;
dwBufferLength := BufLen;
dwFlags := WHDR_BEGINLOOP;
end;
WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead));
WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));
zs:=true;
WaveInStart(WaveIn);
End;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not zs then Exit;
лист
29
Продолжение приложения В
WaveInReset(WaveIn);
WaveInUnPrepareHeader(WaveIn, addr(BufHead), sizeof(BufHead));
WaveInClose(WaveIn);
GlobalUnlock(hBuf);
GlobalFree(hBuf);
zs:=false;
end;
procedure TForm1.OnWaveIn;
var
data16: PData16;
i,d,z,s,x,y,xx,max,s0: integer;
begin
//сходу пустим запись далее чтобы не прерывалась
WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam),SizeOf(TWaveHdr));
data16 := PData16(PWaveHdr(Msg.lParam)^.lpData);
//перепишем звук из массива в который пишется
//в массив который обрабатывается чтобы запись его не портила
move(data16^[0],m,BufSize*2);
if data16^[0]<>m[1] then showMessage(‘Не успела’);
//Обработка звука
s:=0;
s0:=0;
max:=0;
for i := 1 to BufSize do begin
z:=m[i];
inc(s0,z);
z:=абс(z);
inc(s,z);
if z>max then max:=z;
end;
//показ звука
s:=s div bufSize;
s0:=s0 div bufSize;
label1.caption:=’Среднее: ‘+intToStr(s)+
‘, Максимум: ‘+intToStr(max)+
‘, Неизменный уровень: ‘+intToStr(s0);
with form1.image1.Picture.Bitmap.canvas do begin
fillRect(rect(0,0,w,h));
pen.color:=$CCCCCC; moveTo(w,h2); lineTo(0,h2);
pen.color:=0;
лист
30
Продолжение приложения В
max:=абс(max-abs(s0));
if max<16 then max:=16;
if checkBox1.checked then d:=BufSize else d:=w;
for x:=1 to w do begin
xx:=x*BufSize div d;
y:=h2+(m[xx]-s0)*h2 div max;
if x=1 then moveTo(0,y) else lineTo(x,y);
end;
end;
if rec then begin
//запись в массив для файла
setLength(mz,qz+bufSize+1);
move(m[1],mz[qz+1],BufSize*2);
inc(qz,BufSize);
form1.label2.caption:=’Записано ‘+formatFloat(‘0.00′,qz*2/1000000)+’ мб’;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
w:=image1.width;
h:=image1.height;
h2:=h div 2;
image1.Picture.Bitmap.width:=w;
image1.Picture.Bitmap.height:=h;
Form1.Button1Click(Sender);
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Form1.Button2Click(Sender)
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
winExec(‘SndVol22.exe /r’,SW_SHOW);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var fw:file;
begin
if rec then begin
rec:=false;
лист
31
Продолжение приложения В
ifqz>0 thenbegin
//вывод в файл wav
iniWav;
assignFile(fw,’sound.wav’);
rewrite(fw,1);
blockWrite(fw,waveHdr,sizeOf(waveHdr));
blockWrite(fw,mz[1],qz*2);
closeFile(fw);
showMessage(‘Записано в «sound.wav»‘);
label2.visible:=false;
BitBtn1.caption:=’Запись’;
end;
end
else begin
qz:=0;
rec:=true;
label2.visible:=true;
BitBtn1.caption:=’Стой’;
end;
end;
end.
лист
32
приложение Г
Блок- схема к программке
speaker
1
лист
33
приложение Д
Блок – схема к программке
speaker
2
лист
34
Перечень использованных источников
1. Ахо, Альфред, В., Хопкрофт, Джон, Ульман, Джеффри, Д. Структуры данных и методы. М.: Издательский дом «Вильямс», 2001.
2. Дискретная математика для программера / Ф. А. Новиков. – СПб.: Питер, 2002.
3. Климова Л. М. Pascal 7.0. Практическое программирование. Решение типовых задач. – М.: КУДИЦ – ОБРАЗ, 2000.
4. Н. Культин TurboPascal 7.0 – СПб: БХВ – Санкт – Петербург, 1998..
5. Немлюгин С. А. TurboPascal^ практикум. – СПб.: Питер, 2002.
6. Программирование на языке Паскаль: задачник / под ред. Усковой О.Ф. – СПб.: Питер, 2003.
7. Фаронов В. В. Турбо Паскаль 7.0 – Москва, Издательство «Нолидж», 2001
8. Тессел Д. Стиль, разработка, эффективность, отладка и испытание программ. – М.: мир, 1981
9. Докунина Т. К. Программирование и алгоритмические языки.
10. Васикова Н. Д., Тюляева В. В. Практикум по основам
программирования. язык Паскаль., 1991.
.
лист
35
лист
лист
]]>