본문 바로가기
AI 도구

MusicLang: 대형 언어 모델로 누구나 쉽게 MIDI 음악 작곡하기

by James AI Explorer 2024. 3. 13.
    728x90

    안녕하세요! 오늘은 MusicLang이라는 음악 작곡 및 분석을 위한 대형 언어 모델파이썬 프레임워크를 이용해서 나만의 MIDI 음악을 작곡해 보겠습니다. MusicLang은 작곡가가 음악을 로드하고 작성하며, 변환하고 예측하는 데 사용할 수 있는 새로운 언어를 구현함으로써 손쉽게 높은 퀄리티의 MIDI 음악을 다룰 수 있도록 지원합니다. 이 블로그에서는 MusicLang 언어모델과 라이브러리 활용방법, 무작위 음악, 코드진행 음악 등 MIDI 음악 생성예제에 대해서 알아보겠습니다. 

    MusicLang 대형 언어 모델로 나만의 미디음악 작곡하기

    https://www.musiclang.io/

     

    MusicLang .

    MusicLang is Revolutionising Music Creation with AI. Made for artists & by artists.

    www.musiclang.io

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

    MusicLang 개요

    MusicLang은 음악 작곡, 분석, 변환 및 예측을 위한 도구를 제공하는 파이썬 프레임워크이며, 내부의 자체 대형 언어 모델(Large Language Model)을 사용하여 음악 악보에서 다음에 어떤 일이 일어날지 예측함으로써 새로운 음악 아이디어를 도출할 수 있도록 지원합니다. MusicLang은 주요 기능과 특징은 다음과 같습니다:

    • 음악 작곡 및 분석: MusicLang은 음악을 작곡하고 분석하는 데 사용할 수 있습니다. 음악 작곡을 위한 간단하고 직관적인 인터페이스를 제공하여 사용자가 빠르게 음악을 만들 수 있습니다.
    • 음악 변환: MusicLang은 음악을 변환하고 재구성하는 데 사용될 수 있습니다. 사용자가 음악을 다른 형식으로 변환하거나 음악을 변형하여 새로운 음악을 만들 수 있습니다.
    • 음악 예측: 내부적으로 MusicLang은 대형 언어 모델을 사용하여 음악 악보에서 다음에 일어날 일을 예측합니다. 이를 통해 사용자는 기존 음악을 기반으로 예측을 생성하고 새로운 음악 아이디어를 도출할 수 있습니다.
    • 간결한 언어: MusicLang은 새로운 음악 언어를 구현하여 사용자가 음악을 간단하고 고수준으로 다룰 수 있습니다. 이를 통해 사용자는 복잡한 음악 구조를 직관적으로 표현할 수 있습니다.
    • 응용 분야: MusicLang은 음악 작곡가, 음악 분석가, 프로그래머, 데이터 과학자 등 다양한 분야의 사용자들에게 유용합니다. 이 도구를 사용하여 음악을 자동화하고 더 효율적으로 작업할 수 있습니다.

    요약하면, MusicLang은 음악 작곡과 분석을 위한 도구로서 사용자가 음악을 만들고 변환하는 과정을 지원합니다. 아래 허깅페이스 스페이스 링크에서 MusicLang을 간편하게 체험해 보실 수 있습니다. 

    https://huggingface.co/spaces/musiclang/musiclang-predic

     

    Musiclang - a Hugging Face Space by musiclang

     

    huggingface.co

    728x90

    MIDI 음악 만들기

    MIDI 란?

    MIDI는 Musical Instrument Digital Interface의 약자로, 음악 기기 간에 음악 정보를 전송하기 위한 표준 통신 프로토콜입니다. MIDI 파일은 이러한 MIDI 메시지의 시퀀스를 저장하는 형식입니다. 여기에는 음표, 박자, 음악적 이벤트 및 제어 정보가 포함될 수 있습니다. MIDI 파일은 음악을 실제로 재생하는 것이 아니라 음악을 표현하고 전달하는 데 사용됩니다. MIDI 파일은 다음과 같은 특징을 가지고 있습니다:

    • 가벼움: MIDI 파일은 실제 음악을 포함하지 않으며, 대신 음악적 이벤트의 일련의 명령어를 저장합니다. 따라서 파일 크기가 상대적으로 작습니다.
    • 편집 가능성: MIDI 파일은 음악적 이벤트의 명령어를 저장하기 때문에 편집이 쉽습니다. 음악을 편집하거나 다른 음악 소프트웨어에서 재생하기 위해 MIDI 파일을 편집할 수 있습니다.
    • 다양한 악기 지원: MIDI는 다양한 악기와 장치에 적합합니다. 각 악기의 소리를 결정하는 MIDI 명령어는 MIDI 파일에 포함됩니다. 또한 MIDI 프로그램을 통해 원하는 악기를 추가하거나 수정, 삭제할 수 있습니다. 
    • 표준 포맷: MIDI는 표준 포맷이므로 MIDI 파일을 지원하는 거의 모든 음악 소프트웨어나 장치에서 재생할 수 있습니다. MIDI 파일은 다양한 음악 작업에서 사용됩니다. 이 파일 형식은 음악 제작, 편집, 재생, 녹음 등에 널리 사용됩니다.

    MIDI 파일은 실제 음악 녹음과는 다르게 컴퓨터에서 음악을 다루거나, MIDI 호환 장치와 소프트웨어를 통해 음악을 재생하고 편집하는 데에 매우 효과적입니다.

    환경설정 및 라이브러리 설치

    먼저, MusicLang을 파이썬에서 구동하기 위해 파이썬 라이브러리인 musiclang_predict를 설치합니다. 파이썬 환경설정과 코드실행은 WSL(Windows Subsystem for Linux) 또는 리눅스 시스템에서 진행하시는것을 추천드립니다. 윈도우11 환경에서 실행해 본 결과 저의 경우는 인코딩 에러, setup.py 수정, run.dll 빌드 등 복잡한 디버깅 작업으로 많은 시간이 소요되고, 예제코드도 정상적으로 실행하지 못하였습니다. 아래 링크는 MusicLang 깃 허브 프로젝트 페이지입니다. 

    https://github.com/MusicLang/musiclang_predict/tree/main

     

    GitHub - MusicLang/musiclang_predict: AI Prediction api of the MusicLang package

    AI Prediction api of the MusicLang package. Contribute to MusicLang/musiclang_predict development by creating an account on GitHub.

    github.com

     

    아래 WSL 예시코드와 같이 명령 프롬프트에서 가상환경을 만들고 musiclang_predict 라이브러리를 설치합니다.

    python3.11 -m venv myenv
    source myenv/bin/activate
    pip install musiclang_predict

    musiclang_predict 라이브러리 설치

    파이썬 예제코드 실행

    예제코드의 출처는 유튜브 "How MusicLang Revolutionises AI Music Generation in Music Industry"이며, 예제코드에 대한 동작순서와 설명은 다음과 같습니다. 

    • 1. MusicLangPredictor 초기화: 먼저 `MusicLangPredictor` 클래스를 초기화합니다. 이 클래스는 미리 학습된 음악 생성 모델을 로드하고 사용자 설정을 불러옵니다. 이 모델은 MusicLang 데이터셋에서 학습된 GPT (Generative Pre-trained Transformer) 모델이며, 텍스트 데이터를 기반으로 음악을 생성할 수 있는 딥러닝 모델입니다.
    • 2. 자유 음악 생성: 미리 학습된 모델을 사용하여 무작위 음악 생성합니다. `ml.predict()` 메서드를 호출하여 모델에게 생성할 음악의 길이 (`nb_tokens`), 생성의 다양성 (`temperature`), 생성에 사용할 토큰 누적 확률 (`top_p`), 그리고 랜덤 시드 값을 지정하고 music.mid 파일로 저장합니다. 
    • 3. 코드 진행 제어: 사용자가 지정한 코드 진행에 따라 음악을 생성합니다. `ml.predict_chords()` 메서드를 호출하여 모델에게 생성할 코드 진행 (`chord_progression`)과 다양한 설정을 전달합니다. 생성된 음악은 chord.mid 파일로 저장됩니다.
    • 4. 사용자 음악 생성: 사용자가 지정한 음악에 대해 지속적인 생성을 수행합니다. `ml.predict()` 메서드를 호출하여 이전 음악에 지속적으로 새로운 음향을 추가하여 continue.mid 파일로 저장합니다. 
    • 5. 코드 진행과 사용자 음악 조합: 이 단계에서는 사용자 지정 음악에 코드 진행을 결합한 음악을 생성합니다. `ml.predict_chords()` 메서드를 호출하여 이전 음악과 지정된 코드 진행을 조합하여 새로운 음악을 생성하고,  songchord.mid 파일로 저장합니다.

    이러한 단계를 통해 MusicLangPredictor를 사용하여 다양한 방법으로 음악을 생성하고 제어할 수 있습니다. 다음은 MusicLang 을 활용한 파이썬 예제 코드입니다. 

    import time
    from musiclang_predict import MusicLangPredictor, corpus
    
    # Initialize MusicLangPredictor
    ml = MusicLangPredictor('musiclang/musiclang-v2')
    
    # 1. Generating a free music idea
    # 1024 tokens ~ 25s of music (depending on the number of instruments)
    nb_tokens_free = 1024 # {type:"slider", min:32, max:1024, step:32}
    temperature_free = 0.9 # {type:"slider", min:0.0, max:1, step:0.05}
    top_p_free = 1.0 # {type:"slider", min:0.0, max:1.0, step:0.05}
    seed_free = 16 # {type: "integer"} Set to 0 to unset seed
    
    start = time.time()
    score_free = ml.predict(
        nb_tokens=nb_tokens_free,
        temperature=temperature_free,
        topp=top_p_free,
        rng_seed=seed_free
    )
    end = time.time()
    print(f"Free music idea generated in {end - start} seconds")
    score_free.to_midi('music.mid')
    
    # 2. Controlling the chord progression
    # Chord qualities: M, m, 7, m7b5, sus2, sus4, m7, M7, dim, dim7.
    chord_progression = "Am CM Dm E7 Am" # {type: "string"}
    nb_tokens_chords = 1024 # {type:"slider", min:32, max:1024, step:32}
    temperature_chords = 0.8 # {type:"slider", min:0.0, max:1, step:0.05}
    top_p_chords = 1.0 # {type:"slider", min:0.0, max:1.0, step:0.05}
    seed_chords = 42 # {type: "integer"}
    
    start = time.time()
    score_chords = ml.predict_chords(
        chord_progression,
        time_signature=(4, 4),
        temperature=temperature_chords,
        topp=top_p_chords,
        rng_seed=seed_chords
    )
    end = time.time()
    print(f"Music with chord progression generated in {end - start} seconds")
    score_chords.to_midi('chord.mid', tempo=110, time_signature=(4, 4))
    
    # 3. Using a prompt to continue your own music
    song_name_continue = 'boney_m_ma_baker' # ['bach_847', 'bob_marley_jammin', 'boney_m_ma_baker', 'mozart_alla_turca', 'white_stripes_seven_nation_army']
    nb_tokens_continue = 1504 # {type:"slider", min:32, max:2048, step:32}
    temperature_continue = 0.85 # {type:"slider", min:0.0, max:1, step:0.05}
    top_p_continue = 1.0 # {type:"slider", min:0.0, max:1.0, step:0.05}
    seed_continue = 1000 # {type: "integer"}
    
    start = time.time()
    score_continue = ml.predict(
        score=corpus.get_midi_path_from_corpus(song_name_continue),
        nb_tokens=nb_tokens_continue,
        prompt_chord_range=(0,4),
        temperature=temperature_continue,
        topp=top_p_continue,
        rng_seed=seed_continue
    )
    end = time.time()
    print(f"Continued music generated in {end - start} seconds")
    score_continue.to_midi('continue.mid', tempo=120, time_signature=(4, 4))
    
    # 4. Combining both prompt and chord progression
    song_name_with_chords = 'bach_847' # ['bach_847', 'bob_marley_jammin', 'boney_m_ma_baker', 'mozart_alla_turca', 'white_stripes_seven_nation_army']
    chord_progression_with_prompt = "Cm C7/E Fm F#dim G7 Cm" # {type: "string"}
    nb_tokens_with_chords = 1024 # {type:"slider", min:32, max:1024, step:32}
    temperature_with_chords = 0.8 # {type:"slider", min:0.0, max:1, step:0.05}
    top_p_with_chords = 1.0 # {type:"slider", min:0.0, max:1.0, step:0.05}
    seed_with_chords = 3666 # {type: "integer"}
    
    start = time.time()
    score_combined = ml.predict_chords(
        chord_progression_with_prompt,
        score=corpus.get_midi_path_from_corpus(song_name_with_chords),
        time_signature=(4, 4),
        nb_tokens=nb_tokens_with_chords,
        prompt_chord_range=(0,4),
        temperature=temperature_with_chords,
        topp=top_p_with_chords,
        rng_seed=seed_with_chords
    )
    end = time.time()
    print(f"Combined music generated in {end - start} seconds")
    score_combined.to_midi('songchord.mid', tempo=110, time_signature=(4, 4))

     

    예제코드 실행 화면

    예제코드를 실행하여 생성된 MIDI 파일은 다음과 같습니다. (MIDI파일 크기가 5KB 이하로 작습니다.)

    songchord.mid
    0.00MB
    continue.mid
    0.00MB
    chord.mid
    0.00MB
    music.mid
    0.00MB

    MIDI 프로그램 실행

    예제코드에서 생성된 MIDI 파일을 실행할 수 있는 프로그램은 LogicPro, Cubase, LMMS 등 다양한데요. 이 블로그에서는 LMMS를 사용해서 예제코드의 결과물을 확인해 보겠습니다. LMMS는 아래 링크에서 다운로드하실 수 있습니다. 

    https://lmms.io/download#windows

     

    LMMS | 다운로드

    리눅스에서 LMMS 설치하기 아래의 버튼을 클릭하여 LMMS의 Linux 버전을 다운로드하시기 바랍니다. 안정 버전 Linux 64-bit LMMS 1.2.2 릴리스 노트 보기 Note for macOS users: if you're using macOS 10.14(Mojave) or newe

    lmms.io

    LMMS 다운로드 화면

    MIDI 프로그램 설치가 완료되면 사운드를 재생하기 위한 기본 사운드 폰트가 필요한데요. 아래 링크에서 무료 사운드 폰트를 다운로드할 수 있으며, 아래 화면과 같이 .sf2 파일을 저장하고 해당 디렉토리를 LMMS에 설정해 줍니다. 

    https://freepats.zenvoid.org/SoundSets/general-midi.html

     

    FreePats project - General MIDI sound sets

    FreePats General MIDI sound set Please note that this sound set is incomplete: it contains 45 entries for the melodic sound set and 43 entries for the percussion kit. More instruments will be included in subsequent releases, and we hope to achieve a comple

    freepats.zenvoid.org

    사운드 폰트 다운로드 화면

    다운로드한 사운드폰트 파일은 아래 화면과 같이 LMMS 메뉴의 편집-설정에서 "기본 사운드폰트 파일"로 설정해 줍니다.

    기본 사운드폰트 파일 설정화면

    설정이 완료되면 예제코드에서 생성된 .mid 파일을 아래 화면과 같이 LMMS 파일메뉴 "가져오기"를 통해 불러옵니다. 

    LMMS에서 .mid 파일 불러오기

    .mid 파일을 불러온 후, 악기별로 나누어진 각 트랙을 더블클릭하면 음정, 박자, 길이 등을 편집할 수 있습니다. 

    트랙 자세히 보기

    예제코드에서 생성된 MIDI 파일은 아래 Play 버튼을 클릭하시면 들어보실 수 있습니다. 

    cord.mid
    continue.mid
    music.mid
    songchord.mid

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

    마치며

    오늘은 음악 작곡 및 분석을 위한 AI 도구인 MusicLang에 대해 알아보고 이를 이용해서 새로운 음악 아이디어 생성, 코드진행 음악생성, 사용자 지정 음악 생성, 코드와 사용자 음악 결합과 같은 MIDI 음악 작곡 예제를 다루어 보았습니다. MusicLang은 음악 작곡가부터 음악 분석가, 프로그래머, 데이터 과학자까지 다양한 분야의 사용자들에게 음악 창작에 대한 접근성을 높여주고, 음악을 만들고 수정하는 과정이 더욱 즐겁고 효율적으로 이루어질 수 있도록 지원합니다.

     

    MusicLang과 같은 AI 음악 창작 도구는 음악 산업에 더 많은 혁신을 가져올 것으로 기대됩니다. 이러한 도구를 통해 더 많은 사람들이 음악을 만들고 즐길 수 있기를 기대해 보면서 오늘 내용은 여기서 마치겠습니다. 여러분도 MusicLang을 이용해서 나만의 MIDI 음악을 작곡해 보시면 어떨까요? 저는 다음에 더 유익한 정보로 다시 찾아뵙겠습니다. 감사합니다! 

     

     

    2024.03.10 - [AI 도구] - [꿀팁] 비행기 모드 AI 채팅! MLCChat으로 스마트폰 데이터 연결 없이 AI 즐기기

     

    [꿀팁] 비행기 모드 AI 채팅! MLCChat으로 스마트폰 데이터 연결 없이 AI 즐기기

    안녕하세요! 오늘은 "MLCChat"이라는 앱을 이용해서 데이터 연결 없이 스마트폰에서 대형 언어 모델과 대화하는 방법에 대해 알아보겠습니다. MLCChat(Machine Learning Chat)은 웹, iOS 및 Android 등 다양한

    fornewchallenge.tistory.com

     

     

    728x90