HOW TO USE MUSICVAE
- create notesequeces
convert_dir_to_note_sequences --input_dir=midi_data --output_file=notesequences.tfrecord --recursive
- training
music_vae_train --config=hier-multiperf_vel_1bar_med --run_dir=log1 --num_steps=70 --mode=train --examples_path=notesequences.tfrecord
생성된 checkpoint 들을 tar 로 묶은 뒤 사용
- generate (sample)
music_vae_generate \
--config=hier-multiperf_vel_1bar_med \
--checkpoint_file=/path/to/music_vae/checkpoints/mycheckpoint.tar \
--mode=sample \
--num_outputs=5 \
--output_dir=/tmp/music_vae/generated
- generate (interpolate)
music_vae_generate \
--config=hier-multiperf_vel_1bar_med \
--checkpoint_file=/path/to/music_vae/checkpoints/mycheckpoint.tar \
--mode=sample \
--num_outputs=5 \
--input_midi_1=1.mid \
--input_midi_2=3.mid \
--output_dir=/tmp/music_vae/generated
- tensorboard
tensorboard --logdir=logdir/train
Training dataset
- 특정 크기만큼 잘라냄
- 중복 제거
- 지원되지 않는 형식 제거
- 정해놓은 피치 클래스에 맞게 midi 파일의 음을 추론함
ex
_PITCH_CLASS_NAMES = [
'C' , 'C#' , 'D' , 'Eb' , 'E' , 'F' , 'F#' , 'G' , 'Ab' , 'A' , 'Bb' , 'B' ]
제한 사항
- 8개 이하의 트랙이 포함되어야 함
- 4/4 박자 기호가 있어야함
- BPM (비트가 빠름 한 박자에 많은 음표가 포함됨) 이 높은 파일을 input 으로 주어도 4/4 박자에 맞게 BPM 이 삭제되기 때문에 모든 템포를 학습할 순 없다.
- 128개의 악기 프리셋 + 드럼으로 제한된 midi 파일
- 미디 파일의 제한으로 인한 한계를 해결하기 위해 또 다른 프로젝트가 진행되고 있다고 함 NSynth (추후에 공부하여 업로드 하겠음)
MusicVAE (Trio model)
현악기로 구성된 midi file에 적합해 보인다. base drum melody로 구성된 track 만을 입력으로 받을 수 있었으며 현재 프로젝트의 음원은 일렉 악기 등등이 포함된 midi file 이므로 목적에 부합하지 않는다고 판단하였다.
(그래도 혹시나 해서 music_vae 에서 샘플링된 데이터를 input 에다가 줘 보았다 (output samples 의 악기 트랙은 input과 똑같이 구성되어 있을 것이니까 무조건 될 것이라고 생각했다) 하지만 pretty midi 가 해당 음악의 tampo key 등을 알 수 없다고 하였고 결과적으로 학습이 제대로 되지 않았다...
MusicVAE (multi track model)
일반 MIDI 데이터셋을 가지고 학습을 할 수 있으며 일반 MIDI 는 128개의 악기 소리의 표준 set 을 사용하는 음악 표현이다. 이러한 General MIDI 를 기본 표현으로 사용하여 여러 악기를 사용한 다성 음악 생성을 탐색한다.
모델은 최대 8개의 서로 다른 악기로 개별 소절을 생성할 수 있다.
값을 생성하기 위해 모델은 잠재 벡터를 샘플링하고 8개의 트랙 임베딩으로 디코딩함. 그 후 각 트랙 LSTM 은 기본 코드에 따라 조건이 지정된 각 트랙을 독립적으로 디코딩함
트랙 디코더는
1. 트랙에 사용할 128 일반 MIDI 프로그램 번호 + 드럼으로 표시되는 악기 선택
2. 연주할 음을 선택
제한사항
music vae 와 같이 4/4박자 기호가 존재해야 함
General midi 의 특징에 의해 128개의 악기 프리셋 + 드럼의 소리로 제한 됨
Nsynth 프로젝트를 통해 접근 가능한 악기 사운드 세트를 모델링하고 확장할 수 있음
train & generate
latent space
musical sequence 는 고차원적이다. 미디 파일에서 선택할 수 있는 모노포닉 피아노 멜로디는 총 88개이고 릴리즈, 휴식까지 고려한다면 총 90가지를 선택할 수 있다. 템포를 무시하고 시간을 16분 음표까지로 양자화하면 총 90^256개의 시퀀스로 확장되게 된다.
이렇게 무작위로 선택된 샘플의 피아노 롤은 음악이라고 하기 어려울정도로 듣기 싫다.
- latent space 모델은 트레이닝 데이터셋의 근본적인 특징을 학습할 수 있다 그러므로 위의 예제와 같이 무작위의 이상한 음악이 생성되는 것을 방지할 수 있다.
- 표현 : 모든 예제는 잠재 공간의 특정 지점에 mapping 되고 재구성될 수 있음
- 부드러움 : 잠재 공간에서 가까운 지점의 예는 서로 유사한 특성을 가지고 있음
How to Learn a Latent Space
AE : 오토인코더를 사용해 각 데이터를 벡터 (z) 로 압축 (인코딩)하여 동일한 output 을 나오도록 한다.(재생성) 이 방법을 통해 잠재 공간을 구축하는데 AE 의 핵심은 벡터가 데이터 자체보다 적은 차원을 갖도록 하여 발생하는 병목 현상으로 모델이 압축 방식을 학습하도록 함.
NSynth 는 음표 오디오에서 음색의 잠재 공간을 학습한 오토 인코더이다.
이러한 유형의 오토인코더는 임의의 벡터를 디코딩하면 현실적이지 않은 결과가 나올 수 있다. NSynth 는 재구성 및 보간이 가능하지만 무작위로 샘플링하는 기능은 없다.
이 문제를 겪지 않는 병목 현상을 강제하는 또 다른 방법은 변형 손실을 사용하는 것. 벡터의 차원을 제한하는 대신 인코더는 미리 정의된 구조를 사용하여 잠재 코드를 생성하는 것이 좋다.
Latent Spaces of Loops
- 두 시퀀스 사이를 morph 하고 그 속성을 혼합한다. 베이스라인에서 멜로디로의 모핑도 가능
- latent spaces interpolate 는 중간 시퀀스가 유효하고 이들 사이의 전환이 부드러움. 음표 선택은 끝점의 맥락에서 더 음악적으로 의미가 있음
Long-Term Structure
생성하는 출력이 일반적으로 일관된 장기 구조가 부족하다는 것
전체 음악을 생성하기 위해 장기 구조를 인코딩할 수 있게 됨
디코더를 직접 초기화하기 위해 latent code 를 사용하는 대신 먼저 출력의 각 막대에 대해 새로운 임베딩을 출력하는 RNN 에 코드를 전달함 그런 다음 RNN 은 잠재 코드 자체 대신 임베딩에 따라 16개의 막대 각각을 독립적으로 생성함
노트 디코더에서 회귀적으로 샘플링을 수행함
밴드 재결합
개별 악기를 모델링할 수 있다는 것을 확인하고 계층적 아키텍처를 조정하여 서로 다른 악기간의 상호 작용을 모델링함.
단일 음 디코더로 임베딩을 전달하는 대신 각 임베딩을 각 악기 혹은 트랙에 대해 하나씩 여러 디코더로 전달함
잠재 공간에서 짧은 다중 악기 편곡을 표현함으로써 단일 멜로디에 대해 했던 것과 동일하게 모든 조작을 할 수 있음
완전히 다른 8개의 계측기에 대해 두 개의 1 bar 배열 사이를 보간할 수 있음
16마디 섹션에 거쳐 3개의 악기 (trio ) 을 모델링 하기 위해 소절에 걸쳐 있는 계층 구조를 추가할 수 있다.