1055

Система обробки аудіоінформації. Підсистема фільтрації і обробки сигналу

Дипломная

Информатика, кибернетика и программирование

Обґрунтування доцільності розробки системи обробки аудіоінформації. Основні цілі створення системи та критерії ефективності її функціонування. Опис системи програмного забезпечення. Опис постановки задачі обробки та фільтрації звукового сигналу. Математичний опис алгоритму створення ефекту реверберації. Призначення і характеристика алгоритму створення ефекту луни. Математичний опис алгоритму створення ефекту затухаючої гучності.

Украинкский

2013-01-06

1.36 MB

25 чел.

Федеральне агентство з освіти
Державна освітня установа
вищої професійної освіти
«Іжевський державний технічний університет»
Факультет «Інформатика і обчислювальна техніка»
Кафедра "Програмне забезпечення"
ПОЯСНЮВАЛЬНА ЗАПИСКА
до дипломної роботи на тему:
«Система обробки аудіоінформації. Підсистема фільтрації і обробки сигналу »
Дипломник
студент групи 10-19-1 ... ... ... ... ... ... ... ... ... ... ... ... ... Суханов М.А.
Керівник
д.т.н, професор ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... Муринов А.І.
Консультант з економічної частини к.е.н., доцент ... .. Радигіна І.І.
Консультант з безпеки та екологічності проекту .... Якименко Г.Ф.
Нормоконтроль ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... Соболєва В.П.
Рецензент
зав.кафедрою «Мультимедіа та Інтернет-технології» УдГУ.Шіроков В.А.
Завідувач кафедрою
«Програмне забезпечення»
д.т.н., професор ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... Муринов А.І.
ІЖЕВСЬК 2006

РЕФЕРАТ
Пояснювальна записка до дипломної роботи на тему «Система обробки аудіоінформації. Підсистема фільтрації і обробки сигналу »оформлена на 159 аркушах, містить 48 малюнків, 21 таблицю.
Метою роботи є розробка підсистеми фільтрації і обробки сигналу в складі системи обробки аудіоінформації для внесення необхідних змін до початкового звуковий сигнал до початку кодування
Робота включає в себе вивчення структури звукових файлів різних форматів і реалізація можливостей читання цих форматів для подальшої обробки, розробку алгоритмів, що дозволяють перетворювати вихідний звуковий сигнал з метою зміни характеристик звучання і програмну реалізацію розроблених алгоритмів.
Для написання відповідного програмного забезпечення були вивчені матеріали і публікації в області цифрової обробки аудіоінформації, теорії звуку, звукових перетворень і ефектів.
У результаті проведеної роботи було розроблено програмне забезпечення, призначене для зміни характеристик вихідного звукового сигналу з метою зміни характеристик його звучання. Були розроблені та програмно реалізовані наступні алгоритми обробки та фільтрації звукового сигналу: зміна основних параметрів цифрового звуку (частота дискретизації, бітрейт, число каналів), редагування структури звукового сигналу, зміна темпу звуку й рівня гучності, ефекти зростаючій і затухаючої гучності, луни й реверберації
Отриманий в результаті роботи підсистеми змінений звуковий сигнал використовується в підсистемі кодування даних.
На сьогоднішній день існують готові програмні продукти для редагування звукових сигналів. Однак, усі ці програмні продукти є комерційними і володіють закритим вихідним кодом.
Дана розробка має відкритим кодом і дозволяє виробляти редагування структури звукового сигналу, змінювати характеристики його звучання і застосовувати звукові ефекти.
Розроблене програмне забезпечення є дослідницьким, воно спрямоване на вивчення та аналіз методів обробки аудіоінформації. З його допомогою вже були отримані експериментальні дані, використані в даній роботі. Кінцевим програмним продуктом може бути оболонка, яка представляє в значній мірі автоматизований інтерфейс для проведення перетворення звукових сигналів.

ЗМІСТ
ВСТУП .... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 11
1. РОЗРОБКА СИСТЕМИ ОБРОБКИ Аудиоинформация ... ... 14
1.1. Обґрунтування доцільності розробки системи обробки аудіоінформації ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... 14
1.1.1. Призначення системи .. 14
1.1.2. Характеристика функціональної структури системи .. 14
1.1.3. Обгрунтування мети створення системи .. 15
1.1.4. Обгрунтування складу автоматизуються завдань. 17
1.2. Аналітичний огляд ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. ... 18
1.2.1. Cool Edit Pro 2.0. 18
1.2.2. Sound Forge 6.0a. 18
1.2.3. Висновок по аналітичного огляду. 19
1.3. Основні вимоги до системи ... ... ... ... ... ... ... ... ... ... ... ... ... .. ... 20
1.3.1. Основні цілі створення системи та критерії ефективності її функціонування. 20
1.3.2. Функціональне призначення системи .. 20
1.3.3. Особливості системи та умови її експлуатації. 21
1.3.4. Вимоги до функціональної структури. 21
1.3.5. Вимоги до технічного забезпечення .. 22
1.3.6. Вимоги до інформаційного забезпечення .. 22
1.3.7. Вимоги до програмного забезпечення .. 22
1.4. Основні технічні рішення проекту системи ... ... ... ... ... ... .... 23
1.4.1. Рішення по комплексу технічних засобів. 23
1.4.2. Опис системи програмного забезпечення. 23
2. РОЗРОБКА ПІДСИСТЕМИ ОБРОБКИ І ФІЛЬТРАЦІЇ ... ... 25
2.1. Опис постановки задачі обробки та фільтрації звукового сигналу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... 25
2.1.1. Характеристика задачі. 25
2.1.2. Вхідна інформація. 26
2.1.3. Вихідна інформація. 27
2.1.4. Математична постановка задачі. 27
2.2. Опис алгоритму створення ефекту реверберації ... ... ... .. ... 34
2.2.1. Призначення і характеристика алгоритму створення ефекту реверберації 34
2.2.2. Використовувана інформація. 34
2.2.3. Результати рішення. 35
2.2.4. Математичний опис алгоритму створення ефекту реверберації 35
2.2.5. Алгоритм створення ефекту реверберації. 36
2.2.6. Вимоги до контрольного прикладу. 37
2.2.7. Список умовних позначень. 37
2.3. Опис алгоритму створення ефекту луни ... ... ... ... ... ... ... ... .. ... 38
2.3.1. Призначення і характеристика алгоритму створення ефекту луни. 38
2.3.2. Використовувана інформація. 38
2.3.3. Результати рішення. 39
2.3.4. Математичний опис алгоритму створення ефекту луни. 39
2.3.5. Алгоритм створення ефекту луни. 40
2.3.6. Вимоги до контрольного прикладу. 41
2.3.7. Список умовних позначень. 41
2.4. Опис алгоритму зміни темпу звуку ... ... ... ... ... ... ... ... ... .. 42
2.4.1. Призначення і характеристика алгоритму зміни темпу звуку. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... 42
2.4.2. Використовувана інформація. 42
2.4.3. Результати рішення. 42
2.4.4. Математичний опис алгоритму зміни темпу звуку. 43
2.4.5. Алгоритм зміни темпу звуку. 43
2.4.6. Вимоги до контрольного прикладу. 44
2.4.7. Список умовних позначень. 44
2.5. Опис алгоритму зміни гучності звуку ... ... ... ... ... ... .... 45
2.5.1. Призначення і характеристика алгоритму зміни гучності. 45
2.5.2. Використовувана інформація. 45
2.5.3. Результати рішення. 45
2.5.4. Математичний опис алгоритму зміни гучності звуку ...
2.5.5. Алгоритм зміни гучності звуку. 46
2.5.6. Вимоги до контрольного прикладу. 47
2.5.7. Список умовних позначень. 47
2.6. Опис алгоритму створення ефекту зростаючої гучності ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 48
2.6.1. Призначення і характеристика алгоритму зміни гучності. 48
2.6.2. Використовувана інформація. 48
2.6.3. Результати рішення. 48
2.6.4. Математичний опис алгоритму створення ефекту зростаючої гучності 48
2.6.5. Алгоритм створення ефекту зростаючої гучності. 49
2.6.6. Вимоги до контрольного прикладу. 50
2.6.7. Список умовних позначень. 50
2.7. Опис алгоритму створення ефекту затухаючої гучності ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 51
2.7.1. Призначення і характеристика алгоритму створення ефекту затухаючої гучності 51
2.7.2. Використовувана інформація. 51
2.7.3. Результати рішення. 51
2.7.4. Математичний опис алгоритму створення ефекту затухаючої гучності 51
2.7.5. Алгоритм створення ефекту затухаючої гучності. 52
2.7.6. Вимоги до контрольного прикладу. 53
2.7.7. Список умовних позначень. 53
2.8. Опис алгоритму звернення звукового сигналу ... ... ... ... ... ... .... 54
2.8.1. Призначення і характеристика алгоритму створення ефекту затухаючої гучності 54
2.8.2. Використовувана інформація. 54
2.8.3. Результати рішення. 54
2.8.4. Математичний опис алгоритму звернення сигналу. 54
2.8.5. Алгоритм звернення звукового сигналу. 55
2.8.6. Вимоги до контрольного прикладу. 56
2.8.7. Список умовних позначень. 56
2.9. Опис підпрограми «Reverberation» ... ... ... ... ... ... ... ... ... .. 57
2.9.1. Вступна частина. 57
2.9.2. Функціональне призначення. 57
2.9.3. Опис інформації. 57
2.9.4. Використовувані програми .. 59
2.9.5. Схема підпрограми «Reverberation». 59
2.10. Опис підпрограми «Echo» ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 61
2.10.1. Вступна частина. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 61
2.10.2. Функціональне призначення ... ... ... ... ... ... ... ... ... .... 61
2.10.3. Опис інформації ... ... ... ... ... ... ... ... ... ... ... ... .. 61
2.10.4. Використовувані підпрограми .. ... ... ... ... ... ... ... ... .... 62
2.10.5. Схема підпрограми «Echo» ... ... ... ... ... ... ... ... ... ... ... 62
2.11. Опис підпрограми «SetSpeedOfAudio» ... ... ... 64
2.11.1. Вступна частина. 64
2.11.2. Функціональне призначення 64
2.11.3. Опис інформації ... ... ... ... ... ... ... ... ... ... .... 64
2.11.4. Використовувані програми .. ... ... ... ... ... ... ... ... ... ... .... 65
2.11.5. Схема підпрограми «SetSpeedOfAudio». ... ... ... .. 65
2.12. Опис підпрограми «SetVolumeOfAudio» ... ... ... ... ... ... ... ... ... .. 67
2.12.1. Вступна частина. ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 67
2.12.2. Функціональне призначення ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 67
2.12.3. Опис інформації ... ... ... ... ... ... ... ... ... ... ... ... .. ... 67
2.12.4. Використовувані програми .. ... ... ... ... ... ... ... ... ... ... ... 68
2.12.5. Схема підпрограми «SetVolumeOfAudio». ... ... ... .. 68
2.13. Опис підпрограми «ReChangeVolumeOfAudio» ... ... ... ... .. 70
2.13.1. Вступна частина. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 70
2.13.2. Функціональне призначення. ... ... ... ... ... ... ... ... ... ... ... ... 70
2.13.3. Опис інформації ... ... ... ... ... ... ... ... ... ... ... ... ... 70
2.13.4. Використовувані програми .. ... ... ... ... ... ... ... ... ... ... ... ... 71
2.13.5. Схема підпрограми «ReChangeVolumeOfAudio». ... ... 71
2.14. Опис підпрограми «ChangeVolumeOfAudio» ... ... ... ... ... ... .... 73
2.14.1. Вступна частина. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 73
2.14.2. Функціональне призначення. ... ... ... ... ... ... ... ... ... ... ... ... 73
2.14.3. Опис інформації. ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 73
2.14.4. Використовувані програми .. ... ... ... ... ... ... ... ... ... ... ... ... 74
2.14.5. Схема підпрограми «ChangeVolumeOfAudio». ... ... 74
2.15. Опис підпрограми «ReverseAudio» ... ... ... ... ... ... ... ... ... .. 76
2.15.1. Вступна частина. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 76
2.15.2. Функціональне призначення. ... ... ... ... ... ... ... ... ... ... ... ... 76
2.15.3. Опис інформації. ... ... ... ... ... ... ... ... ... ... ... ... ... .... 76
2.15.4. Використовувані програми .. ... ... ... ... ... ... ... ... ... ... ... ... 77
2.15.5. Схема підпрограми «ReverseAudio». ... ... ... ... ... ... ... 77
2.16. Опис контрольного прикладу ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 79
2.16.1. Призначення. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 79
2.16.2. Вихідні дані. ... ... ... ... ... ... ... ... ... ... ... ... ... .... 79
2.16.3. Контрольний приклад. ... ... ... ... ... ... ... ... ... ... ... ... ... ... 80
2.16.4. Результати тестування роботи підсистеми обробки та фільтрації звукового сигналу. 84
3. ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ЧАСТИНА ... ... ... ... ... ... ... 85
3.1 Обгрунтування необхідності розробки підсистеми обробки та фільтрації сигналу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... 85
3.2 Розрахунок витрат на розробку підсистеми обробки та фільтрації сигналу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 85
4. ЕКОЛОГІЧНІСТЬ І БЕЗПЕКА ПРОЕКТУ ... ... ... ... ... ... .... 91
4.1. Аналіз небезпечних і шкідливих факторів, що виникають при експлуатації комп'ютера ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 91
4.1.1. Виявлення джерел шуму і вібрації. 92
4.1.2. Виявлення джерел випромінювання ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..... 91
4.2. Електробезпека при роботі з комп'ютером ... ... ... ... ... ... ... ... ... .. 94
4.3. Організація робочого місця інженера-програміста ... ... ... ... ... ... ... 95
4.4. Вимоги до параметрів мікроклімату приміщення. ... ... ... ... ... ... ... 98
4.5. Вимоги до освітлення робочих місць. ... ... ... ... ... ... ... ... ... ... .... 100
4.6. Пожежна безпека ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 106
ВИСНОВОК ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 109
СПИСОК ЛІТЕРАТУРИ ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 110
ДОДАТОК 1 ТЕКСТ ПРОГРАМИ ... ... ... ... ... ... ... ... ... ... .... 113
ДОДАТОК 2 КЕРІВНИЦТВО ПРОГРАМІСТА ... ... ... ... ... .... 202
ДОДАТОК 3 КЕРІВНИЦТВО ОПЕРАТОРА ... ... ... ... ... ... ... ... .. 206

ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ
ПЗ - програмне забезпечення.
ОС - операційна система.
ЕОМ - електронно-обчислювальна машина.
ПК - персональний комп'ютер.

ВСТУП

Звукова хвиля (звукові коливання) - це передаються у просторі механічні коливання молекул речовини. Тіло, що створює обурення (коливання) повітря, називають джерелом звуку. Звичне для всіх нас поняття «звук» означає всього лише сприймається слуховим апаратом людини набір звукових коливань.
Звукові коливання, а також взагалі всі коливання, як відомо з фізики, характеризуються амплітудою (інтенсивністю), частотою і фазою. У відповідності з теорією математика Фур'є, звукову хвилю можна представити у вигляді спектра входять до неї частот. Частотні складові спектра - це синусоїдальні коливання (так звані чисті тони), кожне з яких має свою власну амплітуду і частоту. Таким чином, будь-яке, навіть найскладніше за формою коливання (наприклад, людський голос), можна уявити сумою найпростіших синусоїдальних коливанні певних частот і різної амплітуди. І навпаки, згенерувавши різні коливання і наклавши їх один на одного (змікшований, змішавши), можна отримати різні звуки.
«Звичайний» аналоговий звук представляється в аналоговій апаратурі безперервним електричним сигналом. Комп'ютер оперує з даними в цифровому вигляді. Це означає, що і звук в комп'ютері представляється в цифровому вигляді.
Цифровий звук - це спосіб представлення електричного сигналу за допомогою дискретних чисельних значень його амплітуди. Оцифровка сигналу включає в себе два процеси - процес дискретизації (здійснення вибірки) і процес квантування. Процес дискретизації - це процес отримання значень величин преутвореного сигналу в певні проміжки часу. Квантування - процес заміни реальних значень сигналу наближеними з певною точністю. Таким чином, оцифровка - це фіксація амплітуди сигналу через певні проміжки часу та реєстрація отриманих значень амплітуди у вигляді округлених цифрових значень Записані значення амплітуди сигналу називаються відліками.
Основні параметри цифрового звуку:
- Частота
дискретизації: визначається інтервалом часу, через який відбувається вимір значення амплітуди аналогового сигналу;
- Бітрейт: розрядність квантування; кількість біт, яким описується одна секунда звукового сигналу;
- Число каналів: число джерел звуку, через які відтворюються звукові сигнали.
Під обробкою звуку слід розуміти різні перетворення звукової інформації з метою зміни якихось характеристик звучання. До обробці звуку відносяться способи створення різних звукових ефектів, фільтрація, а також методи очищення звуку від небажаних шумів, зміни тембру і т.д. Все це величезне безліч перетворень зводиться, в кінцевому рахунку, до наступних основних типів: амплітудні, частотні, фазові і тимчасові перетворення.
Варто навести кілька практичних прикладів використання зазначених видів перетворень при створенні реальних звукових ефектів:
- Echo (відлуння). Реалізація повторення звукового сигналу за допомогою тимчасових перетворень таким чином, щоб людське вухо сприймало отриманий сигнал як луна;
- Reverberation (повторення, відображення): надання звучанню об'ємності, характерною для великої зали, де кожен звук породжує відповідний, повільно згасає відгомін;

Розроблена підсистема є невід'ємною частина системи обробки аудіоінформації, призначеної для обробки та кодування звукових сигналів. Обробка дозволяє перетворити вихідний звуковий сигнал для отримання необхідних характеристик його звучання перед початком кодування. Розроблена підсистема застосовується до звукових сигналів для їх підготовки до кодування у відповідній підсистемі. За допомогою застосування системи обробки аудіоінформації можна перетворити звукові сигнали до необхідного вигляду і стиснути для зменшення займаного ними розміру.
Створену систему слід розглядати як дослідницьку систему, призначену для виявлення емпіричних закономірностей у предметній області і подальшу розробку в напрямку більшої автоматизації процесу перетворення звукових сигналів.

СПИСОК ЛІТЕРАТУРИ

1. Аммерал Л. Принципи програмування в машинній графіці. - М.: Сол Систем, 1992.
2. Крамер Г. Математичні методи статистики. - М.: Світ, 1975.
3. Строустрап Б. Мова програмування С + +. - М.: Світ, 1994. - 278 с.
4. Кнут Д. Мистецтво програмування для ЕОМ. - М.: Світ, 1976. - Т. 1-3 ..
5. Корн Г., Корн Т. Довідник з математики для наукових працівників та інженерів. - М.: Наука, 1979. - 720с.
6. Левкович О.А., Шелкопляс Є.С., Шелкопляс Т.М. Основи комп'ютерної грамотності: Навчальний посібник. - М.: ТетраСистемс, 2004.-528 с.
7. ГОСТ 12.1.003-83. ССБТ. Шум, загальні вимоги безпеки. - М.: Видавництво стандартів, 1985.
8. ГОСТ 12.1.006-84. ССБТ. Електромагнітні поля радіочастот. Допустимі рівні на робочих місцях і вимоги до проведення контролю. - М.: Видавництво стандартів, 1985.
9. СанПіН 2.2.2.542-96. Гігієнічні вимоги до відео-дисплейним терміналам, персонально-обчислювальних машин та організація робіт. - М.: Госкомсанепіднадзор Росії, 1996.
10.Налоговий кодекс РФ. - М.: ГроссМедіа Ферлаг, 2004. - 432 с.
11.Клімова Л.М. Pascal 7.0. Практичне програмування. Рішення типових завдань. - М.: Кудиц-Образ, 2000 .- 527с.
12.Зіміна Т.Ф., Стеценко І.В. Турбо Паскаль 7.0. - Київ: БХВ, 1999 - 448с.
13.Баженова І.Ю. Delphi 5. Самовчитель програміста. - М.: Кудиц-Образ, 2000 .- 336с.
14.Баас Р., Фервай М. Delphi 3.0 - Київ: БХВ, 1999 - 448с.


ДОДАТОК 1

ТЕКСТ ПРОГРАМИ

