繁体   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