[英]music21 : given midi input, output correctly-spelled pitches with octave numbers
請參閱下面的編輯以了解正在進行的 MRE
我正在嘗試將 music21 的text
output 轉換為包含八度音階數字和正確的等音拼寫。
作為背景,我是 javascript 程序員,music21 和 python 的新手。
下列
myMusic = converter.parse("midi")
myMusic.show("text")
產量
Time Actual output Desired Output
{0.0} <music21.note.Note C> C4
{0.1} <music21.note.Note D#> E-4
{0.2} <music21.note.Note G> G4
{0.3} <music21.note.Note G> G4
哪里有兩個問題:
如何在文本 output 中包含八度音階? (有趣的是,當有和弦時,確實會出現每個音符的八度。
D#
應該是Eb
,即應該在音調上下文中進行解釋。 我想在整個解析的 midi 文件上運行EnharmonicSimplifier.bestPitches()
來糾正這個問題,但從文檔來看,它似乎只能在note list
上運行。
我這樣做錯了嗎? 我應該輸出不同的格式來獲取此信息嗎? 我需要時間點(偏移量可以)、八度數和正確拼寫的音調。 也許我缺少中間處理?
任何指導表示贊賞。
編輯:正在進行的 MRE 工作,解決了問題 1。(嚴重?),但沒有解決問題 2。
from music21 import *
environment.set('autoDownload', 'allow')
stream1 = converter.parse("https://upload.wikimedia.org/wikipedia/commons/5/55/MIDI_sample.mid")
for n in stream1.recurse().notes:
try:
print(n.offset, n.nameWithOctave)
except Exception as e:
print(n.offset, *n.pitches)
產量(摘錄)
237.5 C2
238.0 F#2
238.2 F#2
238.5 C2 F#2
238.7 B-2
1個
.show()
在調試時一目了然,但對於結構化 output 來說並不理想。看看recurse()
。 music21 有一個容器本體:對象是“在”聲音、“在”小節、“在”部分、“在”樂譜中。 因此,如果您從樂譜開始自上而下並希望遍歷每個嵌套容器,只需使用 recurse():
for n in myStream.recurse().notes:
print(n.offset, ' '.join(p.nameWithOctave for p in n.pitches))
音符屬性: http://web.mit.edu/music21/doc/moduleReference/moduleNote.html
2個
simplifyMultipleEnharmonics()
需要一個可迭代的音高(或者可以轉換為音高的東西,但如果你有它們,可以更快地給它音高)。 每個音符或和弦 object 都有一個pitches
屬性,因此您可以在循環遍歷解析的文件時安全地調用音符或和弦上的.pitches
並將該音高元組連同您的鍵 object 發送到simplifyMultipleEnharmonics
。
for n in myStream.recurse().notes:
closest_key = n.getContextByClass(key.Key)
n.pitches = pitch.simplifyMultipleEnharmonics(n.pitches, keyContext=closest_key)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.