1

特定のメロディーのノート ピッチ (名前のみ、オクターブなし) 間の遷移率を取得しようとしています。たとえば、私のメロディ ピッチが (順番に) CDEDFCBC である場合、CD トランジションは 0.5 レートで発生し、BC はレート 1 などになるはずです。

これを行うにはPythonで関数を記述できるはずですが(おそらく多くのelifs...を使用しています)、music21でも簡単に実行できる必要があるようです。ドキュメント、Google、その他の質問をここで見ました...方法が見つかりませんでしたが、私にとって本当に役立つツールキットが不足していると思われます。

4

2 に答える 2

1

あなたが探しているのは、私が通常辞書で扱うバイグラム表現の一種です。これは少しずさんかもしれませんが、おそらく簡単に整理できます。

note_list = ...a list containing all notes in order
bigram_dict = {}
for note in range(1, len(note_list)):
    bigram = (note -1, note)
    if bigram not in bigram_dict:
        bigram_dict[bigram] = 1 / len(note_list)
    else:
        bigram_dict[bigram] += 1 / len(note_list)

これにより、各バイグラムのパーセントが得られます。Python 2.x を使用している場合は、bigram_dict[bigram += float(1 / len(note_list))整数/浮動小数点数の問題を回避するために make を実行する必要があります。また、辞書がうまくいかない場合は、defaultdict を使用してみてください。

于 2016-06-05T04:38:01.773 に答える
0

次のようなことをお勧めします:

from music21.ext.more_itertools import windowed
from collections import Counter
# assuming s is your Stream
nameTuples = []
for n1, n2 in windowed(s.recurse().notes, 2):
    nameTuples.append((n1.name, n2.name))
c = Counter(nameTuples)
totalNotes = len(s.recurse().notes) # py2 cast to float
{k : v / totalNotes for k, v in c.items()}

ウィンドウ化の良いところは、トライグラムなどを簡単に作成できることです。

于 2017-08-31T01:47:51.690 に答える