music21 :给定 midi 输入,输出带有八度数的正确拼写的音高
music21 : given midi input, output correctly-spelled pitches with octave numbers
请参阅下面的编辑以了解正在进行的 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
哪里有两个问题:
如何在文本输出中包含八度音阶? (有意思的是,有和弦的时候,确实会出现每个音符的八度
D#
应该是 Eb
,即应该在音调上下文中进行解释。我想 运行 EnharmonicSimplifier.bestPitches()
对整个解析的 midi 文件进行更正,但是 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
1
.show()
在调试时一目了然,但不适合结构化输出。看看 recurse()
。 music21 有一个容器 ontology:对象是“在”声音中、“在”小节中、“在”部分中、“在”乐谱中。因此,如果您从乐谱开始自上而下并希望遍历每个嵌套容器,只需使用 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()
需要一个可迭代的音高(或者可以转换为音高的东西,但如果你有的话,更快地给它音高)。每个音符或和弦对象都有一个 pitches
属性,因此您可以在遍历已解析的文件时安全地调用音符或和弦的 .pitches
,并将该音高元组与您的音高一起发送到 simplifyMultipleEnharmonics
关键对象。
for n in myStream.recurse().notes:
closest_key = n.getContextByClass(key.Key)
n.pitches = pitch.simplifyMultipleEnharmonics(n.pitches, keyContext=closest_key)
请参阅下面的编辑以了解正在进行的 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
哪里有两个问题:
如何在文本输出中包含八度音阶? (有意思的是,有和弦的时候,确实会出现每个音符的八度
D#
应该是Eb
,即应该在音调上下文中进行解释。我想 运行EnharmonicSimplifier.bestPitches()
对整个解析的 midi 文件进行更正,但是 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
1
.show()
在调试时一目了然,但不适合结构化输出。看看 recurse()
。 music21 有一个容器 ontology:对象是“在”声音中、“在”小节中、“在”部分中、“在”乐谱中。因此,如果您从乐谱开始自上而下并希望遍历每个嵌套容器,只需使用 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()
需要一个可迭代的音高(或者可以转换为音高的东西,但如果你有的话,更快地给它音高)。每个音符或和弦对象都有一个 pitches
属性,因此您可以在遍历已解析的文件时安全地调用音符或和弦的 .pitches
,并将该音高元组与您的音高一起发送到 simplifyMultipleEnharmonics
关键对象。
for n in myStream.recurse().notes:
closest_key = n.getContextByClass(key.Key)
n.pitches = pitch.simplifyMultipleEnharmonics(n.pitches, keyContext=closest_key)