Главная » Программирование звука » Структура для звука в C++

0

Среди целей, которые я ставил пред собой при написании этой книги, есть и разработка  набора  инструментальных  средств  для  работы  со  звуком.  Эти  инструменты  должны  быть  полезны  в  разных  вычислительных  системах.  Чтобы  вы  могли легко  получать  конкретные  результаты,  у  вас  должна  быть  возможность  комбинирования различных средств работы со звуком. У вас также не должно вызывать затруднений  создание  новых  инструментальных  средств  или  модификация  имеющихся.

Я  решил  воспользоваться  методом  создания  программных  компонентов,  которые можно было бы легко комбинировать. Этот подход как нельзя лучше соответствует    принципам    объектно-ориентированного    программирования.    Поскольку язык  C++  на  настоящий  момент  является  наиболее  широко  доступным  объектноориентированным  языком,  я  решил  разрабатывать  эти  инструменты  как  набор классов C++. (Если вы мало знакомы с языком C++, то можете обратиться к приложению  В.  В  этом  приложении  содержится  краткое  описание  средств  C++  для программистов, знающих С.)

Подобно   аудиоинженерам,   подключающим   микрофоны   к   блокам   аудиоэффектов  и  магнитофонам,  вы  получите  возможность  объединять  последовательности  объектов,  которые  создают,  модифицируют  и,  в  конечном  счете,  записывают или воспроизводят получившийся звук.

В  качестве  примера  я  предлагаю  вам  простую  функцию  main,  которая  считывает  из  сin аудиофайл  формата  AU  и  воспроизводит  его  с  помощью  громкоговорителя.

Листинг 4.1. Программа playau.cpp

Copyright © 1998 Tim Kientzle (листинг  Е.1)

#include <fstream>

#include "au.h"

#include "aplayer.h"

// Пробуем выбрать  подходящую программу-проигрыватель  для

// систем Win32, Macintosh или   UNIX/NAS.

#if defined(_WIN32)

#include "winplayr.h" typedef WinPlayer Player;

#elif defined(macintosh)

#include "macplayr.h" typedef MacPlayer Player;

#else

#include "nasplayr.h"

typedef NasPlayer Player;

#endif

int main() {

AuRead auRead(cin);      // Создаем объект  AuRead.

Player player(&auRead);  // Соединяем выход объекта  auRead

// с  входом программы-проигрывателя.

player.Play();            // Теперь запускаем  программу-

// проигрыватель.

return 0;

}

Файл   это  не  единственный  возможный  источник  звуковой  информации,  также и громкоговоритель не единственное возможное устройство вывода. Ниже приведен еще один пример, в котором синусоида записывается в выходной файл формата AU. Обратите  внимание: поскольку  класс  SineWave позволяет  генерировать выходные файлы любого формата, необходимо  указать нужный вариант. Если выходной формат не будет указан, то в объектах sinewave и player станут использоваться значения, из некоторых соображений заданные по умолчанию.

Листинг 4.2. Программа sinetoau.cpp

#include "sinewave.h"

#include "aplayer.h"

#include "au.h"

int main(int, char **) {

SineWave sinewave(440 );      // Синусоида  440 Гц.

sinewave.SamplingRate(11025); // Частота  дискретизации 11025 Гц.

AuWrite player(&sinewave);    // Подключаем волну  к  программе-

// проигрывателю.

player.Play();

return 0;

}

У данного подхода есть ряд преимуществ:

? он   обладает   исключительной   переносимостью.   Единственной   аппаратно-

зависимой  частью  этой  программы  является  класс,  который  передает  моментальные   значения   ИКМ   на   громкоговоритель.   Я   перенес   используемый  в  этой  книге  код  на  три  различные  операционные  системы  (Windows, Mac  OS  и  UNIX)  с  минимальными  изменениями.  В  нашем  примере   приложении playsnd – всего 5% кода является аппаратно зависимым;

? это  очень  гибкий  подход,  можно  легко  создавать  разнообразные  комбина-

ции объектов;

? благодаря тому, что объекты не отдельные программы, все объекты в пос-

ледовательности  могут  обращаться  друг к другу  с  запросами  для  определения  оптимальных  параметров.  Например,  класс  SineWave,  который  просто производит  синусоиду,  может  обращаться  к  объектам,  следующим  за  ним в последовательности, чтобы выяснить оптимальную частоту дискретизации.

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

Как  известно,  при  работе  с  C++  легко  столкнуться  с  неожиданными  сюрпризами. Стандарт ANSI появился сравнительно недавно, и не все компиляторы C++ удовлетворяют этому стандарту. Хотя использованные в этой книге исходные тексты  были  протестированы  разными  компиляторами  в  различных  системах,  я  не могу гарантировать, что они обязательно станут работать на вашем любимом компьютере.  Кроме  того,  язык  C++  сложнее  ряда  других  языков  программирования. Хотя я и пытался сделать исходные тесты программ в этой книге настолько простыми, насколько это возможно, тем, кто не очень хорошо знаком с концепциями C++,  вероятно,  понадобится  обратиться  к  приложению  В  или  прочитать  несколько начальных глав хорошего учебника по C++.

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии