노래의 템포 / BPM을 프로그래밍 방식으로 어떻게 결정할 수 있습니까? 일반적으로 사용되는 알고리즘은 무엇이며 고려해야 할 사항은 무엇입니까?
답변:
이것은 단일 StackOverflow 게시물에서 설명하기 어렵습니다. 일반적으로 가장 간단한 비트 감지 알고리즘은 감지하기 쉬운 사운드 에너지의 피크를 찾는 방식으로 작동합니다. 보다 정교한 방법은 콤 필터 및 기타 통계 / 파형 방법을 사용합니다. 코드 샘플을 포함한 자세한 설명은 이 GameDev 기사를 확인 하십시오 .
검색 할 키워드는 "비트 감지", "비트 추적"및 "음악 정보 검색"입니다. 여기에 많은 정보가 있습니다 : http://www.music-ir.org/
비트 감지 성능에 대해 다양한 알고리즘을 테스트하는 MIREX라는 (아마도) 연례 콘테스트가 있습니다.
http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/
테스트 할 알고리즘 목록이 표시됩니다.
고전적인 알고리즘은 Beatroot (google it)로 멋지고 이해하기 쉽습니다. 다음과 같이 작동합니다.
내 경험상이 알고리즘의 단점 :
다음 은 스펙트럼 플럭스 (하단의 검은 색 선)와 시작 (녹색 원)을 보여주는이 알고리즘의 라이브 버전 데모입니다. 비트가 녹색 원 에서만 추출된다는 사실을 고려할 가치가 있습니다. 나는 클릭처럼 시작을 재생했고, 솔직히 그들로부터 비트를들을 수 없다고 생각한다. 그래서 어떤면에서이 알고리즘은 비트 감지에있는 사람들보다 낫다. 나는 그러한 저 차원 신호에 대한 감소가 약한 단계라고 생각합니다.
귀찮게도 몇 년 전에 비트 감지를위한 많은 알고리즘과 코드가있는 아주 좋은 사이트를 찾았습니다. 나는 그것을 완전히 정제하지 못했습니다.
다음은 시작하는 데 도움이되는 몇 가지 훌륭한 링크입니다.
비트 추출은 음악에서인지 적 지표 구조의 식별을 포함합니다. 예를 들어, 대부분의 음악에는 실신 수준이 있습니다. 즉, 우리가 인식하는 "발 두드리기"비트가 물리적 소리의 존재와 일치하지 않음을 의미합니다. 이것은 물리적 소리를 감지하는 시작 감지 와 는 완전히 다른 필드 이며 다른 방식으로 수행됨을 의미합니다.
시작 및 비트 추출 도구를 모두 제공하는 일반 C 라이브러리 인 Aubio 라이브러리를 사용해 볼 수 있습니다.
온라인 Echonest API 도 있지만 웹 사이트에 MP3를 업로드하고 XML을 검색하는 작업이 포함되므로 적합하지 않을 수 있습니다.
편집 : 나는 지난 밤에 이것을 보았습니다. 내가 직접 사용하지는 않았지만 매우 유망한 C / C ++ 라이브러리입니다. Vamp 플러그인
관심있는 연구의 일반적인 영역은 음악 정보 검색입니다.
이를 수행하는 다양한 알고리즘이 있지만 모두 기본적으로 ONSET DETECTION을 중심으로합니다.
시작 감지는 이벤트의 시작을 측정하며이 경우 이벤트는 재생중인 음표입니다. 가중 푸리에 변환 (High Frequency Content)의 변화를 찾을 수 있으며, 스펙트럼 콘텐츠의 큰 변화를 찾을 수 있습니다. (스펙트럼 차이). (더 자세히 살펴볼 것을 권장하는 몇 가지 논문이 있습니다.) 시작 감지 알고리즘을 적용하면 임계 값을 통해 비트가있는 위치를 선택합니다.
비트의 시간 현지화를 얻은 후에 사용할 수있는 다양한 알고리즘이 있습니다. 그것을 펄스 트레인으로 바꿀 수 있습니다 (항상 0 인 신호를 만들고 비트가 발생할 때만 1 인 신호를 생성). 그런 다음 FFT를 적용하면 BAM이 이제 가장 큰 피크에서 발생 주파수를 갖게됩니다.
다음은 올바른 방향으로 안내하는 몇 가지 문서입니다.
http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf
http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf
다음은 일부 사람들이 논의하는 내용에 대한 확장입니다.
누군가가 기계 학습 알고리즘을 적용하는 방법을 언급했습니다. 기본적으로 시작 감지 기능 (위에서 언급)에서 여러 기능을 수집하고 신경망 / 로지스틱 회귀에서 원시 신호와 결합하고 비트를 만드는 요소를 학습합니다.
Andrew Ng 박사를 살펴보십시오. 그는 Stanford University에서 온라인으로 무료 머신 러닝 강의를 제공합니다 (긴 바람의 비디오 강의가 아니라 실제로 온라인 원격 강의가 있습니다).
프로젝트에서 파이썬 코드와 상호 작용할 수 있다면 Echo Nest Remix API 는 매우 매끄러운 파이썬 용 API입니다.
analysis.tempo
BPM을 제공 하는 방법 이 있습니다. API 문서 또는 이 튜토리얼 에서 볼 수 있듯이 단순한 BPM보다 훨씬 더 많은 일을 할 수 있습니다.
푸리에 변환을 수행 하고 전력 스펙트럼에서 피크를 찾습니다. 사람의 청력을 위해 20Hz 컷오프 미만의 피크를 찾고 있습니다. 일반적으로 0.1-5Hz 범위에서 관대하다고 생각합니다.
도움이 될만한 질문 : Bpm 오디오 감지 라이브러리
또한 다음은 SO에 대한 몇 가지 "피크 찾기"질문 중 하나입니다. 측정 된 신호의 피크 감지
편집 : 내가 오디오 처리를하는 것은 아닙니다. 파일의 주파수 도메인 속성을 찾고 있다는 사실에 근거한 추측 일뿐입니다.
또 다른 편집 : mp3와 같은 손실 압축 형식은 처음에 시간 도메인 데이터가 아닌 푸리에 도메인 데이터를 저장한다는 점에 주목할 가치가 있습니다. 약간의 영리함으로 무거운 계산을 절약 할 수 있지만 cobbal의 사려 깊은 의견을 참조하십시오.
내 답변을 다시 게시하려면 : 쉬운 방법은 사용자가 비트에 맞춰 리듬에 맞춰 버튼을 탭하게하고 탭 수를 시간으로 나눈 값을 세는 것입니다.
BPM을 얻는 방법에는 여러 가지가 있지만 가장 효과적인 방법은 "비트 스펙트럼"( 여기에서 설명 )입니다. 이 알고리즘은 음악의 짧은 샘플을 다른 샘플과 비교하여 유사성 매트릭스를 계산합니다. 유사성 행렬이 계산되면 각 시간 간격 T에 대해 모든 샘플 쌍 {S (T); S (T + 1)} 사이의 평균 유사성을 얻을 수 있습니다. 이것이 비트 스펙트럼입니다. 비트 스펙트럼의 첫 번째 높은 피크는 대부분의 경우 비트 지속 시간입니다. 가장 좋은 점은 음악 구조 나 리듬 분석과 같은 작업도 할 수 있다는 것입니다.