2009-10-29 3 views
8

여러 주파수의 톤이 포함 된 사운드를 만들어야합니다. C#에서 이것을 수행 할 수있는 방법이 있습니까?C#에서 복잡한 색조를 생성 할 수 있습니까?

내가 지금까지 본 유일한 톤 생성 방법은 작동하는 console.beep과 관련이 있지만 순수한 톤 (단일 주파수)에만 해당됩니다.

+0

귀하의 정보를 위해, 컴퓨터 스피커 (경고음) 사용은 일반적으로 좋은 연습이 아닙니다. 기본 오디오 출력을 사용해야합니다. – decasteljau

+0

나는 실제로 기본 오디오 출력을 사용하는 것을 선호합니다. 결국 그것은 헤드폰을 통과해야합니다. –

+4

중요한 포인트입니다. 삐 소리는 잊어 버려. DirectSound 또는 WaveOut을 사용하려고합니다. 둘 다 관리되지 않는 API이므로 PInvoke를 사용해야하거나 C++/CLI로 전환해야합니다. – CannibalSmith

답변

19

Audiere 라이브러리를 사용하면이 작업을 매우 쉽게 수행 할 수 있습니다. 여기에 "1"버튼에 대한 DTMF 톤을 생성 할 수있는 거의 완전한 C# 프로그램입니다 :

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(); 

는 C#으로 Audiere을 사용하려면이, 가장 쉬운 방법은 일어나하고 실행 그가 모노에 작품을 주장하는 (Harald Fielker's C# binding를 사용하는 것입니다 VS : VS2005의 정식 버전과 C# 및 VC++의 별도 Express 2008 버전을 사용하여 작동하는지 확인할 수 있습니다. Win32 Audiere DLL, lib, and header (모두 동일한 zip에 있음)을 다운로드해야하며 VC++ 및 C#을 사용하여 소스에서 C# 바인딩을 빌드해야합니다.

Audiere를 사용하면 얻을 수있는 장점 중 하나는 통화가 차단되지 않는다는 것입니다. tone1a이 시작되기 전에 재생을 중지 할 때까지 기다릴 필요가 없습니다. tone1b은 복잡한 음을 재생할 때 분명히 필요합니다. 얼마나 많은 동시 출력 스트림을 사용할 수 있는지에 대한 상한선을 알지 못하기 때문에 하드웨어/OS가 지원하는 것은 무엇이든 상관 없습니다. 그런데 Audiere는 순수한 생성 된 음색뿐만 아니라 특정 오디오 파일 (MP3, WAV, AIFF, MOD, S3M, XM, IT 자체, Ogg Vorbis, Flac, Speex 외부 라이브러리)도 재생할 수 있습니다.

한 가지 단점은 개별적인 음색을 시작하거나 중지 할 때 약간의 가청음이 발생한다는 것입니다. 이미 연주하고있는 음색에 하나의 음색을 추가하면 눈에 띄지 않습니다. 내가 찾은 가장 쉬운 해결 방법은 각각 톤을 켜거나 끌 때 톤 볼륨을 천천히 올리거나 내리는 것입니다. "딱 맞는 소리"를 내기 위해서는 램프 속도로 놀아야 할 것입니다.

Audiere는 LGPL 라이선스를 받았으며 바인딩에는 라이선스가 첨부되어 있지 않습니다. 시판 제품에서 그의 구속력을 사용하고 싶다면 법적 팀과 상담하거나 Harald를 확보해야합니다. 또는 당신은 당신의 자신의 구속력을 만들고 혼전을 피할 수 있습니다.


@Tom : Harald의 라이브러리에는 특정 라이선스가 없으므로 호스팅의 의미가 무엇인지 확신 할 수 없습니다. 그러나, 나는 적어도 당신에게 내 libaudieresharplue 프로젝트가 어떻게 설정되었는지 정확하게 상세히 설명 할 수 있다고 생각한다.

Visual C++ Express 2008을 사용하면 bindings/csharp/libaudieresharpglue/vc8.0/libaudieresharpglue.sln.을 엽니 다. VC++는 자동으로 솔루션을 VS9 솔루션으로 변환합니다.

