質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1804閲覧

Pythonで作曲をするためwebサイトのソースコードを使ったがエラーが出る

SSDD

総合スコア11

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/24 03:38

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
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')
となりました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamap55

2021/09/24 04:11

SSDDさんが記載したコードは断片が入り込みすぎている(重複している)ようです。 参考にされた記事を読むと、「今回のソースの全文は下記のような感じになります。」とありますので、それ以降にあるコードだけ実行してみてはどうでしょうか。
can110

2021/09/24 04:14

学習に必要な楽譜データは適切に準備、配置していますか?
jbpb0

2021/09/24 04:23 編集

https://inglow.jp/techblog/python-scoremake/ の「今回のソースの全文は下記のような感じになります。」の下のコードだけで動かすのです そうしたら、どうなりますか? 質問に書かれてるコードは、参考Webページの、「ソースの全文」の前に書かれてる個別の解説のコードをつなげて、その後に「ソースの全文」をつなげてるようですが、そうではないです 【追記】 参考Webページの「music21の下準備」のコードだけは、「ソースの全文」の前に付けないといけないかもしれません
SSDD

2021/09/24 04:26

ソース全文をwebサイトの通りに実行しました。 text_model = mrkv.NewlineText(txts)の部分でエラーが出ます。 KeyError: ('___BEGIN__', '___BEGIN__')
ppaul

2021/09/24 04:55

何も知りませんが、名前の付け方として ('___BEGIN__', '___BEGIN__') は ('__BEGIN__', '__BEGIN__') が普通だと思います。
Daregada

2021/09/24 05:20

このコードを動かすための前提として ・コードを置いたフォルダーにmusicxml_simpleフォルダーを作成し ・musicxml_simpleフォルダーに、拡張子.musicxmlのファイル(musicXMLファイル)を複数(目的からするとできるだけ多く)格納する 必要がありますが、それはお済みですか?
SSDD

2021/09/24 05:37

いえ、ソースコードをそのまま実行して、エラー部分に訂正を入れているだけです。
jbpb0

2021/09/24 05:46

> ソースコードをそのまま実行して、エラー部分に訂正を入れているだけ https://inglow.jp/techblog/python-scoremake/ の「今回作るもの」に 既存のメロディを学習させて、その学習データをもとに作曲をしてもらうことにしました。 と書かれてるように、「既存のメロディ」を用意する必要があります 同Webページの「楽譜データを読み取る」に 作成したmusicXMLのファイルを、pythonに読み取らせて、music21によってオブジェクトに変換させます。 と書かれてるように、「既存のメロディ」は「musicXMLのファイル」として作成します Pythonのコードを動かすのは、その後です
guest

回答1

0

ベストアンサー

このコードを動かすための前提として

  • コードを置いたフォルダーにmusicxml_simpleフォルダーを作成し
  • musicxml_simpleフォルダーに、拡張子.musicxmlのファイル(musicXMLファイル)を複数(目的からするとできるだけ多く)格納する

を行なってからコードを実行します。

すると、musicXMLファイルの内容から生成した改行区切りのテキストtxtsmarkovify.NewlineTextの引数に指定してモデルの生成を行なうのですが、質問者は前提となるデータをまったく用意していないため、空文字列のtxtsmarkovify.NewlineTextに渡しており、質問にあるようなエラーが発生します。

解決策は、リンク先の記事をちゃんと読んで、必要なデータを用意することです。

投稿2021/09/24 05:47

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SSDD

2021/09/24 07:03

webサイトに書かれているソースコードだけにしか目が行っていませんでした。ご指摘ありがとうございます。いま一度見直してみます。問題にお付き合いいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問