Chordity v1.11.10 도움말 Chordity 열기

Chordity 도움말

Chordity는 어떻게 박과 코드를 찾나요?

Chordity가 음악에서 박, 마디, 코드, 조성을 찾아내는 원리와 그 판단의 근거, 그리고 결과를 확인하고 바로잡는 방법을 정리했습니다.

실수할 수 있는 이유와 확인하는 법

Chordity는 소리를 자동으로 분석하므로 틀릴 수 있습니다. 중요한 부분은 귀로 들어 다시 한번 확인해 주세요.

Chordity는 미리 학습된 인공지능 모델을 쓰지 않습니다. 소리의 물리와 음악 이론을 수식으로 옮긴 수학 모델, 곧 신호 처리와 확률 추론으로 음악을 분석합니다. 박, 마디의 첫 박, 코드, 조성은 모두 소리에서 가장 그럴듯한 답을 고른 추정입니다. 녹음 상태, 편곡, 연주 방식에 따라 추정은 흔들릴 수 있습니다.

대신 판단의 근거는 모두 드러나 있습니다. 앱의 분석 정보에서 곡마다 템포 후보, 정박 판정, 조성 판정의 근거를 볼 수 있고, 이 도움말에는 그 판단에 쓰인 원리와 수식, 검증 결과를 담았습니다.

자주 틀리는 경우와 바로잡는 법

대부분은 앱의 박이 안 맞나요? 보정하기에서 버튼 하나로 고칠 수 있습니다. 보정은 다시 분석하지 않고 곧바로 반영됩니다.

이렇게 보이면왜 그런가요이렇게 하세요
클릭이 너무 촘촘하거나 드문드문하다음악에는 8분음표, 4분음표, 2분음표 층위의 주기가 모두 있고, 어느 층위를 박으로 느끼는지는 듣는 사람에 따라 다릅니다.절반으로 ÷2 또는 두 배 빠르게 ×2. 6/8·12/8 곡이 8분음표마다 치면 셋씩 묶기 ÷3
클릭이 박과 박 사이에 들린다하이햇이나 엇박 반주가 강하면 박의 줄이 반 박 밀려 잡힐 수 있습니다.½박 옮기기
마디가 시작되는 곳이 한 박 어긋났다코드가 두 박마다 바뀌면 마디 첫 박의 흔적이 약해집니다.한 박 앞당기기, 한 박 늦추기, 필요하면 박자를 직접 지정
텐션 코드가 단순하게 적힌다9·11·13 텐션, 6화음, add9, 파워 코드는 코드 어휘에 없어 가까운 3화음이나 7화음으로 적습니다.코드 연주를 켜고 원곡과 겹쳐 들어 보세요. 코드 종류를 "확장"으로 바꾸면 sus2, aug, m7♭5, dim7까지 찾습니다.
Cm7이 E♭이나 E♭maj7로 적힌다구성음이 같거나 거의 같은 코드(Cm7과 E♭6, Cm9와 E♭maj7)는 베이스음이 유일한 단서입니다.베이스 소리를 들어 가장 낮은 음을 확인하세요.
조성이 나란한 장·단조로 나온다C 장조와 A 단조처럼 같은 음을 쓰는 조성은 헷갈리기 쉽고, 로마 숫자가 통째로 달라집니다.위쪽 조성 칸과 분석 정보의 조성 판정을 확인하세요.
짧은 전조가 표시되지 않는다전조는 대략 6마디(24박) 이상 이어질 때만 표시합니다. 잠깐 스쳐 가는 다른 조의 화음을 전조로 오해하지 않기 위해서입니다.그 구간의 코드를 직접 들어 확인하세요.
템포가 크게 흔들리는 곳에서 박을 놓친다곡 중간의 템포 변화는 새 템포가 10초 넘게 이어질 때 따라갑니다. 몇 초짜리 급변과 심한 루바토에는 한두 박 늦게 따라갑니다.해당 구간은 클릭보다 원곡을 기준으로 들어 주세요.
마디가 두 배로 길게 적힌다보사노바처럼 두 박 단위로 느끼는 곡이나, 드럼 모양으로 가를 수 없는 아주 빠른 곡(160 BPM 이상)은 박을 한 층위 느리게 잡을 수 있습니다.두 배 빠르게 ×2
파워 코드(E5)가 E나 Em으로 나온다파워 코드는 곡 안에서 충분히 자주 나올 때만 적습니다(발라드의 sus4 오판 방지). 디스토션이 아주 강하면 3음 대역까지 채워져 3화음으로 읽힙니다.원곡의 기타 소리를 들어 3음이 없는지 확인하세요.
느린 곡이 12/8, 4/3배 빠른 템포로 나오고 코드가 마디 중간에 들쭉날쭉 놓인다16분음표로 쪼개지는 느린 곡에서 16분음표 셋(점8분음표)을 한 박으로 잡은 경우입니다. 1.11.5부터 근거가 뚜렷하면 4/3배 느린 템포로 다시 잡지만(분석 정보의 '4:3 박 단계'), 근거가 약하면 그대로 남습니다. 분석 정보의 템포 후보에 맞는 템포(예: 69)가 보이면 이 경우입니다.보정 버튼으로는 고칠 수 없습니다(알려진 한계)
8분음표가 고른 곡(기타 반주 등)이 12/8·6/8, 실제의 2/3배 템포로 나온다8분음표 셋(점4분음표)을 한 박으로 잡은 경우입니다. 1.11.6부터 근거가 뚜렷하면 3/2배 빠른 템포로 다시 잡지만(분석 정보의 '4:3·3:2 박 단계'), 근거가 약하면 그대로 남습니다.보정 버튼으로는 고칠 수 없습니다(알려진 한계)
박자 변화가 표시되지 않는다새 박자가 4마디 이상 이어질 때만 박자 변화로 적습니다. 한두 마디짜리 변박은 불규칙 마디로 두고 차트에 "3박"처럼 표시합니다.차트의 "3박" 같은 표시를 참고하세요.
슬래시 코드가 너무 많다경과음이 많은 베이스 라인은 자리바꿈(G/B 등)으로 읽힐 수 있습니다.코드 종류에서 "베이스음 표기"를 끄면 기본형으로 적습니다.

잘못 잡은 박 단계(두 배·절반)와 엇박은 자동으로도 검증합니다. 자세한 기준은 진짜 박인지 확인하기에 있습니다.

귀로 확인하는 가장 빠른 방법

  • 코드 연주를 켜고 원곡과 겹쳐 듣기. 피아노는 분석에서 찾은 곡의 기준음에 맞춰 조율되므로, 코드가 맞으면 원곡과 자연스럽게 섞이고 틀리면 부딪쳐 들립니다. P 키로 켜고 끕니다.
  • 메트로놈으로 박 확인하기. 클릭이 킥과 스네어에 겹치는지, 크게 울리는 첫 박 클릭이 마디 시작에 오는지 들어 보세요. M 키로 켜고 끕니다.
  • 다른 표기로 보기. 차트 위 코드 표기 막대에서 카멜롯을 고르면 조성 번호에서 멀리 떨어진 코드가, 로마 숫자를 고르면 ♭·♯이 붙거나 V/x 로 적힌 코드가 조성 밖의 화음입니다. 틀린 코드는 대개 이런 곳에 숨어 있습니다.
  • 마디를 눌러 그 자리부터 듣기. 의심 가는 마디를 누르면 그 마디부터 재생됩니다. ← →로 한 마디씩 옮겨 다닐 수 있습니다.

분석 정보 읽는 법

앱 아래쪽의 분석 정보에는 곡마다 판단 근거가 나옵니다.

항목뜻
분석 시간파일을 분석하는 데 걸린 시간입니다.
원본파일의 샘플레이트, 채널 수, 길이입니다.
기준음녹음의 A4 주파수와, 440 Hz에서 벗어난 정도(cent)입니다. 코드 연주 피아노도 이 음높이에 맞춥니다.
템포 후보박 주기로 가장 그럴듯한 템포 세 개와, 1위 대비 점수입니다. 두 배나 절반 관계인 후보의 점수가 비슷하면 박 단계가 헷갈리기 쉬운 곡입니다.
정박 검증박 위치와 반 박 위치에서 킥·스네어·화성 변화가 얼마나 강한지 비교한 값입니다. 반 박 쪽이 뚜렷하게 강하면 반 박 옮겨 교정합니다.
박 단계 검증8분음표를 박으로 잡았는지(두 배), 2분음표를 박으로 잡았는지(절반) 판정한 결과와 근거입니다.
4:3·3:2 박 단계박이 셋으로 쪼개져 보이는 곡에서만 나옵니다. 점8분음표(16분음표 셋)를 박으로 잡았다고 보고 4/3배 느린 템포로(1.11.5), 또는 8분음표 셋을 박으로 잡았다고 보고 3/2배 빠른 템포로(1.11.6) 다시 잡았는지, 다시 잡은 박을 스네어 자리로 반 박 옮겼는지입니다.
박 세분한 박이 둘로 나뉘는지(2분할), 셋으로 나뉘는지(3분할: 6/8, 12/8 같은 겹박자)입니다.
박자 판정2·3·4·5·7박(겹박자면 4와 2) 가정에서 마디 첫 박 증거가 얼마나 뚜렷한지(대비도)입니다. 값이 클수록 그 박자가 분명합니다.
조성 상관곡의 음 분포가 고른 조성의 전형적인 분포와 얼마나 닮았는지입니다. 1에 가까울수록 조성이 분명합니다.
조성 변화전조가 있으면 몇 마디 몇 박, 몇 분 몇 초부터 무슨 조인지입니다.
박자 변화곡 중간에 박자가 바뀌면 몇 마디부터 어떤 박자인지입니다. 차트에는 검은 이름표("3/4으로")로 나옵니다. 곡 첫 마디에는 시작 박자("4/4")가 조사 없이 붙습니다.
템포 변화템포가 갑자기 바뀐 곳과 새 템포, 그리고 서서히 바뀐 구간(몇 마디 몇 박부터 어디까지, 몇에서 몇으로)입니다. 차트에는 곡 첫 박에 시작 템포("72"), 갑자기 바뀐 곳에 흰 알약("132로", "63으로")이, 서서히 바뀐 구간에 흰 육각형 틀이 나옵니다.
카멜롯조성의 카멜롯 휠 번호입니다.
비트 수곡 전체에서 찾은 박의 개수입니다.

원리

Chordity는 소리를 아주 짧은 조각으로 나눠 들여다보고, "음악은 대개 이렇게 흘러간다"는 규칙을 확률로 넣어 곡 전체에서 가장 그럴듯한 해석을 고릅니다. 그래서 판단 하나하나를 설명할 수 있습니다.

소리를 그림으로 바꾸기

녹음 파일은 공기의 떨림을 1초에 수만 번 잰 숫자의 나열입니다. 이것을 아주 짧은 조각으로 잘라 조각마다 어떤 높이의 소리가 얼마나 섞여 있는지(스펙트럼)를 계산하고, 시간 순으로 늘어놓으면 가로가 시간, 세로가 음높이인 소리의 그림(스펙트로그램)이 됩니다. 이후의 분석은 모두 이 그림을 읽는 일입니다.

조각을 짧게 자르면 언제 소리가 났는지는 정확하지만 무슨 음인지는 흐려지고, 길게 자르면 그 반대입니다. 그래서 박을 찾을 때는 짧은 조각(46 ms)을, 코드를 찾을 때는 긴 조각(0.19초, 베이스는 0.37초)을 따로 씁니다.

박 찾기

