🎼

Pythonで音楽を生成してwavで出力する

2021/12/03に公開

背景

  • pretty_midiでmidi作れるのはいいけどmacだと再生がめんどくさいので楽にしたい

環境

  • MacOS Big Sur
  • Python 3.8

準備

  • 素のfulid-synthでも音は鳴るが、リッチな音を鳴らすためにサウンドフォントをいれておく
pip install pretty_midi 
brew install fluid-synth
wget 'https://www.dropbox.com/s/4x27l49kxcwamp5/GeneralUser_GS_1.471.zip'
unzip GeneralUser_GS_1.471.zip
mv "GeneralUser GS 1.471" sf

結論

  1. pretty_midiでmidiを作る
  2. fluid-synthでサウンドフォント使った音に変換
  3. scipy.ioでwavファイルに書き出し
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pretty_midi
from scipy.io import wavfile
from pathlib import Path

CURRENT_DIR = str(Path(__file__).resolve().parent)

def create_music():
    # 準備
    new_music = pretty_midi.PrettyMIDI()

    # チェロを設定
    cello_program = pretty_midi.instrument_name_to_program("Cello")
    cello = pretty_midi.Instrument(program=cello_program)

    # どれみふぁそらしどを鳴らす
    time = 0.0
    for note_name in ["C5", "D5", "E5", "F5", "G5", "A5", "B5", "C6"]:
        note_number = pretty_midi.note_name_to_number(note_name)
        note = pretty_midi.Note(
            velocity=100, pitch=note_number, start=time, end=(time + 0.5)
        )
        cello.notes.append(note)
        time = time + 0.5
    new_music.instruments.append(cello)

    # fuildsynthを使ってサウンドフォントを使ったデータに変換
    audio_data = new_music.fluidsynth(
        sf2_path=CURRENT_DIR + "/sf/GeneralUser GS v1.471.sf2"
    )
    filename = CURRENT_DIR + "/output/sample.wav"

    # wavで書き出し
    wavfile.write(filename, 44100, audio_data)

create_music()

おわり

  • wavはFinderで再生ができるので確認作業がとっても楽になるよやったね!
  • scipyって科学計算ライブラリだと思ってたんですけどwavの入出力とかもできるんですね…音楽も突き詰めると波の集まりなので対応できるのもわからないでもないですけど、手広くてすごいですね

参考文献

Discussion