Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   Микширование звука (http://zx-pk.ru/showthread.php?t=10717)

Sinus 13th August 2009 19:09

Микширование звука
 
Наверное это больше сюда, нежели в музыку.

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

Суть в том, что когда бипер включается, AY начинает играть не так как раньше (обычно тише).

На сегодняшний день я знаю 2 алгоритма микширования (все остальные которые я знаю - это вариации этих двух)

1) Z = (A + B) / 2
2) Z = A + B - A*B

где A - AY, B - Beeper и Z - результат.
В этих формулах все числа дробные от 0 до 1.

проблема первой формулы очевидна - все звуковые устройства звучат тише. при использовании второй - при включённом бипере AY не будет звучать вообще.

Чтоб было понятнее, вот иллюстрация: http://detstwo.com/pub/zemu/audio-mix.html (в эксплорере не будет работать)
Кнопки Simpe / Divide by 2 / Improved - выбирают режимы микширования (Simple - Z=A+B), кнопки 1 / 0.5 / 0 - выбирают уровень сигнала бипера.

Наиболее адекватный сигнал получается при div by 2, но при увеличении кол-ва устройств, звук начинает играть тише и тише.

Сейчас я в эмуле "отключаю" неиспользуемые последнюю секунду устройства, а потом импользую div by <кол-во оттавшихся устройств> (пока грубо, что сопровождается щелчками, но буду импрувить).

----

А теперь представим, что в комнате стоит 2 колонки, одна исключительно на бипер, вторая - на AY.
Если "включить" бипер, то колонка щёлкнет, пойдёт звуковая волна, но далее эта "включённая" колонка уже не будет влиять на звук.

----

А как делаете вы? А как это реализовывают в железе?

Vitamin 13th August 2009 20:32

Z=(aX+bY)/(a+b), где a = EXi, b=EYi (т.е. результат интегрирования за определенное время). В зависимости от логики поведения интегратора при появлении всплеска можно реализовать даже АРУ.
А если интегрировать не сигнал, а дельту, то можно даже шумопонижение сделать и избавиться от "постоянки" на выходе.

Sinus 13th August 2009 21:06

а можно поподробней?
X и Y - это текущая громкость на 2х устройствах?
Xi - это от X0 до Xi ?
E - это что?

Vitamin 13th August 2009 21:45

Вкратце, на полу-псевдокоде:

Code:

byte Buffer[DEVICES_COUNT][BUFFER_SIZE];
unsigned Position = 0;
unsigned Integrator[DEVICES_COUNT];

unsigned mixedLevel = 0;
unsigned divisor = 0;
for (int device = 0; device < DEVICES_COUNT; ++device)
{
  byte level = GetDeviceLevel(device);
  Integrator[device] -= Buffer[device][Position];
  Integrator[device] += (Buffer[device][Position] = level);
  Position = ++Position % BUFFER_SIZE;
  double val = Integrator[device] / BUFFER_SIZE;
  mixedLevel += level * val;
  divisor += val;
}
mixedLevel /= divisor;


psb 13th August 2009 23:03

Quote:

Originally Posted by Sinus (Post 212744)
1) Z = (A + B) / 2

самый правильный метод. ну или более обще, как витамин написал.
Quote:

Originally Posted by Sinus (Post 212744)
Если "включить" бипер, то колонка щёлкнет, пойдёт звуковая волна, но далее эта "включённая" колонка уже не будет влиять на звук.

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

Quote:

Originally Posted by Vitamin (Post 212754)
А если интегрировать не сигнал, а дельту, то можно даже шумопонижение сделать и избавиться от "постоянки" на выходе.

дифференцирование - есть фильтрация низких частот, только и всего. постоянку ты убьёшь, но заодно почикаешь и басы:)) лучше этого все-таки не делать...

Vitamin 13th August 2009 23:53

Quote:

Originally Posted by psb (Post 212775)
дифференцирование - есть фильтрация низких частот, только и всего. постоянку ты убьёшь, но заодно почикаешь и басы) лучше этого все-таки не делать...

Не. Я имею в виду коэффициент передачи канала считать динамически как интеграл за последние несколько квантов. А можно как интеграл от дифференциала:)

Ewgeny7 16th August 2009 13:44

Quote:

Originally Posted by Vitamin (Post 212786)
динамически как интеграл за последние несколько квантов. А можно как интеграл от дифференциала

"Фига се, сходил за хлебушком..." (С) где-то :v2_jawdr::v2_wacko:

psb 16th August 2009 20:22

тут главное, чтобы коэф. не менялся слишком быстро.

Sinus 17th August 2009 16:24

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

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

---------- Post added at 14:24 ---------- Previous post was at 14:21 ----------

Quote:

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

psb 17th August 2009 17:42

Quote:

Originally Posted by Sinus (Post 213233)
не не не дэвид блейн

ха!:)))
вообще-то физику не обманешь:) тебе опять-таки кажется, что ничего не происходит. хотя на самом деле конечно и не происходит из-за того, что колонка не может воспроизводить сколь-угодно низкие звуки (как и создавать постоянное давление на ухо). но если взять идеальную колонку и окружение, то влияние на ухо все-таки будет.
авто-регулирование коэф. усиления - это конечно частичный выход из ситуации, но не супер. компрессия - тоже выход, но тоже совсем не супер для музыки. если работа твоего АРУ будет не заметна на слух - отлично:)

---------- Post added at 18:42 ---------- Previous post was at 18:40 ----------

ты раз уж так делаешь, прими меры, чтоб коэф. не мог меняться скачкобразно.


All times are GMT +4. The time now is 21:01.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.