드럼을 치거나 건반을 누르면 그 순간 소리 에너지가 갑자기 늘어납니다. 이런 순간(온셋)들이 일정한 간격으로 반복되는 뼈대가 박입니다. 먼저 온셋 곡선을 자기 자신과 밀어 겹쳐 보며(자기상관) 가장 잘 겹치는 간격, 곧 템포를 찾습니다. 그다음 "강한 온셋은 최대한 많이 지나가면서 간격은 크게 흔들리지 않는" 박의 줄을 곡 전체에 걸쳐 한 번에 찾습니다(동적 계획법).

간격의 기준은 곡 전체의 템포가 아니라 몇 초 단위로 구한 국소 템포입니다. 그래서 필인처럼 잠깐 리듬이 복잡해지는 곳에는 끌려가지 않고, 곡이 실제로 느려지거나 빨라지면 따라갑니다. 곡 중간에 템포가 크게 바뀌면(예: 96에서 132로) 그 지점을 찾아 구간마다 따로 따라가는데, 원래 템포가 계속 지지를 받는 동안에는 넘어가지 않아 템포가 일정한 곡의 결과는 바뀌지 않습니다. 재생하는 동안 화면 위 템포는 그 자리의 템포를 따라 움직이고(스크롤해도 화면 맨 위에 고정되는 재생 막대에도 같은 값이 나옴), 템포가 갑자기 바뀐 곳에는 흰 알약으로 새 템포를 적습니다. 템포가 서서히 바뀌는 구간에는 흰 육각형 틀이 그 길이만큼 걸쳐 있고, 틀 안에는 평소 "여기까지 63"처럼 도착 템포가, 재생 위치가 틀 안에 있으면 "현재 67"처럼 지금 템포가 나옵니다. 틀과 흰 알약은 슬래시 아래 줄에 있어 슬래시를 가리지 않고, 재생 중에는 틀이 지나온 만큼 형광펜 색으로 차며, 다 바뀐 박에서는 흰 알약이 잠깐 켜집니다. 알약과 틀은 화면 폭에 맞춰 서로 겹치지 않게 놓여, 알약끼리 가까우면 조금 비켜 서고 틀은 알약에 닿는 쪽 끝이 줄어듭니다.

진짜 박인지 확인하기

엇박을 박으로 잡는 경우. 킥, 스네어, 베이스가 들어오는 순간과 코드가 바뀌는 순간은 대부분 정박에 몰립니다. 그래서 찾은 박 위치와 반 박 옮긴 위치에서 이런 사건들의 세기를 비교하고, 반 박 쪽이 분명히 강하면 박의 줄을 반 박 옮깁니다.

템포를 두 배나 절반으로 잡는 경우. 박을 하나씩 걸러 두 무리로 나눠 봅니다. 제 템포라면 킥(1·3박)과 스네어(2·4박)가 서로 다른 무리에 오고, 8분음표를 박으로 잡았다면 둘 다 같은 무리(진짜 박)에 몰립니다. 이 경우 새 템포로 처음부터 다시 추적합니다. 반대로 박 사이 한가운데마다 스네어가 규칙적으로 오면 너무 느리게 잡은 것입니다. 두 배로 늘리는 쪽은 틀리면 곧바로 엇박 클릭이 생기므로 훨씬 엄격한 조건에서만 합니다.

빠른 곡을 절반으로 잡는 두 가지 모양. 160~180 BPM쯤 되는 빠른 곡은 절반 템포로 잡기 쉽습니다. 느린 박이 스네어(2·4박)에 앉으면 박 위마다 스네어가 고르게 오고 킥은 박 사이에 옵니다. 제 템포의 느린 곡이라면 킥이 박 위에 오므로 나오지 않는 모양입니다. 느린 박이 킥에 앉으면(하프타임 느낌) 박 사이에도 스네어가 박 위만큼 옵니다. 두 경우 모두 템포 추정이 두 배 템포를 거의 같은 세기의 후보로 낼 때만 두 배로 고칩니다. 절반으로 줄이는 쪽은, 박 사이에도 킥·베이스 같은 저음이 자주 오거나(8분음표를 박으로 잡았다면 박 사이는 16분음표 자리라 저음이 드묾) 스네어가 킥의 반대쪽 박에 몰려 있으면(백비트) 제 박으로 보고 줄이지 않습니다.

스네어를 알아보는 방법은 물리적입니다. 스네어 밑면의 줄이 떨리면 중간 높이부터 아주 높은 소리까지 한꺼번에 커지지만, 건반 음은 몇몇 높이에서만, 하이햇은 높은 쪽에서만 커집니다. 그래서 중간 대역과 높은 대역이 함께 오를 때만 커지는 값(두 값의 기하평균)으로 스네어를 골라냅니다.

마디 나누기

마디의 첫 박에는 흔적이 남습니다. 코드와 베이스가 바뀌고, 킥이 세게 들어가고, 소리가 커지기도 합니다. 박마다 이런 흔적에 점수를 매기고, "마디는 같은 길이로 반복된다"는 규칙을 지키면서 점수가 가장 높은 묶음을 찾습니다. 2·3·4·5·7박 가운데 어느 쪽이 더 잘 맞는지도 이렇게 정하고(마디 길이를 억지로 늘이거나 줄여야 맞는 박자는 버림), 한 박이 셋으로 쪼개지는 느낌이 강하면 6/8, 12/8 같은 겹박자로 봅니다. 드물게 길이가 다른 마디도 허용해 변박이나 잘린 마디에서 경로가 무너지지 않게 합니다. 곡 중간에 박자가 바뀌어 새 박자가 4마디 이상 이어지면 그 마디부터 새 박자로 적습니다.

드럼이 백비트를 치는 곡에서는 킥은 1·3박, 스네어는 2·4박이라는 짝·홀 모양도 첫 박의 흔적으로 씁니다. 코드가 마디 첫 박보다 8분음표 먼저 바뀌는 당김 리프에서는 코드 바뀜의 흔적이 한 박 앞으로 끌려가지만, 드럼의 짝·홀 모양은 그대로라 마디가 한 박 밀리지 않습니다. 3·5·7박은 첫 박의 흔적이 실제로 그 길이마다 되풀이될 때만 고릅니다.

코드 알아내기

옥타브가 다른 같은 음은 화음에서 같은 역할을 하므로, 모든 음을 도, 도♯ … 시의 12칸으로 접으면 그 순간 울리는 음들의 지문(크로마)이 생깁니다. 실제 악기는 한 음만 내지 않고 한 옥타브 위의 도, 그 위의 솔 같은 배음을 함께 내기 때문에, 코드의 지문도 배음까지 포함해 만들어 두고 비교합니다. 그러지 않으면 C 코드의 미에서 나온 배음(시) 때문에 C를 Cmaj7으로 착각합니다.

가장 낮은 음(베이스)은 따로 봐서 C/E 같은 자리바꿈을 적습니다. 녹음마다 기준음이 조금씩 다르므로(A4가 440 Hz가 아닌 곡도 많습니다) 곡 전체 음들의 평균적인 어긋남을 먼저 재고 그만큼 보정합니다.

음악의 규칙을 확률로

박마다 가장 비슷한 코드를 고르기만 하면 멜로디의 지나가는 음 때문에 코드가 깜빡이듯 바뀝니다. 그래서 "코드는 자주 바뀌지 않는다", "바뀐다면 마디 첫 박에서 가장 잘 바뀐다"는 상식을 확률로 넣고, 소리와의 닮음과 함께 따져 곡 전체에서 가장 그럴듯한 코드 순서를 한 번에 고릅니다(은닉 마르코프 모델과 비터비 알고리즘). 박자, 첫 박, 조성도 같은 방식으로 풉니다.

조성과 전조

조성은 "주로 어떤 음들이 쓰이는가"로 드러납니다. 비트마다 앞뒤 몇 마디의 음 분포를 24개 조성의 전형적인 분포와 비교하고, "조는 잘 바뀌지 않는다"는 규칙을 넣어 조성의 흐름을 찾습니다. 조표가 같은 나란한 장·단조(C 장조와 A 단조) 사이의 이동과 한두 마디 스쳐 가는 다른 조의 화음은 전조로 치지 않습니다. 코드로 조를 다시 정한 뒤 이웃한 구간이 같은 조이거나 나란한 장·단조로 갈리면 한 구간으로 합치고, 나란한 장·단조로 갈린 곡은 장·단조가 애매한 곡이라 합친 구간에서 단조가 뚜렷이 앞설 때만 단조로 적습니다(대중음악은 장조가 흔함).

코드를 인식한 뒤에는 코드로 조성을 다시 확인합니다. 코드들이 어느 음계에 들어맞는지, 으뜸화음이 얼마나 오래 나오는지, V → I 마침, 처음과 마지막 코드, 4마디 악구의 첫 코드를 음 분포와 함께 봅니다. 새 조의 딸림화음(예: E 장조의 B7)을 거쳐 넘어가면 악보의 관례대로 새 으뜸화음이 나오는 자리를 전조 위치로 봅니다. 이렇게 다시 정한 조가 이웃한 구간끼리 같으면 한 구간으로 합쳐, 조가 바뀌지 않았는데 전조로 적히는 일이 없게 합니다. 한 구간이 고른 조가 이웃 구간의 조(또는 그 나란한 조)와 코드 점수로 거의 동점(0.1 미만 차이)이면 그 구간도 이웃의 조로 봅니다(1.11.1). 근거가 거의 없는 전조 하나가 곡 전체의 조 이름을 연쇄로 어긋나게 하는 것을 막습니다. 곡 첫 조성 구간이 8마디 이하이고 다음 구간의 버금딸림·딸림 조이면(도입부가 iv나 V에서 시작한 경우) 다음 조에 합치고, 전조가 있는 곡은 조 이름을 가장 긴 구간의 장·단으로 맞춰 한 온음 위로의 전조가 "C 단조 → D 단조"처럼 보이게 적습니다(1.10.3). 끝으로 전조 경계 뒤 2마디 안에서, 코드 구성음이 앞 조 음계에 더 잘 드는 코드(앞 조의 V7 등)는 앞 조에 남도록 경계를 마디 첫 박 단위로 미루고, 새 조의 첫 마디가 절반 이상 쉼(N.C.)이고 새 으뜸화음이 아직 없으면 그 마디는 다음 악절의 못갖춘 시작으로 보고 다음 마디부터 새 조로 적습니다(1.10.4, 1.10.5).

어긋나지 않는 메트로놈

이 메트로놈은 일정한 간격으로 치지 않고, 찾아낸 박 하나하나의 시각에 칩니다. 연주가 조금 빨라지거나 느려져도 따라갑니다. 클릭은 타이머가 아니라 음악을 재생하는 오디오 장치의 시계에 0.2초 앞서 예약해 두므로, 음악과 샘플 하나 단위로 맞물립니다. 마디 첫 박은 높은 "띡", 나머지 박은 "딱"이고, 코드 변화 단위를 ½박으로 하면 박 사이(8분음표 자리)에 작고 높은 "틱"이 더해져 "띡-틱-딱-틱-딱-틱-딱-틱"처럼 칩니다. 블루투스처럼 출력이 늦는 장치에서도 음악과 클릭이 함께 늦게 나와 서로는 어긋나지 않습니다.

코드를 피아노로 들려주기

녹음된 피아노 소리를 쓰는 대신, 피아노 현의 물리를 흉내 내어 소리를 직접 만듭니다. 뻣뻣한 강철 현이라 배음이 정수배보다 조금씩 높게 울리고(비조화성), 해머가 현 길이의 1/7쯤을 때려 그 지점에서 움직이지 않는 배음은 약하게 울립니다. 한 음을 두세 가닥의 현이 함께 내어 소리가 천천히 일렁이고(맥놀이), 처음엔 빨리 줄다가 나중엔 오래 남는 두 단계 감쇠가 생깁니다. 피아노는 곡의 기준음에 맞춰 조율되고, 메트로놈과 같은 시계에 예약되어 코드가 바뀌는 순간에 정확히 울립니다.

