wav 음원에서 '음'을 따내어 보려고 하는데요

kuradocks의 이미지

(다른 게시판에 올렸는데 아무래도 여기가 적절한 것 같아서 여기에 다시 올립니다.

그런데 아무리 찾아도 삭제를 어떻게 하는지 모르겠어서 저곳의 내용을 삭제하지 못하고 있습니다.

제가 KLDP에 글을 쓰는건 처음이라서요.. 죄송합니다.)

안녕하세요, 제가 어떤 필요로 wav파일에서 주파수 이용해서 음을 따는 작업을 하려고 합니다.

개발해서 밖에 내놓을 정도로 해야 되는건 아니고 하는데까지 구현을 해보면 될텐데요,

논문이나 관련된 알고리즘(pitch detection algorithm)을 제대로 본건 아니라서 한글로 된 간접적인 내용들만 읽었습니다.

그래서 제가 질문을 드리고 싶은데.. 우선 이게 어느 정도로 가능하기는 한 작업인지, 난이도가 어느 정도인지가 궁금합니다.

1. 뭐 아주 복잡한 클래식이나 락음악 같은 것들 아니고, 어느 정도 단순선 띄는 음악이면 '어느 계이름이 어느 구간에서 사용되는지' 정도를

할 수가 있을까요? 음원파일 주파수 분석하는 프로그램이 잡아내는 것 보면 가능은 한 것 같던데...

악보를 그리자는게 아니라 특정 구간에서 어떤 코드가 나오는지 정도, 만약에 가능하면 여기까지 해보고 싶어서요..

2. 푸리에 트랜스폼 등으로 해야될 것 같은데, 제가 이런쪽 수학은 제대로 안해서 수학적인 지식도 부족하고 코딩도 잘 하지는

못하고 C말고 딱히 다룰 줄 아는건 없습니다. 물론 매트립이야 필요하면 될텐데..

이게 좀 많이 어려운 작업일까요?

앞에서 말씀 드렸지만, 정말 제대로 해서 의미있는 결과를 내는게 아니라 제한적인 범위 음악에서 코드를 어느 정도 찾아내는

정도로 하려는데 몇 주 정도로 잡고 해볼만한 작업인지 아닌지 판단이 잘 서지 않아서, 질문을 드립니다.

shint의 이미지

제가 해본다면 이런 방식으로 해볼거 같습니다.
학문적 내용은 전혀 모르더라도. 그냥 만들어 보는겁니다.

1. 음 비교
도' 레' 미' 파' 솔'... 등이 있을때. 각 음을 녹음 합니다.
녹음이 됐으면. 그 음을 비교합니다.

1~100까지의 값이 있을때.
10~20은 도' 20~30은 레' 30~40'은 미' 40~50'은 파' 라고 확인할 수 있습니다.

2. 푸리에 트렌스폼
이건 공부를 해보거나. 아시는분에게 문의 하셔야 할거 같습니다.

음의 간격중에 일부만을 잘라내거나. 나눠서.
일부 값을 보간해서 사용하는 함수를 구현한다면.이와 비슷한 기능의 구현이 가능하다고 생각됩니다.

기능적인건 어떻게든 구현이 되지만.
정확도나. 호환성. 안정성등을 위해서는 학문적으로 별도의 도움이나 공부가 필요해 보입니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

snowall의 이미지

어느정도 단순성 정도가 아니라, 단음 음악(monopoly)이 아니고서는 매우 괴로울 겁니다.

예전에 비슷한 질문이 올라온 적이 있어서 이어드립니다.

http://kldp.org/node/95040

피할 수 있을때 즐겨라! http://melotopia.net/b

kuradocks의 이미지

언급해주시면 링크는 저도 찾아 보았던 것인데요,

제가 제대로 이해하고 있는 지는 모르겠습니다만, 말씀하신 글에서의 핵심은 '악기의 분리'인 것 같습니다.
말하자면 같은 음(주파수)을 내는 악기를 서로 분리하는 것,

KLDP인지 아닌지 기억은 안나지만 보컬의 소리를 따로 분리해 내는 작업도 비슷한 것이 아닐까 생각하는데요

제가 글에서 말씀드린 작업과는 다소 다른 것이 아닐까 생각합니다. 같은 음을 내는 악기를 분리하는 작업은
음색이라든지.. 글쎄 저도 음악을 잘 아는게 아니라서 뭐라고 말해야 될지 모르겠습니다만, 직관적으로
생각해도 디지털화된 file형태에서 찾아내기 쉬운 것은 아니라고 봅니다.

그런데 저는 어떤 악기든, 그 음원 파일 하나가 특정 순간에 '어느 음에 가장 집중하는지'를 파악하고자 하는
것이라서요.. 제대로 써본 것은 아니지만 음원 파일 주파수 분석하는 프로그램이, 특성 순간에 어느 음이
가장 중점적으로 등장하는지를 알아낸 것은 본 것 같습니다. 제가 생각하는 것도 이 부분이라서....

snowall의 이미지

특정 순간에 푸리에 변환으로 주파수 영역을 조사하면 되긴 될 것 같은데요

삑삑거리는 단음이 아닌 한, 여러 악기가 뒤섞여 있다면 거의 모든 주파수 영역이 뒤섞여서 어떤 음이 주로 존재한다고 말하기 곤란할 것 같습니다.

일단 굳이 해보고 싶다면 적당한 샘플을 만들어서 푸리에 분석을 해보시면 어떤 패턴을 잡아내야 할지 보일 것 같네요

피할 수 있을때 즐겨라! http://melotopia.net/b

shint의 이미지

그거 있잖아요.
파형 곡선 3가지가 물결치듯이 보이는거요.

//이 영상을 보시면.
http://www.youtube.com/watch?feature=fvwp&NR=1&v=yp8AVAf3R3c

0 솔
1 파
0 미
1 레
0 도
이건. 0x01010 이니까. 레와 파가 있다고 알게 될겁니다.

값을 증폭해서 * 1000 몇배 한다면. 그 값을 좀 더 확실히 구분 가능할겁니다.
cos같은 값들과 비교해서 등분'할 수 있다면. 파형도 비교해볼 수 있을겁니다.

//
그리고. 플래시나 자바스크립트나 C로 만든 스펙트럼 소스등을 분석하면.
출력하는 방식도 알 수 있게 될거 같습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

qiiiiiiiip의 이미지

질문하신 내용을 보니, 하시고자하는 일을
구체적으로 잘 알고 계신것 같네요..

실제 구현자체는 어렵지 않습니다만,
대상 음악이 얼마나 복잡하냐가 관건이 될 것으로 보입니다.

먼저 대상 신호의 스펙트로그램을 살펴보시면,
어느정도 가능성이 판단될 것입니다.
matlab으로 한두줄이면 코딩가능하고 (명령어를 잊어버렸는네요. spec으로 시작할듯)
그보다는 cooledit이나 goldwave등의 툴의 평가판을 받으셔서
spectrogram을 보시면 됩니다.

shint의 이미지

기본이 되는 소스를 만들어 봤습니다. 참고해 보세요.
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=278&MAEULNO=20&no=32157&page=1

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

snowall의 이미지

http://webcache.googleusercontent.com/search?q=cache:Iyl-N5_PtMgJ:theta.tistory.com/26+&cd=1&hl=ko&ct=clnk

위의 글이 떠오르네요. 원문은 삭제되어서 찾을 수 없었습니다.

피할 수 있을때 즐겨라! http://melotopia.net/b

Prentice의 이미지

GPL 소스 괜찮으시면 praat라는 프로그램 한번 알아보세요.

사람의 말소리 분석 등을 위한 프로그램이긴 한데... praat에서 얘기하는 F0 (fundamental frequency) 수치가 바로 pitch입니다.