簡體   English   中英

music21:給定 midi 輸入,output 個正確拼寫的八度音高

[英]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

哪里有兩個問題:

  1. 如何在文本 output 中包含八度音階? (有趣的是,當有和弦時,確實會出現每個音符的八度。

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM