4
3

More than 3 years have passed since last update.

pythonのmusic21ライブラリとAIきりたんはとても楽しいのでTIPS

Posted at

別に行き先を決めているわけじゃないが、保たなそうなので、身の振り方を考えるかも。

まあそれはそうと、NEUTRINOによる東北きりたん、と言えばいいのか、「AIきりたん」で遊んでいる。作曲なんて久しぶりで楽しい。で、スキャットとかしてもらうのもいいな、とか、メロディー以外にもきりたんに頑張ってもらおうと思うと、やっぱりそこはちょいちょい自動化できそうな気がしてくる。

で、そういう効率化をしようとすると、 *.musicxml を出力して *.f0 とか *.lab とかも弄って、ということになろうかと思うが、labはただのテキストファイルだし、f0はnumpy.fromfileで読めちゃうのでここはやはりmusicxmlが一番手間がかかる。ただ、調べてみると、pythonのmusic21ライブラリが便利らしい。自動作曲等の世界では有名らしい。普通にpip install music21で入ってくれたし、NEUTRINO的に大事なポイントはすべて押さえてくれていた。超ありがたいので、この気持ちもそのうち歌にしようとおもう。

ちなみにそのポイントとは下記だ。
・タイが書ける(これは書けなきゃダメすぎる)
・2バイト文字の歌詞が入れ込める(そしてもちろん化けない)
・ブレス記号が入れられる(少なくとも、コンマ型のブレス記号なら、NEUTRINOは確実に見てくれる)
というこんな感じ。

全部OKでした。パーフェクト。というわけで、music21のドキュメントは読みやすいので別に余計なお世話かもしれないけど、下記に上記3点のサンプルを載せておいた。これなら、バックコーラスをコード指定しておいて、声部ごとにmusicxml吐いて、NEUTRINOでレンダリングして、pysoundfileで統合して、とかできちゃうじゃん! 最高です。AIきりたん勢は、ぜひ、これを活用してバックコーラスにもきりたんを並べてほしい。

いろいろ説明不足だと思うけど、まあ地味に気が多いのでこのへんで。

import music21 as m2

if False:
    # これはインストール直後に1回実行すれば事足りる
    # というか、その後実行するとエラーを吐くのでコメントアウト
    usersettings = m2.environment.UserSettings()
    usersettings.create()
    usersettings['musescoreDirectPNGPath'] = \
        'C:/Program Files/MuseScore 3/bin/MuseScore3.exe'
    usersettings['musicxmlPath'] = \
        'C:/Program Files/MuseScore 3/bin/MuseScore3.exe'

# ストリーム全体に関わる設定:楽器名とか調とか
mystrm = m2.stream.Part()
# 楽器
myinst = m2.instrument.Instrument()
myinst.partName = "Kiritan"
mystrm.append(myinst)
# 調号
mystrm.append(m2.key.Key('b-', 'minor'))
# 音部記号
mystrm.append(m2.clef.TrebleClef())
# mystrm.append(m2.clef.BassClef()) へ音記号

for x in range(8):
    # 小節を作って、そこに音符を放り込んでゆく
    cur_measure = m2.stream.Measure()
    n = m2.note.Note(x + 64, quarterLength=2, lyric='よ')
    # コンマ型ブレスは、直前の音符に属している
    b = m2.articulations.BreathMark()
    b.symbol = 'comma'
    n.articulations.append(b)
    cur_measure.append(n)
    # 休符
    cur_measure.append(m2.note.Rest(quarterLength=2))
    # 音符を放り込んだ小節をストリームに放り込む
    mystrm.append(cur_measure)

# タイでつなぐ(始点ならstart)
cur_measure = m2.stream.Measure()
cur_measure.append(m2.note.Rest(quarterLength=2))
n = m2.note.Note(60, quarterLength=2, lyric='う')
n.tie = m2.tie.Tie('start')
cur_measure.append(n)
mystrm.append(cur_measure)

# タイでつなぐ(3つつなぎなら真ん中はcontinue)
cur_measure = m2.stream.Measure()
n = m2.note.Note(60, quarterLength=4, lyric='ー')
n.tie = m2.tie.Tie('continue')
cur_measure.append(n)
mystrm.append(cur_measure)

# タイでつなぐ(終点ならstop)
cur_measure = m2.stream.Measure()
n = m2.note.Note(60, quarterLength=2, lyric='ー')
n.tie = m2.tie.Tie('stop')
cur_measure.append(n)
cur_measure.append(m2.note.Rest(quarterLength=2))
mystrm.append(cur_measure)

# スコアに放り込んで完了
myscore = m2.stream.Score()
myscore.append(mystrm)
myscore.show('musicxml')
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3