前提・実現したいこと
ここに質問の内容を詳しく書いてください。
Pythonで作曲をしようと思い、
markovifyというライブラリをインストールしました。jupyternotebookを使用しています。
pythonに作曲してもらう
https://inglow.jp/techblog/python-scoremake/
このサイトのソースコードを使っています。
text_model = mrkv.NewlineText(txts) #必要があれば、state_sizeを1~3で設定する。デフォルトは2
の行を実行するとエラーメッセージNameErrorが出ます。
発生している問題・エラーメッセージ
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-7-8b03dc32dcf4> in <module> ----> 1 text_model = mrkv.NewlineText(txts) #必要があれば、state_sizeを1~3で設定する。デフォルトは2 NameError: name 'mrkv' is not defined
該当のソースコード
#最初に設定をする場合 from music21 import * us = environment.UserSettings() us.create() #first time only #デフォルトでインストールした場合(適宜パスを変更してください。) us['musescoreDirectPNGPath'] = 'C:/Program Files/MuseScore 3/bin/MuseScore3.exe' us['musicxmlPath'] = 'C:/Program Files/MuseScore 3/bin/MuseScore3.exe' from music21 import * environment.set("musescoreDirectPNGPath", "C:/Program Files/MuseScore 3/bin/MuseScore3.exe") environment.set("musicxmlPath", "C:/Program Files/MuseScore 3/bin/MuseScore3.exe") import music21 as m21 import os import glob #パスの生成 DS = os.sep bs = os.path.dirname(__file__) + DS xmlpath = bs + 'musicxml_simple' + DS #フォルダ内のxmlファイルを取得する xmls = glob.glob(xmlpath + "*.musicxml") for x in xmls: piece = m21.converter.parse(x) #読み込ませるテキスト準備用 note_txts = [] #フォルダ内のxmlファイルを取得する xmls = glob.glob(xmlpath + "*.musicxml") for x in xmls: piece = m21.converter.parse(x) ntxt = [] for n in piece.flat.notesAndRests: #n.name:音名の取得 n.duration.quarterLength:音の長さの取得(1拍、0.5拍等…) ntxt.append(str(n.name) + '_' + str(n.duration.quarterLength)) #1曲が終わったら、追加する note_txts.append(note_txts.append(' '.join(ntxt))) #最後に、改行区切りでテキストデータを準備 txts = '\n'.join(note_txts) text_model = mrkv.NewlineText(txts) #必要があれば、state_sizeを1~3で設定する。デフォルトは2 sentence = text_model.make_sentence(min_chars=50, max_chars=150) #メロディをmusicXMLに変換する meas = m21.stream.Stream() #楽譜オブジェクトの生成 meas.append(m21.meter.TimeSignature('4/4')) #拍子を設定する 今回は4拍子で固定しました。 melo = sentence.split() #半角スペース区切りで配列にします for m in melo: #[E_0.5、E_0.5、D_0.5、C#_0.5、....]のデータを順番に処理 ptch, dist = m.split('_') #アンダーバーで区切る if(ptch == 'rest'): #rest=休符 この場合は休符の長さだけ追加 n = m21.note.Rest(quarterLength = float(dist)) else: #音と音符の長さを追加 n = m21.note.Note(ptch,quarterLength = float(dist)) #楽譜に追加 meas.append(n) #小節線を追加する meas.makeMeasures(inPlace=True) #楽譜をmusicxmlで表示する meas.show('musicxml', addEndTimes=True) import music21 as m21 import markovify as mrkv import os import glob #パスの生成 DS = os.sep bs = os.path.dirname(__file__) + DS xmlpath = bs + 'musicxml_simple' + DS #読み込ませるテキスト準備用 note_txts = [] #フォルダ内のxmlファイルを取得する xmls = glob.glob(xmlpath + "*.musicxml") for x in xmls: piece = m21.converter.parse(x) ntxt = [] for n in piece.flat.notesAndRests: #n.name:音名の取得 n.duration.quarterLength:音の長さの取得(1拍、0.5拍等…) ntxt.append(str(n.name) + '_' + str(n.duration.quarterLength)) #1曲が終わったら、追加する note_txts.append(' '.join(ntxt)) #最後に、改行区切りでテキストデータを準備 txts = '\n'.join(note_txts) text_model = mrkv.NewlineText(txts) #必要があれば、state_sizeを1~3で設定する。デフォルトは2 sentence = text_model.make_sentence(min_chars=50, max_chars=150) #メロディをmusicXMLに変換する meas = m21.stream.Stream() #楽譜オブジェクトの生成 meas.append(m21.meter.TimeSignature('4/4')) #拍子を設定する 今回は4拍子で固定しました。 melo = sentence.split() #半角スペース区切りで配列にします for m in melo: #[E_0.5、E_0.5、D_0.5、C#_0.5、....]のデータを順番に処理 ptch, dist = m.split('_') #アンダーバーで区切る if(ptch == 'rest'): #rest=休符 この場合は休符の長さだけ追加 n = m21.note.Rest(quarterLength = float(dist)) else: #音と音符の長さを追加 n = m21.note.Note(ptch,quarterLength = float(dist)) #楽譜に追加 meas.append(n) #小節線を追加する meas.makeMeasures(inPlace=True) #楽譜をmusicxmlで表示する meas.show('musicxml', addEndTimes=True)
試したこと
該当ソースコードの形を崩して、エラーメッセージよりも上の行にimport markovify as mrkvを入力して実行した所、
KeyError Traceback (most recent call last)
<ipython-input-6-8ab58bb07b9f> in <module>
----> 1 text_model = mrkv.NewlineText(txts) #必要があれば、state_sizeを1~3で設定する。デフォルトは2
~\anaconda3\lib\site-packages\markovify\text.py in init(self, input_text, state_size, chain, parsed_sentences, retain_original, well_formed, reject_reg)
63 map(self.word_join, self.parsed_sentences)
64 )
---> 65 self.chain = chain or Chain(self.parsed_sentences, state_size)
66 else:
67 if not chain:
~\anaconda3\lib\site-packages\markovify\chain.py in init(self, corpus, state_size, model)
51 )
52 if not self.compiled:
---> 53 self.precompute_begin_state()
54
55 def compile(self, inplace=False):
~\anaconda3\lib\site-packages\markovify\chain.py in precompute_begin_state(self)
100 """
101 begin_state = tuple([BEGIN] * self.state_size)
--> 102 choices, cumdist = compile_next(self.model[begin_state])
103 self.begin_cumdist = cumdist
104 self.begin_choices = choices
KeyError: ('_BEGIN', '_BEGIN')
というエラーが出ました。
エラーの部分のプログラム
text_model = mrkv.NewlineText(txts) #必要があれば、state_sizeを1~3で設定する。デフォルトは2
のカッコ内をtext_model = mrkv.NewlineText(txts,state_size=3, well_formed=False)にしたら、
KeyError: ('_BEGIN', '_BEGIN', '_BEGIN')
となりました。
回答1件
あなたの回答
tips
プレビュー