분석 과정

분석은 파일을 열 때 한 번 하는 무거운 단계와, 보정이나 설정을 바꿀 때마다 다시 하는 가벼운 단계로 나뉩니다. 가벼운 단계는 5분짜리 곡도 수십 ms라서 버튼을 누르는 즉시 반영됩니다.

두 단계로 나눈 흐름

파일을 열 때 한 번
  1. 디코딩브라우저가 파일을 PCM으로 풀고, 이 버퍼 하나를 재생과 분석에 함께 씁니다(두 시간축이 어긋나지 않게).
  2. 지연 0 리샘플22,050 Hz(리듬용)와 11,025 Hz(화성용) 신호를 만듭니다. 필터가 좌우 대칭이라 한 샘플도 밀리지 않습니다.
  3. 리듬 특징저·중·고역별 스펙트럴 플럭스와 음량.
  4. 화성 특징스펙트럼 피크, 기준음, 트레블·베이스 크로마, 화성 변화 곡선.
  5. 템포자기상관 콤 점수 × 선호 분포.
  6. 비트 추적국소 템포를 따르는 동적 계획법, 온셋 정점에 맞춤.
  7. 검증정박 위상, 박 단계(두 배나 절반이면 새 템포로 다시 추적), 박이 셋으로 쪼개져 보이면 4/3배 느린 템포와 3/2배 빠른 템포.
보정·설정을 바꿀 때마다
  1. 보정 적용½박, ×2, ÷2, ÷3, 첫 박 이동, 박자 지정.
  2. 조성과 전조조표 단위로 조성 구간을 나눕니다.
  3. 박자와 첫 박첫 박 증거와 마디 위치 모델.
  4. 코드자리바꿈을 포함한 코드 모델, 코드로 조성 다시 확인.
  5. 마디와 표기마디 구성, 음이름·카멜롯·로마 숫자.

단계별 주요 값

단계주요 값
리듬 분석 창1024점(46.4 ms), 홉 256점(11.6 ms, 초당 86.13 프레임). 저역 21–200 Hz, 중역 200–2,500 Hz, 고역 2.5–10 kHz
화성 분석 창트레블 2048점(186 ms, 110–4,200 Hz, 피크 36개), 베이스 4096점(372 ms, 32–1,400 Hz, 피크 24개)
소리 구간큰 음량(상위 5%) 대비 −38 dB 이상
템포 범위40–300 BPM을 0.25 간격으로, 110 BPM 중심의 선호 분포
비트 정밀화±2프레임(±23 ms) 안의 온셋 정점, 검출 지연 6.5 ms 보정
조성 추적앞뒤 ±6박 창, 조 바꿈 벌점 6, 최소 구간 24박
코드 상태 수기본 73개, 표준 241개, 확장 289개(자리바꿈과 코드 없음 포함)
메트로놈 예약25 ms마다 깨어나 0.2초 앞까지 예약(탭이 뒤에 있으면 1.5초)

알고리즘과 수식

원리를 실제로 계산하는 식입니다. F=22050/256≈86.13 은 리듬 프레임률(프레임/초), τ 는 박 주기(프레임), bi 는 i 번째 비트 시각(초)입니다.

신호 준비

재생 버퍼를 직접 리샘플링해 분석과 재생의 시간축을 일치시킵니다. 블랙맨 창을 씌운 싱크 필터는 좌우 대칭이라 위상 지연이 0입니다.

y[n]=∑j=02W−1x[in−W+1+j]h(ϕn+W−1−j)
h(u)=2fcsinc(2fcu)w(uW+1),w(r)=0.42+0.5cosπr+0.08cos2πr,fc=0.46min(1,foutfin)

N 점 실수 신호의 푸리에 변환은 N/2 점 복소 FFT 한 번으로 계산합니다(z[m]=x[2m]+ix[2m+1], Z 는 그 FFT).

X[k]=Fe[k]+e−2πik/NFo[k],Fe[k]=12(Z[k]+Z*[N/2−k]),Fo[k]=−i2(Z[k]−Z*[N/2−k])

Z* 는 켤레복소수입니다.

온셋: 대역별 스펙트럴 플럭스

스펙트럼을 로그로 압축해 조용한 소리의 변화도 드러나게 하고, 두 프레임 전의 스펙트럼을 주파수 방향으로 넓혀 비교해 비브라토를 온셋으로 착각하지 않게 합니다. 커진 양만 더하므로 잔향의 감쇠는 가짜 온셋을 만들지 않습니다.

Y(t,k)=ln(1+λ·4N|X(t,k)|),λ=1000
Δ(t,k)=max(0,Y(t,k)−max|ν|≤1Y(t−2,k+ν)),fb=1|Bb|∑k∈BbΔ(t,k)
O(t)=flow(t)σlow+fmid(t)σmid+12fhigh(t)σhigh

고역을 절반만 반영해 엇박 하이햇의 영향을 줄입니다.

템포

온셋을 ±3초 음량으로 평준화한 E(t) 의 자기상관에서, 박 주기의 1~4배 지연을 함께 보는 콤 점수에 선호 분포를 곱해 템포 v 를 고릅니다.

r(ℓ)=1n−ℓ∑t=0n−ℓ−1E(t)E(t+ℓ)
J(v)=π(v)·max(0,∑k=14ckmax|δ|≤δkr~(kτv+δ)),π(v)=exp(−12log22v110),c=(1,12,0.33,14)

비트 추적

Ellis(2007)의 동적 계획법을 두 가지 바꿔 씁니다. 간격을 전체 템포 대신 국소 박 주기 τ(t) 와 비교하고, 벌점을 박 주기의 제곱에 비례하게 두어(T=τ/F 초) 느린 곡에서도 같은 ms만큼의 흔들림에 같은 벌점을 줍니다.

C(t)=ℓ(t)+maxτ(t)/2≤d≤2τ(t)[C(t−d)−αln2dτ(t)],α=clip(2000T2,100,1600)

국소 박 주기는 8초 창(1초 간격)의 자기상관 rw 로 구하고, 7개 창의 중앙값으로 필인 같은 순간적인 흔들림을 거릅니다.

τw=argmaxℓ∈[0.85τ,1.15τ](rw(ℓ)+12rw(2ℓ))

찾은 비트는 ±2프레임 안의 온셋 정점으로 옮긴 뒤 포물선 보간하고, 검출 지연 6.5 ms를 보정합니다.

악기가 적은 도입부에서는 마디 끝에 앞당겨 친 강세가 박 사이 온셋보다 훨씬 세서, 박이 본 구간보다 조금 느리게 흘러가며 마디선이 반 박쯤 어긋날 수 있습니다. 그래서 곡 첫 48박 안의 어떤 박부터 그 뒤 8박 주기로 일정하게 거꾸로 이은 격자가 지금 박과 4분의 1박 넘게 벌어지면, 도입부 온셋이 8분음표 자리(정박·엇박 모두)에 얼마나 맞는지로 두 격자를 견주어 거꾸로 이은 격자가 뚜렷이 나을 때만 바꾸고, 마디선도 본 구간 위상을 이어 씁니다(1.10.4).

드럼 없이 시작하는 고정 템포 곡에서는 도입부의 앞당겨 친 16분음표를 박으로 잡아, 박 수는 맞지만 박이 도입부 거의 내내 1/4박쯤 일러질 수 있습니다. 어떤 박 뒤 8박이 고른 템포(±3%)이고 그 격자를 거꾸로 이었을 때 0.15박 넘게 벗어난 박이 있으면, 도입부 온셋이 16분음표 자리에 맞는 정도로 견주어 거꾸로 이은 격자가 낫고 고정 템포 곡이라는 근거(온셋 봉우리 30개 이상, 16분음표 맞춤 0.85 이상)가 있을 때만 도입부 박을 그 격자로 바꿉니다(1.11.7).

t^=j+12·O(j−1)−O(j+1)O(j−1)−2O(j)+O(j+1),b=t^F+6.5ms

정박과 박 단계 검증

정박 검증은 저역·중역·고역 플럭스와 화성 변화 ν 를 섞은 강세 S 를 비트 위치와 반 박 위치에서 비교합니다.

S(t)=1.0flowμlow+0.7fmidμmid+0.2fhighμhigh+0.8νμν,off>1.1·on⇒반 박 옮김

박 단계 검증에는 킥 곡선 K 와, 중역과 고역이 함께 오를 때만 커지는 스네어 곡선 Sn 을 씁니다.

K(t)=flow(t)σlow,Sn(t)=fmid(t)σmid·fhigh(t)σhigh,sX=sgn(Keven−Kodd)·Xeven−XoddXeven+Xodd
교정조건
절반으로짝·홀 박 드럼 세기 비 r2≥2.4, 또는 킥과 스네어가 같은 쪽에 몰림(sK≥0.15, sSn≥0.15, sν>0, r2≥1.3). 110 BPM 이상일 때만
두 배로100 BPM 이하에서, 박 사이 스네어가 박 위 스네어의 1.3배 이상이고 박 위 킥이 박 사이 킥의 2배 이상
두 배로(뒷박형)100 BPM 이하에서, 두 배 템포 후보 세기 c2≥0.8, 박 사이 스네어가 박 위의 0.8배 이하, 박 위 킥이 박 사이의 0.95배 이하, 스네어가 짝·홀 박에 고르게(치우침 0.25 이하)
두 배로(하프타임형)100 BPM 이하에서, c2≥0.85, 박 사이 스네어가 박 위의 0.9배 이상, 박 위 킥이 박 사이의 1~10배

c2 는 템포 후보 가운데 지금 템포의 두 배인 후보의 점수를 1위 점수로 나눈 값입니다. 절반으로 줄일 때는 박 위 킥이 박 사이 킥의 2배 이상이어야 하고, 짝·홀 세기 비만으로 줄일 때는 스네어가 백비트 쪽(sSn≤−0.1)이 아니어야 합니다(1.10.0).

4:3 박 단계 확인(1.11.5). 16분음표가 촘촘한 느린 4/4 곡은 16분음표 셋(점8분음표)마다 온셋이 되풀이되는 것처럼 보여, 템포 선호 분포(110 BPM 중심) 때문에 실제 템포의 4/3배가 뽑히고 12/8로 적힐 수 있습니다. 박이 셋으로 쪼개져 보이면 지금 템포 b 의 3/4 근처(±4%)에서 선호 분포를 곱하기 전 점수 C 가 가장 큰 템포 b′ 로 다시 추적해 보고, 다음을 모두 만족할 때만 바꿉니다.

C(b′)C(b)≥0.93,C(b′)π(b′)C(b)π(b)≥0.85,P′(12)12(P′(13)+P′(23))≥1.4,G=ρ(8)+ρ(16)−ρ(12)−ρ(24)≥0

π 는 템포 선호 분포, P′ 는 새 박으로 잰 박 세분 프로필(새 박이 8분음표 둘로 뚜렷하게 나뉘어야 함), ρ(L) 은 지금 박을 셋으로 나눈 16분음표 격자 위 화음 바뀜 열의 지연 L 자기상관입니다. G 는 화음이 8·16칸(4/4의 반 마디·마디)마다 바뀌면 양수, 6·12칸(12/8의 반 마디·마디)마다 바뀌면 음수입니다. 새 템포는 50~140 BPM이어야 하고, 다시 잡은 박이 킥만 따라 엇박에 붙었으면(박 위 스네어가 박 사이 스네어의 0.9배보다 약하고 킥은 박 위가 셈) 반 박 옮깁니다.

3:2 박 단계 확인(1.11.6). 반대로 8분음표가 고르게 이어지는 곡(독주 기타 반주, 8비트 록 등)은 8분음표 셋(점4분음표)마다 강세가 되풀이되는 것처럼 보여 실제 템포의 2/3배, 12/8·6/8로 잡힐 수 있습니다. 4:3 확인으로 바꾸지 않은 곡은 b 의 3/2 근처(±4%)에서 C 가 가장 큰 템포 b′′ 로 다시 추적해 보고, 다음을 모두 만족할 때만 바꿉니다.

C(b′′)C(b)≥0.93,P′′(12)12(P′′(13)+P′′(23))≥1.4,G≥0.05,S¯(beat)S¯(mid)≥1.05,90≤b′′≤240

넷째 조건은 다시 잡은 박 위치의 강세 S 가 박 사이 가운데보다 5% 넘게 세야 한다는 것으로, 템포는 맞았지만 박이 엇박에 붙은 경우를 거릅니다. 새 템포가 90 BPM보다 느리면(지금 템포 60 BPM 미만) 실제로 느린 셋잇단 발라드가 대부분이라 보지 않습니다. 반 박 옮김 규칙은 4:3 확인과 같습니다.

음높이와 크로마

스펙트럼 피크의 주파수를 MIDI 음번호로 바꾸고, 모든 피크의 반음 소수부 dj 를 원 위에서 평균해 기준음 편차 θ (반음)를 구합니다.

m(f)=69+12log2f440,θ=12πatan2(∑jAjsin2πdj,∑jAjcos2πdj)
C(t,q)=∑j:round(m~j)mod12=qAjw(m~j)cos2(π(m~j−round(m~j))),m~=m−θ

코드 판정

코드의 지문(템플릿)은 구성음마다 배음 6개(반음 오프셋 d=(0,12,19,24,28,31), 세기 0.6h−1)와 베이스 배음의 새어 나옴(ρ=0.25)을 더해 만들고, γ=0.45 제곱으로 압축합니다.

T~(q)=∑p∈chord∑h=160.6h−1[q≡p+dh]+ρ∑h=160.6h−1[q≡pbass+dh]

박(또는 ½박)마다 소리와 템플릿의 닮음에 코드 종류와 자리바꿈의 사전 점수, 조성 가산점, 베이스 음의 일치를 더합니다.

es(c)=β⟨os,Tc⟩+πq+πinv+κ[c⊂key]+ηgs(ln(0.06+b^s(pbass))−ln(0.06+112))

β=30, κ=0.6, η=1.5. 사전 점수는 장·단3화음 0, 7·m7 −0.4, maj7 −0.6, sus4 −1.2, dim −1.3, aug −1.8 등이고, 자리바꿈은 3음 베이스 −0.7, 5음·7음 베이스 −1.0입니다.

코드는 유지하면 벌점 0, 바꾸면 자리에 따라 λs 를 빼는 비터비 알고리즘으로 곡 전체에서 한 번에 고릅니다. 마디 첫 박 1.5, 가운데 박 3.0, 그 밖의 박 4.0, 박 사이(½박) 6.0입니다.

Vs(c)=es(c)+max(Vs−1(c),maxc′Vs−1(c′)−λs)

노래 선율 줄이기(1.11.0). 노래 선율이 화음 대역에 섞이면 공통음이 많은 이웃 코드로 읽히기 쉽습니다. 대중음악 녹음은 보통 노래를 가운데에, 반주를 좌우로 벌려 두므로, 곁 신호 S=(L−R)/2 에서는 노래가 거의 지워집니다. 최종 코드 판정에서는 가운데 신호의 트레블 크로마에 곁 신호의 트레블 크로마를 더하고(가운데에 있어 곁 신호에서 빠지는 베이스 음의 배음은 반 비중으로 되살림), 고른 근음·장단 갈래가 더하기 전과 같으면 7화음·자리바꿈 이름은 더하기 전 쪽을 씁니다. 박·첫 박·박자·조성에는 쓰지 않고, 모노이거나 두 채널이 거의 같은 파일은 그대로입니다.

Ctreble=CM+CS+0.5Cbass→treble,ESEM<10−3⇒CS=0

되풀이 맞추기(1.11.0). 1·2절과 후렴처럼 같은 진행이 되풀이되면 선율과 필인만 바뀝니다. 박마다 트레블·베이스 크로마로 곡 안 유사도를 재고, 8박 창 평균이 곡 안 상위 3%에 드는 자리(16박 이상 떨어지고 마디 안 박 위치가 같은 곳, 박마다 6개까지)를 되풀이 짝 j 로 삼습니다. 마지막 후렴처럼 조가 바뀐 곳은 조 차이만큼 옮겨 비교합니다. 비터비 전에 근음별 최고 점수 M 만 짝들과 가중 평균해 같은 근음의 코드 점수를 함께 올리고 내리므로, 장·단·7·sus 같은 성질은 그 박 자신의 소리로 정해집니다.

e~s(c)=es(c)+Ms(rc)+∑jwsjMj(rc)1+∑jwsj−Ms(rc),Ms(r)=maxc′:rc′=res(c′),wsj=0.7min(1,vsj−θδ)

vsj 는 짝 자리의 8박 창 평균 유사도, θ 는 곡 안 97백분위수, δ=max(0.05,(1−θ)/2). 유사도 표가 박 수의 제곱 크기라 3,000슬롯이 넘는 아주 긴 입력에는 쓰지 않습니다.

반감7 이름(1.11.1). 표준 어휘에는 m7♭5가 없어(넣으면 다른 곡의 m7·dim이 바뀌어 전체가 나빠짐) 반감7화음이 dim으로 적혔습니다. 코드와 조성을 다 정한 뒤 dim으로 적힌 구간에서 단7음이 3화음 구성음 평균의 절반 이상이면 이름만 m7♭5로 바꿉니다. GuitarSet에서 연주한 코드를 기준으로 성질이 맞는 표본이 59.37%에서 60.28%로 늘었습니다.

박자와 첫 박

박마다 화성 변화 h, 예비 코드 변화 l, 베이스 변화 g, 저역 온셋 k, 음량 증가 e, 으뜸화음 진입 o 을 표준화(Z)해 더한 첫 박 증거로, 마디 안 위치를 상태로 하는 모델을 풉니다.

zi=1.0Z(h)i+1.0Z(l)i+0.5Z(g)i+0.6Z(k)i+0.3Z(e)i+0.4Z(o)i
P(p→p+1)=1−2ε,P(k→0)=ε,P(m−1→m−1)=ε,ε=3×10−4

작은 확률로 마디가 짧아지거나 길어지는 것을 허용해 변박에도 경로가 무너지지 않습니다. 4박보다 대비도가 0.25(겹박자는 0.3) 이상 높을 때만 다른 박자를 고릅니다.

드럼 짝·홀 사전(1.10.0). 드럼이 백비트를 치면 첫 박은 킥 쪽 박(1·3박)이지 스네어 쪽(2·4박)이 아닙니다. 박마다 앞뒤 8박 안에서 킥과 스네어가 짝·홀로 엇갈리는 정도(국소 일관도 ciK, ciS)를 재고, 둘 다 0.3 이상으로 뚜렷하며 서로 반대쪽일 때만 첫 박 증거에 더합니다. 코드가 첫 박보다 8분음표 먼저 바뀌는 당김 리프에서도 마디가 한 박 밀리지 않게 하기 위해서이고, 1박과 3박의 구분은 여전히 화성 증거가 정합니다.

ciX=(−1)i∑|j−i|≤8(−1)jXj∑|j−i|≤8|Xj|,zi←zi+sgn(ciK)min(|ciK|,|ciS|)

3·5·7박은 첫 박 증거의 자기상관이 그 마디 길이에서 4박보다 클 때(ρz(m)+ρz(2m)>ρz(4)+ρz(8))만 고르고, 드럼 백비트가 곡의 30% 이상에서 보이면 3·5·7박 후보를 뺍니다. 4박 대 2박 판정은 드럼 사전을 더하기 전의 증거로 합니다.

길이가 다른 마디 다시 보기(1.11.4). 마디 첫 박 코드를 반 박~한 박 앞당겨 치는 곡은 박 단위 화성 변화가 넷째 박과 첫 박에 나뉘어, 셋째 박이 첫 박처럼 보이고 마디선이 반 마디 밀리며 2박짜리 마디가 끼기 쉽습니다. 길이가 다른 마디가 생긴 곡(곡 중간 박자 변화가 없을 때)만, 박 단위 변화 대신 앞 2박과 뒤 2박 창의 트레블·베이스 크로마 거리로 바꾼 증거로 다시 풉니다.

z′i=zi−Z(h)i−Z(l)i−0.5Z(g)i+Z(h(2))i+Z(g(2))i

다시 푼 결과는 세 가지가 모두 맞을 때만 씁니다. 길이가 다른 마디가 하나도 없고, 원래 증거와 새 증거 모두에서 곡 전체를 한 위상으로 볼 때 그 위상이 다른 위상보다 길이가 다른 마디 두 개의 값(2|lnε|) 넘게 앞서며, 4·8마디 뒤에 되풀이되는 악구의 같은 자리 화성이 새 격자에서 더 잘 맞는 경우가 부호 검정 z≥3 으로 많을 때입니다. 조건 없이 쓰면 GTZAN에서 첫 박이 나빠지는 곡(34곡)이 있어 기존 곡이 하나도 나빠지지 않게 좁혔습니다.

조성과 전조

비트마다 앞뒤 ±6박을 삼각 가중으로 모은 음 분포 Hi 와 Krumhansl–Kessler 조성 프로필의 상관을, 장조와 나란한 단조를 한 부류(조표 g)로 묶어 계산합니다.

ci(g)=max(corr(Hi,K→major(g)),corr(Hi,K→minor(g+9)))
Vi(g)=ci(g)+max(Vi−1(g),maxg′Vi−1(g′)−Λ),Λ=6

24박보다 짧은 구간은 이웃 구간에 흡수합니다. 코드 인식이 끝나면 구간마다 코드로 조성을 다시 정합니다.

J(K)=∑jℓj[cj⊂K]∑jℓj+0.5∑jℓj[cj=IK]∑jℓj+0.3min(1,NV→I3)+0.15[c1=IK]+0.15[clast=IK]+0.4Nphrase(IK)Nphrase+1.2corr(∑ihi,K→)

ℓj 는 코드 길이(박), IK 는 으뜸화음, NV→I 는 V → I 진행 수, Nphrase 는 4마디마다의 첫 박 수입니다.

m7과 6화음이 겹치는 조 이름(1.11.4). 장조 곡의 vi7(F♯ 장조의 D♯m7)은 I6(F♯6)과 구성음이 같아 코드로는 가를 수 없는데, 으뜸화음 점수는 단조 쪽에만 들어가 vi7이 많은 장조 곡이 나란한 단조 이름으로 적힐 수 있습니다. 코드로 고른 조가 단조이고, 구간의 음 분포가 나란한 장조와 가장 잘 맞으며 그 차이가 1.2Δr>0.15 이고, 그 m7이 구간 코드 시간의 1/3 이상일 때만 그 m7을 장조의 으뜸화음으로도 세어 다시 비교합니다. 조건 없이 쓰면 GTZAN에서 맞던 조 29곡이 틀리게 바뀌어 좁혔습니다.

카멜롯과 로마 숫자

카멜롯 휠은 조성을 5도권 순서로 1~12번에 놓고 장조에 B, 단조에 A를 붙입니다. 장조 으뜸음 t (C = 0)의 번호와, 나란한 장조와 번호를 공유하는 단조의 번호는 다음과 같습니다. 코드는 근음과 3음이 같은 조성의 번호로 적습니다.