П. 1.1. ТЕКСТ МОДУЛЯ MAIN. PAS
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, Spin,
MMSystem, ShellApi, FileUtils, AudioFormat,
PCM_Format, MP3_Format, EM1_Format, Menus, Help, AudioForm, MP3Form, EffectsForm;
type
TMainForm = class (TForm)
OutDeviceComboBox: TComboBox;
InDeviceComboBox: TComboBox;
TrackBar: TTrackBar;
PlayButton: TSpeedButton;
PauseButton: TSpeedButton;
RecordButton: TSpeedButton;
OpenButton: TSpeedButton;
SaveButton: TSpeedButton;
TimePosition: TStaticText;
PositionSpinEdit: TSpinEdit;
OpenDialog: TOpenDialog;
Marker1: TBitBtn;
Marker2: TBitBtn;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
SetMarkerButton: TButton;
DeleteMarkersButton: TButton;
CopyButton: TBitBtn;
CutButton: TBitBtn;
ClearButton: TBitBtn;
PasteButton: TBitBtn;
PasteFileButton: TBitBtn;
DeleteButton: TBitBtn;
TabSheet3: TTabSheet;
SetSpeedText: TStaticText;
SetVolumeText: TStaticText;
EffectButton: TButton;
EffectBox: TComboBox;
PaintBox1: TPaintBox;
WaveOutButton: TSpeedButton;
WaveInButton: TSpeedButton;
PasteSilenceButton: TButton;
CopyToFileButton: TBitBtn;
UndoButton: TBitBtn;
HelpButton: TBitBtn;
SaveDialog: TSaveDialog;
TabSheet9: TTabSheet;
BrainWaveButton: TButton;
BWFreqEdit1: TSpinEdit;
StaticText15: TStaticText;
BWFreqEdit2: TSpinEdit;
StaticText16: TStaticText;
SSelButton: TBitBtn;
FSelButton: TBitBtn;
StaticText4: TStaticText;
UndoCheckBox: TCheckBox;
EMailButton: TSpeedButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
BitBtn1: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn2: TBitBtn;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
BitBtn7: TBitBtn;
BitBtn8: TBitBtn;
BitBtn9: TBitBtn;
BitBtn10: TBitBtn;
Button1: TBitBtn;
Button2: TBitBtn;
Button6: TBitBtn;
BitBtn13: TBitBtn;
BitBtn14: TBitBtn;
BitBtn15: TBitBtn;
BitBtn16: TBitBtn;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N15: TMenuItem;
N31: TMenuItem;
N30: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
N18: TMenuItem;
N19: TMenuItem;
N24: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
N23: TMenuItem;
N25: TMenuItem;
N26: TMenuItem;
N27: TMenuItem;
N28: TMenuItem;
N29: TMenuItem;
N32: TMenuItem;
N33: TMenuItem;
N34: TMenuItem;
N35: TMenuItem;
N36: TMenuItem;
N37: TMenuItem;
N38: TMenuItem;
N39: TMenuItem;
N40: TMenuItem;
N41: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N42: TMenuItem;
SilenceTime: TSpinEdit;
Memo1: TMemo;
PasteModeComboBox: TComboBox;
PasteModeText: TStaticText;
Left10Button: TButton;
StaticText17: TStaticText;
Right10Button: TButton;
SpeedEdit: TSpinEdit;
VolumeEdit: TSpinEdit;
ChangeVolumeBitBtn: TBitBtn;
ChangeSpeedButton: TBitBtn;
SetSpeedBitBtn: TBitBtn;
SetVolumeBitBtn: TBitBtn;
ReverseButton: TBitBtn;
NormalizeBitBtn: TBitBtn;
PageControl2: TPageControl;
TabSheet4: TTabSheet;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
nSamplesPerSecText: TStaticText;
nSamplesPerSecButton: TButton;
nSamplesBox: TComboBox;
nBitsBox: TComboBox;
nBitsPerSampleButton: TButton;
nBitsPerSampleText: TStaticText;
nChannelsText: TStaticText;
nChannelsButton: TButton;
nChannelsBox: TComboBox;
TabSheet5: TTabSheet;
ConstantBitrateComboBox: TComboBox;
StaticText1: TStaticText;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
AverageBitrateComboBox: TComboBox;
VariableBitRateComboBox: TComboBox;
StaticText2: TStaticText;
StaticText3: TStaticText;
StereoModeComboBox: TComboBox;
TabSheet6: TTabSheet;
PageControl3: TPageControl;
TabSheet7: TTabSheet;
StaticText5: TStaticText;
nResponsesEdit: TSpinEdit;
ResponseTimeEdit: TSpinEdit;
ResponseVolumeEdit: TSpinEdit;
StaticText6: TStaticText;
StaticText7: TStaticText;
StaticText8: TStaticText;
StaticText9: TStaticText;
TabSheet8: TTabSheet;
nEchosEdit: TSpinEdit;
DelayEdit: TSpinEdit;
EchoVolumeEdit: TSpinEdit;
StaticText10: TStaticText;
StaticText11: TStaticText;
StaticText12: TStaticText;
StaticText13: TStaticText;
StaticText14: TStaticText;
N43: TMenuItem;
MP31: TMenuItem;
N44: TMenuItem;
ButtonZoomIn: TBitBtn;
ButtonZoomOut: TBitBtn;
AudioOptionsButton: TBitBtn;
MP3OptionsButton: TBitBtn;
EffOptionsButton: TBitBtn;
procedure FormCreate (Sender: TObject);
procedure OpenButtonClick (Sender: TObject);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
procedure PlayButtonClick (Sender: TObject);
procedure PauseButtonClick (Sender: TObject);
procedure RecordButtonClick (Sender: TObject);
procedure TrackBarChange (Sender: TObject);
procedure PositionSpinEditChange (Sender: TObject);
procedure SaveButtonClick (Sender: TObject);
procedure SetMarkerButtonClick (Sender: TObject);
procedure DeleteMarkersButtonClick (Sender: TObject);
procedure CopyButtonClick (Sender: TObject);
procedure CutButtonClick (Sender: TObject);
procedure ClearButtonClick (Sender: TObject);
procedure PasteButtonClick (Sender: TObject);
procedure ReverseButtonClick (Sender: TObject);
procedure SetSpeedButtonClick (Sender: TObject);
procedure ChangePropertie (Sender: TObject);
procedure AboutButtonClick (Sender: TObject);
procedure HomePageLinkClick (Sender: TObject);
procedure SetVolumeButtonClick (Sender: TObject);
procedure DeleteButtonClick (Sender: TObject);
procedure NormalizeButtonClick (Sender: TObject);
procedure PasteSilenceButtonClick (Sender: TObject);
procedure SetSpeedBitBtnClick (Sender: TObject);
procedure ChangeSpeedButtonClick (Sender: TObject);
procedure SetVolumeBitBtnClick (Sender: TObject);
procedure ChangeVolumeBitBtnClick (Sender: TObject);
procedure NormalizeBitBtnClick (Sender: TObject);
procedure EffectButtonClick (Sender: TObject);
procedure PaintBox1Paint (Sender: TObject);
procedure WaveOutButtonClick (Sender: TObject);
procedure WaveInButtonClick (Sender: TObject);
procedure CopyToFileButtonClick (Sender: TObject);
procedure UndoButtonClick (Sender: TObject);
procedure EMailButtonClick (Sender: TObject);
procedure BrainWaveButtonClick (Sender: TObject);
procedure Left10ButtonClick (Sender: TObject);
procedure SSelButtonClick (Sender: TObject);
procedure HelpButtonClick (Sender: TObject);
procedure UndoCheckBoxClick (Sender: TObject);
procedure N4Click (Sender: TObject);
procedure N43Click (Sender: TObject);
procedure MP31Click (Sender: TObject);
procedure N44Click (Sender: TObject);
procedure ButtonZoomInClick (Sender: TObject);
procedure ButtonZoomOutClick (Sender: TObject);
procedure AudioOptionsButtonClick (Sender: TObject);
procedure MP3OptionsButtonClick (Sender: TObject);
procedure EffOptionsButtonClick (Sender: TObject);
private
{Private declarations}
public
procedure SetAudioPosition;
procedure SetMarker;
procedure DeleteMarkers;
procedure PaintAudioGraph;
procedure SaveUndoInfo;
end;
type
TPlayThread = class (TThread)
public
WaveOut: HWaveOut;
procedure Execute; override;
end;
TRecordThread = class (TThread)
public
WaveIn: HWaveIn;
procedure Execute; override;
end;
var
MainForm: TMainForm;
SamplesPerPoint: Cardinal;
Status: String;
AudioPosition: Cardinal;
AudioData: TAudioData;
AudioClipBoard: TAudioData;
PlayThread: TPlayThread;
RecordThread: TRecordThread;
Selection: record
Start: Cardinal;
Finish: Cardinal;
StartExists: Boolean;
FinishExists: Boolean;
end;
UndoInfo: record
Selection: record
Start: Cardinal;
Finish: Cardinal;
StartExists: Boolean;
FinishExists: Boolean;
end;
AudioPosition: Cardinal;
AudioData: TAudioData;
end;
implementation
{$ R *. dfm}
procedure TMainForm.FormCreate (Sender: TObject);
var
WaveOutCaps: TWaveOutCaps;
WaveInCaps: TWaveInCaps;
i: Cardinal;
begin
SamplesPerPoint: = 16;
BorderIcons: = BorderIcons - [biMaximize];
AudioData: = TAudioData.Create;
AudioClipBoard: = TAudioData.Create;
with AudioData do
begin
nChannels: = 2;
nBitsPerSample: = 16;
nSamplesPerSec: = 44100;
Calculate_nBlockAlign;
end;
AudioPosition: = 0;
if WaveOutGetNumDevs <> 0 then
begin
for i: = 0 to WaveOutGetNumDevs-1 do
begin
WaveOutGetDevCaps (i, @ WaveOutCaps, SizeOf (TWaveOutCaps));
OutDeviceComboBox.Items.Add (PChar (@ WaveOutCaps.szPname));
end;
OutDeviceComboBox.ItemIndex: = 0;
end;
if WaveInGetNumDevs <> 0 then
begin
for i: = 0 to WaveInGetNumDevs-1 do
begin
WaveInGetDevCaps (i, @ WaveInCaps, SizeOf (TWaveInCaps));
InDeviceComboBox.Items.Add (PChar (@ WaveInCaps.szPname));
end;
InDeviceComboBox.ItemIndex: = 0;
end;
AudioData.Calculate_nBlockAlign;
UndoInfo.AudioData: = TAudioData.Create;
Status: = 'starting';
end;
procedure TMainForm.SetAudioPosition;
var
AudioSize, Long: Cardinal;
S, S2: String;
begin
PaintBox1.Repaint;
with AudioData do AudioSize: = Data.Size div nBlockAlign;
if AudioSize = 0 then Exit;
if AudioSize <TrackBar.Width then TrackBar.Max: = AudioSize else TrackBar.Max: = TrackBar.Width;
with PositionSpinEdit do
begin
Value: = AudioPosition;
MinValue: = 0;
MaxValue: = AudioSize;
end;
if TrackBar.Position <> Round (AudioPosition * TrackBar.Max / AudioSize) then TrackBar.Position: = Round (AudioPosition * TrackBar.Max / AudioSize);
S2: ='';
Long: = Trunc (AudioPosition / AudioData.nSamplesPerSec);
Str (Trunc (Long/3600), S);
Long: = Long - Trunc (Long/3600) * 3600;
S2: = S2 + S +':';
Str (Trunc (Long/60), S);
Long: = Long - Trunc (Long/60) * 60;
if Length (S) = 1 then S2: = S2 + 0 ";
S2: = S2 + S +':';
Str (Long, S);
if Length (S) = 1 then S2: = S2 + 0 ";
S2: = S2 + S + '/';
Long: = Trunc (AudioSize / AudioData.nSamplesPerSec);
Str (Trunc (Long/3600), S);
Long: = Long - Trunc (Long/3600) * 3600;
S2: = S2 + S +':';
Str (Trunc (Long/60), S);
Long: = Long - Trunc (Long/60) * 60;
if Length (S) = 1 then S2: = S2 + 0 ";
S2: = S2 + S +':';
Str (Long, S);
if Length (S) = 1 then S2: = S2 + 0 ";
S2: = S2 + S + '';
if TimePosition.Caption <> S2 then TimePosition.Caption: = S2;
{PaintBox1.Repaint;}
PaintAudioGraph;
end;
procedure TMainForm.SetMarker;
var
AudioSize: Cardinal;
begin
if (Status = 'starting') then Exit;
with AudioData do AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if (AudioPosition = Start) and (StartExists) or (AudioPosition = Finish) and (FinishExists) then Exit;
if not StartExists then
begin
Start: = AudioPosition;
StartExists: = True;
Marker1.Left: = 8 + Round (Start * (TrackBar.Max-20) / AudioSize);
Marker1.Visible: = True;
Exit;
end;
if (StartExists) and (not FinishExists) then
begin
if AudioPosition> Start then
Finish: = AudioPosition
else
begin
Finish: = Start;
Start: = AudioPosition;
end;
FinishExists: = True;
TrackBar.SelStart: = Round (Start * TrackBar.Max / AudioSize);
TrackBar.SelEnd: = Round (Finish * TrackBar.Max / AudioSize);
Marker1.Left: = 8 + Round (Start * (TrackBar.Max-20) / AudioSize);
Marker1.Visible: = True;
Marker2.Left: = 8 + Round (Finish * (TrackBar.Max-20) / AudioSize);
Marker2.Visible: = True;
PaintBox1.Repaint;
Exit;
end;
if (StartExists) and (FinishExists) then
begin
if AudioPosition <Start then
Start: = AudioPosition
else
if AudioPosition> Finish then
Finish: = AudioPosition;
TrackBar.SelStart: = Round (Start * TrackBar.Max / AudioSize);
TrackBar.SelEnd: = Round (Finish * TrackBar.Max / AudioSize);
Marker1.Left: = 8 + Round (Start * (TrackBar.Max-20) / AudioSize);
Marker1.Visible: = True;
Marker2.Left: = 8 + Round (Finish * (TrackBar.Max-20) / AudioSize);
Marker2.Visible: = True;
PaintBox1.Repaint;
Exit;
end;
end;
end;
procedure TMainForm.DeleteMarkers;
begin
Selection.StartExists: = False;
Selection.FinishExists: = False;
Marker1.Visible: = False;
Marker2.Visible: = False;
TrackBar.SelStart: = 0;
TrackBar.SelEnd: = 0;
PaintBox1.Repaint;
end;
procedure TMainForm.OpenButtonClick (Sender: TObject);
var
FileName, S, Ext: String;
i: Byte;
PCM: TPCMFile;
MP3: TMP3File;
EM1: TEM1File;
begin
if (Status <> 'starting') and (Status <> 'waiting') then Exit;
if OpenDialog.Execute then FileName: = OpenDialog.FileName else Exit;
Status: = 'opening';
AudioData.Data.Clear;
if GetFileAttributes (PChar (FileName)) and FILE_ATTRIBUTE_READONLY = FILE_ATTRIBUTE_READONLY then
SetFileAttributes (PChar (FileName), GetFileAttributes (PChar (FileName)) xor FILE_ATTRIBUTE_READONLY);
Ext: = ExtractFileExt (FileName);
for i: = 1 to Length (Ext) do Ext [i]: = UpCase (Ext [i]);
if Ext = '. WAV' then
begin
PCM: = TPCMFile.Open (FileName);
PCM.ReadAudioData (AudioData);
PCM.Destroy;
end;
if Ext = '. MP3' then
begin
MP3: = TMP3File.Open (FileName);
MP3.ReadAudioData (AudioData);
MP3.Destroy;
end;
if Ext = '. EM1' then
begin
EM1: = TEM1File.Open (FileName);
EM1.ReadAudioData (AudioData);
EM1.Destroy;
end;
Str (AudioData.nChannels, S);
AudioOptionsForm.nChannelsText.Caption: = S + 'channels';
Str (AudioData.nBitsPerSample, S);
AudioOptionsForm.nBitsPerSampleText.Caption: = S + 'bits';
Str (AudioData.nSamplesPerSec, S);
AudioOptionsForm.nSamplesPerSecText.Caption: = S + 'Hz';
AudioPosition: = 0;
AudioData.Calculate_nBlockAlign;
SetAudioPosition;
DeleteMarkers;
Status: = 'waiting';
end;
procedure TMainForm.PlayButtonClick (Sender: TObject);
begin
if Status <> 'waiting' then Exit;
if OutDeviceComboBox.ItemIndex = -1 then Exit;
if AudioPosition * AudioData.nBlockAlign> = AudioData.Data.Size then Exit;
Status: = 'playing';
PlayThread: = TPlayThread.Create (False);
end;
procedure TPlayThread.Execute;
const
BlockSize = 1024 * 24;
var
hEvent: THandle;
WaveFormatEx: TWaveFormatEx;
WaveHdr: array [0 .. 1] of TWaveHdr;
Buf: array [0 .. 1] of array [0 .. BlockSize-1] of Byte;
i: Cardinal;
begin
with WaveFormatEx do
begin
wFormatTag: = WAVE_FORMAT_PCM;
nChannels: = AudioData.nChannels;
nSamplesPerSec: = AudioData.nSamplesPerSec;
wBitsPerSample: = AudioData.nBitsPerSample;
nBlockAlign: = wBitsPerSample div 8 * nChannels;
nAvgBytesPerSec: = nSamplesPerSec * nBlockAlign;
cbSize: = 0;
end;
hEvent: = CreateEvent (nil, False, False, nil);
if WaveOutOpen (@ WaveOut, MainForm.OutDeviceComboBox.ItemIndex, @ WaveFormatEx, hEvent, 0, CALLBACK_EVENT) <> MMSYSERR_NOERROR then
begin
Status: = 'waiting';
CloseHandle (hEvent);
Terminate;
Exit;
end;
MainForm.PlayButton.Flat: = True;
for i: = 0 to 1 do
begin
WaveHdr [i]. LpData: = @ Buf [i];
WaveHdr [i]. DwBufferLength: = BlockSize;
AudioData.Data.Position: = AudioPosition * AudioData.nBlockAlign;
if i <> 1 then
begin
AudioData.Data.Read (Buf [i], BlockSize);
AudioPosition: = AudioPosition + BlockSize div AudioData.nBlockAlign;
if AudioPosition * AudioData.nBlockAlign> = AudioData.Data.Size then AudioPosition: = AudioData.Data.Size div AudioData.nBlockAlign;
end;
WaveOutPrepareHeader (WaveOut, @ WaveHdr [i], SizeOf (TWaveHdr));
end;
i: = 0;
while (not Terminated) and (AudioData.Data.Position <AudioData.Data.Size) do
begin
WaveOutWrite (WaveOut, @ WaveHdr [i], SizeOf (TWaveHdr));
WaitForSingleObject (hEvent, INFINITE);
i: = i xor 1;
AudioData.Data.Position: = AudioPosition * AudioData.nBlockAlign;
AudioData.Data.Read (Buf [i], BlockSize);
AudioPosition: = AudioPosition + (BlockSize div AudioData.nBlockAlign);
if AudioPosition * AudioData.nBlockAlign> = AudioData.Data.Size then AudioPosition: = AudioData.Data.Size div AudioData.nBlockAlign;
MainForm.SetAudioPosition;
end;
WaveOutReset (WaveOut);
for i: = 0 to 1 do WaveOutUndivpareHeader (WaveOut, @ WaveHdr [i], SizeOf (WaveHdr));
WaveOutClose (WaveOut);
CloseHandle (hEvent);
if not Terminated then Terminate;
MainForm.PlayButton.Flat: = False;
Status: = 'waiting';
end;
procedure TMainForm.RecordButtonClick (Sender: TObject);
begin
if (Status <> 'waiting') and (Status <> 'starting') then Exit;
if InDeviceComboBox.ItemIndex = -1 then Exit;
Status: = 'recording';
RecordThread: = TRecordThread.Create (False);
end;
procedure TRecordThread.Execute;
const
BlockSize = 1024 * 24;
BufNumber = 8;
var
hEvent: THandle;
WaveFormatEx: TWaveFormatEx;
WaveHdr: array [0 .. BufNumber-1] of TWaveHdr;
Buf: array [0 .. BufNumber-1] of array [0 .. BlockSize-1] of Byte;
i: Cardinal;
begin
with WaveFormatEx do
begin
wFormatTag: = WAVE_FORMAT_PCM;
nChannels: = AudioData.nChannels;
nSamplesPerSec: = AudioData.nSamplesPerSec;
wBitsPerSample: = AudioData.nBitsPerSample;
nBlockAlign: = wBitsPerSample div 8 * nChannels;
nAvgBytesPerSec: = nSamplesPerSec * nBlockAlign;
cbSize: = 0;
end;
hEvent: = CreateEvent (nil, False, False, nil);
if WaveInOpen (@ WaveIn, MainForm.InDeviceComboBox.ItemIndex, @ WaveFormatEx, hEvent, 0, CALLBACK_EVENT) <> MMSYSERR_NOERROR then
begin
Status: = 'waiting';
CloseHandle (hEvent);
Terminate;
Exit;
end;
MainForm.RecordButton.Flat: = True;
for i: = 0 to BufNumber-1 do
begin
WaveHdr [i]. LpData: = @ Buf [i];
WaveHdr [i]. DwBufferLength: = BlockSize;
WaveInPrepareHeader (WaveIn, @ WaveHdr [i], SizeOf (TWaveHdr));
end;
WaveInStart (WaveIn);
WaitForSingleObject (hEvent, INFINITE);
for i: = 0 to BufNumber-1 do
WaveInAddBuffer (WaveIn, @ WaveHdr [i], SizeOf (TWaveHdr));
i: = BufNumber-1;
while not Terminated do
begin
if i = BufNumber-1 then i: = 0 else Inc (i);
if (WaveHdr [i]. dwFlags and WHDR_DONE) <> WHDR_DONE then
WaitForSingleObject (hEvent, INFINITE);
AudioData.Data.Position: = AudioPosition * AudioData.nBlockAlign;
AudioData.Data.Write (Buf [i], WaveHdr [i]. DwBytesRecorded);
AudioPosition: = AudioPosition + (WaveHdr [i]. DwBytesRecorded div AudioData.nBlockAlign);
WaveInAddBuffer (WaveIn, @ WaveHdr [i], SizeOf (TWaveHdr));
MainForm.SetAudioPosition;
end;
WaveInReset (WaveIn);
for i: = 0 to BufNumber-1 do
WaveInUndivpareHeader (WaveIn, @ WaveHdr [i], SizeOf (WaveHdr));
WaveInClose (WaveIn);
CloseHandle (hEvent);
if not Terminated then Terminate;
with MainForm.PositionSpinEdit do
begin
Value: = AudioPosition;
MinValue: = 0;
MaxValue: = AudioData.Data.Size div AudioData.nBlockAlign;;
end;
MainForm.RecordButton.Flat: = False;
Status: = 'waiting';
end;
procedure TMainForm.PauseButtonClick (Sender: TObject);
begin
if Status = 'playing' then PlayThread.Terminate;
if Status = 'recording' then RecordThread.Terminate;
end;
procedure TMainForm.TrackBarChange (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
if TrackBar.Position <> Round (AudioPosition * TrackBar.Max / AudioSize) then
begin
AudioPosition: = Round (TrackBar.Position / TrackBar.Max * AudioSize);
SetAudioPosition;
end;
end;
procedure TMainForm.PositionSpinEditChange (Sender: TObject);
begin
if Status <> 'waiting' then Exit;
AudioPosition: = PositionSpinEdit.Value;
SetAudioPosition;
end;
procedure TMainForm.SaveButtonClick (Sender: TObject);
var
FileName, Ext, EncMode, StereoMode, BitRate: String;
i: Byte;
Code: Integer;
PCM: TPCMFile;
MP3: TMP3File;
EM1: TEM1File;
begin
if Status <> 'waiting' then Exit;
if SaveDialog.Execute then
FileName: = SaveDialog.FileName else Exit;
Ext: = ExtractFileExt (FileName);
for i: = 1 to Length (Ext) do Ext [i]: = UpCase (Ext [i]);
if Ext = '. WAV' then
begin
PCM: = TPCMFile.Create (FileName, AudioData);
PCM.Destroy;
end;
if Ext = '. MP3' then
begin
if RadioButton1.Checked then
begin
BitRate: = MP3OptionsForm.ConstantBitRateComboBox.Text;
EncMode: = '-b';
end;
if RadioButton2.Checked then
begin
BitRate: = MP3OptionsForm.AverageBitRateComboBox.Text;
EncMode: = '- abr';
end;
if RadioButton3.Checked then
begin
Str (MP3OptionsForm.VariableBitrateComboBox.ItemIndex, BitRate);
EncMode: = '-V';
end;
case MP3OptionsForm.StereoModeComboBox.ItemIndex of
0: StereoMode: = 's';
1: StereoMode: = 'j';
2: StereoMode: = 'f';
3: StereoMode: = 'd';
4: StereoMode: = 'm';
end;
MP3: = TMP3File.Create (FileName, AudioData, BitRate, EncMode, StereoMode);
MP3.Destroy;
end;
if Ext = '. EM1' then
begin
EM1: = TEM1File.Create (FileName, AudioData);
EM1.Destroy;
end;
end;
procedure TMainForm.SetMarkerButtonClick (Sender: TObject);
begin
SetMarker;
end;
procedure TMainForm.DeleteMarkersButtonClick (Sender: TObject);
begin
DeleteMarkers;
end;
procedure TMainForm.CopyButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
S: String;
begin
if Status <> 'waiting' then Exit;
Status: = 'editing';
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
CopyAudio (AudioData, AudioClipBoard, Start, Finish);
end;
Str (AudioClipBoard.Data.Size div AudioClipBoard.nBlockAlign div AudioClipBoard.nSamplesPerSec, S);
Memo1.Text: = 'У буффере' + S + 'сек.';
Status: = 'waiting';
end;
procedure TMainForm.DeleteButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'editing';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
DeleteAudio (AudioData, Start, Finish);
DeleteMarkers;
AudioPosition: = Start;
SetAudioPosition;
end;
Status: = 'waiting';
end;
procedure TMainForm.CutButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
S: String;
begin
if Status <> 'waiting' then Exit;
Status: = 'editing';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
CopyAudio (AudioData, AudioClipBoard, Start, Finish);
DeleteAudio (AudioData, Start, Finish);
DeleteMarkers;
AudioPosition: = Start;
SetAudioPosition;
end;
Str (AudioClipBoard.Data.Size div AudioClipBoard.nBlockAlign div AudioClipBoard.nSamplesPerSec, S);
Memo1.Text: = 'У буффере' + S + 'сек.';
Status: = 'waiting';
end;
procedure TMainForm.ClearButtonClick (Sender: TObject);
var
AudioSize, i: Cardinal;
Buf: Byte;
begin
if Status <> 'waiting' then Exit;
Status: = 'editing';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
Buf: = 0;
AudioData.Data.Position: = Start * AudioData.nBlockAlign;
for i: = Start * AudioData.nBlockAlign to Finish * AudioData.nBlockAlign-1 do
AudioData.Data.Write (Buf, 1);
end;
Status: = 'waiting';
PaintAudioGraph;
end;
procedure TMainForm.PasteButtonClick (Sender: TObject);
var
MP3: TMP3File;
PCM: TPCMFile;
EM1: TEM1File;
i: Byte;
FileName, S, Ext: String;
TempAudio: TAudioData;
begin
if (Status <> 'waiting') and (Status <> 'starting') then Exit;
if Sender = PasteFileButton then
begin
if OpenDialog.Execute then FileName: = OpenDialog.FileName else Exit;
Status: = 'opening';
Ext: = ExtractFileExt (FileName);
if GetFileAttributes (PChar (FileName)) and FILE_ATTRIBUTE_READONLY = FILE_ATTRIBUTE_READONLY then
SetFileAttributes (PChar (FileName), GetFileAttributes (PChar (FileName)) xor FILE_ATTRIBUTE_READONLY);
TempAudio: = TAudioData.Create;
for i: = 1 to Length (Ext) do Ext [i]: = UpCase (Ext [i]);
if Ext = '. WAV' then
begin
PCM: = TPCMFile.Open (FileName);
PCM.ReadAudioData (TempAudio);
PCM.Destroy;
end;
if Ext = '. MP3' then
begin
MP3: = TMP3File.Open (FileName);
MP3.ReadAudioData (TempAudio);
MP3.Destroy;
end;
if Ext = '. EM1' then
begin
EM1: = TEM1File.Open (FileName);
EM1.ReadAudioData (TempAudio);
EM1.Destroy;
end;
SetnSamplesPerSec (TempAudio, AudioData.nSamplesPerSec);
SetnBitsPerSample (TempAudio, AudioData.nBitsPerSample);
SetnChannels (TempAudio, AudioData.nChannels);
end
else
begin
SetnSamplesPerSec (AudioClipBoard, AudioData.nSamplesPerSec);
SetnBitsPerSample (AudioClipBoard, AudioData.nBitsPerSample);
SetnChannels (AudioClipBoard, AudioData.nChannels);
end;
Status: = 'editing';
SaveUndoInfo;
if Sender <> PasteFileButton then
Case PasteModeComboBox.ItemIndex of
0: InsertAudio (AudioClipBoard, AudioData, AudioPosition);
1: OverWriteAudio (AudioClipBoard, AudioData, AudioPosition);
2: MixAudio (AudioClipBoard, AudioData, AudioPosition);
end
else
Case PasteModeComboBox.ItemIndex of
0: InsertAudio (TempAudio, AudioData, AudioPosition);
1: OverWriteAudio (TempAudio, AudioData, AudioPosition);
2: MixAudio (TempAudio, AudioData, AudioPosition);
end;
DeleteMarkers;
SetAudioPosition;
SetMarker;
if Sender <> PasteFileButton then
AudioPosition: = AudioPosition + AudioClipBoard.Data.Size div AudioData.nBlockAlign - 1
else
begin
AudioPosition: = AudioPosition + TempAudio.Data.Size div AudioData.nBlockAlign - 1;
TempAudio.Destroy;
end;
SetAudioPosition;
SetMarker;
Status: = 'waiting';
end;
procedure TMainForm.PasteSilenceButtonClick (Sender: TObject);
var
i: Cardinal;
b: Byte;
TempAudio: TAudioData;
begin
if (Status <> 'waiting') and (Status <> 'starting') then Exit;
Status: = 'editing';
SaveUndoInfo;
TempAudio: = TAudioData.Create;
TempAudio.nChannels: = AudioData.nChannels;
TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
TempAudio.nBitsPerSample: = AudioData.nBitsPerSample;
TempAudio.Calculate_nBlockAlign;
b: = 0;
for i: = 1 to TempAudio.nSamplesPerSec * SilenceTime.Value * TempAudio.nBlockAlign do
TempAudio.Data.Write (b, 1);
InsertAudio (TempAudio, AudioData, AudioPosition);
DeleteMarkers;
SetAudioPosition;
SetMarker;
AudioPosition: = AudioPosition + TempAudio.Data.Size div AudioData.nBlockAlign - 1;
SetAudioPosition;
SetMarker;
TempAudio.Destroy;
Status: = 'waiting';
end;
procedure TMainForm.ReverseButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
ReverseAudio (AudioData, Start, Finish-Start +1);
end;
Status: = 'waiting';
end;
procedure TMainForm.NormalizeButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
Normalize (AudioData, Start, Finish-Start +1);
end;
Status: = 'waiting';
PaintBox1.Repaint;
end;
procedure TMainForm.SetSpeedButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
SetSpeedOfAudio (AudioData, Start, Finish-Start +1, SpeedEdit.Value/100);
DeleteMarkers;
AudioPosition: = Start;
SetMarker;
AudioPosition: = Trunc (Start + (Finish-Start) * 100/SpeedEdit.Value);
SetMarker;
AudioPosition: = Start;
SetAudioPosition;
end;
Status: = 'waiting';
end;
procedure TMainForm.ChangePropertie (Sender: TObject);
var
S: String;
Value, Code: Cardinal;
begin
if (Status <> 'waiting') and (Status <> 'starting') then Exit;
Status: = 'editing';
if Sender = AudioOptionsForm.nSamplesPerSecButton then
begin
Val (AudioOptionsForm.nSamplesBox.Text, Value, Code);
SetnSamplesPerSec (AudioData, Value);
end;
if Sender = AudioOptionsForm.nBitsPerSampleButton then
begin
Val (AudioOptionsForm.nBitsBox.Text, Value, Code);
SetnBitsPerSample (AudioData, Value);
end;
if Sender = AudioOptionsForm.nChannelsButton then
begin
SetnChannels (AudioData, AudioOptionsForm.nChannelsBox.ItemIndex +1);
end;
AudioData.Calculate_nBlockAlign;
DeleteMarkers;
AudioPosition: = 0;
SetAudioPosition;
Str (AudioData.nChannels, S);
AudioOptionsForm.nChannelsText.Caption: = S + 'channels';
Str (AudioData.nBitsPerSample, S);
AudioOptionsForm.nBitsPerSampleText.Caption: = S + 'bits';
Str (AudioData.nSamplesPerSec, S);
AudioOptionsForm.nSamplesPerSecText.Caption: = S + 'Hz';
Status: = 'waiting';
end;
procedure TMainForm.SetVolumeButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
SetVolumeOfAudio (AudioData, Start, Finish-Start +1, VolumeEdit.Value/100);
end;
Status: = 'waiting';
end;
procedure TMainForm.AboutButtonClick (Sender: TObject);
begin
MessageBox (MainForm.Handle, 'AudioEditor v02.2006' # 13 # 13'Виполніл Суханов М.А. '# 13 # 13'ІжГТУ, 2006' # 13 # 13'smike @ pochta.ru ',' Про програму ', MB_OK);
end;
procedure TMainForm.HomePageLinkClick (Sender: TObject);
begin
ShellExecute (Handle, 'open', PChar ('http://Andrei512.narod.ru'),'','', SW_Show);
end;
procedure TMainForm.FormClose (Sender: TObject; var Action: TCloseAction);
begin
AudioData.Destroy;
AudioClipBoard.Destroy;
UndoInfo.AudioData.Destroy;
end;
procedure TMainForm.SetSpeedBitBtnClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
SetSpeedOfAudio (AudioData, Start, Finish-Start +1, SpeedEdit.Value/100);
DeleteMarkers;
AudioPosition: = Start;
SetMarker;
AudioPosition: = Trunc (Start + (Finish-Start) * 100/SpeedEdit.Value);
SetMarker;
AudioPosition: = Start;
SetAudioPosition;
end;
Status: = 'waiting';
end;
procedure TMainForm.ChangeSpeedButtonClick (Sender: TObject);
var
AudioSize, NewCount: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
NewCount: = ChangeSpeedOfAudio (AudioData, Start, Finish-Start +1, SpeedEdit.Value/100);
DeleteMarkers;
AudioPosition: = Start;
SetMarker;
AudioPosition: = Start + NewCount;
SetMarker;
AudioPosition: = Start;
SetAudioPosition;
end;
Status: = 'waiting';
end;
procedure TMainForm.SetVolumeBitBtnClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
SetVolumeOfAudio (AudioData, Start, Finish-Start +1, VolumeEdit.Value/100);
end;
Status: = 'waiting';
PaintBox1.Repaint;
end;
procedure TMainForm.ChangeVolumeBitBtnClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
ChangeVolumeOfAudio (AudioData, Start, Finish-Start +1, VolumeEdit.Value/100);
end;
Status: = 'waiting';
PaintBox1.Repaint;
end;
procedure TMainForm.NormalizeBitBtnClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
Normalize (AudioData, Start, Finish-Start +1);
end;
Status: = 'waiting';
end;
procedure TMainForm.EffectButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
if Sender = BitBtn13 then Echo (AudioData, Start, Finish-Start +1, EffOptionsForm.nResponsesEdit.Value, EffOptionsForm.ResponseTimeEdit.Value, EffOptionsForm.ResponseVolumeEdit.Value/100);
if Sender = BitBtn14 then Reverberation (AudioData, Start, Finish-Start +1, EffOptionsForm.nEchosEdit.Value, EffOptionsForm.DelayEdit.Value, EffOptionsForm.EchoVolumeEdit.Value/100);
if Sender = BitBtn15 then ChangeVolumeOfAudio (AudioData, Start, Finish-Start +1, 0);
if Sender = BitBtn16 then ReChangeVolumeOfAudio (AudioData, Start, Finish-Start +1, 1);
{Case EffectBox.ItemIndex of
0: ChangeVolumeOfAudio (AudioData, Start, Finish-Start +1, 0);
1: ReChangeVolumeOfAudio (AudioData, Start, Finish-Start +1, 1);
2: Echo (AudioData, Start, Finish-Start +1, nResponsesEdit.Value, ResponseTimeEdit.Value, ResponseVolumeEdit.Value/100);
3: Reverberation (AudioData, Start, Finish-Start +1, nEchosEdit.Value, DelayEdit.Value, EchoVolumeEdit.Value/100);
end;}
end;
Status: = 'waiting';
PaintBox1.Repaint;
end;
procedure TMainForm.PaintAudioGraph;
var
PaintPos, MaxPaintPos: Cardinal;
AudioPos, {SamplesPerPoint,} LeftSamples, MaxAmplitude: Cardinal;
numChannels, Channel, i: Word;
Smp, Smp1: Integer;
begin
with PaintBox1.Canvas do
begin
Pen.Color: = clBlack;
MoveTo (Round (PaintBox1.Width / 2), 0);
LineTo (Round (PaintBox1.Width / 2), Round (PaintBox1.Height));
MoveTo (0, Round (PaintBox1.Height / 2));
LineTo (PaintBox1.Width, Round (PaintBox1.Height / 2));
Pen.Color: = clGreen;
end;
MaxPaintPos: = PaintBox1.Width;
if AudioPosition-PaintBox1.Width * SamplesPerPoint> = 0 then
begin
AudioPos: = AudioPosition-PaintBox1.Width * SamplesPerPoint;
PaintPos: = 0;
end
else
begin
AudioPos: = 0;
PaintPos: = PaintBox1.Width - Trunc (AudioPosition / SamplesPerPoint);
end;
numChannels: = AudioData.nChannels;
MaxAmplitude: = 1;
for i: = 1 to AudioData.nBitsPerSample do
MaxAmplitude: = MaxAmplitude * 2;
Smp: = 0;
for Channel: = 0 to numChannels-1 do
begin
AudioData.ReadSample (AudioPos, Channel, Smp1);
Smp: = Smp + Smp1;
end;
Smp: = Round (Smp / numChannels);
PaintBox1.Canvas.MoveTo (PaintPos-Round (PaintBox1.Width / 2), Round (PaintBox1.Height/2-Smp/MaxAmplitude * PaintBox1.Height));
LeftSamples: = SamplesPerPoint;
while PaintPos <= (MaxPaintPos + Round (PaintBox1.Width / 2)) do
begin
Smp: = 0;
for Channel: = 0 to numChannels-1 do
begin
AudioData.ReadSample (AudioPos, Channel, Smp1);
Smp: = Smp + Smp1;
end;
if (Selection.StartExists) and (Selection.FinishExists) and
(AudioPos> Selection.Start) and (AudioPos <Selection.Finish)
then PaintBox1.Canvas.Pen.Color: = clRed
else PaintBox1.Canvas.Pen.Color: = clGreen;
Smp: = Round (Smp / numChannels);
PaintBox1.Canvas.LineTo (PaintPos-Round (PaintBox1.Width / 2), Round (PaintBox1.Height/2-Smp/MaxAmplitude * PaintBox1.Height));
Inc (AudioPos);
Dec (LeftSamples);
if LeftSamples = 0 then
begin
Inc (PaintPos);
LeftSamples: = SamplesPerPoint;
end;
end;
end;
procedure TMainForm.PaintBox1Paint (Sender: TObject);
begin
PaintAudioGraph;
end;
procedure TMainForm.WaveOutButtonClick (Sender: TObject);
begin
ShellExecute (Handle, 'open', PChar ('sndvol32.exe'),'','', SW_Show);
end;
procedure TMainForm.WaveInButtonClick (Sender: TObject);
begin
ShellExecute (Handle, 'open', PChar ('sndvol32.exe'), PChar ('/ r'),'', SW_Show);
end;
procedure TMainForm.CopyToFileButtonClick (Sender: TObject);
var
FileName, Ext, EncMode, StereoMode, BitRate: String;
i: Byte;
TempAudio: TAudioData;
Code: Integer;
PCM: TPCMFile;
MP3: TMP3File;
EM1: TEM1File;
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
if SaveDialog.Execute then
FileName: = SaveDialog.FileName else Exit;
Ext: = ExtractFileExt (FileName);
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
TempAudio: = TAudioData.Create;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
CopyAudio (AudioData, TempAudio, Start, Finish);
end;
for i: = 1 to Length (Ext) do Ext [i]: = UpCase (Ext [i]);
if Ext = '. WAV' then
begin
PCM: = TPCMFile.Create (FileName, TempAudio);
PCM.Destroy;
end;
if Ext = '. MP3' then
begin
if RadioButton1.Checked then
begin
BitRate: = MP3OptionsForm.ConstantBitRateComboBox.Text;
EncMode: = '-b';
end;
if RadioButton2.Checked then
begin
BitRate: = MP3OptionsForm.AverageBitRateComboBox.Text;
EncMode: = '- abr';
end;
if RadioButton3.Checked then
begin
Str (MP3OptionsForm.VariableBitrateComboBox.ItemIndex, BitRate);
EncMode: = '-V';
end;
case MP3OptionsForm.StereoModeComboBox.ItemIndex of
0: StereoMode: = 's';
1: StereoMode: = 'j';
2: StereoMode: = 'f';
3: StereoMode: = 'd';
4: StereoMode: = 'm';
end;
MP3: = TMP3File.Create (FileName, TempAudio, BitRate, EncMode, StereoMode);
MP3.Destroy;
end;
if Ext = '. EM1' then
begin
EM1: = TEM1File.Create (FileName, TempAudio);
EM1.Destroy;
end;
TempAudio.Destroy;
end;
procedure TMainForm.SaveUndoInfo;
begin
if not UndoCheckBox.Checked then Exit;
UndoInfo.AudioPosition: = AudioPosition;
UndoInfo.Selection.Start: = Selection.Start;
UndoInfo.Selection.Finish: = Selection.Finish;
UndoInfo.Selection.StartExists: = Selection.StartExists;
UndoInfo.Selection.FinishExists: = Selection.FinishExists;
UndoInfo.AudioData.Data.Clear;
CopyAudio (AudioData, UndoInfo.AudioData, 0, AudioData.Data.Size div AudioData.nBlockAlign - 1);
end;
procedure TMainForm.UndoButtonClick (Sender: TObject);
begin
if Status <> 'waiting' then Exit;
if UndoInfo.AudioData.Data.Size = 0 then Exit;
Status: = 'undo';
DeleteMarkers;
AudioData.Data.Clear;
CopyAudio (UndoInfo.AudioData, AudioData, 0, UndoInfo.AudioData.Data.Size div UndoInfo.AudioData.nBlockAlign - 1);
if UndoInfo.Selection.StartExists then
begin
AudioPosition: = UndoInfo.Selection.Start;
SetMarker;
end;
if UndoInfo.Selection.FinishExists then
begin
AudioPosition: = UndoInfo.Selection.Finish;
SetMarker;
end;
AudioPosition: = UndoInfo.AudioPosition;
SetAudioPosition;
UndoInfo.AudioData.Data.Clear;
Status: = 'waiting';
end;
procedure TMainForm.EMailButtonClick (Sender: TObject);
begin
ShellExecute (Handle, 'open', PChar ('mailto: Andrei512@narod.ru'), PChar (''),'', SW_Show);
end;
procedure TMainForm.BrainWaveButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
Status: = 'deformation';
SaveUndoInfo;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
with Selection do
begin
if not StartExists or not FinishExists then
begin
DeleteMarkers;
Start: = 0;
Finish: = AudioSize-1;
end;
AddBrainWave (AudioData, Start, Finish-Start +1, BWFreqEdit1.Value, BWFreqEdit2.Value);
end;
Status: = 'waiting';
end;
procedure TMainForm.Left10ButtonClick (Sender: TObject);
var
AudioSize, Smp10ms: Cardinal;
begin
if Status <> 'waiting' then Exit;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
Smp10ms: = Round (AudioData.nSamplesPerSec/100);
if Sender = Left10Button then
if AudioPosition <Smp10ms then AudioPosition: = 0 else AudioPosition: = AudioPosition - Smp10ms
else
if AudioPosition + Smp10ms> = AudioSize then AudioPosition: = AudioSize - 1 else AudioPosition: = AudioPosition + Smp10ms;
SetAudioPosition;
end;
procedure TMainForm.SSelButtonClick (Sender: TObject);
var
AudioSize: Cardinal;
begin
if Status <> 'waiting' then Exit;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
if Sender = {SSelButton} BitBtn3 then
if Selection.StartExists then AudioPosition: = Selection.Start else AudioPosition: = 0
else
if Selection.FinishExists then AudioPosition: = Selection.Finish else AudioPosition: = AudioSize - 1;
SetAudioPosition;
end;
procedure TMainForm.HelpButtonClick (Sender: TObject);
begin
HelpForm.Visible: = True;
HelpForm.Show;
end;
procedure TMainForm.UndoCheckBoxClick (Sender: TObject);
begin
if UndoCheckBox.Checked then
UndoButton.Enabled: = True
else
begin
UndoButton.Enabled: = False;
UndoInfo.AudioData.Data.Clear;
end;
end;
procedure TMainForm.N4Click (Sender: TObject);
begin
MainForm.Close;
end;
procedure TMainForm.N43Click (Sender: TObject);
begin
AudioOptionsForm.Visible: = True;
AudioOptionsForm.Show;
end;
procedure TMainForm.MP31Click (Sender: TObject);
begin
MP3OptionsForm.Visible: = True;
MP3OptionsForm.Show;
end;
procedure TMainForm.N44Click (Sender: TObject);
begin
EffOptionsForm.Visible: = True;
EffOptionsForm.Show;
end;
procedure TMainForm.ButtonZoomInClick (Sender: TObject);
begin
SamplesPerPoint: = SamplesPerPoint div 2;
if (SamplesPerPoint <1) then SamplesPerPoint: = 1;
PaintBox1.Repaint;
end;
procedure TMainForm.ButtonZoomOutClick (Sender: TObject);
begin
SamplesPerPoint: = SamplesPerPoint * 2;
PaintBox1.Repaint;
end;
procedure TMainForm.AudioOptionsButtonClick (Sender: TObject);
begin
AudioOptionsForm.Visible: = True;
AudioOptionsForm.Show;
end;
procedure TMainForm.MP3OptionsButtonClick (Sender: TObject);
begin
MP3OptionsForm.Visible: = True;
MP3OptionsForm.Show;
end;
procedure TMainForm.EffOptionsButtonClick (Sender: TObject);
begin
EffOptionsForm.Visible: = True;
EffOptionsForm.Show;
end;
end.
П. 1.2. ТЕКСТ МОДУЛЯ PCM_FORMAT.PAS
unit PCM_Format;
interface
uses
SysUtils, AudioFormat;
type
TPCMFile = class (TAudioFile)
public
RIFFLabel: String;
RIFFSize: LongWord;
fccType: String;
fmt_Label: String;
fmtSize: LongWord;
formatTag: Word;
nChannels: Word;
nSamplesPerSec: LongWord;
nAvgBytesPerSec: LongWord;
nBlockAlign: Word;
nBitsPerSample: Word;
DataID: String;
AdvDataBegin: LongWord; / / *
DataSize: LongWord;
DataLabel: String;
SndDataBegin: LongWord; / / *
nDataBytes: LongWord;
constructor Open (FileName: string);
function ReadSample (Number, Channel: LongInt): Integer;
procedure WriteSample (Number, Channel: LongInt; Value: Integer);
procedure ReadAudioData (var AudioData: TAudioData);
constructor Create (FileName: string; var AudioData: TAudioData);
private
{Private declarations}
end;
implementation
constructor TPCMFile.Open (FileName: String);
begin
inherited Open (FileName);
ReadString (RIFFLabel, 4);
Read (RIFFSize, 4);
ReadString (fccType, 4);
ReadString (fmt_Label, 4);
Read (fmtSize, 4);
Read (formatTag, 2);
Read (nChannels, 2);
Read (nSamplesPerSec, 4);
Read (nAvgBytesPerSec, 4);
Read (nBlockAlign, 2);
Read (nBitsPerSample, 2);
Position: = $ 14 + fmtSize;
ReadString (DataLabel, 4);
if DataLabel <> 'data' then
begin
DataId: = DataLabel;
Read (DataSize, 4);
AdvDataBegin: = Position;
Position: = Position + DataSize;
ReadString (DataLabel, 4);
end
else
begin
DataID: ='';
DataSize: = 0;
end;
Read (nDataBytes, 4);
SndDataBegin: = Position;
end;
function TPCMFile.ReadSample (Number, Channel: LongInt): Integer;
var
i: Byte;
Value, Mult: LongWord;
begin
Position: = SndDataBegin + Number * nBlockAlign + Channel * Trunc (nBlockAlign / nChannels);
Value: = 0;
Read (Value, Trunc (nBlockAlign / nChannels));
Mult: = 1;
for i: = 0 to Trunc (nBlockAlign / nChannels) -1 do Mult: = Mult * 256;
if nBitsPerSample> 8 then
if Value> = Mult / 2 then ReadSample: = Value - Mult else ReadSample: = Value
else
ReadSample: = Value-128;
end;
procedure TPCMFile.WriteSample (Number, Channel: LongInt; Value: Integer);
begin
Position: = SndDataBegin + Number * nBlockAlign + Channel * Trunc (nBlockAlign / nChannels);
if nBitsPerSample <= 8 then Value: = Value +128;
Write (Value, Trunc (nBlockAlign / nChannels));
end;
procedure TPCMFile.ReadAudioData (var AudioData: TAudioData);
const
MaxBufSize = 65536;
var
i: Cardinal;
BufSize: Cardinal;
Buf: array [0 .. MaxBufSize] of Byte;
begin
AudioData.Data.Clear;
Position: = SndDataBegin;
while Position <Size do
begin
if Size-Position> = MaxBufSize then BufSize: = MaxBufSize else BufSize: = Size-Position;
Read (Buf, BufSize);
AudioData.Data.Write (Buf, BufSize);
end;
AudioData.nChannels: = nChannels;
AudioData.nSamplesPerSec: = nSamplesPerSec;
AudioData.nBitsPerSample: = nBitsPerSample;
AudioData.Calculate_nBlockAlign;
end;
constructor TPCMFile.Create (FileName: string; var AudioData: TAudioData);
const
MaxBufSize = 65536;
var
i: Cardinal;
BufSize: Cardinal;
Buf: array [0 .. MaxBufSize] of Byte;
begin
inherited Create (FileName);
RIFFLabel: = 'RIFF';
RIFFSize: = AudioData.Data.Size +4 * 3 +2 * 2 +4 * 2 +2 * 2 +4 * 2;
fccType: = 'WAVE';
fmt_Label: = 'fmt';
fmtSize: = 16;
formatTag: = 1; //???
nChannels: = AudioData.nChannels;
nSamplesPerSec: = AudioData.nSamplesPerSec;
nBlockAlign: = AudioData.nBitsPerSample div 8;
if AudioData.nBitsPerSample mod 8 <> 0 then Inc (nBlockAlign);
nBlockAlign: = nBlockAlign * nChannels;
nAvgBytesPerSec: = nSamplesPerSec * nBlockAlign;
nBitsPerSample: = AudioData.nBitsPerSample;
DataLabel: = 'data';
nDataBytes: = AudioData.Data.Size;
WriteString (RIFFLabel, 4);
Write (RIFFSize, 4);
WriteString (fccType, 4);
WriteString (fmt_Label, 4);
Write (fmtSize, 4);
Write (formatTag, 2);
Write (nChannels, 2);
Write (nSamplesPerSec, 4);
Write (nAvgBytesPerSec, 4);
Write (nBlockAlign, 2);
Write (nBitsPerSample, 2);
WriteString (DataLabel, 4);
Write (nDataBytes, 4);
DataID: ='';
DataSize: = 0;
SndDataBegin: = Position;
AudioData.Data.Position: = 0;
while AudioData.Data.Position <AudioData.Data.Size do
begin
with AudioData.Data do
begin
if Size-Position> = MaxBufSize then BufSize: = MaxBufSize else BufSize: = Size-Position;
Read (Buf, BufSize);
end;
Write (Buf, BufSize);
end;
end;
end.
П. 1.3. ТЕКСТ МОДУЛЯ MP3_FORMAT.PAS
unit MP3_Format;
interface
uses
SysUtils, ShellApi, Windows, Classes, AudioFormat, PCM_Format;
type
TMP3File = class (TAudioFile)
public
constructor Open (FileName: string);
constructor Create (FileName: string; var AudioData: TAudioData; BitRate, EncMode, StereoMode: String);
procedure ReadAudioData (var AudioData: TAudioData);
private
Name: String;
end;
implementation
{$ R Lame.res}
var
Res: TResourceStream;
TempDir: String;
LameFile: String;
LameParameters: String;
constructor TMP3File.Open (FileName: string);
begin
inherited Open (FileName);
Name: = FileName;
end;
constructor TMP3File.Create (FileName: string; var AudioData: TAudioData; BitRate, EncMode, StereoMode: String);
var
TempWaveFile: String;
PCM: TPCMFile;
StartupInfo: TStartupInfo;
ProcessInformation: TProcessInformation;
begin
TempWaveFile: = TempDir + 'TempWave.wav';
PCM: = TPCMFile.Create (TempWaveFile, AudioData);
PCM.Destroy;
LameParameters: = LameFile + '-m' + StereoMode + '' + EncMode + '' + BitRate + '"' + TempWaveFile + '" "' + FileName +'"';
FillChar (StartupInfo, SizeOf (StartupInfo), 0);
StartupInfo.cb: = SizeOf (StartupInfo);
StartupInfo.dwFlags: = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow: = SW_HIDE;
CreateProcess (nil, PChar (LameParameters), nil, nil, False, CREATE_DEFAULT_ERROR_MODE + HIGH_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation);
WaitForSingleObject (ProcessInformation.hProcess, infinite);
DeleteFile (PChar (TempWaveFile));
inherited Open (FileName);
Name: = FileName;
end;
procedure TMP3File.ReadAudioData (var AudioData: TAudioData);
var
TempWaveFile: String;
PCM: TPCMFile;
Result: Word;
StartupInfo: TStartupInfo;
ProcessInformation: TProcessInformation;
begin
TempWaveFile: = TempDir + 'TempWave.wav';
LameParameters: = LameFile + '- decode'+'"'+ Name +' "" '+ TempWaveFile +'"';
FillChar (StartupInfo, SizeOf (StartupInfo), 0);
StartupInfo.cb: = SizeOf (StartupInfo);
StartupInfo.dwFlags: = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow: = SW_HIDE;
CreateProcess (nil, PChar (LameParameters), nil, nil, False, CREATE_DEFAULT_ERROR_MODE + HIGH_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation);
WaitForSingleObject (ProcessInformation.hProcess, infinite);
PCM: = TPCMFile.Open (TempWaveFile);
PCM.ReadAudioData (AudioData);
PCM.Destroy;
DeleteFile (PChar (TempWaveFile));
end;
initialization
TempDir: = GetEnvironmentVariable ('TEMP') + '\';
Res: = TResourceStream.Create (Hinstance, 'Lame', 'ExeFile');
LameFile: = TempDir + 'Lame.exe';
Res.SaveToFile (LameFile);
Res.Destroy;
end.
П. 1.4. ТЕКСТ МОДУЛЯ EM1_FORMAT.PAS
unit EM1_Format;
interface
uses
SysUtils, AudioFormat;
type
TEM1File = class (TAudioFile)
public
EM1Label: String;
nChannels: Word;
nSamplesPerSec: LongWord;
nBytesPerSample: Word;
nSamples: LongWord;
procedure ReadAudioData (var AudioData: TAudioData);
constructor Create (FileName: string; var AudioData: TAudioData);
constructor Open (FileName: string);
end;
implementation
constructor TEM1File.Create (FileName: string; var AudioData: TAudioData);
var
Channel: Word;
NumberOfBit, NumberOfSample, NumberOfSample0, i: Cardinal;
Sample: Integer;
Bit: Byte;
begin
inherited Create (FileName);
EM1Label: = 'EM1';
nChannels: = AudioData.nChannels;
nSamplesPerSec: = AudioData.nSamplesPerSec;
nBytesPerSample: = AudioData.nBitsPerSample div 8;
nSamples: = AudioData.Data.Size div AudioData.nBlockAlign;
WriteString (EM1Label, 4);
Write (nChannels, 2);
Write (nSamplesPerSec, 4);
Write (nBytesPerSample, 2);
Write (nSamples, 4);
for Channel: = 0 to nChannels-1 do
begin
NumberOfBit: = Position * 8;
NumberOfSample0: = 0;
NumberOfSample: = 1;
Bit: = 0;
while NumberOfSample <nSamples do
begin
while not AudioData.Extremum (NumberOfSample, Channel) do
Inc (NumberOfSample);
Inc (NumberOfSample);
for i: = 1 to NumberOfSample-NumberOfSample0 do
begin
WriteBit (NumberOfBit, Bit);
Inc (NumberOfBit);
end;
Bit: = 1 - Bit;
NumberOfSample0: = NumberOfSample;
end;
NumberOfSample0: = 0;
NumberOfSample: = 1;
while NumberOfSample <nSamples do
begin
while not AudioData.Extremum (NumberOfSample, Channel) do
Inc (NumberOfSample);
AudioData.ReadSample (NumberOfSample, Channel, Sample);
Inc (NumberOfSample);
Write (Sample, nBytesPerSample);
NumberOfSample0: = NumberOfSample;
end;
end;
end;
constructor TEM1File.Open (FileName: String);
begin
inherited Open (FileName);
ReadString (EM1Label, 4);
Read (nChannels, 2);
Read (nSamplesPerSec, 4);
Read (nBytesPerSample, 2);
Read (nSamples, 4);
end;
procedure TEM1File.ReadAudioData (var AudioData: TAudioData);
var
Channel: Word;
NumberOfBit, NumberOfSample, NumberOfSample0, i: Cardinal;
Sample, Sample0, Sample1: Integer;
Bit: Byte;
Value, Mult: LongWord;
begin
AudioData.Data.Clear;
AudioData.nChannels: = nChannels;
AudioData.nSamplesPerSec: = nSamplesPerSec;
AudioData.nBitsPerSample: = nBytesPerSample * 8;
AudioData.Calculate_nBlockAlign;
Position: = 16;
Mult: = 1;
for i: = 0 to nBytesPerSample-1 do Mult: = Mult * 256;
for Channel: = 0 to nChannels-1 do
begin
NumberOfBit: = Position * 8;
for i: = 0 to nSamples-1 do
begin
ReadBit (NumberOfBit, Bit);
if Bit = 0 then Sample: = -32768 else Sample: = 32767;
AudioData.WriteSample (i, Channel, Sample);
Inc (NumberOfBit);
end;
NumberOfSample0: = 0;
NumberOfSample: = 0;
Sample0: = 0;
while NumberOfSample <nSamples do
begin
AudioData.ReadSample (NumberOfSample, Channel, Sample1);
Sample: = Sample1;
while (Sample = Sample1) and (NumberOfSample <nSamples) do
begin
Inc (NumberOfSample);
if NumberOfSample <nSamples then
AudioData.ReadSample (NumberOfSample, Channel, Sample);
end;
Value: = 0;
Read (Value, nBytesPerSample);
if Value> = Mult / 2 then Sample: = Value - Mult else Sample: = Value;
for i: = 0 to NumberOfSample-NumberOfSample0-1 do
begin
Sample1: = Sample0 + Round ((Sample-Sample0) / 2 - (Sample-Sample0) / 2 * Cos (i * Pi / (NumberOfSample-NumberOfSample0)));
AudioData.WriteSample (NumberOfSample0 + i, Channel, Sample1);
end;
NumberOfSample0: = NumberOfSample;
Sample0: = Sample;
end;
end;
end;
end.
П. 1.5. ТЕКСТ МОДУЛЯ AUDIOFORMAT.PAS
unit AudioFormat;
interface
uses
SysUtils, FileUtils;
type
TAudioFile = class (TFile)
end;
type
TAudioData = class (TObject)
public
nChannels: Word;
nSamplesPerSec: LongWord;
nBitsPerSample: Word;
nBlockAlign: Word;
Data: TFile;
constructor Create;
destructor Destroy;
procedure Calculate_nBlockAlign;
procedure ReadSample (Number, Channel: LongInt; var Value: Integer);
procedure WriteSample (Number, Channel: LongInt; Value: Integer);
function Extremum (Number, Channel: LongInt): Boolean;
private
Name: String;
end;
procedure CopyAudio (var AudioSource, AudioGeter: TAudioData; Start, Finish: Cardinal);
procedure DeleteAudio (var AudioData: TAudioData; Start, Finish: Cardinal);
procedure InsertAudio (var AudioSource, AudioGeter: TAudioData; Start: Cardinal);
procedure OverwriteAudio (var AudioSource, AudioGeter: TAudioData; Start: Cardinal);
procedure MixAudio (var AudioSource, AudioGeter: TAudioData; Start: Cardinal);
procedure ReverseAudio (var AudioData: TAudioData; Start, Count: Cardinal);
procedure AddBrainWave (var AudioData: TAudioData; Start, Count, Freq1, Freq2: Integer);
procedure SetSpeedOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Speed: Real);
function ChangeSpeedOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Speed: Real): Cardinal;
procedure SetnSamplesPerSec (var AudioData: TAudioData; Value: Cardinal);
procedure SetnBitsPerSample (var AudioData: TAudioData; Value: Cardinal);
procedure SetnChannels (var AudioData: TAudioData; Value: Cardinal);
procedure SetVolumeOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Volume: Real);
procedure Echo (var AudioData: TAudioData; Start, Count, Number, Delay: Cardinal; Volume: Real);
procedure Reverberation (var AudioData: TAudioData; Start, Count, Number, Delay: Cardinal; Volume: Real);
procedure ChangeVolumeOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Volume: Real);
procedure ReChangeVolumeOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Volume: Real);
procedure Normalize (var AudioData: TAudioData; Start, Count: Cardinal);
implementation
constructor TAudioData.Create;
var
TempDir, FileName: String;
i: Word;
begin
inherited Create;
TempDir: = GetEnvironmentVariable ('TEMP') + '\';
i: = 0;
FileName: = TempDir + '\' + '0. TAD ';
while FileExists (FileName) do
begin
Inc (i);
Str (i, FileName);
FileName: = TempDir + '\' + FileName + '. TAD';
end;
Name: = FileName;
Data: = TFile.Create (FileName);
end;
procedure TAudioData.Calculate_nBlockAlign;
begin
nBlockAlign: = nBitsPerSample div 8;
if nBitsPerSample mod 8 <> 0 then Inc (nBlockAlign);
nBlockAlign: = nBlockAlign * nChannels;
end;
procedure TAudioData.ReadSample (Number, Channel: LongInt; var Value: Integer);
var
i: Byte;
Mult, AbsValue: LongWord;
begin
Calculate_nBlockAlign;
Data.Position: = Number * nBlockAlign + Channel * (nBlockAlign div nChannels);
AbsValue: = 0;
Data.Read (AbsValue, nBlockAlign div nChannels);
Mult: = 1;
for i: = 1 to nBlockAlign div nChannels do
Mult: = Mult * 256;
if nBitsPerSample> 8 then
if AbsValue> = Trunc (Mult / 2) then Value: = AbsValue - Mult else Value: = AbsValue
else Value: = AbsValue-128;
end;
procedure TAudioData.WriteSample (Number, Channel: LongInt; Value: Integer);
var
K: Byte;
N: Cardinal;
begin
Calculate_nBlockAlign;
Data.Position: = Number * nBlockAlign + Channel * (nBlockAlign div nChannels);
if Data.Position> Data.Size then
begin
K: = 0;
N: = Data.Position + nBlockAlign div nChannels;
Data.Position: = Data.Size;
while Data.Position <= N do Data.Write (K, 1);
Data.Position: = Number * nBlockAlign + Channel * (nBlockAlign div nChannels);
end;
if nBitsPerSample <= 8 then Value: = Value +128;
Data.Write (Value, nBlockAlign div nChannels);
end;
function TAudioData.Extremum (Number, Channel: LongInt): Boolean;
var
Smp1, Smp, Smp2: Integer;
begin
if (Number = 0) or (Number + 1 = Data.Size div nBlockAlign) then
begin
Extremum: = True;
Exit;
end;
ReadSample (Number-1, Channel, Smp1);
ReadSample (Number, Channel, Smp);
ReadSample (Number +1, Channel, Smp2);
if (Smp1 <Smp)and(Smp> Smp2) or (Smp1> Smp) and (Smp <Smp2) then
Extremum: = True
else
Extremum: = False;
end;
destructor TAudioData.Destroy;
begin
Data.Destroy;
DeleteFile (Name);
inherited Destroy;
end;
procedure CopyAudio (var AudioSource, AudioGeter: TAudioData; Start, Finish: Cardinal);
var
i: Cardinal;
Buf: array [0 .. 63] of Byte;
begin
AudioGeter.Data.Clear;
AudioGeter.nChannels: = AudioSource.nChannels;
AudioGeter.nSamplesPerSec: = AudioSource.nSamplesPerSec;
AudioGeter.nBitsPerSample: = AudioSource.nBitsPerSample;
AudioGeter.Calculate_nBlockAlign;
AudioSource.Data.Position: = Start * AudioSource.nBlockAlign;
for i: = 1 to Abs (Finish-Start) do
begin
AudioSource.Data.Read (Buf, AudioSource.nBlockAlign);
AudioGeter.Data.Write (Buf, AudioSource.nBlockAlign);
end;
AudioGeter.nChannels: = AudioSource.nChannels;
AudioGeter.nSamplesPerSec: = AudioSource.nSamplesPerSec;
AudioGeter.nBitsPerSample: = AudioSource.nBitsPerSample;
end;
procedure InsertAudio (var AudioSource, AudioGeter: TAudioData; Start: Cardinal);
var
i: Cardinal;
Buf: Byte;
begin
if AudioSource.Data.Size = 0 then Exit;
AudioGeter.Data.Insert (Start * AudioGeter.nBlockAlign, AudioSource.Data.Size);
AudioSource.Data.Position: = 0;
AudioGeter.Data.Position: = Start * AudioGeter.nBlockAlign;
for i: = 1 to AudioSource.Data.Size do
begin
AudioSource.Data.Read (Buf, 1);
AudioGeter.Data.Write (Buf, 1);
end;
end;
procedure DeleteAudio (var AudioData: TAudioData; Start, Finish: Cardinal);
begin
AudioData.Data.Delete (Start * AudioData.nBlockAlign, Abs (Finish-Start) * AudioData.nBlockAlign);
end;
procedure OverwriteAudio (var AudioSource, AudioGeter: TAudioData; Start: Cardinal);
var
i: Cardinal;
Buf: Byte;
begin
if AudioSource.Data.Size = 0 then Exit;
AudioSource.Data.Position: = 0;
AudioGeter.Data.Position: = Start * AudioGeter.nBlockAlign;
for i: = 1 to AudioSource.Data.Size do
begin
AudioSource.Data.Read (Buf, 1);
AudioGeter.Data.Write (Buf, 1);
end;
end;
procedure MixAudio (var AudioSource, AudioGeter: TAudioData; Start: Cardinal);
var
i, Channel, AudioSize: Cardinal;
Value, MaxValue: Int64;
Samp1, Samp2: Integer;
begin
if AudioSource.Data.Size = 0 then Exit;
AudioSize: = AudioGeter.Data.Size div AudioGeter.nBlockAlign;
MaxValue: = 1; for i: = 1 to AudioGeter.nBitsPerSample-1 do MaxValue: = MaxValue * 2;
for i: = 0 to AudioSource.Data.Size div AudioGeter.nBlockAlign - 1 do
for Channel: = 0 to AudioGeter.nChannels-1 do
begin
AudioSource.ReadSample (i, Channel, Samp1);
if Start + i <AudioSize then
AudioGeter.ReadSample (Start + i, Channel, Samp2)
else
Samp2: = 0;
Value: = Samp1 + Samp2;
if (Value <-MaxValue) or (Value> = MaxValue) then
Value: = Trunc ((Value) / 2);
AudioGeter.WriteSample (Start + i, Channel, Value);
end;
end;
procedure ReverseAudio (var AudioData: TAudioData; Start, Count: Cardinal);
var
i, AbsStart, AbsFinish, AbsCount: Cardinal;
BufferStart: Cardinal;
Buf: Int64;
TempAudio: TAudioData;
begin
TempAudio: = TAudioData.Create;
AbsStart: = Start * AudioData.nBlockAlign;
AbsCount: = Count * AudioData.nBlockAlign;
AbsFinish: = AbsStart + AbsCount;
i: = AbsFinish;
repeat
if i-AbsStart> = MaxSizeOfBuffer then
BufferStart: = i - MaxSizeOfBuffer
else
BufferStart: = AbsStart;
AudioData.Data.Position: = BufferStart;
AudioData.Data.Read (Buf, 1);
while i> BufferStart do
begin
i: = i - AudioData.nBlockAlign;
AudioData.Data.Position: = i;
AudioData.Data.Read (Buf, AudioData.nBlockAlign);
TempAudio.Data.Write (Buf, AudioData.nBlockAlign);
end;
until i = AbsStart;
AudioData.Data.Position: = AbsStart;
TempAudio.Data.Position: = 0;
for i: = 1 to Count do
begin
TempAudio.Data.Read (Buf, AudioData.nBlockAlign);
AudioData.Data.Write (Buf, AudioData.nBlockAlign);
end;
TempAudio.Destroy;
end;
procedure AddBrainWave (var AudioData: TAudioData; Start, Count, Freq1, Freq2: Integer);
var
i, MaxAmplitude: Cardinal;
T, TL, TR: Real;
Freq: Integer;
SampL, SampR: Integer;
begin
if AudioData.nChannels = 1 then Exit;
MaxAmplitude: = 1;
for i: = 1 to AudioData.nBitsPerSample-1 do
MaxAmplitude: = MaxAmplitude * 2;
for i: = Start to Start + Count-1 do
begin
Freq: = Freq1 + Round ((i-Start) * (Freq2-Freq1) / Count);
T: = 2 * Pi / (AudioData.nSamplesPerSec / (Freq/100));
TL: = 2 * Pi / (AudioData.nSamplesPerSec / (50 +50 * Freq/100));
TR: = 2 * Pi / (AudioData.nSamplesPerSec / (50 +50 * Freq/100 + Freq/100));
AudioData.ReadSample (i, 0, SampL);
AudioData.ReadSample (i, 1, SampR);
SampL: = Trunc (0.6 * SampL +0.4 * MaxAmplitude * Sin (i * TL));
SampR: = Trunc (0.6 * SampR +0.4 * MaxAmplitude * Sin (i * TR));
AudioData.WriteSample (i, 0, SampL);
AudioData.WriteSample (i, 1, SampR);
end;
end;
procedure Normalize (var AudioData: TAudioData; Start, Count: Cardinal);
var
i, MaxAmplitude, MaxVolume: Cardinal;
Volume: Integer;
K: Real;
Channel: Word;
begin
MaxAmplitude: = 1;
for i: = 1 to AudioData.nBitsPerSample-1 do
MaxAmplitude: = MaxAmplitude * 2;
for Channel: = 0 to AudioData.nChannels-1 do
begin
MaxVolume: = 0;
for i: = Start to Start + Count-1 do
begin
AudioData.ReadSample (i, Channel, Volume);
if Abs (Volume)> MaxVolume then MaxVolume: = Abs (Volume);
end;
K: = MaxAmplitude / MaxVolume;
for i: = Start to Start + Count-1 do
begin
AudioData.ReadSample (i, Channel, Volume);
Volume: = Round (Volume * K);
AudioData.WriteSample (i, Channel, Volume);
end;
end;
end;
procedure SetSpeedOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Speed: Real);
var
i, j, k, n, NewCount: Cardinal;
Channel: Byte;
Smp1, Smp2: Integer;
Interval: Real;
TempAudio: TAudioData;
Buf: Int64;
begin
if (Speed ​​= 1) or (Speed ​​= 0) then Exit;
TempAudio: = TAudioData.Create;
TempAudio.nChannels: = AudioData.nChannels;
TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
TempAudio.nBitsPerSample: = AudioData.nBitsPerSample;
TempAudio.nBlockAlign: = AudioData.nBlockAlign;
NewCount: = Round (Count / Speed);
if Speed> 1 then
begin
i: = NewCount;
Interval: = Speed;
AudioData.Data.Position: = Start * AudioData.nBlockAlign;
while i <> 0 do
begin
AudioData.Data.Read (Buf, AudioData.nBlockAlign);
TempAudio.Data.Write (Buf, AudioData.nBlockAlign);
AudioData.Data.Position: = AudioData.Data.Position - AudioData.nBlockAlign + Trunc (Interval) * AudioData.nBlockAlign;
Interval: = Interval-Trunc (Interval) + Speed;
Dec (i);
end;
end
else
begin
Speed: = 1/Speed;
for Channel: = 0 to AudioData.nChannels-1 do
begin
i: = 0;
j: = 0;
Interval: = Speed;
while i <> Count do
begin
AudioData.ReadSample (Start + i, Channel, Smp1);
if i +1 <> Count then
AudioData.ReadSample (Start + i +1, Channel, Smp2)
else
Smp2: = Smp1;
k: = Trunc (Interval);
for n: = 0 to k-1 do
TempAudio.WriteSample (j + n, Channel, Round (Smp1 + (Smp2-Smp1) / k * n));
Interval: = Interval-Trunc (Interval) + Speed;
Inc (i);
Inc (j, k);
end;
end;
end;
DeleteAudio (AudioData, Start, Start + Count-1);
InsertAudio (TempAudio, AudioData, Start);
TempAudio.Destroy;
end;
function ChangeSpeedOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Speed: Real): Cardinal;
var
i, j, k, n: Cardinal;
Channel: Byte;
Smp1, Smp2: Integer;
Interval, FinalSpeed: Real;
TempAudio: TAudioData;
Buf: Int64;
begin
if (Speed ​​= 1) or (Speed ​​= 0) then Exit;
TempAudio: = TAudioData.Create;
TempAudio.nChannels: = AudioData.nChannels;
TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
TempAudio.nBitsPerSample: = AudioData.nBitsPerSample;
TempAudio.nBlockAlign: = AudioData.nBlockAlign;
FinalSpeed: = Speed;
if Speed> 1 then
begin
Speed: = 1;
Interval: = Speed;
AudioData.Data.Position: = Start * AudioData.nBlockAlign;
while AudioData.Data.Position div AudioData.nBlockAlign <Start + Count do
begin
AudioData.Data.Read (Buf, AudioData.nBlockAlign);
TempAudio.Data.Write (Buf, AudioData.nBlockAlign);
AudioData.Data.Position: = AudioData.Data.Position - AudioData.nBlockAlign + Trunc (Interval) * AudioData.nBlockAlign;
Interval: = Interval-Trunc (Interval) + Speed;
Speed: = Speed ​​+ Trunc (Interval) * (FinalSpeed-1) / Count;
end;
end
else
begin
FinalSpeed: = 1/FinalSpeed;
for Channel: = 0 to AudioData.nChannels-1 do
begin
i: = 0;
j: = 0;
Speed: = 1;
Interval: = Speed;
while i <> Count do
begin
AudioData.ReadSample (Start + i, Channel, Smp1);
if i +1 <> Count then
AudioData.ReadSample (Start + i +1, Channel, Smp2)
else
Smp2: = Smp1;
k: = Trunc (Interval);
for n: = 0 to k-1 do
TempAudio.WriteSample (j + n, Channel, Round (Smp1 + (Smp2-Smp1) / k * n));
Interval: = Interval-Trunc (Interval) + Speed;
Inc (i);
Inc (j, k);
Speed: = Speed ​​+ (FinalSpeed-1) / Count;
end;
end;
end;
DeleteAudio (AudioData, Start, Start + Count-1);
InsertAudio (TempAudio, AudioData, Start);
ChangeSpeedOfAudio: = TempAudio.Data.Size div TempAudio.nBlockAlign;
TempAudio.Destroy;
end;
procedure SetnSamplesPerSec (var AudioData: TAudioData; Value: Cardinal);
var
AudioSize: Cardinal;
begin
if AudioData.nSamplesPerSec = Value then Exit;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
if AudioSize <> 0 then SetSpeedOfAudio (AudioData, 0, AudioSize, AudioData.nSamplesPerSec / Value);
AudioData.nSamplesPerSec: = Value;
end;
procedure SetnBitsPerSample (var AudioData: TAudioData; Value: Cardinal);
var
AudioSize, Max1, Max2, i: Cardinal;
Channel: Word;
Smp: Integer;
Mult: Real;
TempAudio: TAudioData;
begin
if AudioData.nBitsPerSample = Value then Exit;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
TempAudio: = TAudioData.Create;
TempAudio.nChannels: = AudioData.nChannels;
TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
TempAudio.nBitsPerSample: = Value;
TempAudio.Calculate_nBlockAlign;
Max1: = 1; for i: = 1 to AudioData.nBlockAlign div AudioData.nChannels do Max1: = Max1 * 256;
Max2: = 1; for i: = 1 to TempAudio.nBlockAlign div TempAudio.nChannels do Max2: = Max2 * 256;
Mult: = Max2/Max1;
if AudioSize <> 0 then
begin
for Channel: = 0 to AudioData.nChannels-1 do
for i: = 0 to AudioSize-1 do
begin
AudioData.ReadSample (i, Channel, Smp);
Smp: = Trunc (Smp * Mult);
TempAudio.WriteSample (i, Channel, Smp);
end;
AudioData.Data.Clear;
OverwriteAudio (TempAudio, AudioData, 0);
end;
TempAudio.Destroy;
AudioData.nBitsPerSample: = Value;
AudioData.Calculate_nBlockAlign;
end;
procedure SetnChannels (var AudioData: TAudioData; Value: Cardinal);
var
AudioSize: Cardinal;
TempAudio: TAudioData;
i: Integer;
Channel: Cardinal;
Smp: Integer;
begin
if AudioData.nChannels = Value then Exit;
with AudioData do
AudioSize: = Data.Size div nBlockAlign;
TempAudio: = TAudioData.Create;
TempAudio.nChannels: = Value;
TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
TempAudio.nBitsPerSample: = AudioData.nBitsPerSample;
TempAudio.Calculate_nBlockAlign;
for i: = 0 to AudioSize-1 do
for Channel: = 0 to Value-1 do
begin
if Channel <AudioData.nChannels then
AudioData.ReadSample (i, Channel, Smp)
else
AudioData.ReadSample (i, AudioData.nChannels-1, Smp);
TempAudio.WriteSample (i, Channel, Smp);
end;
AudioData.Data.Clear;
AudioData.nChannels: = Value;
AudioData.Calculate_nBlockAlign;
OverWriteAudio (TempAudio, AudioData, 0);
TempAudio.Destroy;
end;
procedure SetVolumeOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Volume: Real);
var
MaxValue: Cardinal;
Value: Integer;
i: Cardinal;
Channel: Word;
begin
MaxValue: = 1;
for i: = 1 to AudioData.nBlockAlign div AudioData.nChannels do
MaxValue: = MaxValue * 256;
MaxValue: = MaxValue div 2 - 1;
for Channel: = 0 to AudioData.nChannels-1 do
for i: = Start to Start + Count-1 do
begin
AudioData.ReadSample (i, Channel, Value);
/ / Value: = Trunc (Value * Exp (Volume/20));
Value: = Trunc (Value * Volume);
if Abs (Value)> MaxValue then
if Value <0 then Value: =-MaxValue
else Value: = MaxValue;
AudioData.WriteSample (i, Channel, Value);
end;
end;
procedure Echo (var AudioData: TAudioData; Start, Count, Number, Delay: Cardinal; Volume: Real);
var
TempAudio: TAudioData;
i, j, DelaySmp: Cardinal;
SummSmp: Int64;
Mult: Real;
Smp: Integer;
Channel: Word;
MaxValue: Cardinal;
begin
for i: = 1 to AudioData.nBlockAlign div AudioData.nChannels do
MaxValue: = MaxValue * 256;
MaxValue: = MaxValue div 2 - 1;
TempAudio: = TAudioData.Create;
TempAudio.nChannels: = AudioData.nChannels;
TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
TempAudio.nBitsPerSample: = AudioData.nBitsPerSample;
TempAudio.Calculate_nBlockAlign;
DelaySmp: = Round (Delay * AudioData.nSamplesPerSec/1000);
for Channel: = 0 to AudioData.nChannels-1 do
for i: = Start to Start + Count-1 do
begin
AudioData.ReadSample (i, Channel, Smp);
SummSmp: = Smp;
Mult: = Volume;
for j: = 1 to Number do
begin
if i-Start <DelaySmp * j then
Smp: = 0
else
AudioData.ReadSample (i-DelaySmp * j, Channel, Smp);
SummSmp: = SummSmp + Round (Mult * Smp);
Mult: = Mult * Volume;
end;
Smp: = Round (SummSmp / (Number +1));
if Abs (Smp)> MaxValue then
if Smp <0 then Smp: =-MaxValue
else Smp: = MaxValue;
TempAudio.WriteSample (i-Start, Channel, Smp);
end;
OverwriteAudio (TempAudio, AudioData, Start);
TempAudio.Destroy;
Normalize (AudioData, Start, Count);
end;
procedure Reverberation (var AudioData: TAudioData; Start, Count, Number, Delay: Cardinal; Volume: Real);
var
TempAudio: TAudioData;
i, j, k, DelaySmp: Cardinal;
SummSmp: Int64;
SmpBuf: array [0 .. 64] of Int64;
Mult: Real;
Smp: Integer;
Channel: Word;
MaxValue: Cardinal;
begin
for i: = 1 to AudioData.nBlockAlign div AudioData.nChannels do
MaxValue: = MaxValue * 256;
MaxValue: = MaxValue div 2 - 1;
TempAudio: = TAudioData.Create;
TempAudio.nChannels: = AudioData.nChannels;
TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
TempAudio.nBitsPerSample: = AudioData.nBitsPerSample;
TempAudio.Calculate_nBlockAlign;
DelaySmp: = Round (Delay * AudioData.nSamplesPerSec/1000);
for Channel: = 0 to AudioData.nChannels-1 do
for i: = Start to Start + Count-1 do
begin
for j: = Number downto 0 do
begin
if i-Start <DelaySmp * j then
Smp: = 0
else
AudioData.ReadSample (i-DelaySmp * j, Channel, Smp);
SmpBuf [j]: = Smp;
end;
Mult: = Volume;
for j: = 1 to Number do
begin
for k: = 1 to Number do
SmpBuf [k-1]: = SmpBuf [k-1] + Round (SmpBuf [k] * Mult);
Mult: = Mult * Volume;
end;
Smp: = Round (SmpBuf [0] / (Number +1));
if Abs (Smp)> MaxValue then
if Smp <0 then Smp: =-MaxValue
else Smp: = MaxValue;
TempAudio.WriteSample (i-Start, Channel, Smp);
end;
OverwriteAudio (TempAudio, AudioData, Start);
TempAudio.Destroy;
Normalize (AudioData, Start, Count);
end;
procedure ChangeVolumeOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Volume: Real);
var
MaxValue: Cardinal;
Value: Integer;
i: Cardinal;
FinalVolume: Real;
Channel: Word;
begin
MaxValue: = 1;
for i: = 1 to AudioData.nBlockAlign div AudioData.nChannels do
MaxValue: = MaxValue * 256;
MaxValue: = MaxValue div 2 - 1;
FinalVolume: = Volume;
for Channel: = 0 to AudioData.nChannels-1 do
begin
Volume: = 1;
for i: = Start to Start + Count-1 do
begin
AudioData.ReadSample (i, Channel, Value);
/ / Value: = Trunc (Value * Exp (Volume/20));
Value: = Trunc (Value * Volume);
if Abs (Value)> MaxValue then
if Value <0 then Value: =-MaxValue
else Value: = MaxValue;
AudioData.WriteSample (i, Channel, Value);
Volume: = Volume + (FinalVolume-1) / Count;
end;
end;
end;
procedure ReChangeVolumeOfAudio (var AudioData: TAudioData; Start, Count: Cardinal; Volume: Real);
var
MaxValue: Cardinal;
Value: Integer;
i: Cardinal;
FinalVolume: Real;
Channel: Word;
begin
MaxValue: = 1;
for i: = 1 to AudioData.nBlockAlign div AudioData.nChannels do
MaxValue: = MaxValue * 256;
MaxValue: = MaxValue div 2 - 1;
FinalVolume: = Volume;
for Channel: = 0 to AudioData.nChannels-1 do
begin
Volume: = 0;
for i: = Start to Start + Count-1 do
begin
AudioData.ReadSample (i, Channel, Value);
/ / Value: = Trunc (Value * Exp (Volume/20));
Value: = Trunc (Value * Volume);
if Abs (Value)> MaxValue then
if Value <0 then Value: =-MaxValue
else Value: = MaxValue;
AudioData.WriteSample (i, Channel, Value);
Volume: = Volume + FinalVolume / Count;
end;
end;
end;
end.

