Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1000 / Основная теория звука и синтеза

.docx
Скачиваний:
57
Добавлен:
15.06.2014
Размер:
222.59 Кб
Скачать

Основы теории звука и синтеза.

Что такое звук?

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

Эти волны давления могут быть разной интенсивности (к примеру звук, очень громкие звуки могут быть почувствованы остальными частями вашего тела), и они колеблются взад и вперед с той же скоростью, с которой заставил их объект. Наши уши могут интерпретировать звуковые частоты в диапазоне от примерно 20 Гц (герц) до 20000 Гц (или 20 кГц). Один герц соответствует одному возвратно-поступательному движению в секунду.

Один герц может быть создан от движения руки взад вперёд, но он не проявиться как звук, так как наши уши не могут слышать низкочастотные звуки. Рука, тем не менее, приводит в движение воздух, который можно легко почувствовать. Если бы вы могли помахать рукой быстрее, на более чем 20 возвратно-поступательных движений в секунду, вы услышите звук похожий на сильный бас.

В качестве примера того, что вы действительно можете услышать, это звук шведского гудка, как правило, 440 Гц. Это означает, что объект совершает колебания туда сюда 440 раз в секунду, что довольно быстро для повседневного движения. Видимо американский эквивалент представляет собой смесь 2 тонов 350 и 440 Гц, но результат всё же в том же диапазоне.

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

Как насчёт синтеза звука, как создать звук?

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

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

Воспроизведение звуков природы это хорошо, но не то, что нам требуется. Если вы нуждаетесь в конкретном звуке вам придётся искать его с помощью генерации реальных физических процессов, что практически невозможно. Однако, звуковые техники старой школы в производстве фильмов, создали замечательные работы с практически физической генерацией звука. Примером является звук лазерной TIE Fighter в "Звездных войнах" (надлом металлической проволоки) и рычание T-Rex в "Парке Юрского периода (крупные транспортные машины). Очевидно, существует бесконечное множество других эффектов, взрывы, шумы монстров и, конечно, самые популярные драки на кулаках.

Сейчас существую удобные системы для создания звука. Звуковая карта компьютера обладает тем, что называется цифро-аналоговый преобразователь (ЦАП), который способен генерировать электрические сигналы из цифр, которые ему даны. Номер должен быть в пределах определенного диапазона, скажем -1,0 до 1,0 (с произвольной точностью между ними). Как правило, ноль дает нам покой/свободное положение динамика, при положительных числах оказывается давление на перед при отрицательных чисел на заднюю часть, то есть в другом направлении. Это на самом деле неважно куда идет вона, вы слышите звук будет более или менее одинаковы.

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

С практической точки зрения, вы не можете ожидать, что современный компьютер, достаточно устойчив, чтобы сохранить цикл и явно отправить каждый номер на звуковую карту. Все происходит по заранее установленной частоте, как правило, на 44100 выборок в секунду (CD-качество звука). Это частота дискретизации иногда называют "Hz".

Простой сигнал

Ладно, мы должны подойти к цифрам. Повторять модели чисел. Как мы это сделаем? Это абсолютно просто - любой повторяющийся набор чисел создаст звуковой сигнал (если вы их диапазон достаточно большой).

* Любая модель вы говорите? Ну, что ж 1,0,1,0,1,0,1,0 ,...?

Да, это сработает. Но, к сожалению, вы не услышите, ни один звук, даже если он использует большую часть диапазона. Помните, те образцы, которые мы кормили через D/A конвертер на 44100 в секунду, и эти цифры описывают колебания (возвратно-поступательный, помните?), Вроде этого:

…но картина повторяется каждые два образца, так что в результате динамика колебаний на 22050 Гц. Это чуть выше 20 кГц, которые вы, вероятно, помните, как верхний предел для человеческого слуха. Это действительно причина для использования 44,1 кГц, частота дискретизации - поэтому мы можем воспроизводить звуки по всему диапазону человеческого уха, но не больше.

* Хорошо, что, если я держу каждое из чисел на некоторое время?

Ты имеешь в виду что-то вроде 1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0 ,...?

* Да, вот так. Или даже больше того же до изменения.