nmajor(t)=((7t+7)mod12)+1,nminor(t)=nmajor((t+3)mod12)

로마 숫자는 그 자리의 조성을 기준으로 근음의 음정 d=(r−t)mod12 를 도수로 바꿉니다. 단조는 자연단음계를 기준으로 하고, 이끎음 위의 감화음은 관례대로 vii°로 적습니다.

d01234567891011
장조I♭IIII♭IIIIIIIV♯IVV♭VIVI♭VIIVII
단조I♭IIIIIII♯IIIIV♯IVVVI♯VIVII♯VII
  • 3음이 단3도인 코드는 소문자, 감화음은 °, 반감7화음은 ø, 증3화음은 +, 장7화음은 M입니다.
  • 자리바꿈 숫자는 3화음 6·⁶₄, 7화음 7·⁶₅·⁴₃·⁴₂입니다.
  • 조성 밖의 장3화음·딸림7화음이 바로 다음 코드로 완전5도 내려가 해결하면 V/x, 조성 밖 감화음이 반음 위로 가면 vii°/x, 그 앞의 조성 밖 단3화음은 ii/x로 적습니다.
  • 전조 직전에 새 조의 딸림화음이 오면 새 조 기준 V로 적습니다.

코드 이름의 철자. 같은 건반이라도 화음의 기능에 따라 이름이 다릅니다. 로마 숫자가 정한 도수로 글자를 정하고, 실제 음높이와의 차이만큼 임시표를 붙입니다. 그래서 C 장조의 나폴리 화음(♭II)은 D♭, ii로 가는 이끎음 화음(vii°/ii)은 C♯로 적고, 자리바꿈 베이스는 구성음 글자대로 적습니다(E♭7/D♭). 겹임시표가 필요하거나 조에 없는 F♭·C♭·E♯·B♯가 되면 한소리 이름을 씁니다.

곡 종류별 보강

템포 도약. 8초 창(1초 간격)마다 전체 박 주기의 0.6~1.65배 범위에서 박 주기 점수를 구하고 템포 상태 비터비로 흐름을 고릅니다. 원래 템포 근처(±4%)는 점수가 창 최댓값의 60% 이상이면 만점으로 보아 쉽게 떠나지 않게 하고, 다른 템포는 실제 점수로 비교해 2/3배 같은 가짜 주기로 가지 않게 합니다. 창 사이의 이동 비용은 다음과 같습니다(d=|ln(ℓw/ℓw−1)|).

창 사이 변화비용뜻
d≤0.0050서서히 바뀌는 템포는 그대로 따라감
0.005<d≤0.04−6−100(d−0.005)작은 걸음을 이어 멀리 가는 길이 도약보다 비쌈
d>0.04−12−2d원래 템포의 지지가 12창 넘게 무너져야 넘어감

도약이 없으면 앞의 국소 템포 곡선을 그대로 쓰고, 있으면 도약 지점으로 구간을 나눠 구간마다 같은 방식으로 곡선을 만듭니다.

워킹 베이스 층위. 85 BPM 이하인데 저역 온셋이 박 사이에도 박 위의 40% 이상 울리고(박 위/박 사이 비 2.5 이하) 백비트도 없으면 한 층위 위로 올리고, 150 BPM 이하에서 한 번 더 확인합니다.

박자. 4박이 아닌 박자는 첫 박 대비도가 4박보다 3박은 0.25, 5·7박은 0.3 넘게 높고, 길이를 억지로 맞춘 마디가 15% 이하일 때만 고릅니다.

파워 코드. 근음 위 2·3·4·5반음의 세기가 근음과 5음으로 설명되는 정도를 넘으면 감점하고, 곡 안에서 16박 이상, 전체의 8% 이상 나올 때만 적습니다.

es(c5)←es(c5)−6max(0,∑d∈{2,3,4,5}os(r+d)−0.7(os(r)+os(r+7)))

박자 변화. 첫 박 모델의 상태를 (박자, 마디 안 위치)로 넓혀, 마디가 끝날 때만 아주 작은 확률(μ=10−7)로 다른 박자로 넘어가게 합니다(곡 끝맺음에서 코드가 한 박씩 앞서 바뀌는 곳을 3/4로 읽지 않게). 새 박자가 4마디 이상 이어질 때만 박자 변화로 보고, 그런 변화가 없으면 이 결과를 쓰지 않습니다.

박자 변화 확인(1.11.4). 첫 박 증거가 흐트러진 구간에서는 잡음이 다른 마디 길이로 우연히 맞아떨어져 끝까지 4/4인 곡의 끝 후렴이 5/4로 적힐 수 있습니다. 바뀐 박자 구간이 주 박자로 16마디 이상이면, 박별 트레블·베이스 크로마가 악구 간격(4·8마디) 떨어진 박끼리 얼마나 비슷한지를 주 박자와 새 박자의 마디 길이로 재서, 주 박자 쪽이 0.02 넘게 높으면 그 박자 변화를 빼고 다시 풉니다. 대중음악은 4·8마디 악구로 되풀이되므로 한두 마디 간격으로는 박자를 가르지 못합니다.

템포 표시. 박마다 앞뒤 4박 간격의 중앙값으로 템포를 구해 화면 위 BPM에 쓰고, 앞뒤 8박의 템포가 12% 넘게 갑자기 바뀌며 새 템포가 직전 표시보다 8% 넘게 다른 곳에 표시를 붙입니다(Δb 는 박 간격).

rj=|lnmed{Δbj−8,…,Δbj−1}med{Δbj,…,Δbj+7}|≥0.12

서서히 바뀌는 템포. 앞뒤 8박으로 다듬은 템포가 4박 전보다 1% 넘게 한 방향으로 계속 바뀌고, 모두 합쳐 8% 넘게 16박 이상에 걸쳐 바뀐 구간입니다. 구간 끝 뒤 16박 안에서 박마다 템포가 더 바뀌면 거기까지를 끝으로 보고, 끝 박에 도착 템포를 흰 알약으로 둡니다. 이렇게 앞뒤로 늘려 잡은 이웃 구간이 겹치면, 같은 방향은 한 구간으로 합치고 반대 방향은 겹친 곳의 템포 극점(가장 빠르거나 느린 박)에서 나눠 틀이 겹쳐 그려지지 않게 합니다. 재생 중 틀은 재생 위치까지 채워지고 도착 박에서 0.8초 동안 옅어지며, 도착 알약은 도착 박의 길이 Δb 에 대해 다음 시간 동안 켜집니다. 1.1배는 템포에 비례한 여운, 0.06초는 꺼짐이 다음 박의 시작과 겹쳐 보이지 않게 하는 고정 여운입니다.

Ton=1.1Δb+0.06s

코드 연주(곡 따라). 기본 타건 방식은 코드가 바뀌는 곳과, 같은 코드라도 새로 친 마디 첫 박(검은 글자)에서 치고, 끌어 둔 곳(회색)에서는 누른 채로 이어서 울립니다. 원곡의 치는 짜임을 따라가므로 서스테인을 따로 늘리지 않아도 새로 친 곳에서는 소리가 다시 살아납니다. 차트에서도 이렇게 새로 치는 박(검은 글자 코드가 놓인 박)의 빗금을 두껍게 그려, 어느 리듬에서 코드를 치는지 보이게 합니다.

이어짐(회색). 마디 첫 박의 코드가 앞 칸과 같을 때, 그 구성음의 세기를 박 직전 약 0.12초 평균과 직후 약 0.12초 최대로 비교해 1.2배 넘게 뛰면 새로 친 것(검은 글자), 아니면 끌어 둔 것(회색)으로 적습니다. 약박 바뀜 다듬기. 약박(2·4박)에서 바뀐 것으로 판정됐지만 앞 강박에서 옛 코드에만 있는 음이 새로 쳐지지 않았고 두 코드의 점수 차가 2.5 이내이면, 바뀜을 앞 강박으로 옮깁니다(분산화음 반주의 Esus4 → E 등). 마디 끝 당김 다듬기(1.10.3). 마디의 마지막 박에서 바뀐 코드가 다음 첫 박까지 같은 근음으로 이어지면 앞당겨 친 당김이나 베이스 접근음인 경우가 많아, 그 박에서 새 코드가 뚜렷이 앞서지 않으면 악보 관례대로 다음 첫 박에서 바뀐 것으로 적습니다.

마디 첫 박 한 박 코드(1.11.8). 마디 안에서 코드를 바꾸는 벌점 때문에 첫 박에만 울리는 한 박짜리 코드가 뒤 박의 코드 Y 에 합쳐질 수 있습니다. 첫 박만 보면 근음이 다른 코드 Z 가 가장 잘 맞을 때, 다음을 모두 만족하면 첫 박을 Z 로 적습니다. Eb 는 박 b 의 코드 점수, r 은 이어짐 판정의 세기 비, Z−Y 는 Z 에만 있는 음입니다.

Eb(Z)−Eb(Y)≥3.5,Eb+1(Y)>Eb+1(Z),rb(Z−Y)≥1.2,rb+1(Y−Z)≥1.2,bass(Z)≠bass(Y)

셋째·넷째 조건은 Z 에만 있는 음을 첫 박에 새로 치고 Y 에만 있는 음을 둘째 박에 다시 쳤다는 뜻입니다. 앞 마디 코드의 잔향이 새 코드와 섞여 첫 박에서 다른 코드처럼 보이는 경우를 거릅니다. 앞 마디에서 이어 온 코드에는 쓰지 않습니다.

온음 위 베이스(F/G형). 장3화음 위에 근음보다 온음 높은 베이스를 둔 상태로, 베이스 크로마의 30% 이상이 그 음일 때만 인정합니다. 자리바꿈 다듬기. 같은 코드 안에서 베이스가 세 번 이상 움직이면 2박보다 짧은 자리바꿈을 합치고, 근음과 오가는 5음 베이스는 자리바꿈으로 적지 않습니다.

코드 이름 다듬기(1.10.0). 조성 안의 m7이 3음을 베이스로 둔 채 이어지면(Am7/C, Em7/G) 같은 음의 6화음(C6, G6)이므로 베이스 위 장3화음(C, G)으로 적습니다. 베이스에서 그 음이 가장 셀 때만 바꾸고, 앞뒤에 같은 m7이 다른 베이스로 붙어 있으면 그대로 둡니다. 베이스가 흐릿해(그 음이 베이스의 절반 미만이면서 박의 3/4 미만에서만 가장 셈) 잘못 들었을 수 있는 곳과, 같은 코드 사이에 잠깐 낀 m7도 그대로 둡니다. sus4는 3음이 4음의 0.7배 이상 울리면 같은 근음의 3화음으로 적습니다(선율이나 음정 있는 드럼에 섞인 4음을 sus4로 읽지 않게).

메트로놈과 코드 연주

오디오 시계에서 음악을 ts 에 곡 위치 os 부터 재생하기 시작했다면, 클릭 타이밍 보정 δ 를 더한 i 번째 클릭의 예약 시각과 화면의 재생 위치는 다음과 같습니다(Lout 은 출력 장치의 지연).

ticlick=ts+(bi+δ−os),posdisplay=os+max(0,tnow−ts)−Lout

클릭 소리는 첫 박 1,850 Hz, 나머지 박 1,250 Hz이고, ½박 단위일 때는 박 bi 를 예약하면서 그 뒤 박 사이 (bi+bi+1)/2+δ 에 작은 2,600 Hz 클릭(세기 1/3, 감쇠 8 ms)을 함께 예약합니다.

코드 연주의 피아노 음은 곡의 기준음 θ 에 맞춘 비조화 배음과 두 단계 감쇠로 합성합니다.

