2013-11-01 2 views
0

아내는 최고의 음악으로 크리스마스 조명을 '록'하게 만들 장치를 요청했습니다. Arduino 마이크로 컨트롤러를 사용하여 조명에 연결되는 릴레이를 제어하고 C# winforms에서 6 개의 신호를 보내서 끄고 켭니다. 나는 NAduio를 사용하여 진폭과 리듬을 분리하여 여섯 개의 신호를 보내고 싶습니다. 여섯 개의 신호에 대해 여섯 개의 막대가있는 이퀄라이저와 같은 특정 범위의 헤르츠에 대해서는 리듬에서 타이밍을 취하십시오. WPF 데모를 보았고 파형이 대답처럼 보입니다. 노래가 재생되는 동안 그 값을 실시간으로 가져 오는 방법을 알고 싶습니다. 나는 생각하고 ... 1. 간단한 mp3 플레이어를 만들고 내 노래를 모두로드하십시오. 2. 재생중인 노래를 시작하십시오. 3. 노래의 현재 다이내믹을 샘플링하여 정수로 변환하여 USB를 통해 Arduino 마이크로 컨트롤러의 어느 채널로 보낼 수 있는지 확인하십시오.NAudio를 사용하면 MP3 파일의 진폭과 리듬을 어떻게 얻을 수 있습니까?

현재 사운드 정보를 실시간으로 캡처하고 그 순간에 정수 값을 제공하는 방법을 모르겠습니다. 노래가 재생되는 동안 e.MaxSampleValues ​​[0] 값을 실시간으로 읽을 수 있지만 그 순간에 어떤 주파수 범위가 활성 상태인지 구별 할 수 있기를 원합니다.

어떤 흥미로운 프로젝트라도 도움이 되었으면 좋겠습니다.

답변

2

재미 신호 처리 프로젝트처럼 들리는 주셔서 감사합니다.

NAudio.Wave.WasapiLoopbackCapture 개체를 사용하면 로컬 컴퓨터의 사운드 카드에서 생성되는 오디오 데이터를 가져올 수 있습니다. 이렇게하면 사운드와 조명 사이에 약간의 지연이 있지만 'MP3 플레이어 만들기'단계를 건너 뛸 수 있습니다. 더 나은 동기화를 위해 MP3 디코딩을 수행하고 재생 중에 비트 패턴과 출력 상태를 미리 계산할 수 있습니다. 이렇게하면 출력을 전송하고 출력이 생성 된 오디오 블록을 재생하는 사이의 지연을 조절할 수있어 조명과 음악 간의 완벽한 동기화가 이루어집니다.

샘플을 얻은 후에는 다음 단계로 FFT를 사용하여 주파수 구성 요소를 찾습니다. 다행스럽게도 NAudio에는 NAudio.Dsp.FastFourierTransform과 관련된 수업이 포함되어 있습니다. (Thank you Mark!) FFT() 함수의 출력을 가져 와서 각각의 제어 된 빛에 대해 원하는 주파수 범위를 합산하십시오.

다음 단계는 비트 검출입니다. 이 here에 대한 흥미로운 기사가 ​​있습니다. 가장 큰 차이점은 샘플 블록 스트림에서 에너지를 감지하는 대신 스펙트럼 분석 단계의 데이터를 사용하여 비트 감지 알고리즘을 제공한다는 것입니다. 합계 한 범위는 개별 비트 감지 프로세서의 입력이되어 정의한 각 주파수 범위에 대해 하나의 출력을 제공합니다. 각 주파수 그룹에 개별 스케일링/임계 값 계수를 추가하고 최상의 효과를 위해이를 조정하는 화면 제어 기능을 추가 할 수 있습니다.

프로세스가 끝나면 각 출력 플래그 세트가있는 샘플 블록 스트림이 생성됩니다. 플래그를 Arduino에 밀어 넣고 샘플을 대기열에 두어 동기화 작업을 지연 시키십시오.

관련 문제