Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2013, 21:36   #1
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию Аккорд (смешивание частот нот)

Привет! Давно искал но что то так и не нашел ответ на вопрос... Как правильно смешать ну допустим 2 звуковых сигнала синусоидальной формы разной частоты. При заполнении буферов структуры TWAVEFORMATEX на заполнение одного 16 битного сэмпла у нас есть диапазон -32768..32767. То есть максимум амплитуда у 1 синусоидального сигнала будет 32767 а минимум -32768. А если смешивать 2 сигнала с амплитудой 32767 то при их смешивании придется вылезать за диапазон. Есть ли алгоритм как сделать это грамотно и без тресков?)
JekaDefer вне форума Ответить с цитированием
Старый 04.09.2013, 23:32   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...в общем случае, берем по отсчету из каждого сигнала для заданного момента времени, складываем, делим пополам.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 05.09.2013, 00:09   #3
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...в общем случае, берем по отсчету из каждого сигнала для заданного момента времени, складываем, делим пополам.
так то оно так но это 2 сигнала... а если их например 10? тогда при проигрывании одного сигнала он поделится на 10 и будет один звучать совсем тихо.... просто я пытаюсь это сформировать в 1 потоке... пробовал запускать отдельными потоками и звуковая карта нормально все плюсует и никаких тресков и все играет с 1 установленной громкостью... но если так делать то чтобы услышать 3 частоты с 1 громкостью надо запустить 3 потока... а если их 20 или 100? тогда как?)
JekaDefer вне форума Ответить с цитированием
Старый 05.09.2013, 00:31   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
так то оно так но это 2 сигнала... а если их например 10?
да хоть сто, среднее берем при прочих равных частотах дискретизации и битрейте для того, чтобы не было зашкаливания сэмпла (к примеру, для 16 бит один из каналов равен +32767, и вдруг второй 100, сумма даст ограничение). Синус там или речь не имеет значения. Что же касается тихо-громко - нормируйте уровни, отслеживайте тишину в каналах.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 05.09.2013, 01:00   #5
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

в общем выкладываю программу. В ней каждая одиночно звучащая нота звучит с урезанной громкостью в 10 раз... как сделать чтоб звучало при любом раскладе(и одиночно и одновременно и тд...) с максимальной громкостью?
Вложения
Тип файла: rar Синтезатор на 7 звуков.rar (192.2 Кб, 6 просмотров)
JekaDefer вне форума Ответить с цитированием
Старый 05.09.2013, 09:59   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...разве не в 7?

Код:
  nSounds = 7; // Максимальное количество одновременно звучащих нот
  MaxSoundAmplitude = trunc(MaxAmplitude / nSounds); // Максимальная амплитуда ноты

...
procedure SinthezSetVolume(Volume: Byte);
begin
  SinthezSoundAmplitude := Trunc(MaxSoundAmplitude / 100 * Volume); // Перевод громкости в int16
end;
Повторяю, отслеживайте "тишину". Если у вас есть один звучащий канал на фоне остальных приостановленных, то сумма амплитуд отсчетов всех каналов в единицу времени не должна превысить максимума (32767 по модулю), дабы не было ограничения и соответственно искажений.

К примеру, складываем амплитуды 2-х каналов:
|Am1| + |Am2| < 32767

К примеру, складываем амплитуды 5-х каналов:
|Am1| + |Am2| + |Am3| + |Am4| + |Am5| < 32767

Тогда, максимальная амплитуда каждого из каналов:
Amn = 32767 div n

Это гарантирует, что сумма амплитуд всех каналов, звучащих на данный момент не превысит int16. А что мы видим в вашем коде выше, у вас это деление забито константой, т.е. звучит-не звучит канал из ваших семи, а амплитуда делится на всех. Ферштеен?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 12.09.2013, 02:11   #7
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

да так то оно так но смотрите.. по вашему методу (я его кстати уже думал раньше) выходит что если я нажимаю 1 клавишу то она звучит во весь диапазон... но если я затем нажимаю вторую то этим самым я сразу понижаю громкость первой в 2 раза и тд.. это очень некрасиво звучит... почему когда в разных потоках запускаю то звуковуха все нормально смешивает?
JekaDefer вне форума Ответить с цитированием
Старый 12.09.2013, 10:58   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Согласен, да, именно так - результирующая громкость будет в n-раз ниже. Однако никто не мешает опосля уровень при смешивании поднять общий в 200% (для двух сигналов).

Вот тут "Описание API вызова библиотеки MixerWAV.DLL" это можно делать с двумя WAV PCM одноканальными (работа непосредственно с отсчетами, уровень результирующий поднимаем-опускаем-регулирем скорость)

Видео:

http://www.youtube.com/watch?v=Lv0J2-WD2XE
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 17.09.2013, 18:15   #9
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
Вот тут "Описание API вызова библиотеки MixerWAV.DLL" это можно делать с двумя WAV PCM одноканальными (работа непосредственно с отсчетами, уровень результирующий поднимаем-опускаем-регулирем скорость)
Чтото я даже примерно не могу сообразить как это может мне тут помочь...
JekaDefer вне форума Ответить с цитированием
Старый 25.09.2013, 23:10   #10
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Есть еще какие нибудь варианты как увеличить общую громкость после суммирования сигналов?
JekaDefer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Трекерная музыка, воспроизведение нот(С++) Chuguev Помощь студентам 9 02.08.2013 12:46
Получение нот из waf формата aram111 Помощь студентам 8 05.10.2011 20:35
Смешивание AngelOfDeathSX Мультимедиа в Delphi 1 16.10.2010 21:32
Пример кода для воспроизведения нот - частоты нот для 80-ти клавишного пианино mutabor Свободное общение 8 09.01.2010 23:48
Воспроизведение Midi-нот desperado Общие вопросы Delphi 2 26.06.2007 13:22