Ура, вы только что создали прямоугольные волны, которые, пожалуй, являются самым классическим цифровой синтезированным сигналом. Сколько раз мы повторяем количество до перехода к другой? Если мы увеличим, это количество, сигнал будет более растянутым во времени, и колебания будет происходить медленнее, поскольку он занимает больше времени, чтобы завершить движение. Число повторов (также называемый "период", если измерять по времени) прямой способ управления частотой сигнала, которую мы генерируем. Более длительный срок означает более низкую частоту, и наоборот.

Маленькая заметка к работоспособности это то, что вы обычно хотите, чтобы сигнал колебался равномерно вокруг нулевой точки, в противном случае не будет звукового щелчка/клика в начале и в конце вызова. Это вызвано средним уровнем сигнала, который переносится внезапно. Это иллюстрируется довольно ясно по тому, как аудио системы построены. Они, как правило фильтруют все, что движется медленнее, чем группа Гц, чтобы всегда держать диффузор колеблющейся около физической точки покоя динамика. Так вы получите максимально доступный диапазон движения из нее, даже если ваш аудио сигнал постоянного тока.

Так что мы должны делать, а наши квадратные волны состоят из положительных и отрицательных чисел той же величины. Например -0,5 до +0,5 или -1,0 до +1,0

Синусоидальная волна

Хотя прямоугольная волна имеет свойство быть очень простой для расшифровки компьютером, на самом деле очень сложна с музыкальной точки зрения. Она содержит большое количество резонансных частот выше единицы, которые мы создаем с выбранной величиной периода, который может сделать звук "полным" и характерным. На самом деле некоторые из них можно описать скорее как "пустые" или "воздушные", но все-таки имеющие определённый характер.

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

Субъективно, синусоида довольно скучна, она может быть охарактеризована только как очень чистый сигнал, и не более того. Для выработки возможных чистых звуков у неё есть достоинства, и это также весьма ценный компонент в создании более сложных звуков. Больше всего важны теоретическая и математическая конструкция этой величины. Например -0,5 до +0,5 или -1,0 до +1,0.

Синусоида довольно сложна в создании компьютером, но в большинстве случаев функция sin() моделируется на разумной скорости. Полный период колебаний sin(t) достигается цикличным изменением t от 0 до 2*пи, и выводит значения в диапазоне от -1 до +1. Причины для использования таких, казалось бы, нечетные параметров диапазона математические и связанные с кругом, традиционные функции, такие как синус и косинус. Окружности радиуса 1 равна 2 пи.

Треугольная волна

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

Пилообразная волна

Это половина треугольной волны, сброс в исходное значение значения, когда оно достигает вершины. С этого скачка в уровне сигнала вы получите жесткий характеристики аналогичные прямоугольной волне, но есть только один такой скачок в период (по сравнению с прямоугольной волной, которая имеет 2 скачка - вверх и вниз), а остальное плавные формы, поэтому, как правило, звук немного теплее и более органичен, нежели у прямоугольной волны.

Шум

Если вы хотите более хаотичных, звуков, напоминающих взрывы или ударов, вам не придется иметь дело с простыми повторяющимися моделями. Прямой путь получения хаотической модели это использование генератора случайных чисел. Большинство языков программирования имеют такие генераторы. В C вы могли бы сделать что-то вроде этого:

next_number = (float) (rand ()% 20000-10000) / 10000

... Чтобы получить случайное число между -1,0 и +1,0. Посмотрите rand () и srand () для деталей.

Несмотря на это модель не будет полностью случайной, вы можете по-прежнему контролируете очевидной "частоты" и легкость звучания. Это можно сделать несколькими способами, но наиболее простой это задержка между переключением на новые случайные значения на основе качества. Модель очень похоже на прямоугольные волны в этом отношении, кроме вас, придется держать на период намного короче длины шума.

Общие формы волн (для программистов)

Чтобы испробовать различные виды сигналов с использованием одной и той же базовой функции, вы должны сохранить переменную, которая будет изменяться от 0 до 1 и пройти полный период выбранной функции. В периоде длина будет определять желаемые частоты. Для получения фактических значений, можно использовать различные функции (в зависимости от того, какой сигнал вы хотите), чтобы найти подходящее значение, основанное на текущем положении периода.

