알라딘MGG와이드바


Python 으로 펜타토닉 스케일 위치 구하기 개발 이야기

얼마 전에 기타 솔로가 어떤 펜타토닉 스케일로 되어 있는지를 알고 싶어서
플랫보드를 프린터해서 노트를 손으로 그려가며 펜타토닉 CAGED 모양을 비교해서 겨우 G minor 를 찾았다.


찾고 나서 보니 b 가 2개 붙어 있는 곡이라 Bb 장조 혹은 G 단조일테니 G minor 펜타토닉부터 찾아보면 빨랐겠지만
조성을 모른 상태로 펜타토닉 스케일을 좀더 쉽게 찾을 방법이 없을까 해서 파이썬으로 간단하게 만들어 보았다.
솔로 노트를 있는대로 입력하면 12개의 마이너 스케일과 얼마나 유사한지를 출력해 준다.
예외 처리 같은 건 생략한다. 나중에는 모드나 코드톤 같은 것도 분석해 주면 좋을 거 같다.
(여기까지 쓰고 보니 Guitar Pro 에 이런 비슷한 기능이 이미 있을 거 같다.)
(그리고 어느 정도 수준에 이르면 귀로 듣자마자 스케일을 알 수 있겠지. 이런 코드를 계속 쓰고 있으면 사실 안 되는 거다.)

from itertools import combinations

# A C D E G(0, 3, 5, 7, 10)
pentatonics = [0, 3, 5, 7, 10]
note_array = ['A', 'Bb', 'B', 'C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab']

# 입력값을 정리한다. (중복 제거, sort)
def GetInput():
while True:
input_str = input("Input 4~7 different notes as number. ex. A C D E Gb\ninput: ")
input_notes = [x for x in input_str.split(' ')] # 입력값을 list 로 만들기
input_notes = list(dict.fromkeys(input_notes)) # 중복 제거
input_notes.sort()
if len(input_notes) >= 4 and len(input_notes) <= 7:
return input_notes
else:
pass

# 12 개의 minor 펜타토닉 데이터를 준비한다.
def ReadyPentatonicData():
pentatonic_notes = []
for i in range(12):
p = [(a + i) % 12 for a in pentatonics]
p.sort()
p_note = [note_array[a] for a in p]
pentatonic_notes.append(p_note)
return pentatonic_notes

# 유사도 구하기
def CalcSimilarity(input_notes, index, penta_data):
input_notes_comb = combinations(input_notes, min(len(input_notes), 5)) # 최대 5개의 조합을 찾은 뒤
max_sum = -1
max_sum_list = []
for in_notes in list(input_notes_comb):
s = sum([1 for i, j in zip(in_notes, penta_data) if i == j]) # 노트가 몇 개 일치하는가 구하고 가장 많이 맞는 값을 출력한다.
if s > max_sum:
max_sum = s
max_sum_list = in_notes
print(note_array[index], "minor:", penta_data, " input:", max_sum_list, "Similarity:", max_sum / 5.0 * 100.0, '%') # 같은 아이템이 몇 개 있는가

def main():
input_notes = GetInput()

pentatonic_notes = ReadyPentatonicData()

for index in range(len(pentatonic_notes)):
penta_data = pentatonic_notes[index]
CalcSimilarity(input_notes, index, penta_data)

if __name__ == "__main__":
main()


결과는 다음과 같다.


덧글

  • 커널 2020/09/02 15:51 # 삭제 답글

    중복제거 fromkeys 로 쓰는게 가장 빠른 방식이구나. 배웠네 ㅎㅎ https://www.geeksforgeeks.org/python-ways-to-remove-duplicates-from-list/

  • 박PD 2020/09/14 01:55 #

    Python 참 재미있네. :)
댓글 입력 영역


Yes24위대한게임의탄생3

위대한 게임의 탄생 3
예스24 | 애드온2