Главная » Программирование звука » Управление амплитудой

0

Если внимательно прислушаться к звучанию колеблющейся струны гитары, пианино или почти любого другого музыкального инструмента, можно заметить, что громкость звука изменяется достаточно предсказуемым образом. B большинстве случаев наибольшая громкость наблюдается в начале звучания ноты, затем на протяжении некоторого интервала она достаточно равномерно сохраняется и, наконец, следует область затухания. Такое изменение амплитуды называется огибающей (envelope).

Чтобы  заставить  цифровые  инструменты  звучать  более  живо,  следует  уделить особое  внимание  управлению  огибающей.  Простейшая  и  наиболее  распространенная форма управления огибающей называется ADSR аббревиатура от attack (атака),  decay  (спад),  sustain  (поддержка)  и  release  (затухание).  Ha  рис.  21.1  показана типичная огибающая ADSR.

Управление огибающей ADSR осуществляется множеством различных способов. B аппаратных синтезаторах часто предусмотрено отдельное управление громкостью, которая корректируется по мере проигрывания ноты. B случае с семплами управление огибающей ADSR может быть встроено непосредственно в семпл. Для других  типов  цифровых  инструментов  механизм  управления  огибающей  является обязательным.  Примером  этого  может  служить  алгоритм  колеблющейся  струны (plucked string), который будет описан в данной главе.

Управление огибающей в семплерах

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

Чтобы  показать,  как  построить  семпл,  создадим  произвольную  шаблонную волновую форму с самого начала. B качестве базового звука возьмем синусоидальную волну 440 Гц, оцифрованную на частоте 44000 отсчетов в секунду. Затем используем форму огибающей ADSR, показанную на рис. 21.1. Она имеет короткий период  атаки  (1/20  секунды),  за  который  достигает  максимумальной  амплитуды, затем идет спад до уровня поддержки в 1/4 амплитуды. Заканчивается эта огибающая  полусекундной  областью  затухания.  Начало  и  конец  области  поддержки были аккуратно подобраны, чтобы звук повторялся корректно.

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

Листинг 21.5. Создание шаблона и инициализация семпла

const float maxAmplitude

= static_cast<float>((1L<<(8*sizeof(AudioSample)-1))-1);

const int numSamples = 44000;

AudioSample *buffer= new AudioSample[numSamples];

for(int i=0;i<numSamples;i++) {

float amplitude = 0.0;          // По  умолчанию.

float time = i / static_cast<float>(numSamples);

if(time < 0.05)                 // Атака  0,0 5 с.

amplitude = time / 0.05;     // Увеличиваем  до   1.

else if(time < 0.25)            // Спад   длительностью  0,2 с.

amplitude = 1.0 ((time-0.05) / 0.2 * 0.75);

// Ослабление  до   0,25.

else if(time < 0.5)             // Период поддержки

// (0,25 с по   шаблону).

amplitude = 0.2 5;

else if(time < 1.0)             // Спад   длительностью  0,5 с.

amplitude = 0.25 ((time-0.5) / 0.5 * 0.25);

buffer[i] = static_cast<AudioSample>(

maxAmplitude

* amplitude

* sin(time * (440.0 * 2.0 * 3.14159265358979 ) )

);

}

_sampledInstrument

= new SampledInstrument(buffer,numSamples,numSamples/

4,numSamples/2);

_sampledInstrument-

>BasePitch(440.0,static_cast<float>(numSamples));

delete [] buffer;

Такой  подход  имеет  один  серьезный  недостаток:  когда  вы  изменяете  скорость воспроизведения,  вы  также  меняете  скорость  изменения  огибающей.  Более  сложные  методы  управления  огибающей  подразумевают  отдельный  контроль  за  ней для предотвращения этой проблемы.

Другие методы управления

Хотя  ломаные  огибающие  ADSR  наиболее  распространены,  кроме  них  также используются и другие типы управления огибающей. B частности, ровный уровень поддержки подходит только для таких инструментов, как скрипка и труба, в которых продолжительное  возбуждение  (смычок  скрипача  или  дыхание  трубача) сохраняет ровный звук настолько долго, насколько это необходимо. Им можно противопоставить гитару или пианино. У этих инструментов следующая после первоначальной атаки область спада не прерывается. Участок поддержки отсутствует.

Еще  один  популярный  эффект   тремоло  (tremolo),  когда  амплитуда  цикли-

чески  равномерно  изменяется.  При  аппаратном  синтезе  используется  низкочастотный  генератор  (low-frequency  oscillator,  LFO),  который  осуществляет  управление   амплитудой.   При   работе   с  семплами   можно   использовать   циклическую область для хранения целого цикла амплитуды.

Есть   и   альтернативный   способ:   можно   быстро   корректировать   громкость,

умножая каждую выборку на значение, которое плавно изменяется.

Частотная модуляция и синтез

Поставщики  звуковых  карт  яростно  спорят  об  относительных  преимуществах ЧМ-синтпеза (FM synthesis, синтез при помощи частотной модуляции) и табличного волнового  синтеза  (Wavetable  synthesis).  B  действительности  эти  два  похода скорее схожи, нежели отличны.

Посмотрите внимательно на метод AddSamples центральную часть его часто называют цифровым генератором (digital oscillator), который имеет три входных параметра:  волновую  форму,  представленную  в  виде  отсчетов,  приращение  (высоту тона) и громкость. Ha их основе он формирует выходную последовательность отсчетов. B классе SampledNote все входные параметры зафиксированы.

Для  формирования  более  насыщенных  звуков  можно  изменять  приращение

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

Простейший   пример   такого   использования   называется   ЧМ-синтезом.   ЧМсинтез  характеризуется  небольшим  набором  волновых  форм,  также  часто  используются  простые  синусоидальные  и  прямоугольные  волны.  Цифровые  осцилляторы  называются  модулями  или  операторами.  Микросхемы  ЧМ-синтеза  позволяют комбинировать операторы различными способами.

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

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

По теме:

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