Для прямоугольной волны, вы может просто проверить период, меньше или больше 0,5. Если он меньше, выводить -1, или 1 (наоборот). Чтобы получить пилообразную волну, вы напишите что-то вроде (-1,0 + period_pos*2,0), что приведет к уклону сигнала от -1 до +1 над {0,0 - 1,0} положения диапазона периода.

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

Для изменения частоты звука вам нужно просто установить новое значение для длины периода (хотя это влияет только на скорость, с которой положение периода увеличивается, он всегда будет в промежутке между 0 и 1). Для контроля звука нужно умножить выходной сэмпл с помощью значения звука (скажем, между 0.0 за молчание и 1.0 для максимальной громкости). Можно также смешать несколько независимых сигналов, соединив их сэмплы вместе, хотя будьте уверены, что он не превышает допустимого диапазона вашей звуковой карты (которые, вероятно, равны -1,0 до +1,0). Иными словами, вы должны будете использовать звук ниже для каждого сигнала (или "канала"), если вы собираетесь смешать (добавить) некоторые из них вместе ... или вы можете просто умножить итоговую сумма со значением громкости, если вам не нужна регулировка громкости на каждый канал.

Еще одно небольшое предостережение, которое стоит рассмотреть это то, что вы не должны использовать числа с плавающей точкой, как будто они были неотъемлемой типов данных. То есть: не увеличивать маленькие шаги в большом диапазоне. Они имеют ограниченную точность и будет неправильно, если вы это сделаете. Это может проявляться как небольшое, но заметное изменение в поле, ни хуже. Вы увеличить числа с запятой столько, сколько хотите держать их в разумных пределах, как между 0,0 и 1,0. Проблемы возникают, когда размер приращения намного меньше, чем текущее значение (например, 50000,0 + 0,1).

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

float frequency

float volume

float period_speed

float period_position

init()

{

frequency = 440.0 // this is in Hz

period_speed = frequency/44100.0 // assuming a sample rate of 44.1 kHz

period_position = 0.0

}

fill_stream_buffer() // called by the soundcard

{

for(all samples in buffer)

{

period_position += period_speed

if(period_position >= 1.0) // change the "if" to a "while" if you expect frequencies above 44.1 kHz

{

period_position -= 1.0

}

this_sample = WaveformLookup(period_position)*volume

}

}

Обратите внимание, что мы держим period_position значение между вызовами fill_stream_buffer, так что не будет никаких разрывов или скачков сигнала. Если последний буфера завершилась period_position от 0,725 то в следующем начнется 1 естественно оттуда и аудиовыход будет звучать непрерывно.

Динамические волны

Besides simply setting a new fixed value, the simplest parameter "modulation" (alteration) is a simple ramp, or increasing/decreasing value. It is of course achieved by gradually incrementing or decrementing the parameter you're interested in. If you do this for volume you get a fade in or out, depending on the direction. For frequency the result is a frequency or pitch slide, naturally.

Даже с учетом основных сигналов упоминавшихся ранее, вы можете увеличить сложность и интерес путем изменения различных параметров во времени. Только параметры они имеют, в общем, являются частота и звук, но даже те, 2 позволяют довольно интересные эффекты.

Кроме того, просто установив новый фиксированные значения, простейших параметров "модуляции" (изменения) представляет собой простой уклон или увеличение / уменьшение величины. Это, конечно, достигнуто постепенным увеличением или уменьшением интересующих вас параметров. Если вы делаете это для звук вы получаете исчезают или, в зависимости от направления.

Вам не нужно ограничивать себя одним только уклоном. Вы можете прикрепить некоторые, спина к спине. Например: сначала исчезают быстро, а затем сохранить 1 уровень громкости, а потом медленно исчезают. Это основная идея "развёртки" или сценария звуковой модуляции. Это простой и эффективный способ имитации звуков природы способ, как правило, отличаются по качеству с течением времени в более широком масштабе.

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

Я бы воспользоваться этой возможностью, чтобы отметить, что прямоугольные волны на самом деле имеет дополнительный природные параметр, связанный с ним - рабочий цикл. Это значение, описывающее соотношение между длиной первый и второй половинах сигнала период, или центральной позиции (0,5 в предыдущем примере). При изменении этого, вы можете кардинально изменить характер звука. Подметальная постепенно приводит к большой эффект в себя и широко используется в C64 музыке и SFX.

Анализ типичных звуковых эффектов

Соседние файлы в папке 1000