ДОДАТОК 2

КЕРІВНИЦТВО ПРОГРАМІСТА

П. 2.1. ПРИЗНАЧЕННЯ ПРОГРАМИ
Програма обробки та фільтрації звукових сигналів має ідентифікатор AudioEditor і призначена для обробки звукових сигналів, записаних у файлах одного з таких форматів: Microsoft RIFF / WAVE (*. wav), MP3 (*. mp3), Elecronic Music (*. em1). Програма AudioEditor виконує наступні функції:
1) можливість відкриття та аналізу файлів форматів Microsoft Wave, MP3 і Electronic Music;
2) відображення структури звукового сигналу, записаного у файлі, в графічному вигляді з можливістю зміни масштабу;
3) забезпечення можливості основних операцій редагування: виділення частини сигналу, її видалення, копіювання і вставку. Забезпечення можливості вставки звукового сигналу з іншого файлу;
4) можливість зміни основних параметрів цифрового звуку: частоти дискретизації, бітрейта, числа каналів;
5) зміна темпу (швидкості) звукового сигналу, рівня гучності, звернення звукового сигналу;
6) застосування звукових ефектів до сигналу (луни, реверберації, зростання, загасання) із зазначенням необхідних для них параметрів.
Програма AudioEditor входить до складу системи обробки аудіоінформації. Ця система дозволяє отримати перетворений звуковий сигнал із заданими характеристиками звучання, а також здійснити стиснення зміненого звукового файлу для зменшення займаного ним розміру без значної втрати якості його звучання.
П. 2.2. УМОВИ ЗАСТОСУВАННЯ ПРОГРАМИ
Програма AudioEditor пред'являє такі вимоги до технічних засобів:
1) стандартний x86-сумісний ПК;
2) тактова частота процесора не менше 900 МГц;
3) обсяг оперативної пам'яті не менше 128 Мб;
4) дозвіл екрану монітора не менше 1024x768.
Програма AudioEditor пред'являє такі вимоги до програмних засобів:
1) операційна система сімейства Windows (Windows 9x/ME/NT/2000/XP);
2) середовище для розробки додатків Borland Delphi 7.
П. 2.3. ХАРАКТЕРИСТИКА ПРОГРАМИ
Програма AudioEditor вимагає для свого функціонування наявності в проекті файлів, що містять звукові сигнали, записані у файлах наступних форматів: Microsoft RIFF / WAVE (*. wav), MP3 (*. mp3), Elecronic Music (*. em1). У зв'язку з цим перед запуском даного модуля рекомендується сформувати відповідні файли зі звуковими сигналами.
До складу програми входять наступні файли, необхідні для її функціонування:
1) AudioEditor.exe - виконуваний файл, що містить основний інтерфейс програми;
2) borlndmm.dll - менеджер пам'яті, що розділяється від Borland;
3) cc3260mt.dll - багатопотокова бібліотека від Borland;
4) stlpmt45.dll - бібліотека стандартних шаблонів STL від Borland.
Програма є інтерактивною, тобто вимагає взаємодії з користувачем.
Вся настройка програми відбувається в інтерактивному режимі, тобто через спеціальні діалоги налаштування в оболонці самого додатка.
П. 2.4. ЗВЕРНЕННЯ ДО ПРОГРАМИ
Для виклику програми необхідно запустити на виконання файл AudioEditor.exe.
Опис файлів програми:
AudioForm. Pas - функції для обробки форми з основними параметрами звукового сигналу;
AudioFormat. Pas - функції для зміни основних параметрів звуку (бітрейт, частота дискретизації, число каналів), створення ефектів (реверберації, луни, зростання, загасання), зміни структури звукового сигналу, зміни темпу і гучності, звернення;
EffectsForm. Pas - функції для обробки форми з параметрами звукових ефектів;
EM1_ Format. Pas - функції для роботи з файлами формату Electronic Music;
FileUtils. Pas - функції для роботи з файлами будь-яких типів;
Help. Pas - функції для відображення довідкової інформації за програмою;
Main. Pas - функції для обробки головного вікна програми;
MP3_ Format. Pas - функції для роботи з файлами формату MP3;
MP3 Form. Pas - функції для обробки форми з параметрами MP3;
PCM_ Format. Pas - функції для роботи з файлами формату Microsoft RIFF / WAVE;
AudioDeformator. Res - ресурси програми;
AudioForm. Dfm - файл з описом форми для зміни основних параметрів звукового сигналу (частота дискретизації, бітрейт, число каналів);
EffectsForm. Dfm - файл з описом форми для завдання параметрів звукових ефектів;
Help. Dfm - файл з описом форми для відображення довідкової інформації за програмою;
Main. Dfm - файл з описом головної форми програми;
MP3 Form. Dfm - файл з описом форми для завдання параметрів MP3.
П. 2.5. ВХІДНІ І ВИХІДНІ ДАНІ
Вхідними даними є звукові сигнали, записані у файлах одного з таких форматів: Microsoft RIFF / WAVE (*. wav), MP3 (*. mp3), Elecronic Music (*. em1).
Вихідними даними є змінені звукові сигнали, записаний у файлах, структура яких аналогічна структурі вхідних.
П. 2.6. ПОВІДОМЛЕННЯ
У ході роботи програми на екрані можуть з'явитися повідомлення, які наведені в табл.П.2.1.
Таблиця Д.2.1
Повідомлення, що з'являються в ході роботи програми