f0=440·2(m−69+θ)/12,fk=kf01+Bk2,B=3.5×10−4·2(m−60)/24
y(t)=∑k∑s=1SkakSk(0.60e−t/τkF+0.40e−t/τkS)sin(2πfk2ds/1200t+φk)

ak 에는 해머 타격 위치(현 길이의 1/7.5)와 해머 펠트의 고역 감쇠가, Sk 에는 한 음을 이루는 현의 수(1~3)가, ds 에는 현마다의 미세한 조율 차(0, +1.0, −0.8 cent)가 들어갑니다.

소리의 물리

분석의 여러 선택은 소리와 악기의 물리적 성질에서 나옵니다.

음높이와 평균율

음높이는 떨림의 주파수이고, 12평균율은 한 옥타브(주파수 2배)를 12개의 같은 비로 나눕니다. 옥타브가 주파수 2배라는 사실이 음들을 12칸(크로마)으로 접는 근거입니다.

f(m)=440·2(m−69)/12Hz,cent(f1,f2)=1200log2f1f2

녹음의 기준음은 테이프 속도, 악기 조율, 의도적인 튜닝 때문에 440 Hz에서 벗어나곤 합니다. 예를 들어 +18 cent면 A4는 약 444.6 Hz입니다.

배음

현이나 관의 진동은 기본 주파수의 정수배 성분(배음)을 함께 냅니다. 배음이 기본음에서 떨어진 거리는 12log2h 반음입니다.

배음반음 거리가까운 평균율차이코드 템플릿에서
10같은 음0 cent1
212.00옥타브0 cent0.6
319.02옥타브 위 5도+2.0 cent0.36
424.00두 옥타브0 cent0.216
527.86두 옥타브 위 장3도−13.7 cent0.13
631.02두 옥타브 위 5도+2.0 cent0.078
733.6934반음−31.2 cent쓰지 않음

C 장3화음(C, E, G)만 쳐도 E의 3배음은 B, G의 3배음은 D가 되어, 배음을 무시하면 Cmaj7이나 Cadd9처럼 보입니다. 템플릿이 이 성분까지 품고 있어야 비교가 공정해집니다.

악기별 주파수 대역

소리주요 대역물리적 특징분석에서의 쓰임
킥 드럼약 40–100 Hz짧은 저음, 음높이가 빠르게 내려감저역 플럭스로 박과 첫 박의 증거
베이스약 41–400 Hz정수배 배음, 긴 지속베이스 크로마로 자리바꿈 판단
스네어몸통 약 150–250 Hz, 줄 잡음 약 2–10 kHz넓은 대역의 잡음중역과 고역의 동시 상승으로 백비트
하이햇약 5–15 kHz금속성 잡음고역 플럭스(박 판정에서는 가중치를 낮춤)
피아노, 기타, 보컬기본음 약 80 Hz–1 kHz정수배 배음트레블 크로마로 코드

시간과 주파수의 맞바꿈

창 길이 T 의 주파수 분해능은 대략 1/T 이고, 이론적 하한은 ΔtΔf≥1/(4π) 입니다. 반면 반음 간격은 주파수에 비례해서, 베이스 최저음 E1(41.2 Hz)에서는 2.45 Hz뿐입니다.

Δfsemitone(f)=f(21/12−1)≈0.0595f
용도샘플레이트창 길이홉칸 간격
리듬(온셋)22,050 Hz46.4 ms11.6 ms21.5 Hz
트레블(코드)11,025 Hz185.8 ms23.2 ms5.38 Hz
베이스, 기준음11,025 Hz371.5 ms46.4 ms2.69 Hz

샘플레이트 fs 로는 fs/2 보다 높은 성분을 담을 수 없고, 줄이면 높은 성분이 낮은 주파수로 접혀 들어옵니다(앨리어싱). 그래서 리샘플러는 새 나이퀴스트 주파수의 92%에서 자르는 저역 필터를 겸합니다.

음량, 잔향, 지각

  • 사람의 음량 감각은 대략 로그적이라 데시벨로 다룹니다. 스펙트럼을 로그로 압축하면 절대 크기보다 상대 변화가 드러나, 조용한 기타 스트로크와 큰 킥이 모두 온셋으로 잡힙니다.
  • 음이 멈춘 뒤에도 방의 잔향 때문에 에너지가 수백 ms 동안 줄어들며 남습니다. 플럭스는 커진 양만 더하므로 잔향의 감쇠는 가짜 온셋을 만들지 않습니다.
  • 사람들이 편하게 박을 세는 템포는 대략 120 BPM 안팎에 몰린다고 알려져 있습니다(Moelants, 2002). 템포 선호 분포는 느린 발라드를 고려해 110 BPM을 중심으로 둡니다.
  • 숙련된 연주자는 수 ms에서 수십 ms의 어긋남도 알아차린다고 알려져 있어, 박 오차의 목표를 ±10 ms 안으로 두었습니다.

지연과 거리

소리는 공기 중에서 약 343 m/s로 움직여 1 m에 약 2.9 ms가 걸립니다. 출력 장치의 지연은 유선이 수 ms에서 수십 ms, 블루투스는 흔히 100–300 ms입니다. 음악, 클릭, 코드 연주가 같은 오디오 경로를 지나므로 셋 다 똑같이 늦어져 서로의 정렬은 유지되고, 화면만 출력 지연만큼 보정합니다.

피아노 현

현상물리합성에서
비조화성강철 현의 굽힘 강성 때문에 높은 배음일수록 정수배보다 높아짐. B=π3Ed4/(64TL2) (E 영률, d 지름, T 장력, L 길이)fk=kf01+Bk2
타격 위치해머가 현 길이의 약 1/7~1/9 지점을 때리면 그 지점에서 움직이지 않는 배음은 거의 울리지 않음|sin(πkxh)|, xh=1/7.5
이중 감쇠한 음의 여러 현이 브리지를 통해 에너지를 주고받아 처음엔 빨리 줄고 나중엔 오래 남음즉음 60%, 여음 40%
맥놀이한 음의 현들이 1 cent 안팎으로 다르게 조율되어 소리가 천천히 일렁임같은 위상에서 출발하는 현 2~3개
배음별 감쇠높은 배음일수록 빨리 사라져 시간이 갈수록 소리가 어두워짐τk∝(f0/fk)0.7

프로그램 구조

Chordity는 외부 라이브러리 없이 HTML 파일 하나로 동작합니다. 파일은 인터넷으로 보내지지 않고, 모든 분석은 브라우저 안에서 이루어집니다.

구성

부분하는 일
분석 엔진신호 처리와 박 추적(무거운 단계), 박자·첫 박·조성·코드 추론(가벼운 단계), 텍스트 차트 만들기. 화면에 기대지 않아 따로 떼어 쓸 수도 있습니다.
불러오기파일 선택과 끌어 놓기, 브라우저 디코딩
재생기와 스케줄러음악 재생, 메트로놈 클릭과 코드 연주 예약
렌더러코드 차트, 박 표시등, 파형, 지금·다음 코드. 차트를 그린 뒤와 화면 폭이 바뀔 때마다 이름표의 실제 폭을 재서, 코드 이름·알약·육각형 틀이 서로 겹치지 않게 크기와 자리를 정합니다(코드 이름은 작은 글씨로도 안 들어가면 위·아래 두 줄로).
보정과 설정박 보정, 코드 종류와 표기, 메트로놈과 코드 연주 설정

세 개의 시계

시계기준쓰는 곳
샘플 시간디코딩한 버퍼의 샘플 번호 ÷ 샘플레이트분석, 모든 비트 시각
오디오 시계오디오 장치의 재생 시각음악 재생, 클릭과 코드 연주 예약
화면 시계화면을 다시 그리는 주기지금 코드 상자와 이름 확대, 표시등, 재생 위치

비트 시각은 샘플 시간으로 계산되고 오디오 시계로 옮겨집니다. 재생 버퍼와 분석 신호가 같은 디코딩 결과에서 나오고 리샘플러의 지연이 0이므로, 두 시간축 사이에 어긋남이 없습니다.

재생하는 동안 지금 울리는 코드는 노란 형광펜 상자가 감쌉니다. 상자는 그 코드를 친 박부터 다음 코드가 나오는 곳까지, 같은 코드를 끌어 두는 동안(회색 코드)은 다음 마디까지 이어 걸치고, 줄이 바뀌면 줄마다 한 조각씩 그립니다. 상자 안은 진행 막대처럼 그 코드에서 지금까지 연주된 만큼 주황색으로 차오르며, 채움 끝은 그 마디의 박 자리 사이를 박 안 위치로 나눈 재생 위치입니다. 코드가 바뀌면 상자의 두 끝 x 가 각각 용수철처럼 d2xdt2=ω2(x*−x)−2ζωdxdt 를 따라 다음 코드 자리 x* 로 갑니다. 가는 쪽 끝(ω=24 rad/s, ζ=0.42)은 목표를 조금 지나쳤다 돌아오고, 반대쪽 끝(ω=16 rad/s, ζ=1)은 지나치지 않고 뒤따릅니다. 지금 코드의 이름은 0.1초 만에 커졌다가 다음 코드로 넘어가면 0.7초에 걸쳐 줄어들며, 다음 이름에 닿지 않을 만큼만(많아야 1.3배) 커집니다. 상자와 채움 색은 채움·상자·바탕 위 어디서나 코드 이름이 읽히도록 골라(밝은 테마 연한 노랑과 주황, 어두운 테마 차분한 노랑과 짙은 주황), 상자가 움직이는 동안에도 글자색을 바꾸지 않습니다. 기기의 움직임 줄이기 설정을 따르면 움직임 없이 바로 바뀝니다.

오디오 그래프

음악
메트로놈 클릭
피아노 음방 잔향 1.6초, 보정 이득 +6.4 dB
음악 볼륨
클릭 볼륨
코드 볼륨
리미터 −1 dBFS셋이 겹쳐도 깨지지 않게
출력

저장되는 설정

메트로놈과 코드 연주 켜기, 첫 박 강조, 코드 연주 방식, 음악·클릭·코드 볼륨, 클릭 타이밍, 자동 스크롤, 테마, 코드 종류, 해상도, 베이스음 표기, 코드 표기 방식은 브라우저에 저장되어 다음에도 그대로입니다. 박 보정은 곡마다 따로라서 저장하지 않습니다.

검증

정답(박, 첫 박, 코드, 조성)을 알고 있는 합성 음원과, 실제 녹음, 실제 브라우저에서의 동작으로 확인했습니다.

한눈에 보기

항목결과
박 적중(합성 곡)18곡 모두 정답 박을 100% 찾음. 엇박 클릭 0(두 해석이 모두 통용되는 레게 1곡 제외)
박 시각 오차평균 −3.2 ~ +0.7 ms, 평균 절대 오차 1.4 ~ 3.8 ms
마디 첫 박박자가 정해진 곡 모두 100%
코드(베이스까지 일치)88.8 ~ 100%
조성조성이 분명한 18곡 모두 맞음, 전조 위치 오차 0박
코드 근음(실제 대중가요 10곡)93.7%, 장·단까지 91.3%(같은 방식으로 잰 madmom 87.4%, 87.4%)
메트로놈(브라우저)예약된 클릭 모두 정박, 첫 박 강조 모두 실제 첫 박. ½박 단위에서는 이웃한 두 박 사이마다 작은 클릭이 한가운데 하나

기본 계산

