Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Как проиграть несколько звуков одновременно?   Найти похожие ветки 

 
Sour Smile   (2006-03-01 12:18) [0]

Если извлекать звуки командой sndPlaySound(Pointer(FileName), SND_ASYNC), то проигрывание предыдущего звука прерывается...
Один из вариантов я нашёл здесь: http://www.swissdelphicenter.ch/en/printcode.php?id=1643
Но подходит, только если оба звука должны начинаться в одно и то же время. Мне же нужно, чтобы звуки начинались в произвольное время, давая возможность звукам начавшимся ранее доиграть до конца (но и не ждать их завершения, т.е. самому звучать и другим не мешать :))).
Как это можно реализовать?


 
Сергей М. ©   (2006-03-01 12:35) [1]


> Мне же нужно, чтобы звуки начинались в произвольное время


Ну так и вызывай соответствующие SendMCICommand("play", ..) в произвольное (нужное) тебе время !

В чем проблема-то ?


 
Sour Smile   (2006-03-01 14:41) [2]

Да вобщем как бы и работает, но...
Если я говорю: SendMCICommand("play "C:\xyz\BackgroundMusic.wav""); - начинает звучать.
Потом говорю: SendMCICommand("play "C:\xyz\AnotherMusic.wav""); - действительно звучат вместе два звука.
Но вот пока не проиграет до конца AnotherMusic.wav, вызовы SendMCICommand("play "C:\xyz\AnotherMusic.wav""); бесполезны... Файл то ли блокируется на чтение... Не копировать же файл AnotherMusic.wav под разными именами столько раз, сколько его копий должно звучать одновременно... :)


 
Сергей М. ©   (2006-03-01 14:55) [3]


> Sour Smile   (01.03.06 14:41) [2]


Ах вот ты о чем !

Ну тогда тебе прямая дорога в DirectSound


 
Sour Smile   (2006-03-01 15:22) [4]


> Сергей М. ©   (01.03.06 14:55) [3]
> > Sour Smile   (01.03.06 14:41) [2]
> Ах вот ты о чем !
> Ну тогда тебе прямая дорога в DirectSound

:) Да хотелось бы обойтись без экстремала... :)))
Нет, если бы я действительно, что-то серьёзное писал - тогда да. А это я пишу знакомой девушке для диплома. Ей же потом прийдётся объяснять, чего "она" там наворотила... :)))
А я сам с DirectX знаком только на уровне DelphiX и то весьма отдалённо...


 
Сергей М. ©   (2006-03-01 15:36) [5]


> Ей же потом прийдётся объяснять, чего "она" там наворотила


Ну а в противном случае ей придется объяснять, почему она ничего путного не "наворотила" из того что требовалось по теме диплома.

Без программного смешивания аудиопотоков (будь оно в недрах DSound, либо еще какой-либо спецбиблиотеки или прямо в аппликации) тут вряд ли обойтись.

Можно еще ASIO предложить, но это по сложности примерно из той же оперы что и DSound


 
Sour Smile   (2006-03-01 16:53) [6]


> Сергей М. ©   (01.03.06 15:36) [5]
> Без программного смешивания аудиопотоков (будь оно в недрах
> DSound, либо еще какой-либо спецбиблиотеки или прямо в аппликации)
> тут вряд ли обойтись.

Если уж речь зашла об этом, не мог бы ты чуть поподробнее расказать, по какому алгоритму смешивать два и более WAV"а (в формате PCM), для последующего вывода с помощью waveOutWrite? Насколько я знаю в PCM каждый байт это уровень громкости (сигнала) в данный момент времени от -127 до +127 (это для восьмибитного PCM, ну и плюс для каждого канала).
Обычное среднее арифметическое, или как то более хитро?


 
Jeer ©   (2006-03-01 16:57) [7]

s = a*X + (1-a)*Y

0=< a <=1  - коэфф. соотношения сигналов X и Y


 
Sour Smile   (2006-03-01 17:19) [8]


> Jeer ©   (01.03.06 16:57) [7]
> s = a*X + (1-a)*Y
> 0=< a <=1  - коэфф. соотношения сигналов X и Y

То есть, если я хочу что бы оба сигнала были равносильными я должен задать a=0.5 и тогда получается формула среднего арифметического. Но всё равно странно...
Допустим я сначала выводил всего один WAV-PCM один к одному (т.е. как прочитал из файла или памяти, так и вывел в waveOutWrite). Теперь допустим добавляется ещё один WAV-PCM который нужно смикшировать и я применяю формулу среднего арифметического. Но допустим второй WAV-PCM - тишина (все байты равны нулю), тогда получится: s = 0.5*X +0.5*Y = 0.5*X + 0.5*0 = 0.5*X , т.е. при добавлении "тишины" снижается в два раза уровень первого сигнала, а по идее тишина какбы не должна влиять на уровень звука... :(


 
Jeer ©   (2006-03-01 18:34) [9]

И что, в паузе между словами одного исполнителя должна в два раза увеличиваться громкость второго ?
А если и там и там пауза ?
Может надо довести уровень шума до максимума в это случае ?

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

"Подумай, может и получится" (С)


 
XProger ©   (2006-03-01 19:09) [10]

http://xproger.mirgames.ru/?id=2&page=2 // Sound module v0.3



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
15-1156750303
ANB
2006-08-28 11:31
2006.09.17
Чье оружие круче ?


1-1154508723
IGray
2006-08-02 12:52
2006.09.17
Ищу компонент - ресайзовый уголок (как в TScrollBar)


15-1156226937
Некто
2006-08-22 10:08
2006.09.17
Воздушное охлаждение системного блока


15-1156734742
tButton
2006-08-28 07:12
2006.09.17
знаки


3-1152885882
stud
2006-07-14 18:04
2006.09.17
регистр при именовании переменных