Повідомлення

Опис

Будь ласка зачекайте ...

З'являється у разі, коли програмою проводиться виконання тривалої операції (наприклад, відкриття файлу великого розміру або його обробка). Необхідно дочекатися зникнення цього повідомлення для подальшої роботи з програмою

Помилка відкриття файлу

Неможливо відкрити файл, так як його формат не входить до числа підтримуваних додатком (*. em1, *. wav, *. mp3) Необхідно відкрити файл у підтримуваному форматі.

Помилка збереження файлу

Неможливо зберегти файл. Причиною може бути брак вільного дискового простору або відсутність прав на запис файлав вказаної директорії

Зберегти зміни у файлі?

З'являється в тому випадку, якщо файл був змінений, але зміни не були збережені, а користувач викликав процедуру виходу з програми


ДОДАТОК 3

КЕРІВНИЦТВО ОПЕРАТОРА
П. 3.1. ПРИЗНАЧЕННЯ ПРОГРАМИ
Програма обробки та фільтрації звукових сигналів має ідентифікатор AudioEditor і призначена для обробки звукових сигналів, записаних у файлах одного з таких форматів: Microsoft RIFF / WAVE (*. wav), MP3 (*. mp3), Elecronic Music (*. em1). Програма AudioEditor виконує наступні функції:
1) можливість відкриття та аналізу файлів форматів Microsoft Wave, MP3 і Electronic Music;
2) відображення структури звукового сигналу, записаного у файлі, в графічному вигляді з можливістю зміни масштабу;
3) забезпечення можливості основних операцій редагування: виділення частини сигналу, її видалення, копіювання і вставку. Забезпечення можливості вставки звукового сигналу з іншого файлу;
4) можливість зміни основних параметрів цифрового звуку: частоти дискретизації, бітрейта, числа каналів;
5) зміна темпу (швидкості) звукового сигналу, рівня гучності, звернення звукового сигналу;
6) застосування звукових ефектів до сигналу (луни, реверберації, зростання, загасання) із зазначенням необхідних для них параметрів.
Програма AudioEditor входить до складу системи обробки аудіоінформації. Ця система дозволяє отримати перетворений звуковий сигнал із заданими характеристиками звучання, а також здійснити стиснення зміненого звукового файлу для зменшення займаного ним розміру без значної втрати якості його звучання.

П. 3.2. УМОВИ ВИКОНАННЯ ПРОГРАМИ
Програма AudioEditor пред'являє такі вимоги до технічних засобів:
1) стандартний x86-сумісний ПК;
2) тактова частота процесора не менше 900 МГц;
3) обсяг оперативної пам'яті не менше 128 Мб;
4) дозвіл екрану монітора не менше 1024x768.
Програма Tubes пред'являє такі вимоги до програмних засобів:
1) операційна система сімейства Windows (Windows 9x/ME/NT/2000/XP);
2) наявність звукових файлів одного з наступних форматів: Microsoft RIFF / WAVE (*. wav), MP3 (*. mp3), Elecronic Music (*. em1).
П. 3.3. ВИКОНАННЯ ПРОГРАМИ
П.3.3.1 Запуск програми
Для виклику програми необхідно запустити на виконання файл AudioEditor.exe.
П.3.3.2 Опис інтерфейсу роботи з програмою
П.3.3.2.1 Головне вікно програми
Головне вікно програми представлено на ріс.П.3.1.
У верхній частині вікна розташований рядок меню, за допомогою якого можна отримати доступ до всіх функцій програми. Опис пунктів меню наведено в П.3.3.2.2.
Головне вікно програми

Рис. Д.3.1
У нижній частині вікна наведено графічне зображення структури звукового сигналу, записаного у відкритому файлі. Червоним кольором виділена ділянка, до якого застосовується обробка. Якщо ділянка не виділено, то обробка застосовується до Свему звукового сигналу, записаного у файлі.
У середній частині вікна розташовані управляюще кнопки для швидкого доступу до функцій програми і виклику вікон налаштувань.
Опис кнопок:
- Викликає діалог відкриття звукового файлу;
- Викликає діалог збереження звукового файлу;
- Вставка вибраної частини звукового сигналу з буфера обміну;
- Копіювання вибраної частини звукового сигналу в буфер обміну;
- Видалення та копіювання вибраної частини звукового сигналу в буфер обміну;
- Видалення вибраної частини звукового сигналу;
- Видалення вибраної частини звукового сигналу зі збереженням займаного їм тимчасового простору;
- Вставка звукового сигналу з іншого файлу в місце, позначене маркером;
- Викликає діалог збереження вибраної частини звукового сигналу в файл;
- Скасування останнього виробленого дії;
- Звернення вибраної частини звукового сигналу;
- Нормалізація вибраної частини звукового сигналу;
- Застосування ефекту луни до вибраної частини звукового сигналу;
- Застосування ефекту реверберації до вибраної частини звукового сигналу;
- Застосування ефекту спадної гучності до вибраної частини звукового сигналу;
- Застосування ефекту зростаючої гучності до вибраної частини звукового сигналу;
- Виклик стандартного діалогу налаштування відтворення звуку;
- Виклик стандартного діалогу налаштування запису звуку;
- Вставка порожнього звукового сигналу тривалістю, зазначеною під кнопкою;
- Зміна темпу вибраної частини звукового сигналу на значення, вказане у відсотках під кнопкою;
- Плавна зміна темпу вибраної частини звукового сигналу на значення, вказане у відсотках під кнопкою;
- Зміна рівня гучності вибраної частини звукового сигналу на значення, вказане у відсотках під кнопкою;
- Плавна зміна рівня гучності вибраної частини звукового сигналу на значення, вказане у відсотках під кнопкою;
- Виклик довідкової інформації по роботі з програмою;
- Виклик довідкової інформації про версію програми і її розробника;
- Вибір режиму вставки звукового сигналу з буфера обміну;
- Вибір пристрою відтворення звуку;
- Вибір пристрою запису звуку;
- Перейти на початок звукового сигналу або до позиції, поміченої маркером початку;
- Перейти в кінець звукового сигналу або до позиції, поміченої маркером кінця;
- Почати запис звукового сигналу з вибраного пристрою запису;
- Почати відтворення звукового сигналу через вибраний пристрій відтворення;
- Призупинити відтворення звукового сигналу;
- Встановити позицію маркера початку / кінця;
- Видалити встановлені позиції маркера;
Маркери початку і кінця задають обрану частина звукового сигналу, яка позначається на графічному поданні червоним кольором.
- Збільшити масштаб відображення звукового сигналу;
- Зменшити масштаб відображення звукового сигналу;
- Показує час поточної позиції у файлі та загальну тривалість відтворення;
- Показує поточну позицію у файлі;
- Дозволяють переміщати позіуію у файлі на 10мс назад і вперед;
- Виклик вікна налаштування основних параметрів цифрового звуку (частота дискретизації, бітрейт, число каналів);
- Виклик вікна налаштування збереження файлу у форматі МР3;
- Виклик вікна налаштування звукових ефектів;
- Показує тривалість в секундах звукового сигналу, який знаходиться в буфері обміну.
П.3.3.2.2 Головне меню програми
Головне меню програми представлено на рис. Д.3.2
Головне меню програми

