music21:给定midi输入,输出正确拼写的八度音高

2024-09-27 19:22:53 发布

您现在位置:Python中文网/ 问答频道 /正文

有关正在进行的MRE,请参见下面的编辑

我正在尝试转换music21的text输出,以包括八度数字和正确的非谐波拼写

作为背景,我是一名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. 如何在文本输出中包含八度?(有趣的是,当有和弦时,每个音符的八度都会出现

  2. D#应该是一个Eb,也就是说,应该在音调上下文中进行解释。我想在整个解析的midi文件上运行EnharmonicSimplifier.bestPitches()来纠正这个问题,但是from the docs,它似乎只能在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

Tags: textfrom编辑parse数字convertermusic21midi
1条回答
网友
1楼 · 发布于 2024-09-27 19:22:53

一,

.show()在调试时一目了然,但对于结构化输出并不理想。看看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

二,

simplifyMultipleEnharmonics()需要一个iterable的音高(或者可以转换为音高的东西,但是如果你有音高,可以更快地给出音高)。每个音符或和弦对象都有一个pitches属性,因此您可以安全地调用音符或和弦上的.pitches,同时在解析的文件中循环,并将音调元组连同键对象一起发送到simplifyMultipleEnharmonics

for n in myStream.recurse().notes:
  closest_key = n.getContextByClass(key.Key)
  n.pitches = pitch.simplifyMultipleEnharmonics(n.pitches, keyContext=closest_key)

相关问题 更多 >

    热门问题