항목방법결과
실수 FFT직접 계산한 DFT와 비교최대 오차 3.8×10⁻¹³
리샘플러 정확도1 kHz 사인을 이상적인 사인과 비교RMS 오차 7.7×10⁻⁶
리샘플러 지연1.0초 위치의 임펄스를 변환1.00000초(지연 0)
샘플레이트22.05, 44.1, 96 kHz 입력비트 적중 100%, 평균 오차 0.3 ms 이내
특수 입력무음, 1.5초와 0.2초 클립오류 없이 빈 결과

합성 곡 18곡

킥, 스네어, 하이햇, 배음이 있는 베이스와 건반, 비화성음이 20% 섞인 멜로디, 잡음을 넣어 만들었습니다. 기준음을 18 cent 틀거나, 템포를 흔들거나, 후반부를 15% 늦추거나, 전조한 곡도 있습니다. 비트 적중은 70 ms 이내, 코드는 박 가운데에서 근음·성질·베이스가 모두 맞아야 정답으로 쳤습니다.

곡별 결과 보기
곡BPM(정답)비트엇박평균 / 절대 오차박자첫 박코드
팝, 강한 엇박 하이햇, +18 cent97.1 (97)96/9600.1 / 1.5 ms4/424/24100%
팝128.1 (128)96/9600.5 / 1.7 ms4/424/24100%
왈츠150.2 (150)48/4800.5 / 1.8 ms3/416/16100%
셋잇단 발라드58.0 (58)48/480−1.4 / 2.0 ms12/812/12100%
8분 아르페지오 발라드, 템포 흔들림67.1 (68)64/640−1.0 / 1.9 ms4/416/1698.4%
약한 스네어 록118.0 (118)96/9600.0 / 1.6 ms4/424/24100%
댄스123.9 (124)96/960−0.4 / 1.5 ms4/424/24100%
힙합87.9 (88)64/6400.7 / 2.0 ms4/416/16100%
펑크176.2 (176)96/9600.4 / 1.7 ms4/424/24100%
피아노 솔로72.0 (72)64/640−3.2 / 3.2 ms4/416/1698.4%
피아노 솔로, 3박자84.0 (84)48/480−2.6 / 2.7 ms3/416/16100%
발라드, 후반부 15% 느려짐71.6 (72→63)80/800−0.8 / 2.0 ms4/420/2088.8%
전조 C → D (A7 경유)110.2 (110)116/11600.0 / 1.5 ms4/429/29100%
전조 E♭ → E (B7 경유, 발라드)70.0 (70)116/1160−1.1 / 2.0 ms4/429/2993.1%
전조 G → A♭ (바로)100.0 (100)112/11200.0 / 1.4 ms4/428/28100%
A 단조 절 → C 장조 후렴96.0 (96)64/640−0.2 / 1.5 ms4/416/16100%
드럼 인트로 + 못갖춘마디104.0 (104)57/570−0.7 / 2.3 ms4/414/14100%
레게 원드롭151.7 (76)48/4847−3.8 / 3.8 ms4/4두 배 층위100%

레게는 스캥크를 백비트로 보는 두 배 템포 해석도 흔히 쓰여 자동으로 강제하지 않았습니다(÷2 한 번으로 76 BPM). 코드 오답은 Esus4 → E가 마디 가운데에서 바뀌는 곳과, 아르페지오 속 7음이 약한 발라드에서 maj7·m7을 3화음으로 읽은 경우입니다.

곡 종류 확장 시험

회귀 18곡에 없던 곡 종류 17곡을 더해 1.4.2와 비교했습니다. 검증 시 기준은 대중음악을 우선하는 것입니다. 대중음악 곡의 결과가 나빠지는 수정은 특수 장르가 좋아져도 넣지 않고, 대중음악 곡의 결과가 좋아지는 수정은 특수 장르가 조금 나빠져도 넣습니다.

묶음항목1.4.21.5.0
회귀 18곡비트, 첫 박, 코드, 조성100%, 100%, 98.6%, 18곡같음
대중음악형 10곡비트 / 엇박 클릭95.7% / 1699.6% / 1
첫 박 / 코드(정확)95.7% / 88.1%99.5% / 97.0%
특수 장르 7곡비트 / 첫 박 / 코드(정확)80.0% / 74.4% / 52.7%93.8% / 93.2% / 56.0%
실제 녹음1.4.2와 일치코드 100%, 첫 박 66/66, 비트 257/257

대중음악형은 템포 급변, 루바토 피아노, 코드 밖 베이스, 테이프 음높이 변화, 케이팝·EDM, 팝록 파워 코드, R&B 슬래시 발라드, 드럼이 큰 힙합, 드럼이 아주 큰 록, 어쿠스틱 스트로크 팝이고, 특수 장르는 5/4, 7/4, 스윙 재즈, 비밥, 보사노바, 메탈, 앰비언트입니다.

비교했지만 넣지 않은 방법

방법대중음악특수 장르
7화음의 9·13 확장음 변형실제 녹음 코드의 18%가 바뀜스윙 재즈 계열 일치 28→32%
화성·타악기 분리(HPSS)변화 없음, 분석 시간 2배코드 정확 56→61%
NNLS 음 분해 크로마코드 정확 98.6→97.4%(회귀)코드 정확 56→63%
바 포인터 모델엇박 클릭 47→304, 첫 박 100→56.7%첫 박 93→44%

바 포인터 모델은 원래 학습된 신경망의 박·첫 박 활성과 함께 쓰는 방법이라, 손으로 만든 온셋 곡선으로는 박의 층위와 박자를 가르지 못했습니다.

이어짐과 바뀜 위치(1.8.4)

항목1.8.31.8.4
합성곡 마디 첫머리 회색(모두 새로 친 곳)49곳8곳, 모두 곡이 끝난 뒤의 여운
코드 바뀜이 정답과 같은 박 / 한 박 이름772 / 50776 / 46
회귀 18곡 코드 정확 / 계열98.6% / 99.8%98.9% / 100%
비트, 첫 박, 조성, 특수 장르, 실제 녹음 코드같음

박자 변화와 템포 표시

곡정답결과
팝, 4/4 → 3/4 → 4/49마디부터 3/4, 17마디부터 4/4같음, 첫 박 24/24
왈츠 절 → 4/4 후렴9마디부터 4/4같음, 첫 박 20/20
템포 급변 96 → 13213마디 1박부터 132같음
후반부가 서서히 느려지는 발라드서서히 72 → 6311마디 2박부터 20마디 4박까지 육각형 틀, 20마디 4박에 흰 알약 63
박자가 일정한 35곡과 실제 녹음박자 변화 없음가짜 박자 변화 0, 기존 결과 모두 같음

실제 녹음

상업 녹음 한 곡(기현 「세월이 가면」, 응답하라 1988 OST, 3분 50초)으로 시험했습니다. 정답 박 표시가 없으므로, 템포가 일정한 스튜디오 녹음이라는 점을 이용해 구간마다 비트를 직선에 맞춘 잔차를 추적 오차의 대리 지표로 썼습니다.

항목결과
박 단계68.1 BPM(8분음표를 박으로 잡는 두 배 오판을 교정)
구간별 직선 잔차 RMS6 ~ 23 ms
필인 구간 클릭 간격0.86 ~ 0.90 s(목표 0.88 s)
전조45마디 1박(2:37)부터 E♭ 장조 → E 장조, 이후 G♯m7·C♯7로 표기
로마 숫자코드 105개 중 10개가 부속화음(ii7/IV, V7/IV, V7/ii 등), 16개가 자리바꿈
사람이 맞춘 정답과 비교(1.11.0)코드 근음 94.7%, 장·단 91.2%, 비트 F 0.948, 첫 박 F 0.937(1.10.5는 근음 88.4%, 장·단 84.8%). 1.11.1도 같음

여러 장르의 대중가요 다섯 곡(여자친구 「시간을 달려서」, 「もう恋なんてしない」 커버, あいみょん 「マリーゴールド」, YOASOBI 「夜に駆ける」, 시드 사운드 「여래아」)으로도 확인했습니다(1.10.3). 다섯 곡 모두 템포 층위와 박자가 맞고, 마디 위치는 독립된 분석기(madmom)와 96~100% 일치합니다. 코드는 공개 코드 차트를 음원에 맞춰 정렬한 정답과 비교해 근음 약 90%, 장·단 계열 약 87%가 맞습니다(차트가 있는 네 곡, 같은 방식으로 잰 madmom은 86.5%, 87.3%). 남은 오류는 대부분 노래 선율이 화음 대역에 섞여 공통음이 많은 이웃 코드로 읽히는 것입니다. 1.10.4에서 「マリーゴールド」 도입부의 마디선과 「夜に駆ける」의 B 단조 전조 위치(102마디 → 후렴이 시작하는 104마디)를 바로잡았습니다.

1.11.0에서는 장르와 빠르기가 다른 대중가요 다섯 곡(김종국 「이 사람이다」, 015B 「이젠 안녕」, 박명수 「바다의 왕자」 라이브 커버, 디셈버 「별이 될게」·피노키오 「사랑과 우정 사이」 여성 보컬 커버)과 「세월이 가면」을 더해, 코드 정답이 있는 실제 녹음 10곡으로 검증했습니다. 뒤의 여섯 곡은 규칙과 값을 고를 때 보지 않고 마지막에만 쟀습니다.

묶음코드 근음 / 장·단 1.10.5 → 1.11.0madmom
앞의 4곡(값을 고른 곡)89.7% / 87.2% → 93.3% / 91.0%86.5% / 87.3%
뒤의 6곡(값을 고를 때 안 본 곡)90.8% / 88.6% → 94.0% / 91.5%88.0% / 87.5%
10곡 전체90.4% / 88.0% → 93.7% / 91.3%87.4% / 87.4%

10곡 모두 근음이 올랐고, 공통음이 많은 이웃 코드로 읽은 표본은 5.0%에서 3.6%로 줄었습니다. 장·단은 두 곡(「별이 될게」 −1.3%p, 「사랑과 우정 사이」 −0.4%p)에서 조금 내려갔습니다. 박·첫 박·조성은 10곡 모두 그대로입니다. 「이젠 안녕」(71 BPM)과 「사랑과 우정 사이」(64 BPM)는 두 배 템포로 잡히는 한계가 남아 있습니다.

1.11.1에서는 계산 결과는 그대로 두고(같은 연산을 같은 순서로) 분석을 약 1.8배 빠르게 했고(크롬에서 실제 녹음 5곡 합 20.2초 → 11.3초), 1.11.0에서 「고민중독」 조성이 B 단조 → E 단조 → F 단조로 잘못 적히던 것을 정답과 같은 G 장조 → A♭ 장조로 바로잡았습니다(거의 동점인 전조 거르기). 코드 바뀜 시점과 7화음·sus4 이름을 다듬는 규칙도 시험했지만, 대중음악 곡 하나 이상을 나쁘게 해 넣지 않았습니다(README의 1.11.1 검증 절).

1.11.4의 세 규칙(박자 변화 확인, 길이가 다른 마디 다시 보기, m7과 6화음이 겹치는 조 이름)은 시험곡 1,268곡(합성 곡 74곡, 실제 녹음 15곡, GTZAN 999곡, GuitarSet 180곡)에서 한 곡도 나빠지지 않게 조건을 정했습니다. 규칙을 끄면 모든 곡이 1.11.3과 같고, 켜면 바뀐 곡은 7곡입니다. 끝 후렴이 5/4로 적히던 4/4 곡(사용자 제보)은 박자 변화가 없어지고 길이가 다른 마디가 27개에서 0개, 조 이름이 장조로 바뀌었습니다. GTZAN 3곡은 첫 박 F가 0.56·0.89·0.81에서 1.00으로, 2곡은 조성이 틀림에서 맞음으로 바뀌었고, 1곡은 전후 모두 틀린 조(정답과의 거리 점수 같음)입니다. 나머지 시험(회귀 18곡, 조성, 로마 숫자, 합성 곡 37곡, 실제 녹음 키트, 「세월이 가면」 정답, GuitarSet)은 1.11.3과 같습니다.

