Можно ли генерировать сложные тоны в C#?
Мне нужно создать звук, содержащий тоны разных частот. Есть ли способ сделать это в C#?
Единственные методы генерации тона, которые я видел до сих пор, включают console.beep, который работает, но только для чистых тонов (одиночных частот).
6 ответов
Библиотека Audiere делает это чрезвычайно простым делом. Вот почти полная программа на C# для генерации тона DTMF для кнопки "1":
AudioDevice device = new AudioDevice();
OutputStream tone1a = device.CreateTone(697); // part A of DTMF for "1" button
OutputStream tone1b = device.CreateTone(1209); // part B
tone1a.Volume = 0.25f;
tone1b.Volume = 0.25f;
tone1a.Play();
tone1b.Play();
Thread.Sleep(2000);
// when tone1a stops, you can easily tell that the tone was indeed DTMF
tone1a.Stop();
Чтобы использовать Audiere в C#, самый простой способ начать работу - использовать привязку Харальда Филкера C# (которая, как он утверждает, работает на Mono и VS; я могу подтвердить, что она работает как в полной версии VS2005, так и в отдельных версиях Express 2008). C# и VC++). Вам нужно будет загрузить Win32 Audiere DLL, lib и заголовок (которые находятся в одном и том же zip-файле), и вам нужно будет создать привязку C# из исходного кода, используя как VC++, так и C#.
Одним из приятных преимуществ использования Audiere является то, что звонки не блокируются. Вам не нужно ждать tone1a
прекратить играть, прежде чем начать tone1b
, что явно необходимо для воспроизведения сложных тонов. Я не знаю каких-либо жестких верхних ограничений на количество одновременных потоков вывода, которые вы можете использовать, так что это, вероятно, то, что поддерживает ваше оборудование / ОС. Кстати, Audiere также может воспроизводить определенные аудиофайлы (MP3, WAV, AIFF, MOD, S3M, XM, IT; Ogg Vorbis, Flac, Speex с внешними библиотеками), а не только чисто сгенерированные тоны.
Одним из возможных недостатков является то, что при запуске или остановке индивидуального тона слышен слегка слышимый "щелчок"; это не заметно, если добавить один тон к уже воспроизводимому. Самый простой обходной путь, который я нашел для этого, - это медленно увеличивать или уменьшать громкость тона при включении или выключении тона соответственно. Возможно, вам придется поэкспериментировать со скоростью рампы, чтобы она звучала "точно".
Обратите внимание, что Audiere имеет лицензию LGPL, и к привязке не приложена лицензия. Вам нужно будет проконсультироваться со своей юридической командой или попытаться завладеть Харальдом, если вы хотите использовать его связывание в коммерческом продукте; или вы можете просто сделать свой собственный переплет и избежать хлопот.
@Tom: Поскольку к библиотеке Харальда не прилагается конкретная лицензия, я не уверен, каковы будут последствия ее размещения; однако, я полагаю, что могу, по крайней мере, дать вам подробную информацию о том, как именно настроен мой проект libaudieresharpglue.
Используя Visual C++ Express 2008, откройте bindings/csharp/libaudieresharpglue/vc8.0/libaudieresharpglue.sln.
VC++ автоматически преобразует решение в решение VS9.
В другой папке у вас должен быть пакет Audiere от Sourceforge. В свойствах вашего проекта VC++ перейдите в Свойства конфигурации> C/C++ > Общие и убедитесь, что у вас есть path/to/audiere-1.9.4-win32/include
в ваших "Дополнительных каталогах включения". Затем в том же окне перейдите в Linker > General и убедитесь, что у вас есть /path/to/audiere-1.9.4-win32/lib
в ваших "Дополнительных библиотечных каталогах". Затем вы должны быть в состоянии построить проект (желательно в режиме выпуска) и этот вывод libaudieresharpglue.dll
в вашем vc8.0/Release
папка.
Затем откройте Visual C# Express 2008. Откройте bindings\csharp\test\vc8.0\AudiereCSharpTest.sln
и пусть он преобразует решение. Проект должен хорошо работать, но при запуске вы получите ошибку. Все в порядке; в вашем csharp/test/vc8.0/bin/Release
В эту папку необходимо добавить как libaudieresharpglue.dll из решения VC++, так и audiere.dll из пакета Sourceforge.
Теперь у вас должна быть возможность собрать и запустить AudiereCSharpTest. Обратите внимание, что по умолчанию #define stream_test
не закомментирован в верхней части AudiereTest.cs, и это будет ссылаться на файл, который не находится на вашем жестком диске. Вы можете просто закомментировать, что #define
и раскомментируйте noise_test
или же square_test
,
Это должно покрыть это; если я пропустил какие-либо детали, надеюсь, они достаточно малы, чтобы обойтись самостоятельно:)
Я смотрел на NAudio с целью создания программы, которая имитирует обратную связь при воспроизведении минусовки. В блоге есть сообщение о генерации синусоидальных волн на определенных частотах, я подозреваю, что это можно адаптировать для того, что вы ищете.
Да, это возможно.
Вот ссылка на учебник по этому вопросу. но, конечно, это также использует Console.Beep
В документации MSDN не ясно, является ли Console.Beep асинхронным или нет. Если это так, то вы, вероятно, можете сделать так быстро, как вам нужно, в кратчайшие сроки, и никто не станет мудрее. Вы хотели бы использовать версию, которая принимает частоту и продолжительность, конечно.
По сути, вы должны реализовать свой собственный программный синтезатор или найти стороннюю библиотеку. Смотрите: http://en.wikipedia.org/wiki/Demo_(computer_programming)