Рис. Д.3.2
Меню «Файл»:
- Відкрити: викликає діалог відкриття звукового файлу;
- Зберегти: викликає діалог збереження звукового файлу;
- Вихід: вихід з програми.
Меню «Програвання»:
- Відтворити: почати відтворення звукового сигналу через виб-ранное пристрій відтворення;
- Записати: почати запис звукового сигналу з вибраного пристрою за-писи;
- Зупинити: призупинити відтворення звукового сигналу.
Меню «Правка»:
- Скасування: скасування останнього виробленого дії;
- Встановити маркер: встановити позицію маркера початку / кінця;
- Прибрати всі маркери: видалити встановлені позиції маркера;
- Вставити: вставка вибраної частини звукового сигналу з буфера обміну;
- Вставити з файлу: вставка звукового сигналу з іншого файлу в місце, позначене маркером;
- Вирізати: видалення та копіювання вибраної частини звукового сигналу в буфер обміну;
- Видалити: видалення вибраної частини звукового сигналу;
- Стерти: видалення вибраної частини звукового сигналу зі збереженням за-мальної їм тимчасового простору;
- Копіювати: копіювання вибраної частини звукового сигналу в буфер обміну;
- Копіювати в файл: викликає діалог збереження вибраної частини звуко-вого сигналу в файл.
Меню «Деформації»:
- Змінити темп: зміна темпу вибраної частини звукового сигналу на значення, вказане у відсотках під кнопкою;
- Змінити гучність: зміна рівня гучності вибраної частини звукового сигналу на значення, вказане у відсотках під кнопкою;
- Звернути звучання: звернення вибраної частини звукового сигналу;
- Вирівняти гучність: нормалізація вибраної частини звукового сигна-ла;
- Вставити тишу: вставка порожнього звукового сигналу тривалістю, зазначеною під кнопкою;
- Застосувати ефект: застосувати ефект один з ефектів (затухаючої гучності, луни, реверберації, зростаючої гучності) до вибраної частини звукового сигналу.
Меню «Налаштування»:
- Відтворення: виклик стандартного діалогу налаштування програвання-ня звуку;
- Запис: виклик стандартного діалогу налаштування запису звуку;
- Аудіодані: виклик вікна налаштування основних параметрів цифрового звуку (частота дискретизації, бітрейт, число каналів);
- Mp 3: виклик вікна налаштування збереження файлу у форматі МР3;
- Ефекти: виклик вікна налаштування звукових ефектів.
Меню «Довідка»:
- Допомога: виклик довідкової інформації по роботі з програмою;
- Про програму: виклик довідкової інформації про версію програми і її розробника.
П.3.3.2.3 Опис діалогових вікон програми
П.3.3.2.3.1 Опис вікна для настроювання параметрів звукових ефектів
У даному діалоговому вікні відбувається настроювання параметрів ефектів луни й реверберації.
На ріс.П.3.3 наведено зображення вікна з відкритою вкладкою для налаштування параметрів ефекту луни. У першому полі вказується кількість відгуків, яке необхідно створити при застосуванні ефекту, у другому полі вказується необхідний час між відгуками, а в третьому вказується гучність відгуку щодо попереднього.
На ріс.П.3.4 наведено зображення вікна з відкритою вкладкою для налаштування параметрів ефекту реверберації. У першому полі вказується кількість віддзеркалень, яке необхідно створити при застосуванні ефекту, у другому полі вказується необхідний час між відображеннями, а в третьому вказується гучність відображення відносно попереднього.
Вікно налаштування параметрів ефекту луни

Рис. П.3.3
Вікно налаштування параметрів ефекту реверберації

Рис. П.3.4
П.3.3.2.3.2 Опис вікна для налаштування параметрів збереження MP3-файлів
У даному діалоговому вікні відбувається налаштування збереження звукового сигналу в форматі MP3. У цьому вікні вказується тип бітрейту і кількість каналів (1 - mono; 2 - stereo).
Вид діалогового вікна налаштування параметрів МР3 представлений на на рис. П.3.5.
Вікно налаштування параметрів MP3

Рис. П.3.5
П.3.3.2.3.3 Опис для налаштування основних параметрів цифрового звуку
Дане діалогове вікно використовується для перегляду та зміни основних параметрів звукового сигналу: частота дискретизації, бітрейт, кількість каналів. У лівій частині розташовуються поточні значення цих параметрів, а в правій можна вибрати бажане і змінити значення, натиснувши відповідну кнопку «Застосувати». Слід враховувати, що при збільшенні частоти дискретизації і бітрейта якість звукового сигналу не покращиться, зміниться тільки займане ним дисковий простір.
Вид діалогового вікна налаштування основних параметрів представлений на рис п.3.6.
Вікно налаштування параметрів цифрового звуку

Ріс.П.3.6


П.3.3.2.3.4 Опис вікна для отримання довідкової інформації про програму
Дане діалогове вікно використовується для перегляду довідкової інфор-мації за програмою: опис всіх функцій та елементів інтерфейсу.
Вид довідкового діалогового вікна представлений на рис. П.3.7.
Вікно з довідковою інформацією про програму

Рис. П.3.7
П. 3.4. Повідомлення оператору
У ході роботи програми на екрані можуть з'явитися повідомлення, які наведені в табл.П.3.1.
Таблиця Д.3.1
Повідомлення, що з'являються в ході роботи програми

Повідомлення

Опис

Будь ласка зачекайте ...

З'являється у разі, коли програмою проводиться виконання тривалої операції (наприклад, відкриття файлу великого розміру або його обробка). Необхідно дочекатися зникнення цього повідомлення для подальшої роботи з програмою.

Помилка відкриття файлу

Неможливо відкрити файл, так як його формат не входить до числа підтримуваних додатком (*. em1, *. wav, *. mp3) Необхідно відкрити файл у підтримуваному форматі.

Помилка збереження файлу

Неможливо зберегти файл. Причиною може бути брак вільного дискового простору або відсутність прав на запис файлав вказаної директорії.

Зберегти зміни у файлі?

З'являється в тому випадку, якщо файл був змінений, але зміни не були збережені, а користувач викликав процедуру виходу з програми.

- Зміна темпу: уповільнення або прискорення швидкості відтворення звукового сигналу;
- Зміна загального рівня гучності: збільшення або зменшення загального рівня гучності.;
- Ефект зростання гучності: плавне збільшення гучності від нульового рівня на початку фрагмента до максимального в кінці;
- Ефект загасання гучності: плавне зменшення гучності від максимального рівня на початку фрагмента до нульового в кінці.
Обробка сигналу - це складна і, головне, ресурсномістка процедура. Вона порівняно недавно стала проводитися в цифрових пристроях - раніше різні ефекти звучання і інші досягалися шляхом обробки звуку в аналогових приладах. В аналоговій апаратурі звук у вигляді електричних коливань проходить через різні тракти (блоки електричних елементів), чим досягається зміна фази, спектру і амплітуди сигналу. Однак такий спосіб обробки має масу недоліків. Можливість же використання цифрових пристроїв має незаперечні переваги. Якість обробки сигналів у них набагато менше залежить від якості апаратури. Крім того, для різних маніпуляцій зі звуком не потрібна постійна зміна обладнання. І, найголовніше, оскільки обробка ведеться програмним шляхом, для неї відкриваються просто неймовірні можливості, які обмежені лише потужністю комп'ютерів (а вона збільшується з кожним днем) і фантазією людини.

1. РОЗРОБКА СИСТЕМИ ОБРОБКИ Аудиоинформация

1.1. Обгрунтування доцільності розробки системи обробки аудіоінформації

1.1.1. Призначення системи

Система обробки аудіоінформації реалізує обробку звукових сигналів. Система призначена для обробки звукових сигналів, записаних у звукових файлах різних форматів. Обробка дозволяє внести необхідні зміни у вихідний звуковий файл: редагування його структури, основних параметрів, дозволяє застосувати різні ефекти до файлу. Система також дозволяє здійснити кодування вихідного файлу з метою зменшення займаного ним розміру без явної втрати якості.

1.1.2. Характеристика функціональної структури системи

Функціональна схема системи приведена на рис. 1.1.
Обробка аудіофайлів складається з наступних етапів:
1) введення звукових сигналів в підсистему обробки та фільтрації сигналу, результатом роботи якої є змінений звуковий сигнал, записаний у файлі та статистичні дані, отримані при аналізі звукового сигналу;
2) введення відредагованого звукового сигналу в підсистему кодування даних, результатом якої є файл зі стисненим звуковим сигналом.
Результатом роботи системи є змінений та / або стиснений звуковий файл.

Функціональна схема системи обробки аудіоінформації

Рис. 1.1

1.1.3. Обгрунтування мети створення системи

Обробка сигналу - це складна і, головне, ресурсномістка процедура. Вона порівняно недавно стала проводитися в цифрових пристроях - раніше різні ефекти звучання і інші досягалися шляхом обробки звуку в аналогових приладах. В аналоговій апаратурі звук у вигляді електричних коливань проходить через різні тракти (блоки електричних елементів), чим досягається зміна фази, спектру і амплітуди сигналу. Однак такий спосіб обробки має масу недоліків. По-перше, страждає якість обробки, адже кожен аналоговий елемент має свою похибку, а кілька десятків елементів можуть критично вплинути на точність і якість бажаного результату. А по-друге, і це, мабуть, найголовніше, майже кожен окремий ефект досягається шляхом використання окремого пристрою, коли кожне такий пристрій може коштувати дуже дорого. Можливість же використання цифрових пристроїв має незаперечні переваги. Якість обробки сигналів у них набагато менше залежить від якості апаратури, головне - це якісно оцифрувати звук і мати можливість якісно його відтворювати, і тоді якість обробки лягає вже тільки на програмний механізм. Крім того, для різних маніпуляцій зі звуком не потрібна постійна зміна обладнання. І, найголовніше, оскільки обробка ведеться програмним шляхом, для неї відкриваються просто неймовірні можливості, які обмежені лише потужністю комп'ютерів (а вона збільшується з кожним днем) і фантазією людини.
До перетворення звуку вдаються в основному з метою зміни якихось характеристик звуку.
Принципово, метою обробки звуку є додання існуючому звуку якихось нових якостей або усунення небажаних. Звукові ефекти відносяться до тих перетворень звуку, які надають звучанню нові форми або повністю змінюють звукову інформацію. Апаратну реалізацію звукові ефекти знаходять в цифрових сигнальних процесорах (DSP). Будь-яка більш-менш пристойний MIDI-синтезатор має вбудований ефект-процесор тієї чи іншої складності (ефект-процесор представляє собою один чи кілька DSP). Складні ефект-процесори "вміють" накладати на звуковий сигнал відразу кілька різних ефектів, причому, окремо для кожного каналу, дозволяючи регулювати параметри ефектів в режимі реального часу. Однак вартість таких ефект-процесорів надзвичайно висока (як і вартість будь-якого іншого високопродуктивного процесора), тому професійні DSP встановлюються тільки на якісної музичної апаратури. На більш-менш дешевих звукових платах часто встановлюється DSP зі спрощеним набором можливостей: накладення одного або декількох ефектів на всі канали одночасно. Апаратний ефект-процесор - це, безумовно, добре, але обробити звук на високому рівні можна і програмним способом.
Оцифрований аудіо сигнал «в чистому вигляді» (наприклад, у формі однієї з розглянутих вище варіацій ІКМ) є досить точною, але не самою компактною формою запису вихідного аналогового сигналу. обсяг пам'яті, необхідний для її зберігання у вихідному цифровому вигляді, виявляється дуже значним. Тому зберігання відносно великих обсягів аудіо даних, що гарантує достатньо хорошу якість звучання, вимагає застосування різних «хитрощів», що дозволяють ущільнити дані.

1.1.4. Обгрунтування складу автоматизуються завдань

Реалізація системи обробки аудіоінформації дозволить інтегрувати в єдиному інтерфейсі всі етапи обробки аудіоінформації:
1) редагування структури звукового файлу;
2) зміна параметрів цифрового звуку (частота дискретизації, бітрейт, число каналів);
3) редагування темпу звуку;
4) зміна загального рівня гучності;
5) ефекти зростаючій і затухаючої гучності, луни й реверберації;
6) кодування (стиснення) аудіоданих.
Редагування структури файлу необхідно для зміни окремих частин файлу, це дозволить видаляти, копіювати і вставляти частини звукового сигналу. Зміна параметрів цифрового звуку необхідно, наприклад, для зменшення розміру звукового файлу, коли не так важливо якість звучання. Редагування темпу дозволить уповільнити і прискорити швидкість відтворення звукового сигналу. Застосування ефектів дозволить надати звуку необхідні характеристики звучання.

1.2. Аналітичний огляд

Тема програмного забезпечення дуже широка, тому тут ми лише коротко обговоримо основні представники програм для обробки звуку.
Основні можливості таких програм це, як мінімум, забезпечення можливості запису (оцифрування) аудіо і збереження на диск. Розвинені представники такого роду програм дозволяють набагато більше: запис, багатоканальне зведення аудіо на декількох віртуальних доріжках, обробка спеціальними ефектами (як вбудованими, так і підключаються ззовні - про це пізніше), очищення від шумів, мають розвинену навігацію та інструментарій у вигляді спектроскопа та інших віртуальних приладів, управління / керованість зовнішніми пристроями, перетворення аудіо з формату у формат, генерація сигналів, запис на компакт диски та багато іншого. Деякі з таких програм: Cool Edit Pro (Syntrillium), Sound Forge (Sonic Foundry), Nuendo (Steinberg), Samplitude Producer (Magix), Wavelab (Steinberg).

1.2.1. Cool Edit Pro 2.0

Редагування і зведення аудіо на 128 доріжках, 45 вбудованих DSP-ефектів, включаючи інструменти для мастерингу, аналізу та реставрації аудіо, 32-бітна обробка, підтримка аудіо з параметрами 24 біт / 192 КГц, потужний інструментарій для роботи з завісами (loops), підтримка DirectX, а також управління SMPTE / MTC, підтримка роботи з відео і MIDI та інше.

1.2.2. Sound Forge 6.0a

Потужні можливості не деструктивного редагування, багатозадачна фонова обробка завдань, підтримка файлів з параметрами до 32 біт / 192 КГц, менеджер предустановок, підтримка файлів більше 4 Гб, робота з відео, великий набір ефектів обробки, відновлення після зависань, предпрослушіваніе застосованих ефектів, спектральний аналізатор та інше.

1.2.3. Висновок по аналітичного огляду

У наборі програм користувача, що займається обробкою звуку, є безліч різних інструментів, так було раніше і так буде надалі - універсальних комбайнів для роботи зі звуком не буває. Проте, не дивлячись на всю різноманітність ПЗ, у програмах часто використовуються схожі механізми для обробки звуку (наприклад, процесори ефектів та інші). На якомусь етапі розробки аудіо ПЗ, виробники зрозуміли, що зручніше зробити у своїх програмах можливість підключення зовнішніх інструментів, ніж кожен раз створювати заново інструменти для кожної окремої програми. Так що багато програм, що відносяться до тієї чи іншої групи ПЗ, дозволяють підключати так звані «плагіни» - зовнішні модулі, що підключаються, розширюють можливості обробки звуку. Це стало можливим у результаті появи декількох стандартів на інтерфейс між програмою і підключається модулем. На сьогоднішній день існують два основні стандарти на інтерфейс: DX і VST. Існування стандартів дозволяє підключати один і той же плагін до абсолютно різними програмами, не піклуючись про виникнення конфліктів і неполадок. Говорячи про самих плагінах, треба сказати, що це просто величезне сімейство програм. Зазвичай, один плагін є механізмом, що реалізують якийсь конкретний ефект, наприклад, реверберацію або низькочастотний фільтр. Але всі перераховані вище засоби для редагування аудіоданих мають закритий вихідний код.

1.3. Основні вимоги до системи

1.3.1. Основні цілі створення системи та критерії ефективності її функціонування

Створення системи обробки аудіоінформації дозволить отримати перетворений звуковий сигнал із заданими характеристиками звучання, а також стиснення зміненого звукового файлу для зменшення займаного ним розміру без значної втрати якості звучання.
Для оцінки ефективності роботи системи обробки аудіоінформації можна використовувати якість одержуваних на виході звукових сигналів. Для визначення якості кодування звукових даних можна використовувати оцінку розміру отриманих закодованих звукових файлів і вихідних.

1.3.2. Функціональне призначення системи

Автоматизація процесу обробки аудіоінформації увазі реалізацію в системі певних засобів і функцій. Слід виділити функціональних особливості, якими повинна володіти система:
1) можливість відкриття та аналізу файлів форматів Microsoft Wave, MP3 і Electronic Music;
2) відображення структури звукового сигналу, записаного у файлі, в графічному вигляді з можливістю зміни масштабу;
3) забезпечення можливості основних операцій редагування: виділення частини сигналу, її видалення, копіювання і вставку. Забезпечення можливості вставки звукового сигналу з іншого файлу;
4) можливість зміни основних параметрів цифрового звуку: частоти дискретизації, бітрейта, числа каналів;
5) зміна темпу (швидкості) звукового сигналу, рівня гучності;
6) застосування звукових ефектів до сигналу, із зазначенням необхідних для них параметрів (для ефекту луни: кількість відгуків, час між відгуками, гучність відгуку щодо попереднього; для ефекту реверберації: кількість віддзеркалень, затримка відбитого сигналу, гучність відображення відносно попереднього; для ефектів зростаючої і затухаючої гучності: гучність щодо поточної);
7) стиснення отриманого сигналу для більш компактного зберігання з можливістю подальшого вилучення.

1.3.3. Особливості системи та умови її експлуатації

Система обробки аудіоінформації призначена для роботи з цифровими звуковими сигналами, записаними у файлах одного з таких форматів: Microsoft Wave, MP3, Electronic Music. Обсяг інформації, що обробляється системою, досить великий і може досягати декількох десятків мегабайт. Ці особливості накладають обмеження на використання непродуктивних і повільних алгоритмів.

1.3.4. Вимоги до функціональної структури

Побудова системи обробки аудіоінформації передбачає модульну структуру. Система включає в себе 2 підсистеми: підсистему обробки та фільтрації сигналу, підсистему кодування даних. Загальний інтерфейс і можливість доступу до всіх модулів в складі кожної підсистеми повинна забезпечувати оболонка. Таким чином, існує дві оболонки. Перша реалізує інтерфейс для редагування звукового сигналу, його параметрів, застосування до нього різних ефектів. Друга реалізує інтерфейс для кодування (стиснення) відредагованого звукового сигналу. Обмін між підсистемами відбувається через звукові файли.

1.3.5. Вимоги до технічного забезпечення

Завдання обробки звукових сигналів в системі обробки аудіоінформації пов'язана з автоматичним аналізом великих масивів аудіо інформації. Перетворення, проведені в системі, повинні проводитися в процесі інтерактивної взаємодії з користувачем, тому паузи на обробку не повинні перевищувати декількох хвилин. Виходячи з цього, сформульовані вимоги до технічних характеристик персонального комп'ютера, на якому буде функціонувати система. Вимоги зведені в табл. 1.1.
Таблиця 1.1
Технічні характеристики персонального комп'ютера

Найменування

Значення

Частота процесора, МГц

від 900

Об'єм оперативної пам'яті, Мб

від 128

Дозвіл екрану монітора

не менше 1024x768

1.3.6. Вимоги до інформаційного забезпечення

Система обробки аудіоінформації призначена для обробки звукових сигналів, записаних у звукових файлах. Файли повинні бути одного з наступних форматів: Microsoft Wave (*. wav), MP3, Electronic music (*. em1)
Основним видом інформації, оброблюваному в системі, є звукова інформація в цифровому поданні. Такий вид даних сприймається людиною безпосередньо, тому необхідно забезпечити можливість прослуховування перетворених сигналів на різних етапах обробки, а також їх графічну візуалізацію.

1.3.7. Вимоги до програмного забезпечення

Систему обробки аудіоінформації доцільно розробляти для функціонування під керуванням операційною системою сімейства Windows, так як ОС даного класу найбільш широко поширені в сучасному світі. Платформами для розробки вибрані середовища для розробки додатків Borland Delphi 7 (підсистема обробки і філбтраціі сигналу) і Microsoft Visual C + + 2003 (підсистема кодування даних). Це середовище підтримують алгоритмічні мови Pascal і C + + відповідно і мають при цьому можливостями швидкої розробки і проектування візуальних інтерфейсів.

1.4. Основні технічні рішення проекту системи

1.4.1. Рішення по комплексу технічних засобів

Як вже зазначалося в п.п. 1.3.5, для досягнення зручного користувачеві режиму функціонування системи необхідно наступна мінімальна конфігурація персонального комп'ютера: частота процесора 900 МГц, обсяг оперативної пам'яті 128 Мб, монітор, що підтримує дозвіл 1024x768 точок. Також бажано наявність наступних периферійних технічних засобів: мікрофон або інше записуючий пристрій для отримання вихідних звукових сигналів для їх подальшої обробки в системі, а також пристрої виведення звукових сигналів (колонки) для прослуховування отриманих звукових сигналів і оцінки результатів роботи системи.

1.4.2. Опис системи програмного забезпечення

Для реалізації і функціонування проекту необхідно загальносистемне програмне забезпечення ОС Windows XP, в основі якої лежить ядро, що характеризується 32-розрядною обчислювальною архітектурою та повністю захищеною моделлю пам'яті, що забезпечує надійну обчислювальне середовище.
Розробка системи обробки аудіоінформації та її підсистем буде вестися з використанням середовищ для розробки додатків Borland Delphi 7 і Microsoft Visual C + + 2003. Ці середовища розробки включають в себе високопродуктивний 32-бітний компілятор, що дозволяє оптимізувати створюваний код, а також великий набір засобів, які підвищують продуктивність праці програмістів і скорочують тривалість циклу розробки. Багатофункціональні інтегровані середовища розробки включають компілятор, що задовольняє стандарту ANSI / ISO, вбудований дизайнер форм, багатий набір засобів для роботи з компонентами, менеджер проектів і відладчик. Зручність розробки та ефективність створених в даних середовищах розробки програм роблять їх оптимальним вибором для побудови дослідницької системи, якою є система обробки аудіоінформації.

2. РОЗРОБКА ПІДСИСТЕМИ ОБРОБКИ І ФІЛЬТРАЦІЇ СИГНАЛУ

2.1. Опис постановки задачі обробки та фільтрації звукового сигналу

2.1.1. Характеристика задачі

При розробці підсистеми обробки та фільтрації звукового сигналу потрібно виконати такі завдання:
1) вивчення структури звукових файлів різних форматів і реалізація можливостей читання цих форматів для подальшої обробки;
2) розробка алгоритмів, що дозволяють перетворювати вихідний звуковий сигнал з метою зміни характеристик звучання;
3) програмна реалізація алгоритмів, що дозволяють перетворювати вихідний звуковий сигнал з метою зміни характеристик звучання.
Автоматизація процесу обробки та фільтрації звукового сигналу має на увазі реалізацію в підсистемі певних засобів і функцій. Слід виділити функціональних особливостей, якими повинна володіти підсистема:
1) можливість відкриття та аналізу файлів форматів Microsoft Wave, MP3 і Electronic Music;
2) відображення структури звукового сигналу, записаного у файлі, в графічному вигляді з можливістю зміни масштабу;
3) забезпечення можливості основних операцій редагування: виділення частини сигналу, її видалення, копіювання і вставку. Забезпечення можливості вставки звукового сигналу з іншого файлу;
4) можливість зміни основних параметрів цифрового звуку: частоти дискретизації, бітрейта, числа каналів;
5) зміна темпу (швидкості) звукового сигналу, рівня гучності, звернення звукового сигналу;
6) застосування звукових ефектів до сигналу із зазначенням необхідних для них параметрів.
Перерахуємо реалізовані звукові ефекти із зазначенням їхніх параметрів:
- Ефект луни: реалізація повторення звукового сигналу за допомогою тимчасових перетворень таким чином, щоб людське вухо сприймало отриманий сигнал як відлуння (параметри: кількість відгуків, час між відгуками, гучність відгуку щодо попереднього);
- Ефект реверберації: надання звучанню об'ємності, характерною для великої зали, де кожен звук породжує відповідний, повільно згасає відгомін; відрізняється тим, що на вхідний сигнал накладається затриманий в часі вихідний сигнал, а не затримана копія вхідного (параметри: кількість відбитків, затримка відбитого сигналу, гучність відображення відносно попереднього);
- Ефекти зростаючій і затухаючої гучності: плавне збільшення гучності від нульового рівня на початку фрагмента до максимального в кінці і навпаки відповідно (параметр: величина гучності у відсотках від поточної).
Отриманий змінений звуковий сигнал надходить у підсистему кодування даних для зменшення займаного ним розміру.

2.1.2. Вхоная інформація

Вхідний інформацією для підсистеми є цифровий звуковий сигнал, записаний у звуковому файлі певного формату. Формат вхідного звукового файлу представлений у табл.2.1.
Файл цього формату містить заголовок, що описує загальні параметри файлу, і один або більше фрагментів, кожен з яких представляє собою хвильову форму або допоміжну інформацію.
Таблиця 2.1
Структура звукового файлу формату Microsoft RIFF / WAVE

ЗСУВ ВІД ПОЧАТКУ ФАЙЛУ

ДОВЖИНА

ОПИС

0

4

ІДЕНТИФІКАТОР ФОРМАТУ ('RIFF')

4

4

ДОВЖИНА БЛОКУ ДАНИХ (ДОВЖИНА ФАЙЛУ БЕЗ ЦЬОГО ЗАГОЛОВКА)

8

4

ІДЕНТИФІКАТОР БЛОКУ звукових даних ('WAVE')

12

4

ІДЕНТИФІКАТОР подблока ЗАГОЛОВКА ('fmt_')

16

4

ДОВЖИНА подблока ЗАГОЛОВКА

20

2

ТИП формату представлення даних

22

2

ЧИСЛО КАНАЛІВ (1 - МОНО, 2 - СТЕРЕО)

24

2 / 4

Частота дискретизації, ГЦ

26/28

2 / 4

ШВИДКІСТЬ ПЕРЕДАЧІ ДАНИХ, БАЙТ / С
(ЧИСЛО КАНАЛІВ х Частота дискретизації х розрядних у байтах)

28/32

2

ВИРІВНЮВАННЯ БЛОКУ ДАНИХ (ЧИСЛО КАНАЛІВ х розрядних)

30/34

2

РОЗРЯДНІ - ЧИСЛО БІТ НА ОДИН ВІДЛІК (8, 16)

32/36

4

ІДЕНТИФІКАТОР подблока ДАНИХ ('DATA')

36/40

4

ДОВЖИНА звукових даних

40/44

ЗВУКОВІ ДАНІ (0 .. 255 ПРИ 8 БІТ І -32768 .. 32767 ПРИ 16 БІТ)

2.1.3. Вихідна інформація

Вихідною інформацією для даної задачі є змінений звуковий сигнал, записаний у файлі, структура якого аналогічна описаній у п.2.1.2.

2.1.4. Математична постановка задачі

Спектр - один з найважливіших інструментів аналізу й обробки звуку. Французький математик Фур'є (1768-1830) і його послідовники довели, що будь-яку, обов'язково періодичну функцію, у разі її відповідності деяким математичним умовами можна розкласти в трігонометрічес-кий ряд Фур'є: 

  ,

(1)

де a i, b i - це так звані коефіцієнти Фур'є, розраховуються за деякою формулою.
На рис. 2.1 представлена ​​цифрова форма представлення звуку.
Цифрова форма подання звукового сигналу

Рис. 2.1
Основні параметри цифрового звуку:
- Частота дискретизації: визначається інтервалом часу, через кото-рої відбувається вимір значення амплітуди аналогового сигналу;
- Бітрейт: розрядність квантування; кількість біт, яким описує-ся одна секунда звукового сигналу;
- Число каналів: число джерел звуку, через які відтворюються звукові сигнали.
Звукові сигнали надходять на вхід системи в цифровому вигляді - у вигляді звукових файлів, структура яких описана в п.2.1.2.
Завдання обробки та фільтрації полягає у витяганні і обробки необхідних даних з файлу.
За допомогою заголовка звукового файлу можна прочитати і змінити описані основні параметри звукового сигналу, записаного у файлі.
Для зміни звукового сигналу та застосування до нього ефектів необхідно прочитати і відредагувати звукові дані з основної частини файлу.
Математичне подання звукових ефектів та їх параметрів:
Ефект реверберації.
На рис. 2.2 представлений вихідний звуковий сигнал, а на рис. 2.3 застосування до вихідного сигналу ефекту реверберації з зазначенням параметрів На осі абцісс відкладається час, а по осі ординат значення амплітуди (гучності) звукового сигналу в певний момент часу.
Вихідний сигнал