1.11.5의 4:3 박 단계 확인도 같은 1,268곡에서 정했습니다. 12/8·6/8로 적히는 125곡마다 4/3배 느린 템포로 다시 잡은 결과를 모두 만들어 보니, 조건 없이 바꾸면 26곡이 좋아지고 96곡이 나빠져서(진짜 셋잇단 곡, 실제 템포가 3/2배 빠른 기타 반주 곡 등), 나빠지는 곡이 없어질 때까지 조건을 더해 좁혔습니다. 바뀐 곡은 6곡입니다. 「아주 먼 옛날」(사용자 제보)은 92 BPM 12/8에서 69 BPM 4/4가 되어 코드가 마디 첫 박·셋째 박에 고르게 놓이고, GTZAN pop.00004·pop.00062·hiphop.00035·rock.00049와 GuitarSet 1곡은 박 F가 0.27~0.30에서 0.98~1.00으로, 첫 박 F는 좋아지거나 같았습니다. 같은 오류가 있는 시험곡 19곡 가운데 나머지 13곡은 그대로입니다. 1,268곡 전체를 1.11.4와 따로 분석해 비교해도 이 6곡 말고는 결과가 같습니다.

1.11.6의 3:2 박 단계 확인도 같은 방법으로 정했습니다. 4:3 확인으로 바뀌지 않는 119곡마다 3/2배 빠른 템포로 다시 잡아 보니, 조건 없이 바꾸면 34곡이 좋아지고 84곡이 나빠져서, 화음 바뀜 묶음·점수 비·새 박 위치 강세·8분음표 나뉨 조건을 차례로 더해 나빠지는 곡이 없을 때까지 좁혔고, GuitarSet 코드 채점에서 장·단이 나빠진 곡(정답의 절반 템포가 된 보사노바 1곡)이 나와 새 템포 하한을 90 BPM으로 올렸습니다. 바뀐 곡은 7곡이고 모두 박과 첫 박이 좋아지거나 같았습니다. GTZAN metal.00017·metal.00034·metal.00094·rock.00064와 GuitarSet 2곡은 정답 템포가 되었고(박 F 0.37~0.40 → 0.60~1.00, GuitarSet 2곡은 코드도 좋아짐), GTZAN jazz.00086은 정답의 두 배가 되어 보정 버튼으로 고칠 수 있게 되었습니다. 같은 오류(템포가 정답의 2/3배)가 있는 시험곡 28곡 가운데 정답 템포가 된 곡은 6곡이고, 나머지는 주로 점수 비 조건을 넘지 못해 그대로입니다. 1,268곡 전체를 1.11.5와 따로 분석해 비교해도 이 7곡(하한을 올리기 전에는 보사노바 1곡 포함 8곡) 말고는 결과가 같습니다.

1.11.7의 도입부 국소 어긋남 규칙은 「해질녘 예스터데이」(사용자 제보)의 피아노 도입부 박을 본 구간의 132 BPM 격자로 바로잡습니다(도입부 피아노 온셋이 거의 모두 그 격자의 16분음표 자리에 놓임). 고정 템포 근거 조건 없이는 GuitarSet 기타 독주 1곡의 코드 정확도가 내려가 조건을 더했고, 최종 조건으로 바뀌는 곡은 1,268곡 가운데 이 곡 하나입니다.

1.11.8의 마디 첫 박 한 박 코드 규칙은 같은 곡 둘째 마디의 한 박짜리 A♯m7을 되살립니다. 점수 조건만으로는 1,268곡 가운데 102곡이 바뀌고 GuitarSet에서 코드 점수가 움직인 6곡이 모두 나빠졌는데(앞 코드 잔향을 다른 코드로 읽음), 첫 박·둘째 박 어택과 베이스 조건을 더하자 GuitarSet에서 바뀌는 곡이 없어졌습니다. 최종 조건으로 바뀌는 곡은 23곡(곡마다 한두 마디)이고, 코드 정답이 있는 곡에서 나빠진 곳은 없습니다.

브라우저 시험

헤드리스 Chromium에서 페이지를 실제로 조작하며, 예약되는 클릭을 모두 기록해 곡 안의 시각으로 되돌린 뒤 정답 비트와 대조했습니다.

시험결과
재생·이동·정지를 섞은 클릭37/37, 29/29, 22/22 정박, 첫 박 강조 모두 실제 첫 박
½박 옮기기모든 클릭이 정답 박의 중간점으로, 한 번 더 누르면 정박으로 복귀
×2, ÷2, 첫 박 이동, 박자 지정간격과 첫 박 강조가 기대대로 바뀜
클릭 타이밍 +30 ms클릭이 29.2 ms 늦게 예약됨
화면콘솔 오류 0, 데스크톱과 휴대폰 폭에서 가로 넘침 0 px
지금 코드 상자와 이름 확대재생 중 매 프레임(세 곡, 약 1,000프레임) 커진 이름은 하나이고 재생 위치의 코드와 일치, 재생 중 위치를 옮겨도 앞 코드가 비치지 않음, 줄을 넘는 코드는 줄마다 한 조각이고 떠난 줄의 상자는 다시 자라지 않음, 진행 채움 끝이 매 프레임 재생 위치와 1.1px 안에서 일치, 두 테마에서 회색 코드와 N.C.까지 모든 이름이 채움·상자·바탕 위 모두 4.5:1 이상, 모든 이름을 확대해도 이웃 이름·알약·빗금과 새로 겹친 픽셀 0

조성과 전조

곡정답결과
C 장조 → D 장조, A7 경유18마디부터18마디 1박
E♭ 장조 → E 장조, B7 경유18마디부터18마디 1박
G 장조 → A♭ 장조, 바로17마디부터17마디 1박
A 단조 절 → C 장조 후렴전조 없음(조표 같음)전조 없음
전조 없는 합성 곡 14곡전조 없음가짜 전조 0

표기

시험결과
카멜롯 번호 24개를 표준 휠 표와 대조24/24 일치
A 단조: Am, Em/G, F, C/E, Dm, G, C, E7i, v6, VI, III6, iv, V/III, III, V7
C 장조: C, E7, Am, D7, G7, C, A7, Dm, G7, C, Fm, C, B♭, CI, V7/vi, vi, V7/V, V7, I, V7/ii, ii, V7, I, iv, I, ♭VII, I
E♭ 장조: E♭, B♭/D, Cm, B♭m7, E♭7, A♭maj7, B♭7/A♭ …I, V6, vi, ii7/IV, V7/IV, IVM7, V⁴₂ …

코드 연주

시험결과
피아노가 친 코드18회 모두 구성음과 베이스가 정답과 일치
치는 시각코드가 바뀌는 시각과의 오차 평균 1.4 ms, 최대 8.1 ms
피아노 음높이곡의 기준음(+18 cent)에 대해 모든 음이 +17.7 ~ +18.3 cent
재생 중 끊김50 ms 넘게 멈추는 작업 0건

용어 풀이

박
음악을 들으며 발로 까딱이게 되는 일정한 맥박입니다.
마디와 첫 박
박을 몇 개씩 묶은 단위가 마디이고, 마디의 첫 박(다운비트)이 가장 강합니다.
못갖춘마디
곡이 마디 중간에서 시작할 때의 첫 마디입니다. 차트에서 0마디로 표시합니다.
BPM
1분에 몇 박이 오는지, 곧 템포입니다.
온셋
새 소리가 시작되는 순간입니다.
스펙트로그램
가로가 시간, 세로가 주파수인 소리의 그림입니다.
크로마
옥타브를 무시하고 12개 음이름으로 접은 음 분포입니다.
배음
한 음을 낼 때 기본 주파수의 정수배로 함께 울리는 성분입니다.
센트(cent)
반음의 1/100인 음높이 단위입니다.
자기상관
신호를 시간 방향으로 밀어 자기 자신과 겹쳐 보며 반복 주기를 찾는 방법입니다.
동적 계획법
큰 문제를 작은 문제의 최적해를 이어 붙여 푸는 방법입니다. 박의 줄을 곡 전체에 걸쳐 한 번에 찾는 데 씁니다.
은닉 마르코프 모델
겉으로 보이는 관측(소리) 뒤의 숨은 상태(코드, 첫 박, 조성)를 확률로 추론하는 모델입니다. 가장 그럴듯한 상태 순서는 비터비 알고리즘으로 찾습니다.
조성과 전조
곡이 중심으로 삼는 음과 음계가 조성이고, 곡 중간에 조성이 바뀌는 것이 전조입니다.
나란한조
같은 조표를 쓰는 장조와 단조입니다(C 장조와 A 단조).
자리바꿈
코드의 근음이 아닌 음을 가장 낮은 음(베이스)으로 두는 것입니다(G/B).
부속화음
조성 안의 다른 화음으로 가기 위해 잠시 빌려 쓰는 딸림화음 등입니다(V7/vi).
카멜롯 휠
조성을 5도권 순서로 1~12번 자리에 놓은 DJ용 표기입니다.

참고 문헌

  • D. P. W. Ellis, "Beat Tracking by Dynamic Programming," Journal of New Music Research, 36(1), 2007.
  • S. Böck and G. Widmer, "Maximum Filter Vibrato Suppression for Onset Detection," Proc. DAFx, 2013.
  • E. D. Scheirer, "Tempo and Beat Analysis of Acoustic Musical Signals," JASA, 103(1), 1998.
  • D. Moelants, "Preferred Tempo Reconsidered," Proc. ICMPC, 2002.
  • T. Fujishima, "Realtime Chord Recognition of Musical Sound: A System Using Common Lisp Music," Proc. ICMC, 1999.
  • M. Mauch and S. Dixon, "Simultaneous Estimation of Chords and Musical Context from Audio," IEEE Trans. Audio, Speech, and Language Processing, 18(6), 2010.
  • C. L. Krumhansl and E. J. Kessler, "Tracing the Dynamic Changes in Perceived Tonal Organization in a Spatial Representation of Musical Keys," Psychological Review, 89(4), 1982.
  • C. Harte, M. Sandler, S. Abdallah, and E. Gómez, "Symbolic Representation of Musical Chords: A Proposed Syntax for Text Annotations," Proc. ISMIR, 2005.
  • B. McFee et al., "librosa: Audio and Music Signal Analysis in Python," Proc. SciPy, 2015.
  • H. Fletcher, "Normal Vibration Frequencies of a Stiff Piano String," JASA, 36(1), 1964.
  • G. Weinreich, "Coupled Piano Strings," JASA, 62(6), 1977.
  • N. Whiteley, A. T. Cemgil, and S. Godsill, "Bayesian Modelling of Temporal Structure in Musical Audio," Proc. ISMIR, 2006.
  • F. Krebs, S. Böck, and G. Widmer, "An Efficient State-Space Model for Joint Tempo and Meter Tracking," Proc. ISMIR, 2015.
  • D. FitzGerald, "Harmonic/Percussive Separation using Median Filtering," Proc. DAFx, 2010.
  • M. Mauch and S. Dixon, "Approximate Note Transcription for the Improved Identification of Difficult Chords," Proc. ISMIR, 2010.
  • S. Kostka, D. Payne, and B. Almén, Tonal Harmony, 8th ed., McGraw-Hill, 2018.
  • J. O. Smith III, "Digital Audio Resampling Home Page," CCRMA, Stanford University.
  • C. Wilson, "A Tale of Two Clocks: Scheduling Web Audio with Precision," 2013.
  • W3C, Web Audio API 명세.