또 다른 폴더에는 Sourceforge의 Audiere 패키지가 있어야합니다. VC++ 프로젝트 속성에서 구성 속성> C/C++> 일반으로 이동하여 "추가 포함 디렉터리"에 path/to/audiere-1.9.4-win32/include이 있는지 확인하십시오. 그런 다음 동일한 창에서 Linker> General로 이동하여 "추가 라이브러리 디렉토리"에 /path/to/audiere-1.9.4-win32/lib이 있는지 확인하십시오. 그런 다음 프로젝트를 빌드 할 수 있어야합니다 (릴리스 모드 인 것이 좋음).이 출력은 vc8.0/Release 폴더에 libaudieresharpglue.dll입니다.

다음으로 Visual C# Express 2008을 엽니 다. bindings\csharp\test\vc8.0\AudiereCSharpTest.sln을 열어 솔루션을 변환하십시오. 프로젝트를 잘 빌드해야하지만 실행하면 오류가 발생합니다. 괜찮아; csharp/test/vc8.0/bin/Release 폴더에서 VC++ 솔루션의 libaudieresharpglue.dll과 Sourceforge의 패키지의 audiere.dll을 모두 추가해야합니다.

이제 AudiereCSharpTest를 빌드하고 실행할 수 있어야합니다. 기본적으로 #define stream_test은 AudiereTest.cs의 맨 위에 주석 처리되지 않으며 하드 드라이브에없는 파일을 참조합니다. 단순히 #define을 주석 처리하고 noise_test 또는 square_test의 주석을 제거 할 수 있습니다.

그렇습니다. 세부 사항을 놓친 경우, 잘하면 그들이 자신에 의해 얻을 정도로 작습니다 :)

+0

멋진 라이브러리입니다. NAudio가 나에게 적합하지 않을 경우 자세히 살펴볼 수 있습니다. –

+0

컴파일 할 래퍼의 "libaudieresharpglue.dll"부분을 컴파일하는 데 큰 문제가 있습니다. 내가 바이너리를 잡을 수있는 아이디어는? –

+0

분명히 내가해야 할 일이기 때문에 나는 이것을 받아 들였다. 그러나 당신의 멍청한 증거 설명에도 불구하고, 나는 여전히 "libaudieresharpglue.dll"을 컴파일 할 수 없다 (100 개의 오류에서 멈춤). 링크를하면 입력 파일 '. \ Release \ audiere.obj'를 열 수 없다는 메시지가 나타납니다. 누락 된 초보자가 있습니까? –

0

예 가능합니다.

Here is a link에 대한 자습서입니다. 그러나 물론이 또한 분명히 Console.Beep 비동기인지 아닌지하지 않습니다 Console.Beep

+0

내가 본 곳에서 이것은 한 번에 하나의 톤 만 생성 할 수도 있습니다. – Joey

4

당신은 항상 DirectSound를 시도 할 수 있습니다 ...

+0

DirectSound로 복잡한 톤을 생성하는 것과 관련된 링크가 있습니까? –

+2

간단히 말해서 많은 sin() 호출 결과를 웨이브 버퍼에 쓴 다음 해당 버퍼를 다시 재생하도록합니다. – Kylotan

0

MSDN 설명서를 사용합니다. 그것이 있으면, 당신은 아마 당신이 빨리 연속적으로 필요로하는만큼 많은 호출을 발사 할 수 있고 아무도 더 현명하지 못합니다. 물론 주파수와 지속 시간을 사용하는 버전을 사용하고 싶을 것입니다.

+0

그것은 동기식입니다. – Joey

+0

C#을 처음 사용했습니다. 스레드를 사용하여 동기식 호출을 계층화 할 수 있습니까? –

+1

새 스레드를 사용하여 Console.Beep을 호출 할 수 있지만 여전히 많은 소리를 한 번에 재생할 수는 없습니다. – twk

3

저는 뒷받침 트랙을 재생하면서 피드백을 에뮬레이트하는 프로그램을 만들기 위해 NAudio을보고있었습니다. sine waves at specific frequencies 생성에 관한 블로그 게시물이 있습니다. 귀하가 찾고있는 것을 처리 할 수있는 것으로 여겨집니다.

+0

이것은 지금까지 가장 유망한 것이지만, 나는 하나 이상의 주파수가 함께 작동하지 못하고있다. –

+0

여러 스레드를 사용해 보셨습니까? 설명서에 Windows 혼합 장치 지원에 대한 설명이 나와 있습니다. –