ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [R] AI기반 작곡 솔루션(AI MUSIC) 재현 02
    Project/AI Music (with R) 2020. 5. 24. 02:44


    목차



    서론


     지난 게시글에서는 음악 종류에 따라 인공지능 기반 작곡에 관한 연구를 살펴보았으며, Markov Chain Model 기반의 인공지능 작곡 솔루션(AI MUSIC) 연구 모형을 제시하였다. 연구모형에 대한 간단한 리뷰를 하자면, <그림 1>과 같이 모델을 생성하는 과정(Modeling Process)과 모델을 기반으로 작곡을 하는 과정(Compose Process)으로 구성되어 있다.


    <그림 1> Markov Chain 기반 AI Composer(By Jay Data Graph)



    R에서 소리를 출력하기


     연구 모형을 소개하기에 소리를 출력하는 방법을 이해할 필요가 있다. 먼저, 소리를 분석할 때 사용하는 패키지들이 있다. 그 중에서 소개하고자하는 패키지는 "tuneR"이다.

      • tuneR
    library(tuneR)
    
    # sine()을 이용해서 쉽게 소리 출력 가능
    # sine(freq,
    #      duration = samp.rate,
    #      from = 0,
    #      samp.rate = 44100,
    #      bit = 1,
    #      stereo = FALSE,
    #      xunit = c("samples", "time"), ...)
    #
    # freq에 hz 입력를 입력하여 소리 출력
    
    sound = sine(440)
    plot(head(sound, 1000))
    

    <그림 2> 440hz 소리의 음파 일부 시각화



    Modeling Process(Step1. 악보를 처리하기)


     악보를 수집하기 위해서 초등학교 교과서에 수록되어있는 "비행기"를 수집했으며, Markov Chain Model을 활용하기 위해 변환하는 작업이 필요하다. 비행기 악보를 계이름과 박자를 list 구조로 변환하는 작업을 한다.

    <그림 3> 네이버에서 '비행기'로 검색하여 나타난 악보 예시


    # 악보를 계이름과 박자로 변환
    # airplane = list(c("4E","3/16"),c("4D","1/16"), c("4C","1/8"), c("4D","1/8"),
    #                 c("4E","1/8"), c("4E","1/8"), c("4E","1/4"),
    #                 c("4D","1/8"), c("4D","1/8"), c("4D","1/4"),
    #                 c("4E","1/8"), c("4E","1/8"), c("4E","1/4"),
    #                 c("4E","3/16"),c("4D","1/16"), c("4C","1/8"), c("4D","1/8"),
    #                 c("4E","1/8"), c("4E","1/8"), c("4E","1/4"),
    #                 c("4D","1/8"), c("4D","1/8"), c("4E","3/16"), c("4D","1/16"),
    #                 c("4C","1/2"))
    

     


    Modeling Process(Step2. Markov Chain Model)


     변환한 악보 리스트를 이용해서, <그림 3>과 같이 Markov Chain Model을 구성해야 한다. 구성에 앞서 Markov Chain Model의 Matrix를 이해할 필요가 있다. Matrix의 왼쪽 label은 현재 상태를 의미하고, Matrix의 상단 label은 미래 상태를 의미한다.


     

     

    <그림 4> "비행기"의 계이름과 박자를 기반으로 구성한 Matrix


     첫번째 행의 첫번째 열은 4C(4옥타브 도)가 나왔을 경우 4C가 온 경우가 4회 발생되었다는 것을 의미한다. 이를 이용해서 다음 멜로디가 어떤 계이름과 반자를 가지고 있을지 예측하는 Markov Chain Model이 생성된다. 다음은, 비행기 음정을 기반으로 모델이 나오도록 생성한 로직이다.

    # vec1 = data.frame()
    #
    # for(i in 1:(length(airplane)-1))
    # {
    #     s_sca = data.frame(table(airplane[[i]][1],
    #                              airplane[[i+1]][1]))
    #     vec1 = rbind(vec1, s_sca)
    # }
    #
    # vec1 = data.frame(matrix(table(vec1), nrow = nrow(table(vec1)),
    #                          byrow = T,
    #                          dimnames = list(rownames(table(vec1)),colnames(table(vec1)))),
    #                   stringAsFactors = F)
    #
    # vec1 실행 결과

    # > vec1

    #   X4D X4C X4E

    # 4E   5   3   2

    # 4D   0   3   0

    # 4C   7   4   0

     다음에 오는 박자를 예측하기 위해서 위와 같은 방식으로 비행기의 박자를 기반으로 모델을 생성할 필요가 있다.

    # vec2 = data.frame()
    #
    # for(i in 1:(length(airplane)-1))
    # {
    #     s_sca = data.frame(table(airplane[[i]][2],
    #                              airplane[[i+1]][2]))
    #     vec2 = rbind(vec1, s_sca)
    # }
    #
    # vec2 = data.frame(matrix(table(vec2), nrow = nrow(table(vec2)),
    #                          byrow = T,
    #                          dimnames = list(rownames(table(vec2)),colnames(table(vec2)))),
    #                   stringAsFactors = F)
    #
    # vec2 실행 결과

    # > vec2 # X1.16 X1.8 X1.4 X3.16 X1.2 # 3/16 3 0 0 0 0 # 1/16 2 9 3 0 0 # 1/8 4 0 0 0 1

    # 1/4 1 0 1 0 0

     두 matrix인 vec1과 vec2는 각각 비행기의 음정과 박자를 이용해서 Markov Chain 모델을 만들었으며, 이를 바탕으로 다음에 올 음정과 박자를 예측하게 된다.



    Lesson Learned


     인공지능 작곡 솔루션(AI MUSIC)을 재현하기 위한 과정 중에서 Modeling Process를 소개했다. 이를 위해 R을 활용해서 AI Composer를 재연한 소스 코드를 리뷰하였다. 재연하는 과정에서 악보를 list로 변형하는 과정에 사람이 변환하는 과정이 있다. 이는, 향후 이번 프로젝트 재현을 마치고 악보를 자동으로 변경하기 위한 기능이 필요하다고 생각이 든다. 현재까지 작업한 영상은 아래의 <그림 5>를 클릭하면 Youtube로 연결된다.


    <그림 5> Jay Data Graph 링크



    Reference

     Uwe Ligges, "Analysis of Music and Speech, https://cran.r-project.org/web/packages/tuneR/tuneR.pdf

    댓글

Designed by Tistory.