| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Воспроизведение звука |
| Автор: oleg2s 8.6.2012, 12:11 |
| Доброе время суток. Как воспроизвести звук синусоиды (прямоугольника) определенной частоты и длительности? В случае прямоугольника желательно еще менять длительность меандра. Beep, PlaySound, MessageBeep не подходят Beep - просто пикает MessageBeep - выдает системные звуки PlaySound - воспроизводит звуки из заданного банка инструментов. В стандартных банках нет такого инструмента. |
| Автор: Чучмек 8.6.2012, 14:37 | ||
|
| Автор: oleg2s 13.6.2012, 05:51 |
| Спасибо, вроде работает. Только как задать длительность? Ну и разобраться надо еще, как это работает... Есть над чем подумать. |
| Автор: Alexeis 13.6.2012, 13:13 | ||
Посмотри на
когда она вызывается с параметром Msg = WOM_DONE, то буфер аудио данных отправлен аудио драйверу. Данный код обрабатывая сообщение WOM_DONE засылает очередную порцию сгеренированных данных. Если не реагировать на WOM_DONE, то буфер драйвера опустеет и звук прекратиться. Сколько данных передашь в буфер, столько и будет звучать. 1 секунда в этом формате займет wf.nAvgBytesPerSec байт. |
| Автор: oleg2s 15.6.2012, 14:41 |
| Спасибо, разобрался. Еще один вопрос: Почему в конце слышен небольшой щелчок? Пытался заполнять буфер так, чтобы синусоида оканчивалась на нуле. Результат тот же :( Стандартная процедура Beep тоже щелкает. |
| Автор: oleg2s 21.6.2012, 04:27 | ||
Я заполняю буфер от -32767 до 32767 (десяч.) Значит надо закончить максимальным значением? |
| Автор: oleg2s 21.6.2012, 05:09 |
| Попробовал заполнить весь буфер 32768 ($8000). Слышны щелчки. Заполнение буфера -32767, приведит к тому же результату. Если заполнить буфер 0-м, то полная тишина. Вывод: В 16-ти битном звуке 0 - это НЕ $8000, а $0, он же и в десятичке 0. |
| Автор: Чучмек 23.6.2012, 07:24 |
| Попробуй, перед выключением, свести плавно к нулю амплитуду. |
| Автор: oleg2s 25.6.2012, 04:41 |
| Причина ясна. Опытным путем проверил, что если сигнал заканчивается не в нуле, то появляются щенчки. Причем они слышны начиная со значения 100 (ну у кого какой слух). Теперь стоит две задачи: Первая, практическая. Какой величины (крутизны) должен быть фронт? Какую кривую должен описывать этот фронт? Вторая, математическая. Как описать кривую фронта? Кто-нибудь занимался обработкой сигнала? |
| Автор: ivan219 25.6.2012, 21:41 | ||||
oleg2s у вас передача сигнала происходит блоками значит начало нового блока должно быть продолжение старого.
И максимальное значение в 16бит звуке = 32767 а минимальное -32768 Так что делайте всегда так что бы ваше максимальное или минимальное значение было равно |32767| |
| Автор: oleg2s 29.6.2012, 07:08 |
| Нет. У меня данные НЕ передаются блоками. У меня всего один блок заполненный синусоидой. |
| Автор: ivan219 3.7.2012, 19:17 | ||||
Ну правильно. У Вас он один, но вы его постоянно блоками передаёте в звуковую карту и у же в ней, из этих блоков строится не правильная синусоида с разрывами между блоками по этому вы и слышите щелчки. Смотрите ниже красным цветом это не правильная синусоида. Синим та какая должна быть. http://s1.ipicture.ru/
|
| Автор: oleg2s 5.7.2012, 05:31 |
| Нет. У меня ОДИН БЛОК и я его запускаю ОДИН РАЗ. Блок длиной 65535, это примерно 1,5 сек при 44100. Этого мне достаточно. Теперь если сигнал заканчивается не на нуле, то слышен щелчек. Пытался завалить фронт по огибающей синусоиде меньшей частоты. Эффект стал меньше, но при определенных частотах все же слышен. Пробовал заваливать фронт по убывающей прямой. Получилось лучше, но все же не так как хотелось бы. По какой кривой и какой длительности надо заваливать фронт? Вот в чем вопрос. |
| Автор: Чучмек 5.7.2012, 13:24 |
| Попробуй по такой кривой а=А-k*t^n a - спадающая амплитуда А- амплитуда синусоиды t - время от начала спада n - коэффициент крутизны k=A/(T^n) Т длительность спада от А до нуля Попробуй с различными T и n (n = 0,3 ... 10) |
| Автор: oleg2s 6.7.2012, 05:44 |
| Спасибо. Интересная формула. В зависимости от n позволяет описать как выпуклость, так и вогнутость. При n=1 получаем прямую. Надо поэкспериментировать. Результат сообщу, но похоже не скоро. Отпуск. |