Вопрос

Мой вопрос не совсем связан с программированием, но, тем не менее, я думаю, что SO — это подходящее место, чтобы его задать.

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

Так есть ли кто-нибудь, кто может дать мне совет?

редактировать:

Я программирую на C++.Но это не имеет значения, поскольку меня интересовала теория микширования двух звуковых дорожек.У меня проблема в том, что я не могу просто суммировать сэмплы, потому что это часто дает искаженный звук.

Это было полезно?

Решение

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

Если приложение передает управление пользователю, просто позвольте ему напрямую управлять уровнями.Жаркость — это их ответственность, а не ваша.Это «подведение итогов».

Если смешивание автоматизировано, ты собираешься отправиться в путешествие.Вероятно, вам понадобится сжатие, если не ограничение.(Ограничение — это крайняя версия сжатия.)

Обратите внимание: все, что вы делаете со звуком (включая сжатие и ограничение), является формой искажения, поэтому у вас БУДЕТ окраска звука.Ваш выбор алгоритмов сжатия и ограничения повлияет на звук.

Поскольку вы не генерируете звук в реальном времени, у вас есть возможность ограничить «кирпичную стену».Это потому, что вы заранее знаете уровни.Ограничение в реальном времени более ограничено, потому что вы не можете знать, что произойдет, — вам приходится реагировать.

Это музыка, звуковые эффекты, голоса, что?

Программисты здесь иметь с этим дело постоянно.

Другие советы

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

Если у вас есть конкретная проблема, которая не решена в этом документе, не стесняйтесь обновить исходный вопрос.

грязная смесь двух образцов

mix = (a + b) - a * b * sign(a + b)

Вы никогда не говорили, какой язык программирования и платформа, однако сейчас я предполагаю, что Windows использует C#.

http://www.codeplex.com/naudio

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top