Рис.2.2
Ефект реверберації

T - час між відбитками;
h1 - гучність вихідного звукового сигналу;
h2 - гучність відбитого сигналу.
Рис. 2.3
У даному випадку h1 = h2, тобто гучність відбитого сигналу дорівнює гучності вихідного сигналу.
Кількість відображень у даному випадку дорівнює 1.
Ефект відлуння.
На рис. 2.4 представлений вихідний звуковий сигнал, а на рис. 2.5 застосування до вихідного сигналу ефекту луни з зазначенням параметрів На осі абцісс відкладається час, а по осі ординат значення амплітуди (гучності) звукового сигналу в певний момент часу.
Вихідний сигнал

Рис. 2.4
Ефект відлуння

T - час між відгуками;
h1 - гучність вихідного звукового сигналу;
h2 - гучність відгуку.
Рис.2.5.
У даному випадку h2 = h1 / 2, тобто гучність відгуку в два рази менше гучності вихідного сигналу.
Кількість відгуків в даному випадку дорівнює 1.
Зміна темпу.
На рис. 2.6 представлений вихідний звуковий сигнал. На рис. 2.7 представлений змінений звуковий сигнал зі зменшеним в два рази темпом, на рис. 2.8 - зі збільшеним у два рази темпом. На осі абцісс відкладається час, а по осі ординат значення амплітуди (гучності) звукового сигналу в певний момент часу.
Вихідний сигнал Збільшення темпу

Рис. 2.6 Рис. 2.7
Зменшення темпу

Рис. 2.8
Зміна загального рівня гучності
На рис. 2.9 представлений вихідний звуковий сигнал. На рис. 2.10 представлений змінений звуковий сигнал із зменшеною у два рази гучністю, на рис. 2.11 - зі збільшеною в два рази гучністю. На осі абцісс відкладається час, а по осі ординат значення амплітуди (гучності) звукового сигналу в певний момент часу.
Вихідний сигнал Зменшення гучності

Рис. 2.9 Рис. 2.10
Збільшення гучності

Рис. 2.11
Ефекти зростаючій і затухаючої гучності.
На рис. 2.12 представлений вихідний звуковий сигнал, а на рис. 2.13 і рис. 2.14 застосування до вихідного сигналу ефекту зростаючій і затухаючої гучності відповідно. На осі абцісс відкладається час, а по осі ординат значення амплітуди (гучності) звукового сигналу в певний момент часу.
Вихідний сигнал Зростання гучності

Рис. 2.12 рис.2.13
Згасання гучності

Рис. 2.14
Звернення звукового сигналу. На рис. 2.15 представлений вихідний звуковий сигнал, а на рис. 2.16 - обернений.
Вихідний сигнал Звернений сигнал

Рис. 2.15 Рис. 2.16

2.2. Опис алгоритму створення ефекту реверберації

2.2.1. Призначення і характеристика алгоритму створення ефекту реверберації

Даний алгоритм застосовується до вихідного звукового сигналу для створення ефекту реверберації: надання звучанню об'ємності, характерною для великої зали, де кожен звук породжує відповідний, повільно згасає відгомін. Виходить шляхом додавання до вихідного сигналу загасаючої серії його затриманих в часі копій. Це імітує загасання звуку в приміщенні, коли за рахунок багаторазових відбиттів від стін, стелі і інших поверхонь звук набуває повноту і гучність, а після припинення звучання джерела загасає не відразу, а поступово. При цьому час між послідовними відлунням асоціюється з величиною приміщення, а їх інтенсивність - з його гулкостью.

2.2.2. Використовувана інформація

При реалізації даного алгоритму використовуються масиви інформації, сформовані з вхідних даних. Масиви містять інформацію про величину амплітуди звукового сигналу в певні моменти часу. Кількість пар масивів визначається кількістю каналів.
A = {A
1, A 2, ..., A n} - масив амплітуд звукового сигналу.
T = {T
1, T 2, ..., T n} - масив зі значеннями часу, де n залежить від частоти дискретизації, бітрейту і розміру файлу.
T
i - T i -1 визначається частотою дискретизації.
При реалізації алгоритму враховуються наступні параметри ефекту реверберації, які подаються в якості параметрів на вхід алгоритму:
To - час між відбитками;
Гр - гучність відображення відносно попереднього у відсотках;
Kол - кількість віддзеркалень.

2.2.3. Результати рішення

У результаті реалізації алгоритму формуються нові масиви амплітуд і значень часу A 'і T'. Структура вихідного файлу при цьому відповідає описаної в п.2.1.2.

2.2.4. Математичний опис алгоритму створення ефекту реверберації

Для отримання вихідних масивів A 'і T' необхідно попередньо отримати Кількість пар додаткових масивів А (А1, А2, ..., АКОЛЬ) і Т (Т1, Т2, ..., Ткол) з відбитками, а потім поєднати їх:
m - розмірності одержуваних масивів A 'і T'
m = n + n * Кількість;
T1
i = T i + 1 * То;
T2
i = T i + 2 * То;
...
ТКол
i = T i + Кількість * То;
A1
i = Гр/100 * A i;
A2
i = Гр/100 * A1 i;
...
Aкол = Гр/100 * A [к-1]
i
Опис використовуваних позначень наведено в п.2.2.2.
Потім всі отримані масиви амплітуд і часів об'єднуються в один загальний масив (A 'і T' відповідно).

2.2.5. Алгоритм створення ефекту реверберації

1. i:: = 1;
2. MaxValue:: = MaxValue * 256;
3. i:: = i +1;
4. Якщо i ≤ (AudioData.nBlockAlign / AudioData.nChannels), то перехід до п.2 інакше до п.5;
5. MaxValue:: = MaxValue / 2 - 1;
6. TempAudio.nChannels:: = AudioData.nChannels;
7. TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
8. TempAudio.nBitsPerSample: = AudioData.nBitsPerSample;
9. DelaySmp: = Round (Delay * AudioData.nSamplesPerSec/1000);
10. Channel:: = 0;
11. Якщо Channel> (AudioData.nChannels-1), то перехід до п. 38 інакше до п.12
12. i:: = Start;
13. Якщо i> (Start + Count-1), то перехід до п. 37 інакше до п.14;
14. j:: = Number;
15. Якщо j <0, то перехід до п.21 інакше до п.16;
16. Якщо (i - Start) <(DelaySmp * j), то перехід до п.17 інакше до п.18;
17. Smp:: = 0;
18. Читати з файлу значення Smp;
19. SmpBuf [j]:: = Smp;
20. j:: = j +1; перехід до п.15;
21. Mult:: = Volume;
22. j:: = 1;
23. Якщо j> Number, то перехід до п.30 інакше до п.24;
24. k:: = 1;
25. Якщо k> Number, то перехід до п.28 інакше до п.26;
26. SmpBuf [k-1]: = SmpBuf [k-1] + Round (SmpBuf [k] * Mult);
27. k:: = k +1; перехід до п.25;
28. Mult:: = Mult * Volume;
29. j:: = j +1; перехід до п.23;
30. Smp: = Round (SmpBuf [0] / (Number +1));
31. Якщо | Smp |> MaxValue, то перехід до п.32 інакше до п.35;
32. Якщо Smp <0, то перехід до п. 33 інакше до п.34;
33. Smp:: = - MaxValue;
34. Smp:: = MaxValue;
35. Запис Smp в TempAudio;
36. i:: = i +1; перехід до п.13;
37. Сhannel:: = Channel +1; перехід до п.11;
38. AudioData:: = TempAudio;
39. Кінець.

2.2.6. Вимоги до контрольного Приміром

Контрольний приклад повинен містити приклади застосування ефекту реверберації з різними параметрами.

2.2.7. Список умовних позначень

AudioData - сукупність значень амплітуд і народів;
Start - покажчик на місце в масиві даних, з якого починати обробку;
Count - кількість елементів масивів, які необхідно обробити;
Number - кількість віддзеркалень;
Delay - час між відбитками;
Volume - гучність відгуку щодо попереднього;
TempAudio - отримувана сукупність значень амплітуд і народів;
SmpBuf - зберігає вибірку аудіоданих;
Mult - коефіцієнт для отримання значення амплітуди відбиття;
Smp - поточна амплітуда;
Channel - кількість каналів;
MaxValue - макс. значення амплітуди в оброблюваному фрагменті;
DelaySmp = T
i - T i -1. 

2.3. Опис алгоритму створення ефекту луни

2.3.1. Призначення і характеристика алгоритму створення ефекту луни

Даний алгоритм застосовується до вихідного звукового сигналу для створення ефекту луни: реалізація повторення звукового сигналу за допомогою тимчасових перетворень таким чином, щоб людське вухо сприймало отриманий сигнал як відлуння. При цьому слух перестає суб'єктивно сприймати відображення, як призвуки основного сигналу, і починає сприймати їх як повторення. Відлуння зазвичай реалізується так само, як і природне - з загасанням повторюваних копій.

2.3.2. Використовувана інформація

При реалізації даного алгоритму використовуються масиви інформації, сформовані з вхідних даних. Масиви містять інформацію про величину амплітуди звукового сигналу в певні моменти часу. Кількість пар масивів визначається числом каналів (ЧК).
A = {A
1, A 2, ..., A n} - масив амплітуд звукового сигналу;
T = {T
1, T 2, ..., T n} - масив зі значеннями часу;
n залежить від частоти дискретизації (ЧД), бітрейта (Б) і розміру файлу;
T
i - T i -1 визначається частотою дискретизації;
При реалізації алгоритму враховуються наступні параметри ефекту луни, які подаються в якості параметрів на вхід алгоритму:
To - час між відгуками;
Гр - гучність відгуку щодо попереднього у відсотках;
Kол - кількість відгуків.

2.3.3. Результати рішення

У результаті реалізації алгоритму формуються нові масиви амплітуд і значень часу A 'і T'. Структура вихідного файлу при цьому відповідає описаної в п.2.1.2.

2.3.4. Математичний опис алгоритму створення ефекту луни

Для отримання вихідних масивів A 'і T' необхідно попередньо отримати Кількість пар додаткових масивів А (А1, А2, ..., АКОЛЬ) і Т (Т1, Т2, ..., Ткол) з відгуками, а потім поєднати їх:
m - розмірності одержуваних масивів A 'і T';
m = n + n * Кількість + То;
T1
i = T n + T i + То;
T2
i = 2 * T n + T i + 2 * То;
...
ТКол
i = Кількість * Т n + T i + Кількість * То;
A1
i = Гр/100 * A i;
A2
i = Гр/100 * A1 i;
...
Aкол
i = Гр/100 * A [к-1] i
Опис використовуваних позначень наведено в п.2.3.2.
Потім всі отримані масиви амплітуд і часів об'єднуються в один загальний масив (A 'і T' відповідно).

2.3.5. Алгоритм створення ефекту луни

1. i:: = 1;
2. MaxValue:: = MaxValue * 256;
3. i:: = i +1;
4. Якщо i ≤ (AudioData.nBlockAlign / AudioData.nChannels), то перехід до п.2 інакше до п.5;
5. MaxValue:: = MaxValue / 2 - 1;
6. TempAudio.nChannels:: = AudioData.nChannels;
7. TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
8. TempAudio.nBitsPerSample: = AudioData.nBitsPerSample;
9. DelaySmp: = Round (Delay * AudioData.nSamplesPerSec/1000);
10. Channel:: = 0;
11. Якщо Channel> (AudioData.nChannels-1), то перехід до п.31 інакше до п.12;
12. i:: = Start;
13. Якщо i> (Start + Count-1), то перехід до п.30 інакше до п.14;
14. Читати Smp;
15. SummSmp:: = Smp; Mult:: = Volume;
16. j:: = 1;
17. Якщо j> Number, то перехід до п.23 інакше до п.18;
18. Якщо (i - Start) <(DelaySmp * j), то перехід до п.19 інакше до п.20;
19. Smp:: = 0;
20. Читати Smp;
21. SummSmp:: = SummSmp + Mult * Smp; Mult:: = Mult * Volume;
22. j:: = j +1; перехід до 17;
23. Smp:: = SummSmp / (Number + 1);
24. Якщо | Smp |> MaxValue, то перехід до п.25 інакше до п.28;
25. Якщо Smp <0, то перехід до п.26 інакше до п.27;
26. Smp:: =-MaxValue;
27. Smp:: = MaxValue;
28. Запис Smp в TempAudio;
29. i:: = i +1; перехід до п.13;
30. Сhannel:: = Channel +1; перехід до п.11;
31. AudioData:: = TempAudio;
32. Кінець.

2.3.6. Вимоги до контрольного Приміром

Контрольний приклад повинен містити приклади застосування ефекту реверберації з різними параметрами.

2.3.7. Список умовних позначень

AudioData - сукупність значень амплітуд і народів;
Start - покажчик на місце в масиві даних, з якого починати обробку;
Count - кількість елементів масивів, які необхідно обробити;
Number - кількість віддзеркалень;
Delay - час між відбитками;
Volume - гучність відгуку щодо попереднього;
TempAudio - отримувана сукупність значень амплітуд і народів;
SmpBuf - зберігає вибірку аудіоданих;
Mult - коефіцієнт для отримання значення амплітуди відбиття;
Smp - поточна амплітуда;
Channel - кількість каналів;
MaxValue - макс. значення амплітуди в оброблюваному фрагменті;
DelaySmp = T
i - T i -1. 

2.4. Опис алгоритму зміни темпу звуку

2.4.1. Призначення і характеристика алгоритму зміни темпу звуку

Даний алгоритм застосовується для уповільнення або прискорення швидкості відтворення звукового сигналу.

2.4.2. Використовувана інформація

При реалізації даного алгоритму використовуються масиви інформації, сформовані з вхідних даних. Масиви містять інформацію про величину амплітуди звукового сигналу в певні моменти часу. Кількість пар масивів визначається числом каналів (ЧК).
A = {A
1, A 2, ..., A n} - масив амплітуд звукового сигналу;
T = {T
1, T 2, ..., T n} - масив зі значеннями часу, де n залежить від частоти дискретизації (ЧД), бітрейта (Б) і розміру файлу;
T
i - T i -1 визначається частотою дискретизації.
При реалізації алгоритму враховуються такі параметри, які подаються в якості параметрів на вхід алгоритму: величина нової швидкості відтворення у відсотках від поточної (Ск).

2.4.3. Результати рішення

У результаті реалізації алгоритму формується новий масив значень часу T ', масив з амплітуди A залишається незмінним. Структура вихідного файлу при цьому відповідає описаної в п.2.1.2.

2.4.4. Математичний опис алгоритму зміни темпу звуку

Для отримання вихідного масиву T 'використовуються наступні формули:
T
'1 = T 1 * Ск/100;
T
'2 = T 2 * Ск/100;
...
T
'n = T n * Ск/100.
Опис використовуваних позначень наведено в п.2.4.2.

2.4.5. Алгоритм зміни темпу звуку

1. Якщо (Speed ​​= 1) або (Speed ​​= 0), то перехід до п.31 інакше до п.2;
2. TempAudio.nChannels: = AudioData.nChannels;
3. TempAudio.nSamplesPerSec: = AudioData.nSamplesPerSec;
4. TempAudio.nBitsPerSample: = AudioData.nBitsPerSample;
5. TempAudio.nBlockAlign: = AudioData.nBlockAlign;
6. NewCount: = Round (Count / Speed);
7. Якщо Speed> 1, то перехід до п.8 інакше до п.14;
8. i:: = NewCount; Interval:: = Speed;
9. AudioData.Data.Position:: = Start * AudioData.nBlockAlign;
10. Якщо i <> 0, то перехід до п.11 інакше до п.14;
11. Читати Buf з AudioData; Записати Buf в TempAudio;
12. AudioData.Data.Position:: = AudioData.Data.Position - AudioData.nBlockAlign +] Interval [* AudioData.nBlockAlign;
13. Interval: = Interval-] Interval [+ Speed; i:: = i - 1; перехід до п.10;
14. Speed:: = 1/Speed;
15. Channel:: = 0;
16. Якщо Channel> (AudioData.nChannels-1), то перехід до п.31 інакше до п.17;
17. i:: = 0; j:: = 0; Interval:: = Speed;
18. Якщо i <> Count, то перехід до п.19 інакше до п.30;
19. Читати Smp1;
20. Якщо (i +1) <> Count, то перехід до п.21 інакше до п.22;
21. Читати Smp2;
22. Smp2:: = Smp1;
23. k:: =] Interval [;
24. n:: = 0;
25. Якщо n> (k-1), то перехід до п.28 інакше до п.26;
26. Записати в TempAudio (Smp1 + (Smp2-Smp1) / k * n);
27. n:: = n +1; перехід до п.25;
28. Interval:: = Interval -] Interval [+ Speed;
29. i:: = i +1; j:: = j + k; перехід до п.18;
30. перехід до п.16;
31. Кінець.

2.4.6. Вимоги до контрольного Приміром

Контрольний приклад повинен містити приклади зміни темпу звуку: збільшення і зменшення швидкості його відтворення.

2.4.7. Список умовних позначень

AudioData - сукупність значень амплітуд і народів;
Start - покажчик на місце в масиві даних, з якого починати обробку;
Speed ​​- нова швидкість звукового сигналу у відсотках від поточної;
TempAudio - отримувана сукупність значень амплітуд і народів;
Smp1, Smp2 - змінні для зберігання амплітуд;
Channel - кількість каналів;
Interval - поточний оброблюваний часовий інтервал;
Count - поточна кількість позначок часу;
NewCount - нова кількість відміток часу.

2.5. Опис алгоритму зміни гучності звуку

2.5.1. Призначення і характеристика алгоритму зміни гучності звуку

Даний алгоритм застосовується для збільшення або зменшення гучності (амплітуди) звукового сигналу.

2.5.2. Використовувана інформація

При реалізації даного алгоритму використовуються масиви інформації, сформовані з вхідних даних. Масиви містять інформацію про величину амплітуди звукового сигналу в певні моменти часу. Кількість пар масивів визначається числом каналів (ЧК).
A = {A
1, A 2, ..., A n} - масив амплітуд звукового сигналу;
T = {T
1, T 2, ..., T n} - масив зі значеннями часу, де n залежить від частоти дискретизації (ЧД), бітрейта (Б) і розміру файлу;
T
i - T i -1 визначається частотою дискретизації.
При реалізації алгоритму враховуються такі параметри, які подаються в якості параметрів на вхід алгоритму: величина нової гучності звукового сигналу у відсотках від поточної (Гр).

2.5.3. Результати рішення

У результаті реалізації алгоритму формується новий масив значень амплітуд A ', масив з часом T залишається незмінним. Структура вихідного файлу при цьому відповідає описаної в п.2.1.2.

2.5.4. Математичний опис алгоритму зміни гучності звуку

Для отримання вихідного масиву A 'використовуються наступні формули:
A
'1 = А 1 * Гр/100;
A
'2 = А 2 * Гр/100;
...
A
'n = A n * Гр/100.
Опис використовуваних позначень наведено в п.2.5.2.

2.5.5. Алгоритм зміни гучності звуку

1. MaxValue:: = 1;
2. i:: = 0;
3. Якщо i> (AudioData.nBlockAlign / AudioData.nChannels), то перехід до п.5 інакше до п.4;
4. MaxValue:: = MaxValue * 256;
5. MaxValue:: = MaxValue / 2 - 1;
6. Channel:: = 0;
7. Якщо Channel> (AudioData.nChannels - 1), то перехід до п.19 інакше до п.8;
8. Volume:: = 1; i:: = Start;
9. Якщо i> (Start + Count-1), то перехід до п.18 інакше до п.10;
10. Читати Value з файлу;
11. Value:: =] Value * Volume [;
12. Якщо | Value |> MaxValue, то перехід до п.13 інакше до п.16;
13. Якщо Value <0, то перехід до п.14 інакше до п.15;
14. Value:: =-MaxValue; перехід до п.16;
15. Value:: = MaxValue;
16. Записати Value в файл;
17. i:: = i +1; перехід до п.9;
18. Channel:: = Channel +1; перехід до п.7;
19. Кінець.

2.5.6. Вимоги до контрольного Приміром

Контрольний приклад повинен містити приклади зміни гучності звуку: збільшення і зменшення амплітуди звукового сигналу.

2.5.7. Список умовних позначень

AudioData - сукупність значень амплітуд і народів;
Start - покажчик на місце в масиві даних, з якого починати обробку;
Count - кількість елементів масивів, які необхідно обробити;
Number - кількість віддзеркалень;
Delay - час між відбитками;
Volume - гучність відгуку щодо попереднього;
TempAudio - отримувана сукупність значень амплітуд і народів;
SmpBuf - зберігає вибірку аудіоданих;
Mult - коефіцієнт для отримання значення амплітуди відбиття;
Smp - поточна амплітуда;
Channel - кількість каналів;
MaxValue - макс. значення амплітуди в оброблюваному фрагменті;
DelaySmp = T
i - T i -1. 

2.6. Опис алгоритму створення ефекту зростаючої гучності

2.6.1. Призначення і характеристика алгоритму зміни гучності звуку

Даний алгоритм застосовується для плавного збільшення гучності від нульового рівня на початку фрагмента до максимального в кінці.

2.6.2. Використовувана інформація

При реалізації даного алгоритму використовуються масиви інформації, сформовані з вхідних даних. Масиви містять інформацію про величину амплітуди звукового сигналу в певні моменти часу. Кількість пар масивів визначається числом каналів (ЧК).
A = {A
1, A 2, ..., A n} - масив амплітуд звукового сигналу;
T = {T
1, T 2, ..., T n} - масив зі значеннями часу, де n залежить від частоти дискретизації (ЧД), бітрейта (Б) і розміру файлу;
T
i - T i -1 визначається частотою дискретизації.

2.6.3. Результати рішення

У результаті реалізації алгоритму формується новий масив значень амплітуд A ', масив з часом T залишається незмінним. Структура вихідного файлу при цьому відповідає описаної в п.2.1.2.

2.6.4. Математичний опис алгоритму створення ефекту зростаючої гучності

Для отримання вихідного масиву A 'використовуються наступні формули:
A
'1 = А 1 * 1 / n;
A
'2 = А 2 * 2 / n;
...
A
'n = A n.
Опис використовуваних позначень наведено в п.2.6.2.

2.6.5. Алгоритм створення ефекту зростаючої гучності

1. MaxValue:: = 1;
2. i:: = 0;
3. Якщо i> (AudioData.nBlockAlign / AudioData.nChannels), то перехід до п.5 інакше до п.4;
4. MaxValue:: = MaxValue * 256;
5. MaxValue:: = MaxValue / 2 - 1; FinalVolume:: = Volume;
6. Channel:: = 0;
7. Якщо Channel> (AudioData.nChannels - 1), то перехід до п.20 інакше до п.8;
8. Volume:: = 1; i:: = Start;
9. Якщо i> (Start + Count-1), то перехід до п.19 інакше до п.10;
10. Читати Value з файлу;
11. Value:: =] Value * Volume [;
12. Якщо | Value |> MaxValue, то перехід до п.13 інакше до п.16;
13. Якщо Value <0, то перехід до п.14 інакше до п.15;
14. Value:: =-MaxValue; перехід до п.16;
15. Value:: = MaxValue;
16. Записати Value в файл;
17. Volume:: = Volume + FinalVolume / Count;
18. i:: = i +1; перехід до п.9;
19. Channel:: = Channel +1; перехід до п.7;
20. Кінець.

2.6.6. Вимоги до контрольного Приміром

Контрольний приклад повинен містити приклади застосування ефекту зростаючої гучності до звукового сигналу.

2.6.7. Список умовних позначень

AudioData - сукупність значень амплітуд і народів;
Start - покажчик на місце в масиві даних, з якого починати обробку;
Count - кількість елементів масивів, які необхідно обробити;
Number - кількість віддзеркалень;
Delay - час між відбитками;
Volume - гучність відгуку щодо попереднього;
TempAudio - отримувана сукупність значень амплітуд і народів;
SmpBuf - зберігає вибірку аудіоданих;
Mult - коефіцієнт для отримання значення амплітуди відбиття;
Smp - поточна амплітуда;
Channel - кількість каналів;
MaxValue - макс. значення амплітуди в оброблюваному фрагменті;
DelaySmp = T
i - T i -1. 

2.7. Опис алгоритму створення ефекту затухаючої гучності

2.7.1. Призначення і характеристика алгоритму створення ефекту затухаючої гучності

Даний алгоритм застосовується для плавного зменшення гучності від максимального рівня на початку фрагмента до нульового в кінці.

2.7.2. Використовувана інформація

При реалізації даного алгоритму використовуються масиви інформації, сформовані з вхідних даних. Масиви містять інформацію про величину амплітуди звукового сигналу в певні моменти часу. Кількість пар масивів визначається числом каналів (ЧК).
A = {A
1, A 2, ..., A n} - масив амплітуд звукового сигналу;
T = {T
1, T 2, ..., T n} - масив зі значеннями часу, де n залежить від частоти дискретизації (ЧД), бітрейта (Б) і розміру файлу;
T
i - T i -1 визначається частотою дискретизації.

2.7.3. Результати рішення

У результаті реалізації алгоритму формується новий масив значень амплітуд A ', масив з часом T залишається незмінним. Структура вихідного файлу при цьому відповідає описаної в п.2.1.2.

2.7.4. Математичний опис алгоритму створення ефекту затухаючої гучності

Для отримання вихідного масиву A 'використовуються наступні формули:
n - кількість часових інтервалів;
A
'1 = А 1 * n / n;
A
'2 = А 2 * (n-1) / n;
...
A
'n-1 = A n-1 * 2 / n;
A
'n = A n * 1 / n.
Опис використовуваних позначень наведено в п.2.7.2.

2.7.5. Алгоритм створення ефекту затухаючої гучності

1. MaxValue:: = 1;
2. i:: = 0;
3. Якщо i> (AudioData.nBlockAlign / AudioData.nChannels), то перехід до п.5 інакше до п.4;
4. MaxValue:: = MaxValue * 256;
5. MaxValue:: = MaxValue / 2 - 1; FinalVolume:: = Volume;
6. Channel:: = 0;
7. Якщо Channel> (AudioData.nChannels - 1), то перехід до п.20 інакше до п.8;
8. Volume:: = 1; i:: = Start;
9. Якщо i> (Start + Count-1), то перехід до п.19 інакше до п.10;
10. Читати Value з файлу;
11. Value:: =] Value * Volume [;
12. Якщо | Value |> MaxValue, то перехід до п.13 інакше до п.16;
13. Якщо Value <0, то перехід до п.14 інакше до п.15;
14. Value:: =-MaxValue; перехід до п.16;
15. Value:: = MaxValue;
16. Записати Value в файл;
17. Volume:: = Volume + (FinalVolume-1) / Count;
18. i:: = i +1; перехід до п.9;
19. Channel:: = Channel +1; перехід до п.7;
20. Кінець.

2.7.6. Вимоги до контрольного Приміром

Контрольний приклад повинен містити приклади застосування ефекту затухаючої гучності до звукового сигналу різних форм.

2.7.7. Список умовних позначень

AudioData - сукупність значень амплітуд і народів;
Start - покажчик на місце в масиві даних, з якого починати обробку;
Count - кількість елементів масивів, які необхідно обробити;
Number - кількість віддзеркалень;
Delay - час між відбитками;
Volume - гучність відгуку щодо попереднього;
TempAudio - отримувана сукупність значень амплітуд і народів;
SmpBuf - зберігає вибірку аудіоданих;
Mult - коефіцієнт для отримання значення амплітуди відбиття;
Smp - поточна амплітуда;
Channel - кількість каналів;
MaxValue - макс. значення амплітуди в оброблюваному фрагменті;
DelaySmp = T
i - T i -1. 

2.8. Опис алгоритму звернення звукового сигналу

2.8.1. Призначення і характеристика алгоритму створення ефекту затухаючої гучності

Даний алгоритм застосовується для звернення відтворення звукового сигналу.

2.8.2. Використовувана інформація

При реалізації даного алгоритму використовуються масиви інформації, сформовані з вхідних даних. Масиви містять інформацію про величину амплітуди звукового сигналу в певні моменти часу. Кількість пар масивів визначається числом каналів (ЧК).
A = {A
1, A 2, ..., A n} - масив амплітуд звукового сигналу;
T = {T
1, T 2, ..., T n} - масив зі значеннями часу, де n залежить від частоти дискретизації (ЧД), бітрейта (Б) і розміру файлу;
T
i - T i -1 визначається частотою дискретизації.

2.8.3. Результати рішення

У результаті реалізації алгоритму формуються нові масиви значень амплітуд A 'і часу T'. Структура вихідного файлу при цьому відповідає описаної в п.2.1.2.

2.8.4. Математичний опис алгоритму звернення звукового сигналу

Для отримання вихідних масивів A 'і Т' використовуються наступні формули:
A
'1 = А n;
A
'2 = А n-1;
...
A
'n-1 = A 2;
A
'n = A 1;
T
'1 = А n;
T
'2 = А n-1;
...
T
'n-1 = A 2;
T
'n = A 1.
Опис використовуваних позначень наведено в п.2.8.2.

2.8.5. Алгоритм звернення звукового сигналу

1. AbsStart:: = Start * AudioData.nBlockAlign;
2. AbsCount:: = Count * AudioData.nBlockAlign;
3. AbsFinish:: = AbsStart + AbsCount; i:: = AbsFinish;
4. Якщо (i-AbsStart)> = (MaxSizeOfBuffer), то перехід до п.5 інакше до п.6;
5. BufferStart: = i - MaxSizeOfBuffer; перехід до п.7;
6. BufferStart: = AbsStart;
7. AudioData.Data.Position: = BufferStart; Читати знаеніе амплітуди в Buf;
8. Якщо i> BufferStart, то перехід до п.9 інакше до п.11;
9. i: = i - AudioData.nBlockAlign; AudioData.Data.Position: = i;
10. Читати Buf з AudioData; Записати Buf в TempAudio; перехід до п.8;
11. Якщо i = AbsStart, то перехід до п.12 інакше до п.4;
12. AudioData.Data.Position: = AbsStart; TempAudio.Data.Position: = 0;
13. i:: = 1;
14. Якщо I> Count, то перехід до п.17 інакше до п.15;
15. Читати Buf з TempAudio; Записати Buf в AudioData;
16. i:: = i +1; перехід до п.14;
17. Кінець.

2.8.6. Вимоги до контрольного Приміром

Контрольний приклад повинен містити приклади застосування звернення звукового сигналу різних форм.

2.8.7. Список умовних позначень

AudioData - сукупність значень амплітуд і народів;
Start - покажчик на місце в масиві даних, з якого починати обробку;
Count - кількість елементів масивів, які необхідно обробити;
Number - кількість віддзеркалень;
Delay - час між відбитками;
Volume - гучність відгуку щодо попереднього;
TempAudio - отримувана сукупність значень амплітуд і народів;
SmpBuf - зберігає вибірку аудіоданих;
Mult - коефіцієнт для отримання значення амплітуди відбиття;
Smp - поточна амплітуда;
Channel - кількість каналів;
MaxValue - макс. значення амплітуди в оброблюваному фрагменті;
DelaySmp = T
i - T i -1. 

2.9. Опис підпрограми «Reverberation»

2.9.1. Вступна частина

Підпрограма Reverberation служить для застосування ефекту реверберації до зазначеного фрагменту звукового сигналу, записаного у файлі. Текст підпрограми наведений у додатку 1.

2.9.2. Функціональне призначення

Підпрограма Reverberation призначена для реалізації алгоритму створення ефекту реверберації.

2.9.3. Опис інформації

Звуковий сигнал, записаний у файлі, представлений наступним класом:
TAudioData = class (TObject)
public
nChannels: Word;
nSamplesPerSec: LongWord;
nBitsPerSample: Word;
nBlockAlign: Word;
Data: TFile;
constructor Create;
destructor Destroy;
procedure Calculate_nBlockAlign;
procedure ReadSample (Number, Channel: LongInt; var Value: Integer);
procedure WriteSample (Number, Channel: LongInt; Value: Integer);
private
Name: String;
end;
Опис полів класу подання звукового сигналу:
nChannels - число каналів;
nSamplesPerSecond - частота дискретизації;
nBitsPerSample - бітрейт;
nBlockAlign - блок вирівнювання (число каналів х розрядність);
Data - звукові дані;
Name - ім'я файлу.
TempAudio: TAudioData; - отримувана сукупність значень амплітуд і часів.
Опис використовуваних в підпрограмі змінних представлено в табл.2.2.
Таблиця 2.2
Змінні, що використовуються в підпрограмі «Reverberation»

Імена змінних

Тип

Опис

i, j, k

integer

Змінні-лічильники

DelaySmp

Cardinal

Так само T i - T i-1 

SmpBuf

array [0 .. 64] of Int64

Зберігає вибірку аудіо-даних

Mult

Real

Коефіцієнт для отримання значення амплітуди відображення

Smp

Integer

Поточна амплітуда

Channel

Word

Кількість каналів

MaxValue

Cardinal

Максимальне значення амплітуди в оброблюваному фрагменті

Опис вхідних даних підпрограми представлено в табл.2.3.
Таблиця 2.3
Вхідні дані підпрограми «Reverberation»

Імена змінних

Тип

Опис

AudioData

TAudioData

Передана вихідна сукупність-ність значень амплітуд і часів

Start

Cardinal

Стартова позиція, з якою необхідно почати обробку

Count

Cardinal

Кількість позицій, які необхідно обробити відноси-тельно стартовою

Number

Cardinal

Кількість відбитків

Delay

Cardinal

Час між відображеннями

Volume

Real

Гучність відображення щодо відповідності-але попереднього

Вихідні дані підпрограми:
AudioData - змінена сукупність значень амплітуд і часів з ефектом реверберації.

2.9.4. Використовувані програми

У підпрограмі використовуються наступні підпрограми:
1. ReadSample (Number, Channel: LongInt; var Value: Integer) - процедура читання даних з звукового файлу;
2. WriteSample (Number, Channel: LongInt; Value: Integer) - процедура запису даних у звуковий файл.

2.9.5. Схема підпрограми «Reverberation»

Схема підпрограми «Reverberation» наведена на рис. 2.17.

Ні

Ні

Ні

Ні

Ні

Ні

Так

Так

Так

Так

Так

Так

Так

Ні

Схема підпрограми «Reverberation»

Рис. 2.17

2.10. Опис підпрограми «Echo»

2.10.1. Вступна частина

Підпрограма Echo служить для застосування ефекту луни до зазначеного фрагменту звукового сигналу, записаного у файлі. Текст програми приведений у додатку 1.

2.10.2. Функціональне призначення

Підпрограма Echo призначена для реалізації алгоритму створення ефекту луни.

2.10.3. Опис інформації

TempAudio: TAudioData; - отримувана сукупність значень амплітуд і часів. Опис використовуваних в підпрограмі змінних представлено в табл.2.4.
Таблиця 2.4
Змінні, що використовуються в підпрограмі «Echo»

Імена змінних

Тип

Опис

i, j, k

integer

Змінні-лічильники

DelaySmp

Cardinal

Так само T i - T i -1 

SmpBuf

array [0 .. 64] of Int64

Зберігає вибірку аудіо-даних

Mult

Real

Коефіцієнт для одержання значення амплітудою-ди відображення

Smp

Integer

Поточна амплітуда

Channel

Word

Кількість каналів

MaxValue

Cardinal

Макс. значення амплі-туди в оброблюваному фрагменті

Опис вхідних даних підпрограми представлено в табл.2.5.
Таблиця 2.5
Вхідні дані підпрограми «Echo»

Імена змінних

Тип

Опис

AudioData

TAudioData

Передана вихідна сукупність значень амплітуд і часів

Start

Cardinal

Стартова позиція, з якою необхідно почати обробку

Count

Cardinal

Кількість позицій, які необхідно обробити щодо стартовою

Number

Cardinal

Кількість відгуків

Delay

Cardinal

Час між відгуками

Volume

Real

Гучність відгуку відно-сітельно попе-ного

Вихідні дані підпрограми:
AudioData - змінена сукупність значень амплітуд і часів з ефектом луни.

2.10.4. Використовувані підпрограми

У підпрограмі використовуються наступні підпрограми:
1. ReadSample (Number, Channel: LongInt; var Value: Integer) - процедура читання даних з звукового файлу;
2. WriteSample (Number, Channel: LongInt; Value: Integer) - процедура запису даних у звуковий файл.

2.10.5. Схема підпрограми «Echo»

Схема підпрограми «Echo» наведена на рис. 2.18.

Ні

Так

Так

Ні

Ні

Ні

Ні

Так

Так

Так

Ні

Так

Схема підпрограми «Echo»

Рис. 2.18

2.11. Опис підпрограми «SetSpeedOfAudio»

2.11.1. Вступна частина

Підпрограма SetSpeedOfAudio служить для измения темпу (швидкості) зазначеного фрагмента звукового сигналу, записаного у файлі. Текст підпрограми наведений у додатку 1.

2.11.2. Функціональне призначення

Підпрограма SetSpeedOfAudio призначена для реалізації алгоритму зміни темпу звуку.

2.11.3. Опис інформації

TempAudio: TAudioData; - отримувана сукупність значень амплітуд і часів. . Опис використовуваних в підпрограмі змінних представлено в табл.2.6.
Таблиця 2.6
Змінні, що використовуються в підпрограмі «SetSpeedOfAudio»

Імена змінних

Тип

Опис

i, j, k, n, NewCount

integer

Змінні-лічильники

Buf

Int64

Вирівнювання (число каналів х розрядність)

Interval

Real

Інтервал часу між двома значеннями амплітуд

Smp1, Smp2

Integer

Значення амплітуд

Channel

Byte

Кількість каналів

Опис вхідних даних підпрограми представлено в табл.2.7.
Таблиця 2.7
Вхідні дані підпрограми «SetSpeedOfAudio»

Імена змінних

Тип

Опис

AudioData

TAudioData

Передана вихідна сукупність значень амплітуд і часів

Start

Cardinal

Стартова позиція, з якою необхідно почати обробку

Count

Cardinal

Кількість позицій, які необхідно обробити щодо стартовою

Speed

Real

Нова швидкість звуко-вого сигналу

Вихідні дані підпрограми:
AudioData - змінена сукупність значень амплітуд і часів зі зміненим темпом.

2.11.4. Використовувані програми

У підпрограмі використовуються наступні підпрограми:
1) ReadSample (Number, Channel: LongInt; var Value: Integer) - процедура читання даних з звукового файлу;
2) WriteSample (Number, Channel: LongInt; Value: Integer) - процедура запису даних у звуковий файл.

