it-swarm-ko.tech

실시간 오디오 입력에서 분당 비트 수

라인 인 오디오를 모니터링하고 분당 현재 (롤링 평균) 비트를 제공하는 간단한 C # 응용 프로그램을 작성하고 싶습니다.

이 gamedev article 를 보았는데, 전혀 도움이되지 않았습니다. 나는 그가하고있는 일을 이행하려고 노력했지만 작동하지 않았습니다.

DJ 소프트웨어가 많기 때문에 많은 솔루션이 필요하다는 것을 알고 있지만 오픈 소스 라이브러리를 찾거나 직접 수행하는 데 대한 지침은 없습니다.

43
Karl

슬라이딩 윈도우 FFT로 파워 스펙트럼 계산 : 1024 샘플 채취 :

double[] signal = stream.Take(1024);

FFT 알고리즘으로 피드하십시오.

double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);

실제 부분과 가상 부분을 얻게됩니다. 허수 부를 버리지 마십시오. 상상의 실수와 동일하게 행동하십시오. 허수 부분이 실수와 위상이 2/2 인 것은 사실이지만 여전히 스펙트럼 정보의 50 %를 포함합니다.

편집하다:

소리가 클 때 숫자가 많고 소리가 작을 때 0에 가까우도록 진폭과 반대로 전력을 계산하십시오.

for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];

상상의 부분과 비슷합니다.

for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];

이제 마지막 1024 개의 샘플에 대한 전력 스펙트럼이 있습니다. 스펙트럼의 첫 번째 부분은 저주파이고 스펙트럼의 마지막 부분은 고주파입니다.

대중 음악에서 BPM을 찾으려면 저음에 중점을 두어야합니다. 전력 스펙트럼의 하단을 합산하여 저음 강도를 선택할 수 있습니다. 사용할 숫자는 샘플링 주파수에 따라 다릅니다.

double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];

새로운 스펙트럼을 계산하기 전에 다시 똑같이했지만 윈도우 256 개 샘플을 이동하십시오. 이제 256 샘플마다 bassIntensity를 계산합니다.

이는 BPM 분석에 유용한 정보입니다. 저음이 조용 할 때는 비트가없고 큰 소리가 나면 비트가 있습니다.

행운을 빕니다!

26
Hallgrim

춤추는 원숭이라는 훌륭한 프로젝트가 있습니다.이 프로젝트는 음악에서 DDR 댄스 단계를 절차 적으로 생성합니다. 그것이 수행하는 것의 대부분은 (필수적으로 매우 정확한) 비트 분석을 기반으로하며, 프로젝트 논문은 다양한 비트 감지 알고리즘과 작업에 대한 적합성을 설명합니다. 여기에는 각 알고리즘에 대한 원본 논문에 대한 참조가 포함됩니다. 또한 솔루션에 대한 matlab 코드를 게시했습니다. 나는 그들 사이에서 필요한 것을 찾을 수 있다고 확신합니다.

모두 여기에 있습니다 : http://monket.net/dancing-monkeys-v2/Main_Page

15
Nick Johnson

이것을 구현하는 방법에 대한 단서가 아니라 오디오 엔지니어링 관점에서 먼저 필터링해야합니다. 베이스 드럼 히트가 가장 먼저 확인됩니다. 약 200Hz 미만의 것을 제공하는 저역 통과 필터는베이스 드럼을 매우 선명하게 보여줍니다. 고조파가 낮은 다른 기기의 클러 터를 정리하려면 게이트가 필요할 수도 있습니다.

다음으로 확인해야 할 것은 올가미 히트입니다. 이것을 EQ해야합니다. 올가미에서 발생하는 "균열"은 메모리에서 약 1.5kHz이지만, 이것을 확실히 게이트해야합니다.

다음 도전은 펑키 비트에 대한 알고리즘을 개발하는 것입니다. 프로그래밍 방식으로 비트 1을 어떻게 찾습니까? 이전 비트를 추적하고 무언가와 일치하는 패턴을 사용한다고 생각합니다. 따라서 비트를 정확하게 찾으려면 몇 개의 바가 필요할 것입니다. 그렇다면 4/4, 3/4, 6/8과 같은 타이밍 문제가 있습니다. 오디오 하드웨어/소프트웨어 회사에 상당한 돈이 가치가 있다고 확신합니다.

8
Dan Harper

이것은 결코 쉬운 문제가 아닙니다. 나는 당신에게 개요를 제공하려고 노력할 것입니다.

할 수있는 일은 다음과 같습니다.

  1. 예를 들어 5 밀리 초의 블록에 대한 신호의 평균 (루트 제곱 평균) 음량을 계산합니다. (이전에 한 번도 해 본 적이 없지만, 좋은 블록 크기가 무엇인지 알 수 없습니다.)
  2. FFT 알고리즘을 사용하여 "차단 된"신호의 푸리에 변환을 수행하십시오.
  3. 변환 된 신호에서 가장 큰 크기의 구성 요소를 찾으십시오.

푸리에 변환은 기본적으로 신호에 존재하는 모든 주파수의 강도를 계산하는 방법입니다. "차단 된"신호에 대해 그렇게하면 비트의 주파수가 가장 좋을 것입니다.

일반적으로 BPM에 대한 정보가 가장 많은 특정 주파수 (베이스와 같은)에 초점을 맞추려면 먼저 필터를 적용해야합니다.

6
Thomas

이 라이브러리는 분당 비트 를 감지하기 위해 상당히 견고한 구현을하는 것으로 나타났습니다. http://soundtouchdotnet.codeplex.com/

http://www.surina.net/soundtouch/index.html 을 기반으로합니다. 이는 꽤 많은 DJ 프로젝트에서 사용됩니다 http://www.surina.net/soundtouch/ applications.html

5
eandersson

우선 Hallgrim이 생산하는 것은 전력 스펙트럼 밀도 기능이 아닙니다. 모든 신호의 통계주기는 자기 상관 함수를 통해 가져올 수 있습니다. 자기 상관 신호의 푸리에 변환은 전력 스펙트럼 밀도입니다. 0Hz 이외의 PSD에서 지배적 인 피크는 신호의 유효주기 (Hz)에 해당합니다.

1
pete

BASS 오디오 라이브러리와 BASS.NET 래퍼를 확인하는 것이 좋습니다. BPMCounter 클래스가 내장되어 있습니다.

이 특정 기능에 대한 자세한 내용은 http://bass.radio42.com/help/html/0833aa5a-3be9-037c-66f2-9adfd42a8512.htm 에서 찾을 수 있습니다.

0
Matt Williams

가장 쉬운 방법은 사용자가 비트와 함께 리듬으로 버튼을 탭하고 탭 수를 시간으로 나눈 값을 세는 것입니다.

0
Lucius Kwok