Как создать эффект объемного звучания с помощью python, контролируя громкость каналов динамиков?

Купил звуковую карту: Focusrite Scarlett 4i4 3rd Gen, с 4 выходными каналами. У меня также есть 4 динамика, и я свяжу каждый динамик со звуковой картой. Я хотел бы иметь возможность устанавливать отдельно громкость каждого динамика, возможно, с интерфейсом tkinter (в конечном счете, но это не главное).

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

Я хотел бы выбрать звуковую карту в качестве устройства вывода и указать, какие каналы должны воспроизводить звук прямо сейчас. Хорошим использованием было бы иметь файл .wav в моно для реализации в 1,2,3 или 4 динамиках; или файл .wav в стерео реализовать таким же образом, но с первым каналом стерео в 2-х колонках и вторым каналом стерео в 2-х других колонках. Идеальное использование было бы для создания эффекта объемного звучания 4.0, создания квадрата динамиков и возможности поворачиваться вместе со звуком: вы можете представить, что я поставил звук поезда, и что этот звук вращается, как если бы поезд крутился вокруг тебя.

sounddevice.AsioSettings() позволяет нам контролировать, какой выход использовать для воспроизведения чего-либо, верно? (https://python-sounddevice.readthedocs.io/en/0.3.15/api/platform-specific-settings.html) Но когда я просматриваю документ в деталях, я также отмечаю, что sounddevice.play() позволяет нам чтобы указать аргумент mapping, который я действительно не понимаю. (https://python-sounddevice.readthedocs.io/en/0.3.15/api/convenience-functions.html#sounddevice.play) Предполагаю, что во всех случаях придется ставить Asio, что не проблема (надеюсь!) .

Поскольку моя цель — управлять каждым динамиком, что я могу указать и как этого добиться, используя библиотеку звукового устройства или другую? Кроме того, можно ли контролировать громкость каждого динамика, используя эти или другие библиотеки (например, pycaw)?

Большое спасибо!

Эльюрн

PS: Если с python не существует решения, было бы приятно, если у вас есть идеи для достижения этой цели другим способом (например, с помощью программного обеспечения, способного это сделать).


person Tristan N    schedule 03.07.2020    source источник
comment
Я только что увидел, что pygame.mixer может быть очень полезен для управления двумя каналами. stackoverflow.com/ вопросы/42959092/ stackoverflow.com/questions/47921638/ Мне все еще нужно понять, как это сделать для 4 каналов   -  person Tristan N    schedule 03.07.2020


Ответы (1)


Аргументы AsioSettings и mapping предназначены для статического выбора каналов. Вы не можете использовать ни для микширования сигналов, ни для изменения их громкости.

Если вы хотите использовать первые несколько каналов вашей звуковой карты в порядке возрастания (например, каналы 1, 2, 3 и 4), они вам вообще не нужны. Например, вы можете просто использовать channels=4, чтобы выбрать первые 4 канала. Еще проще, если вы используете sounddevice.play(), количество каналов будет определяться заданным массивом NumPy, и вам не нужно явно указывать параметр channels.

Если вы заранее знаете желаемое движение (поезда в вашем примере), вы можете предварительно вычислить 2- или 4-канальный сигнал. Затем вы можете просто воспроизвести многоканальный сигнал с помощью sounddevice.play() (используя AsioSettings или аргумент mapping, если необходимо).

Если вы не знаете движение заранее (например, если оно вычисляется в режиме реального времени), вы можете использовать sounddevice.OutputStream и реализовать пользовательскую функцию callback, которая взвешивает сигналы.

Что касается того, как именно микшировать сигнал в выходные каналы, это не имеет никакого отношения к модулям sounddevice или soundcard. Вы, вероятно, можете найти библиотеки обработки сигналов, чтобы сделать это, или вы можете реализовать это самостоятельно. Подходящим поисковым термином для этого является панорамирование. Для двух каналов вы можете использовать стерео панорамирование, для большего количества каналов есть другие методы, такие как векторное базовое панорамирование амплитуды (VBAP), панорамирование амплитуды Ambisonics, ...

person Matthias    schedule 05.07.2020