2.11.5. Схема підпрограми «SetSpeedOfAudio»

Схема підпрограми «SetSpeedOfAudio» наведена на рис. 2.19.

Ні

Ні

Ні

Ні

Так

Так

Так

Так

Так

Ні

Схема підпрограми «SetSpeedOfAudio»

Рис. 2.19

2.12. Опис підпрограми «SetVolumeOfAudio»

2.12.1. Вступна частина

Підпрограма SetVolumeOfAudio служить для измения рівня гучності зазначеного фрагмента звукового сигналу, записаного у файлі. Текст підпрограми наведений у додатку 1.

2.12.2. Функціональне призначення

Підпрограма SetVolumeOfAudio призначена для реалізації алгоритму зміни загального рівня гучності звуку.

2.12.3. Опис інформації

TempAudio: TAudioData; - отримувана сукупність значень амплітуд і часів. . Опис використовуваних в підпрограмі змінних представлено в табл.2.8.
Таблиця 2.8
Змінні, що використовуються в підпрограмі «SetVolumeOfAudio»

Імена змінних

Тип

Опис

i

integer

Змінна-лічильник

MaxValue

Cardinal

Макс. значення амплі-туди в оброблюваному фрагменті

Value

Cardinal

Поточне значення амплітуди

Channel

Word

Кількість каналів

Опис вхідних даних підпрограми представлено в табл.2.9.
Таблиця 2.9
Вхідні дані підпрограми «SetVolumeOfAudio»

Імена змінних

Тип

Опис

AudioData

TAudioData

Передана вихідна сукупність значень амплітуд і часів

Start

Cardinal

Стартова позиція, з якою необхідно почати обробку

Count

Cardinal

Кількість позицій, які необхідно обробити щодо стартовою

Volume

Real

Нова гучність звуко-вого сигналу

Вихідні дані підпрограми:
AudioData - змінена сукупність значень амплітуд і часів зі зміненим рівнем гучності.

2.12.4. Використовувані програми

У підпрограмі використовуються наступні підпрограми:
1) ReadSample (Number, Channel: LongInt; var Value: Integer) - процедура читання даних з звукового файлу;
2) WriteSample (Number, Channel: LongInt; Value: Integer) - процедура запису даних у звуковий файл.

2.12.5. Схема підпрограми «SetVolumeOfAudio»

Схема підпрограми «SetVolumeOfAudio» наведена на рис. 2.20.

Ні

Ні

Ні

Так

Так

Так

Ні

Так

Схема підпрограми «SetVolumeOfAudio»

Рис. 2.20

2.13. Опис підпрограми «ReChangeVolumeOfAudio»

2.13.1. Вступна частина

Підпрограма ReChangeVolumeOfAudio служить для застосування ефекту зростаючої гучності до зазначеного фрагменту звукового сигналу, записаного у файлі. Текст підпрограми наведений у додатку 1.

2.13.2. Функціональне призначення

Підпрограма ReChangeVolumeOfAudio призначена для реалізації алгоритму створення ефекту зростаючої гучності.

2.13.3. Опис інформації

TempAudio: TAudioData; - отримувана сукупність значень амплітуд і часів. Опис використовуваних в підпрограмі змінних представлено в табл.2.10.
Таблиця 2.10
Змінні, що використовуються в підпрограмі «ReChangeVolumeOfAudio»

Імена змінних

Тип

Опис

i

integer

Змінна-лічильник

MaxValue

Cardinal

Макс. значення амплі-туди в оброблюваному фрагменті

Value

Cardinal

Поточне значення амплітуди

Channel

Word

Кількість каналів

FinalVolume

Real

Значення амплітуди в кінці оброблюваного фрагмента

Опис вхідних даних підпрограми представлено в табл.2.11.
Таблиця 2.11
Вхідні дані підпрограми «ReChangeVolumeOfAudio»

Імена змінних

Тип

Опис

AudioData

TAudioData

Передана вихідна сукупність значень амплітуд і часів

Start

Cardinal

Стартова позиція, з якою необхідно почати обробку

Count

Cardinal

Кількість позицій, які необхідно обробити щодо стартовою

Вихідні дані підпрограми:
AudioData - змінена сукупність значень амплітуд і часів з застосованим ефектом зростаючої гучності.

2.13.4. Використовувані програми

У підпрограмі використовуються наступні підпрограми:
1) ReadSample (Number, Channel: LongInt; var Value: Integer) - процедура читання даних з звукового файлу;
2) WriteSample (Number, Channel: LongInt; Value: Integer) - процедура запису даних у звуковий файл.

2.13.5. Схема підпрограми «ReChangeVolumeOfAudio»

Схема підпрограми «ReChangeVolumeOfAudio» наведена на рис. 2.21.

Ні

Так

Так

Так

Ні

Так

Ні

Ні

Схема підпрограми «ReChangeVolumeOfAudio»

Рис. 2.21

2.14. Опис підпрограми «ChangeVolumeOfAudio»

2.14.1. Вступна частина

Підпрограма ChangeVolumeOfAudio служить для застосування ефекту затухаючої гучності до зазначеного фрагменту звукового сигналу, записаного у файлі. Текст підпрограми наведений у додатку 1.

2.14.2. Функціональне призначення

Підпрограма ChangeVolumeOfAudio призначена для реалізації алгоритму створення ефекту затухаючої гучності.

2.14.3. Опис інформації

TempAudio: TAudioData; - отримувана сукупність значень амплітуд і часів. . Опис використовуваних в підпрограмі змінних представлено в табл.2.12.
Таблиця 2.12
Змінні, що використовуються в підпрограмі «ChangeVolumeOfAudio»

Імена змінних

Тип

Опис

i

integer

Змінна-лічильник

MaxValue

Cardinal

Макс. значення амплі-туди в оброблюваному фрагменті

Value

Cardinal

Поточне значення амплітуди

Channel

Word

Кількість каналів

FinalVolume

Real

Значення амплітуди на початку оброблюваного фрагмента

Опис вхідних даних підпрограми представлено в табл.2.13.
Таблиця 2.13
Вхідні дані підпрограми «ChangeVolumeOfAudio»

Імена змінних

Тип

Опис

AudioData

TAudioData

Передана вихідна сукупність значень амплітуд і часів

Start

Cardinal

Стартова позиція, з якою необхідно почати обробку

Count

Cardinal

Кількість позицій, які необхідно обробити щодо стартовою

Вихідні дані підпрограми:
AudioData - змінена сукупність значень амплітуд і часів з застосованим ефектом затухаючої гучності.

2.14.4. Використовувані програми

У підпрограмі використовуються наступні підпрограми:
1) ReadSample (Number, Channel: LongInt; var Value: Integer) - процедура читання даних з звукового файлу;
2) WriteSample (Number, Channel: LongInt; Value: Integer) - процедура запису даних у звуковий файл.

2.14.5. Схема підпрограми «ChangeVolumeOfAudio»

Схема підпрограми «ChangeVolumeOfAudio» наведена на рис. 2.22.

Так

Так

Так

Ні

Так

Ні

Ні

Ні

Схема підпрограми «ChangeVolumeOfAudio»

Рис. 2.22

2.15. Опис підпрограми «ReverseAudio»

2.15.1. Вступна частина

Підпрограма ReverseAudio служить для застосування звернення зазначеного фрагмента звукового сигналу, записаного у файлі. Текст підпрограми наведений у додатку 1.

2.15.2. Функціональне призначення

Підпрограма ReverseAudio призначена для реалізації алгоритму звернення звукового сигналу.

2.15.3. Опис інформації

TempAudio: TAudioData; - отримувана сукупність значень амплітуд і часів. . Опис використовуваних в підпрограмі змінних представлено в табл.2.14.
Таблиця 2.14
Змінні, що використовуються в підпрограмі «ReverseAudio»

Імена змінних

Тип

Опис

i

integer

Змінна-лічильник

Buf

Int64

Поточне значення амплітуди

AbsStart

Cardinal

Абсолютна позиція початку обробки

AbsCount

Cardinal

Абсолютна кількість позицій для обробки

AbsFinish

Cardinal

Абсолютна позиція кінця обробки

Опис вхідних даних підпрограми представлено в табл.2.15.
Таблиця 2.15
Вхідні дані підпрограми «ReverseAudio»

Імена змінних

Тип

Опис

AudioData

TAudioData

Передана вихідна сукупність значень амплітуд і часів

Start

Cardinal

Стартова позиція, з якою необхідно почати обробку

Count

Cardinal

Кількість позицій, які необхідно обробити щодо стартовою

Вихідні дані підпрограми:
AudioData - змінена сукупність значень амплітуд і часів з оберненим звуковим сигналом.

2.15.4. Використовувані програми

У підпрограмі використовуються наступні підпрограми:
1) ReadSample (Number, Channel: LongInt; var Value: Integer) - процедура читання даних з звукового файлу;
2) WriteSample (Number, Channel: LongInt; Value: Integer) - процедура запису даних у звуковий файл.

2.15.5. Схема підпрограми «ReverseAudio»

Схема підпрограми «ReverseAudio» наведена на рис. 2.23.

Ні

Так

Ні

Так

Ні

Так

Схема підпрограми «ReverseAudio»

Рис. 2.23

2.16. Опис контрольного прикладу

2.16.1. Призначення

Основною метою роботи програми є зміна параметрів звукових сигналів, їх структури і застосування різних звукових ефектів для отримання необхідних характеристик звучання. Результатом роботи програми є змінений звуковий сигнал, записаний у файлі. Контрольний приклад повинен містити вихідний звуковий сигнал, записаний у файлі одного з таких форматів: Microsoft RIFF / WAVE (файли з розширенням wav), MP3 (файли з розширенням mp3), Electronic music (файли з розширенням em1).

2.16.2. Вихідні дані

На рис. 2.24 і рис. 2.25 наведені зображення вихідних звукових сигналів. До першого передбачається застосувати ефекти (реверберація, луна), змінити параметри (частота дискретизації, бітрейт, число каналів, загальний рівень гучності, темп) і відредагувати структуру (видалення, копіювання, звертання частини сигналу). До другого передбачається застосувати ефекти зростаючій і затухаючої гучності. Дані звукові сигнали отримані шляхом запису їх через мікрофон. Файли збережені у форматі Microsoft RIFF / WAVE, тому придатні для тестування.

Вихідні звукові сигнали

Рис. 2.24

Рис. 2.25

Параметри вихідних звукових сигналів, записаних у файлі:
Перший звуковий сигнал:
Частота дискретизації: 44100 Hz;
Бітрейт: 16;
Кількість каналів: 2.
Другий звуковий сигнал:
Частота дискретизації: 22050 Hz;
Бітрейт: 16;
Кількість каналів: 2.

2.16.3. Контрольний приклад

Застосування ефекту луни.
Встановлені параметри ефекту: 2 відгуку, 75% гучність, затримка між відгуками 400 мс. Результат застосування ефекту до вихідного сигналу показаний на ріс.2.26.
Ефект відлуння

Ріс.2.26
Застосування ефекту реверберації.
Встановлені параметри ефекту: 2 відображення, 70% гучність, затримка між відбитками 62 мс. Результат застосування ефекту до вихідного сигналу показаний на ріс.2.27.
Ефект реверберації

Ріс.2.27


Зменшення темпу.
Встановлені параметри ефекту: зменшення темпу в 2 рази. Результат застосування до вихідного сигналу показаний на ріс.2.28.
Зменшення темпу

Ріс.2.28
Збільшення темпу в два рази.
Встановлені параметри ефекту: збільшення темпу в 2 рази. Результат застосування до вихідного сигналу показаний на ріс.2.29.
Збільшення темпу

Ріс.2.29
Збільшення загального рівня гучності.
Встановлені параметри ефекту: збільшення гучності в 2 рази. Результат застосування до вихідного сигналу показаний на ріс.2.30.
Збільшення гучності

Ріс.2.30
Зменшення загального рівня гучності в два рази:
Встановлені параметри ефекту: зменшення гучності в 2 рази. Результат застосування до вихідного сигналу показаний на ріс.2.31.
Зменшення гучності

Ріс.2.31
Застосування ефекту зростаючої гучності:
Результат застосування ефекту до вихідного сигналу показаний на ріс.2.32.
Ефект зростаючою гучності

Ріс.2.32
Застосування ефекту затухаючої гучності:
Результат застосування ефекту до вихідного сигналу показаний на ріс.2.33.
Ефект затухаючої гучності

Ріс.2.33
Звернення звуку:
Результат застосування до вихідного сигналу показаний на ріс.2.34.
Звернення вихідного сигналу

Ріс.2.34
Видалення частини сигналу:
Була вилучена перша частина вихідного звукового сигналу. Результат застосування показу на ріс.2.35.
Видалення частини сигналу

Ріс.2.35
Копіювання частини сигналу (скопійована в кінець друга частина звукового сигналу):
Була скопійована в кінець друга частина вихідного звукового сигналу. Результат застосування показаний на ріс.2.36.
Копіювання частини сигналу

Ріс.2.36
Були змінені параметри:
частота дискретизації: 22050 Hz;
бітрейт: 8;
число каналів: 1.

2.16.4. Результати тестування роботи підсистеми обробки та фільтрації звукового сигналу

Для випробування програмного забезпечення підсистеми обробки та фільтрації сигналу на вхід були подані два звукові сигнали формату Microsoft RIFF / WAVE. Випробування проводилися згідно керівництву програміста, наведеним у додатку 2, і керівництву оператора, наведеному в додатку 3. У результаті були отримані змінені звукові сигнали із заданими характеристиками звучання. Змінені звукові сигнали були збережені у форматі Microsoft RIFF / WAVE.
Тестування показало, що розроблене програмне забезпечення здатне аналізувати подається на вхід звуковий сигнал, визначати і змінювати його параметри, редагувати структуру звукового сигналу і застосовувати різні ефекти для досягнення необхідних характеристик звучання.


3. ОРГАНІЗАЦІЙНО-ЕКОНОМІЧНА ЧАСТИНА

                   Обгрунтування необхідності розробки підсистеми обробки та фільтрації сигналу 

Підсистема обробки та фільтрації сигналу є невід'ємною частиною системи обробки аудіоінформації, призначеної для редагування та кодування звукових сигналів, записаних у файлах. Система, що розробляється носить дослідницький характер і призначена для пошуку і налагодження найбільш ефективних алгоритмів обробки звукової інформації. Реалізація підсистеми дозволить у значній мірі полегшити працю програміста-дослідника шляхом автоматизації процесу обробки звукових сигналів.
Підсистема обробки та фільтрації звукових сигналів дозволить редагувати основні параметри цифрового звуку, модифікувати їх структуру, застосувати різні ефекти для досягнення необхідних характеристик звучання.
Зменшення розміру файлів, що містять звукову інформацію, має велике значення як при їх зберіганні, так і при пересиланні по каналах зв'язку. Таким чином, розробка системи дозволить, крім виконання операцій редагування і перетворення звукових сигналів, заощадити на завантаженні пристроїв зберігання інформації і знизити навантаження на канали зв'язку.

                         Розрахунок витрат на розробку підсистеми обробки та фільтрації сигналу 

Для визначення величини витрат на створення підсистеми, використовуємо прямий метод калькуляції.
Розрахунок кошторису витрат здійснюється за наступними статтями
- Витрати на основні і допоміжні матеріали;
- Витрати на оплату праці виконавців;
- Витрати на соціальні програми;
- Витрати на утримання та амортизацію основних фондів;
- Накладні витрати;
- Інші витрати.
До статті «Витрати на основні та допоміжні матеріали» відносяться покупні вироби, необхідні для виконання роботи, перераховані в табл. 3.1.
Таблиця 3.1
Витрати на основні та допоміжні матеріали

Найменування матеріалу

Кількість

Вартість, р.

CD-R диск

1 шт.

20

CD-RW диск

1 шт.

50

Папір писальний.

250 аркушів

120

Тонер для принтера

1 шт.

200

Інші канцелярські товари

30

Разом

420

Оклад інженера-програміста в період розробки становив 3000 р. в місяць. Тривалість розробки 3 місяці.

З П = ЗП М * П М 

(3.1)

З П = 3000 * 3 = 9000 руб.
До окладу нараховується премія. Відсоток преміальних склав 15% на місяць.

З П,% = З П * 1.15

(3.2)

З П,% = 9000 * 1.15 = 10350 руб.
Планові накопичення до фонду резерву відпусток (З
Д) розраховується в розмірі 10% від тарифної плати:

ЗП Д = З П * 0.10

(3.3)

ЗП Д = 9000 * 0.10 = 900 руб.
До витрат на оплату праці необхідно включити уральський коефіцієнт (15%). Районний коефіцієнт розраховується від окладу разом з преміальними та додаткової заробітної платою.
До
УР = (9000 + 1350) * 0.15 = 1552.50 руб.
Отже, витрати на оплату праці з урахуванням зонального коефіцієнта складуть:

ЗП ОСН = З П,% + ЗП Д + К УР 

(3.4)

ЗП ОСН = 10350 + 900 + 1552.50 = 12802.50 руб.
Сума податкової бази не перевищує 280000 крб., Тому стаття "Витрати на соціальні податки» включає в себе відрахування в пенсійний фонд (20%), на медичне (3.1%) і соціальне страхування (2.9%), відрахування до фонду страхування від нещасних випадків (0.2%), що становить 26.2% / 33 /. Відрахування проводяться від загальних витрат на оплату праці і сума відрахувань становить:

З отч = ЗП ОСН * 0.262

(3.5)

З отч = 12802.50 * 0.262 = 3354.26 руб.
Стаття «Витрати на амортизацію і експлуатацію ВТ» включає витрати, пов'язані з експлуатацією обчислювальної техніки. Вартість одного машинного години розраховується за формулою:

А Ч = З ІСП / (Ч М * К Ч), 

(3.6)

де А Ч - оренда за годину використання;
З
ІСП - загальна вартість використання ЕОМ;
Ч
М - число місяців у році;
До
Ч - кількість робочих годин у місяці.

З ІСП = А КОМП + ЗП обсл + С ЗЧ + З ЕЛ + А ПО, 

(3.7)

де А КОМП - амортизація комп'ютера за рік експлуатації;
ЗП
обсл - витрати на оплату праці обслуговуючого персоналу за рік експлуатації;
ЗП
обсл = 1500 руб / міс.;
З
ЗЧ - вартість запчастин для комп'ютера за рік експлуатації;
З
ЗЧ = 200 руб / рік;
З
ЕЛ - вартість витраченої електроенергії за рік експлуатації;
З
ЕЛ = 2400 руб / рік;
А
ПО - річна амортизація програмного забезпечення.

А КОМП = З КОМП / С ПІ, 

(3.8)

де З КОМП - вартість комп'ютера;
З
ПІ - строк корисного використання (в роках).
А
КОМП = 30000 / 5 = 6000 руб.

А ПО = СТ ПЗ / З ПІ, 

(3.9)

де СТ ПЗ - вартість програмного забезпечення;
З
ПІ - строк корисного використання (в роках).
А
ПО = 5800 / 5 = 1160 руб.
З
ІСП = 6000 + 1500 * 12 + 200 + 2400 + 1160 = 27760 руб.
А
Ч = 27760 / (12 * 176) = 13.14 руб
ЕОМ використовувалася на етапах проектування (41 година), програмування (79 годин), налагодження (551 годин) і документування (299 годин), тобто всього 970 годин. Отже, сума витрат на утримання ВТ складе:

З АР = ЕЧ * Ач,

(3.10)

З АР = 970 * 13.14 = 12745,80 руб.
Стаття «Інші витрати» містить витрати, невраховані у попередніх статтях (до 50% від витрат на оплату праці):

П Р = ЗП ОСН * 0.5,

(3.11)

П Р = 12802.50 * 0.5 = 6401.25 руб.
Стаття «Накладні витрати» включає в себе витрати по управлінню (заробітна плата, що витрати на всі види відряджень управлінського апарату), утримання пожежної і сторожової охорони, утримання та поточний ремонт будівель, споруд, інвентарю; утримання персоналу, який не належить до апарату управління; витрати з винахідництва і раціоналізації; з підготовки кадрів; витрати на утримання ВЦ; канцелярські, поштово-телеграфні витрати та ін загальногосподарські витрати; невиробничі витрати. Накладні витрати складають 130% від витрат на оплату праці, таким чином, отримуємо:

Н Р = ЗП ОСН * 1.3,

(3.12)

Н Р = 12802.50 * 1.3 = 16643,25 руб.
Сума витрат на розробку підсистеми в цілому склала 58670.32 руб. Табл. 3.2 відображає витрати за статтями і структуру цих витрат у загальній сумі.
Таблиця 3.2
Кошторис витрат на розробку підсистеми

Стаття витрат

Сума витрат, руб.

Витрати на матеріали

420

Витрати на оплату праці

12800

Відрахування на соціальні податки

3350

Витрати на утримання та амортизацію ВТ

12750

Накладні витрати

16640

Інші витрати

6400

РАЗОМ

52370


Округлимо отриману суму до тисяч для обліку непередбачених витрат. Отримаємо, що сума витрат на розробку системи становитиме 53000 руб.
Структура витрат на розробку ПО наведена на рис. 3.1.
Структура витрат на розробку підсистеми обробки та фільтрації сигналу

Рис. 3.1

4. ЕКОЛОГІЧНІСТЬ І БЕЗПЕКА ПРОЕКТУ

4.1. Аналіз небезпечних і шкідливих факторів, що виникають при експлуатації комп'ютера 

Під час роботи за ЕОМ часто виникають ситуації, в яких оператор ЕОМ повинний за короткий термін прийняти правильне рішення. Для успішної роботи в таких умовах необхідна раціонально організоване середовище, огороджувальна працівника від впливу сторонніх подразників, якими можуть бути похмура забарвлення пристроїв ЕОМ та приміщення ПЦ, незручне розташування клавіш управління, сигналізації і т.п.
Тому всіма засобами необхідно знижувати стомлення і напруга оператора ЕОМ, створюючи обстановку виробничого комфорту.
Всі працівники ПЦ в даний час стикаються з впливом таких небезпечних і шкідливих факторів як підвищений рівень шуму, температура зовнішнього середовища, розрахована на нормальне функціонування техніки, а не людини, відсутність або нестача природного світла, випромінювання моніторів, статична електрика і ін
Особливості характеру та режиму праці, значне розумове напруження (особливо для розробників) та інші навантаження призводять до зміни у працівників ВЦ функціонального стану центральної нервової системи, нервово-м'язового апарату рук (при роботі з клавіатурою та іншими пристроями ручного введення інформації). Тривалий дискомфорт викликає підвищену напругу, обумовлює розвиток спільного втоми і зниження працездатності.
При тривалій роботі за екраном дисплея відзначається виражена напруга зорового апарату з появою скарг на незадоволеність роботою, головні болі, дратівливість, порушення сну, втому і хворобливі відчуття в очах, в поясниці, в області шиї, руках та ін
Багато співробітників ПЦ пов'язані з впливом таких психофізичних факторів, як перенапруження слухових аналізаторів, монотонність праці, емоційні перевантаження.

4.1.1. Виявлення джерел шуму і вібрації

Шум розглядають як звук, який заважає розмовної мови і негативно впливає на здоров'я людини. Дія шуму не обмежується впливом тільки на органи слуху. Через нервові волокна шум передається в центральну і вегетативну нервові системи, а через них впливає на внутрішні органи, приводячи до значних змін у функціональному стані організму.
Наявність множинних джерел постійного шуму на робочому місці приводить до значного зниження продуктивності праці, зростанню кількості помилок у роботі операторів.
За походженням шум ділять на механічний, аеродинамічний та шум електричних машин. Для робочих місць операторів характерна наявність всіх видів шумів. Технічні засоби, наприклад принтер, плоттер створюють механічний шум, установки кондиціонування - аеродинамічний шум, перетворювачі напруги-електромагнітний.
Відповідно до ГОСТ 12.1.003-83 "Шум, загальні вимоги безпеки" / 7 / рівень шуму на робочому місці операторів не повинен перевищувати 50дБ, а в приміщеннях, де працюють інженерно-технічні працівники, що здійснюють лабораторний, аналітичний і вимірювальний контроль - 60дБ .
Для зниження шуму і вібрації в приміщеннях ОЦ обладнання, апарати та прилади необхідно встановлювати на спеціальні фундаменти і амортизуючі прокладки, передбачені нормативними документами. Стіни і стелі повинні бути облицьовані звукопоглинаючим матеріалом, незалежно від кількості одиниць встановленого обладнання. Як звукопоглинального матеріалу повинні використовуватися спеціальні перфоровані плити, панелі і інший матеріал аналогічного призначення, а так само щільна бавовняна тканина, якою драпіруються стелю і стіни.
4.1.2. Виявлення джерел випромінювання, що впливають на програміста
Одним з найбільш небезпечних факторів, що впливають на організм, є іонізуюче випромінювання. Іонізуючі випромінювання, проникаючи через організм людини і проходячи через біологічну тканину, викликають у ній поява заряджених частинок - вільних електронів. Це супроводжується зміною структури молекул, руйнуванням міжмолекулярних зв'язків, загибеллю клітин. Зміна біохімічного складу клітин і обмінних процесів порушує функції центральної нервової системи, що в свою чергу викликає порушення функцій залоз внутрішньої секреції: зміна судинної проникності і т.п.
Основним джерелом випромінювань при роботі з персональним комп'ютером є дисплей. Він генерують кілька типів випромінювання, у тому числі рентгенівське, радіочастотне, видиме й ультрафіолетове. Максимальний рівень рентгенівського випромінювання на робочому місці оператора комп'ютера звичайно не перевищує 10 мкбер / год на відстані 5 см від поверхні екрана. Рентгенівське випромінювання зменшується пропорційно квадрату відстані до екрану. Інтенсивність ультрафіолетового і інфрачервоного випромінювань від екрану монітора лежить в межах 10 ... 100 мВт / м
2.
Експериментальне дослідження характеру та інтенсивності випромінювання дисплея з метою визначити вплив електромагнітних випромінювань на користувача при тривалій роботі показало, що рівні опромінення в ультрафіолетовій, інфрачервоній і видимій областях спектру виявилися нижче допустимих значень. Таким чином, вважається, що інтенсивність випромінювання екрану дисплея не перевищує гранично допустимої дози радіації і, отже, умови праці можна віднести до безпечним.
Для додаткового зниження випромінювань рекомендується застосовувати монітори із зниженим рівнем випромінювання (MPR-II, TCO-92, TCO-99), встановлювати захисні екрани, які поглинають до 100% ультрафіолетового випромінювання, послаблюють електростатичне поле на 99%, а також дотримуватися регламентовані режими праці та відпочинку.

4.2. Електробезпека при роботі з комп'ютером 

Електричні установки, до яких відноситься практично все обладнання ЕОМ, представляють для людини велику потенційну небезпеку, тому що в процесі експлуатації або проведенні профілактичних робіт людина може торкнутися частин, що знаходяться під напругою.
Будь-який вплив струму може призвести до електричної травми, тобто до пошкодження організму, викликаному дією електричного струму або електричної дуги.
При розгляді питання забезпечення електробезпеки розробника необхідно виділити три основні чинники:
- Електроустановки робочого місця програміста;
- Допоміжне електроустаткування;
- Навколишнє середовище приміщення.
До електропристрої робочого місця належать: комп'ютер, відеомонітор, принтер. До допоміжного обладнання відносяться лампи місцевого освітлення, вентилятори і інші електричні прилади. Електрообладнання, перераховане вище, відноситься до установок напругою до 1000 В, виняток становлять лише дисплей, електронно-променеві трубки, яких мають напругу в кілька кіловольт.
Навколишнє середовище приміщень, в яких працює програміст, впливає на електричну ізоляцію приладів і пристроїв, електричний опір тіла людини і може створювати умови для ураження електричним струмом.
Приміщення, обладнані обчислювальною технікою, як правило, відносяться до категорії приміщень без підвищеної небезпеки, так як:
- Відносна вологість повітря не перевищує 75%;
- Немає струмопровідного пилу;
- Температура не перевищує тривалий час 30 ° С;
- Відсутня можливість одночасного дотику людини з яких з'єднання з землею металевими конструкціями;
- Відсутність можливості доторкнутися до струмоведучих частин обладнання;
- Немає струмопровідних підлог.
Таким чином, для запобігання електротравматизму користувача необхідно дотримуватись вимог безпеки, як при роботі зі звичайною побутовою технікою.

4.3. Організація робочого місця інженера-програміста 

На інженера-програміста впливають різні шкідливі і небезпечні фактори, які негативно впливають на здоров'я: випромінювання екрана монітора ПК, погане провітрювання і недостатня освітленість приміщень можуть призвести до захворювань організму різного ступеня тяжкості.
Тривале перебування людини в зоні перерахованих вище впливів може призвести до професійного захворювання, тому в даному розділі вирішується завдання забезпечення безпечних умов праці інженера-програміста.
Головними елементами робочого місця програміста є стіл і крісло. Основним робочим положенням є положення сидячи. Робоча поза сидячи викликає мінімальне стомлення програміста. Раціональне планування робочого місця передбачає чіткий порядок і сталість розміщення предметів, засобів праці і документації. Те, що потрібно для виконання робіт частіше, розташоване в зоні легкої досяжності робочого простору. Моторне поле - простір робочого місця, в якому можуть здійснюватися рухові дії людини. Максимальна зона досяжності рук - це частина моторного поля робочого місця, обмеженого дугами, описуваними максимально витягнутими руками при русі їх у плечовому суглобі. Оптимальна зона - частина моторного поля робочого місця, обмеженого дугами, описуваними передпліччями при русі в ліктьових суглобах з опорою в точці ліктя і з відносно нерухомим плечем. Схематично зони досяжності представлені на рис. 3.1.
Зони досяжності рук у горизонтальній площині

а - зона максимальної досяжності;
б - зона досяжності пальців при витягнутій руці;
в - зона легкої досяжності долоні;
г - оптимальний простір для грубої ручної роботи;
д - оптимальний простір для тонкої ручної роботи.
Рис.4.1
Оптимальне розміщення предметів праці і документації в зонах досяжності:
- Дисплей розміщується в зоні а (у центрі);
- Системний блок розміщується в передбаченій ніші столу;
- Клавіатура - у зоні
г / д;
- "Миша" - в зоні
в справа;
- Сканер - в зоні
а / б (зліва);
- Принтер - в зоні
а (праворуч);
- Документація: необхідна при роботі - в зоні легкої досяжності долоні -
в; невикористовувана постійно - у висувних ящиках столу.
Схематично розміщення основних і периферійних складових ПК представлено на рис. 4.2.
Розміщення основних і периферійних складових ПК

Рис. 4.2
При компонуванні робочого місця необхідно враховувати зони досяжності рук людини при розташуванні дисплеїв, клавіатури, системного блоку і так далі. Висота робочої поверхні столу повинна регулюватися у межах 680 - 800 мм, при відсутності такої можливості висота робочої поверхні столу повинна бути 725 мм.
Робочий стіл повинен мати простір для постановки ніг висотою не менше 600 мм, шириною не менше 500 мм, глибиною на рівні колін - не менше 450 мм і на рівні простягнутої ноги - не менше 650 мм.
Екран відеомонітора повинен знаходитися від очей користувача на оптимальній відстані 600 - 700 мм, але не ближче 500 мм з урахуванням розмірів алфавітно-цифрових знаків і символів.

4.4. Вимоги до параметрів мікроклімату приміщення 

Під метеорологічними умовами розуміють поєднання температури, відносної вологості, швидкості руху та запилення повітря. Перераховані параметри впливають на функціональну діяльність людини, її самопочуття та здоров'я і на надійність засобів обчислювальної техніки. Ці мікрокліматичні параметри впливають як кожен окремо, так і в різних поєднаннях.
Температура повітря є одним з основних параметрів, що характеризують тепловий стан мікроклімату. Сумарне тепловиділення в приміщенні надходить від:
- ЕОМ;
- Допоміжного обладнання;
- Приладів освітлення;
- Людей;
- Зовнішніх джерел.
Найбільша кількість теплоти виділяють ЕОМ і допоміжне обладнання. Середня величина тепловиділення від комп'ютерів коливається до 100 Вт / м
2. Тепловиділення від приладів освітлення також великі. Питома величина яких становить 35 Вт / м 2. При цьому, чим більше рівень освітленості, тим вище питомі величини тепловиділень. Кількість теплоти від обслуговуючого персоналу незначно. Воно залежить від числа працюючих у приміщенні, інтенсивності роботи, що виконується людиною.
До зовнішніх джерел надходження теплоти відносять теплоту, що надходить через вікна від сонячної радіації, приплив теплоти через непрозорі огородження конструкцій. Інтенсивність цих джерел залежить від розташування будинку, орієнтації по частинам світу, колірної гами та інше.
З метою створення нормальних умов праці програміста, ГОСТом 12.1.005-88 встановлені оптимальні і допустимі значення всіх параметрів мікроклімату. Оптимальні параметри при тривалому і систематичному впливі на організм людини забезпечують збереження нормального функціонування і теплового стану організму, створюють відчуття теплового комфорту та є передумовою високого рівня працездатності. Допустимі параметри мікроклімату можуть викликати приходять і швидко нормалізуються зміни організму, що не виходять за межі фізіологічно пристосувальних можливостей, не створюють порушень стану здоров'я, але викликають дискомфортні тепловідчуття, погіршення самопочуття і зниження працездатності. Оптимальні і допустимі значення основних мікрокліматичних параметрів представлені в табл. 4.1.
Таблиця 4.1
Параметри мікроклімату виробничих приміщень

Параметри

Значення параметрів

оптимальні

допустимі

Температура

20-22 ° С

17-22 ° С

Відносна вологість

40-60%

до 75%

Швидкість руху повітря

0,1 м / с

не більше 0,3 м / с

Для забезпечення нормальних умов праці необхідно дотримуватися вищевказаних даних. З метою підтримки температури і вологості повітря в приміщенні можна використовувати системи опалення, вентиляції та кондиціонування повітря.
На досліджуваному підприємстві температура повітря, вологість та швидкість руху повітря тримається в рамках оптимальних параметрів. Шкідливі речовини в повітрі робочої зони не перевищують граничної допустимої концентрації.

4.5. Вимоги до освітлення робочих місць 

До сучасного освітлення приміщень, де працюють з обчислювальною технікою, висувають високі вимоги як гігієнічного, так і технічного характеру. Правильно спроектоване і виконане висвітлення забезпечує високий рівень працездатності, робить позитивний психологічний вплив, сприяє підвищенню продуктивності праці. Умови діяльності користувача в системі "людина-машина" пов'язані з явною перевагою зорової інформації - до 90% загального обсягу.
У приміщеннях з комп'ютерною технікою застосовується поєднана система освітлення. До таких систем висувають такі вимоги:
- Відповідність рівня освітленості робочих місць характером виконуваних-мих зорових робіт;
- Досить рівномірний розподіл яскравості на робочих поверхонь-тях і в навколишньому просторі;
- Відсутність різких тіней, прямий і відображеної бляклості;
- Сталість освітленості у часі;
- Оптимальна спрямованість випромінюваного освітлювальними приладами світлового потоку;
- Довговічність, економічність, електро-та пожежобезпечність, естетичний-ність, зручність і простота експлуатації.
Для штучного освітлення приміщень з обчислювальною технікою слід використовувати головним чином люмінесцентні лампи, у яких висока світлова віддача (до 75 лм / Вт і більше); тривалий термін служби (до 10 000 год), мала яскравість світної поверхні, близький до природного спектр випромінювання, що забезпечує гарну передачу кольору. Найбільш прийнятними є люмінесцентні лампи білого світла і тепло-білого світла потужністю 20, 40, 80 Вт.
Для виключення засвічення екранів дисплеїв прямим світловим потоком, світильники загального освітлення мають в своєму розпорядженні збоку від робочого місця, паралельно лінії зору оператора і стіні з вікнами. Таке розташування світильників дозволяє виробляти їх послідовне включення в міру необхідності і виключає роздратування очей чергуються смугами світла і тіні, що виникає при поперечному розташуванні світильників.
Для забезпечення оптимальних умов зорових робіт користувачів дисплейних пристроїв необхідна певна світлова оздоблення приміщення. Для внутрішнього оздоблення приміщень, де розташовані ПЕОМ, повинні використовуватися дифузно-відбивні матеріали з коефіцієнтами відбиття для стелі - 0,7 - 0,8; для стін - 0,5 - 0,6; для підлоги - 0,3 -0, 5.
На робочому місці програміста зорові роботи є середньої точності і відносяться до IV розряду, так як найменший розмір об'єкта розрізнення змінюється від 0,5 до 1,0 мм. Контраст об'єкта з фоном і характеристика фону середні, тому зорові роботи відносяться до підрозділу «в». Тому норма освітленості на поверхні столу в зоні розміщення робочого документу повинна бути 300 - 500 лк. Освітлення не повинне створювати відблисків на поверхні екрану, а його освітленість не повинна бути більше 300 лк.
Освітленість робочого місця користувача на досліджуваному підприємстві є поєднаною, розташування робочих місць виключає потрапляння прямих сонячних променів на екран дисплея і в очі. У якості джерела штучного освітлення використовують лампи денного світла.
Правильно спроектоване виробниче освітлення благотворно впливає на виробниче середовище, надаючи позитивну психологічну дію на працюючу людину, підвищує безпеку праці і знижує травматизм.
Недостатність освітлення приводить до напруги зору, ослабляє увагу, приводить до настання передчасної стомленості. Надмірно яскраве освітлення викликає засліплення, роздратування і різь в очах. Неправильний напрямок світла на робочому місці може створювати різкі тіні, відблиски, дезорієнтувати працюючого. Всі ці причини можуть призвести до нещасного випадку або профзахворювань, тому такий важливий правильний розрахунок освітленості.
Розрахунок освітленості:
Раціональне освітлення робочого місця є одним з найважливіших факторів, що впливають на ефективність трудової діяльності людини, що попереджають травматизм і професійні захворювання. Правильно організоване освітлення створює сприятливі умови праці, підвищує працездатність і продуктивність праці. Освітлення на робочому місці програміста повинно бути таким, щоб працівник міг без напруги зору виконувати свою роботу. Стомлюваність органів зору залежить від ряду причин:
- Недостатність освітленості;
- Надмірна освітленість;
- Неправильний напрям світла.
Недостатність освітлення приводить до напруги зору, ослабляє увагу, приводить до настання передчасної стомленості. Надмірно яскраве освітлення викликає засліплення, роздратування і різь в очах. Неправильний напрямок світла на робочому місці може створювати різкі тіні, відблиски, дезорієнтувати працюючого. Всі ці причини можуть призвести до нещасного випадку або профзахворювань, тому такий важливий правильний розрахунок освітленості.
Розрахунок освітленості робочого місця зводиться до вибору системи освітлення, визначенню необхідного числа світильників, їхнього типу і розміщення. Процес роботи програміста в таких умовах, коли природне освітлення недостатньо або відсутній. Виходячи з цього, розрахуємо параметри штучного освітлення.
Штучне освітлення виконується за допомогою електричних джерел світла двох видів: ламп накалювання і люмінесцентних ламп. Будемо використовувати люмінесцентні лампи, які порівняно з лампами розжарювання мають суттєві переваги:
- За спектральним складом світла вони близькі до денного, природного освітлення;
- Володіють більш високим ККД (у 1.5-2 рази вище, ніж ККД ламп нака-ливания);
- Мають підвищену світловіддачею (в 3-4 рази вище, ніж у ламп нака-ливания);
- Більш тривалий термін служби.
Розрахунок освітлення проводиться для кімнати площею 36 м
2, ширина якої 4.9 м, висота - 4.2 м. Скористаємося методом світлового потоку.
Для визначення кількості світильників визначимо світловий потік, падаючий на поверхню за формулою:
  ,
де F - розраховується світловий потік, Лм;
Е - нормована мінімальна освітленість, Лк (визначається за таблицею).
Роботу програміста, відповідно до цієї таблиці, можна віднести до розряду точних робіт, отже, мінімальна освітленість буде Е = 300 Лк при газорозрядних лампах;
S - площа освітлюваного приміщення (у нашому випадку S = 36 м
2);
Z - відношення середньої освітленості до мінімальної (звичайно приймається рівним 1.1-1.2, нехай Z = 1.1);
К - коефіцієнт запасу, враховує зменшення світлового потоку лампи в результаті забруднення світильників у процесі експлуатації (його значення визначається за таблицею коефіцієнтів запасу для різних приміщень і в нашому випадку К = 1.5);
n - коефіцієнт використання, (виражається відношенням світлового потоку, що падає на розрахункову поверхню, до сумарного потоку всіх ламп і обчислюється в частках одиниці; залежить від характеристик світильника, розмірів приміщення, фарбування стін і стелі, якi характеризуються коефіцієнтами відображення від стін (Рс) і стелі (Рп)), значення коефіцієнтів Рс і Рп визначимо по таблиці залежностей коефіцієнтів відображення від характеру поверхні: Рс = 30%, Рп = 50%. Значення n визначимо по таблиці коефіцієнтів використання різних світильників. Для цього обчислимо індекс приміщення по формулі:
,
де S - площа приміщення, S = 36 м
2;
h - розрахункова висота підвісу, h = 3.39 м;
A - ширина приміщення, А = 4.9 м;
В - довжина приміщення, В = 7.35 м.
Підставивши значення отримаємо:

Знаючи індекс приміщення I, Рс і Рп, по таблиці знаходимо n = 0.28.
Підставимо всі значення у формулу для визначення світлового потоку F:
Лм
Для освітлення вибираємо люмінесцентні лампи типу ЛБ40-1, світловий потік яких F = 4320 Лк.
Розрахуємо необхідну кількість ламп за формулою:
,
де N - обумовлений число ламп;
F - світловий потік, F = 63642,857 Лм;
F
л - світловий потік лампи, F л = 4320 Лм.
шт.
При виборі освітлювальних приладів використовуємо світильники типу ОД. Кожен світильник комплектується двома лампами. Розміщуються світильники двома рядами, по чотири в кожному ряду.

4.6. Пожежна безпека 

Особлива увага до пожежної безпеки є обгрунтованим, тому що у випадку пожежі буде завдано значних матеріальних збитків (навіть якщо в приміщенні знаходиться один комп'ютер), і можлива загроза життю і здоров'ю людей.
Джерелами пожежі при роботі програміста з комп'ютером можуть бути ЕОМ, електропроводка, діючі системи опалення, вентиляції та кондиціонування повітря, побутові прилади.
У сучасних ЕОМ дуже висока щільність розміщення елементів електронних схем. У безпосередній близькості один від одного розташовуються сполучні дроти, комутаційні кабелі. При протіканні по них електричного струму виділяється значна кількість теплоти, що може привести до підвищення температури окремих вузлів до 80-100 ° С. При цьому можливо оплавлення ізоляції сполучних проводів, їх оголення і, як наслідок, коротке замикання, яке супроводжується іскрінням, веде до неприпустимих перевантажень елементів електронних схем. Останні, перегріваючись, згорають з розбризкуванням іскор.
Для відведення надлишкової теплоти від ЕОМ служать системи вентиляції та кондиціонування повітря. Однак постійно діючі системи представляють додаткову пожежну небезпеку, тому що, з одного боку, вони забезпечують подачу кисню-окислювача, з іншого боку - при виникненні пожежі швидко поширюють вогонь і продукти горіння по всіх пристроях.
Приміщення, де встановлена ​​обчислювальна техніка, відносяться до категорії «Д» - приміщення, де знаходяться тверді горючі і важко горючі речовини і матеріали в холодному стані. Можливою причиною виникнення пожежі може бути несправність електрообладнання. Для попередження цього необхідно проводити профілактичні огляди устаткування.
Пожежна профілактика - це комплекс організаційних і технічних заходів, спрямованих на забезпечення безпеки людей, запобігання пожежі, обмеження її розповсюдження, а також на створення умов для успішного гасіння пожежі.
При роботі в приміщеннях категорії «Д» необхідно:
- Виконувати правила пожежної безпеки приміщень для ЕОМ, сховищ інформації, установок кондиціонування і систем енергоживлення;
- Виконувати правила пожежної безпеки при ремонтно-профілактичних робіт;
- Встановити в приміщенні систему автоматичної пожежної сигналізації та пожежогасіння;
- Зберігати горючі рідини в металевій, щільно закривається тарі, і прибирати після закінчення роботи в сейф;
- Знімні вузли ЕОМ необхідно ремонтувати в окремому спеціальному приміщенні;
- Використовувати нізковольтовие паяльники, що встановлюються на неспалимій підставці.
Обов'язковою умовою гасіння пожежі на ОЦ є відключення електрики. Для гасіння пожеж на ОЦ найбільш ефективне застосування вогнегасників типу ВВ-5, ОП-5-01. Перевагою використання останнього є також і те, що в момент гасіння пристрій може знаходитися під напругою. Вогнегасники розташовуються з розрахунку один на 40-50 м
2 площі, але не менше двох в приміщенні.
У приміщенні може бути встановлена ​​пожежна сигналізація - теплові сповіщувачі з плавкими запобіжниками. Це необхідно при великій концентрації засобів обчислювальної техніки.
На закінчення слід зауважити, що сучасні виробники обчислювальної техніки останнім часом намагаються максимально задовольнити умовам безпеки і зручності програміста при роботі з комп'ютером, що служить значного зниження травматизму і професійних захворювань. До таких нововведень можна віднести монітори з низьким рівнем електромагнітного випромінювання, енергозберігаючі функції устаткування (моніторів, процесорів, жорстких дисків), а також весь час що підвищується ергономічність комп'ютерної техніки.

ВИСНОВОК

У результаті проведеної роботи була розроблена і реалізована підсистема обробки та фільтрації звукового сигналу в складі системи обробки аудіоінформації. Були розроблені та програмно реалізовані алгоритми, що дозволяють змінювати вихідний звуковий сигнал з метою зміни характеристик звучання. Були реалізовані наступні методи обробки та фільтрації звукового сигналу: зміна основних параметрів цифрового звуку (частота дискретизації, бітрейт, число каналів), редагування темпу звуку, зміна загального рівня гучності, ефекти зростаючій і затухаючої гучності, луни й реверберації, звернення звуку. Також була реалізована можливість зміни структури звукового сигналу: видалення, копіювання, вставка.
У результаті проведеної роботи була програмна оболонка, що дозволяє здійснити необхідні перетворення звукових сигналів, записаних у файлі.


 

А также другие работы, которые могут Вас заинтересовать

4186. Властивості напівпровідникових кристалів 724.5 KB
  Явища переносу в напівпровідниках Кінетичне рівняння Больцмана В рівноважних умовах розподіл електронів ідеальної кристалічної гратки по енергіях описується (§ 2.1) функцією ФерміДірака f(E) (чи МаксвеллаБольцмана для невиродженого електронного газу...
4187. Україна козацькаконспект. Довідник з історії України для студентів всіх спеціальностей УДУВГП 241.5 KB
  Вступ Козацький період в історії України (ХVІ – ХVІІІ ст.) надзвичайно важливий для розуміння складних державотворчих і націєтворчих процесів, що відбувалися на наших землях протягом багатьох століть, і які, на жаль, залишаються незавершеними щ...
4188. Корреспонденция – жанр-гибрид 65.5 KB
  Корреспонденция – жанр-гибрид Создание журналистского произведения всегда обусловлено рядом взаимозависимых процессов, к которым можно отнести поиск и рождение темы будущей публикации, формирование и разработку замысла конкретного произведения...
4189. Теория длинных волн Н.Д. Кондратьева 127.5 KB
  Введение. Я выбрала курсовую работу по теме: Теория длинных волн Н.Д. Кондратьева. Эта тема меня заинтересовала тем, что во-первых, спады и подъемы в экономической жизни любой страны всегда наблюдались и наблюдаются в наши дни. Мне захотелось самой...
4190. Предмет исследования экономической теории и ее функции 43.73 KB
  Введение Первым поводом к изучению экономической теории является то, что эта теория дело с такими проблемами, которые касаются нас всех без исключения: какие виды работ нужно выполнять Как они оплачиваются сколько товаров можно купить на доллар за...
4191. Методы нормирования оборотных средств предприятия 64 KB
  Введение Каждое предприятие, начиная свою производственно-хозяйственную деятельность, должно располагать определённой денежной суммой. На эти денежные ресурсы предприятие закупает на рынке или у других предприятий по договорам сырьё, материалы, топл...
4192. Концепции современного естествознания. Теория большого взрыва 140.5 KB
  Сценарий Большого взрыва Как и любая схема, претендующая на объяснение данных о спектре микроволнового космического излучения, химического состава догалактического вещества и иерархии масштабов космических структур, стандартная модель эволюции Вселе...
4193. Классный час. О чем поют птицы. Экологическая беседа 622.5 KB
  Цель: развивать у детей интерес к жизни птиц, в частности, к их голосам формировать умение вслушиваться в их звуковые сигналы воспитывать любовь к природе, бережное заботливое отношение к птицам. Оборудование: запись «Голоса птиц», таблицы с изобр...
4194. Табличний процесор Excel 667 KB
  Табличний процесор Excel Мета: Нагадати і закріпити принципи обробки даних, принципи побудови діаграм і графіків, принципи систематизації та аналізу даних, поданих у таблиці, розвивати вміння використовувати електронні таблиці в навчальній діяльност...