如何使用music21将音高下移八度并避免降号转升号?
解决music21移调八度时保留原音名符号的问题
问题分析
你遇到的情况是因为music21的transpose()方法默认会选择等音等价的最简记谱形式,D-4和C#4是等音,移调-12个半音后,库自动转换成了更常见的C#3记法,但这不是你想要的保留降号的结果。
两种解决方案
方案1:直接修改八度属性(最直接)
移调一个八度本质就是音高的八度值变化,不需要调用transpose(),直接修改octave属性即可完美保留原音名的拼写:
import music21 p = music21.pitch.Pitch('D-4') p.octave -= 1 # 向下移一个八度,octave减1 print(p)
输出结果:
D-3
方案2:使用transpose()并开启拼写保留
如果你更倾向于使用transpose()方法,可以传入preserveSpelling=True参数,强制库保留原音名的升降号拼写:
import music21 p = music21.pitch.Pitch('D-4') transposed_p = p.transpose(-12, preserveSpelling=True) print(transposed_p)
输出结果:
D-3
原理说明
preserveSpelling=True会让music21优先保持原音高的记谱特征(比如降号、特定音名),而不会自动转换为等音的最简形式。直接修改octave则完全跳过了等音转换逻辑,是针对八度移调场景最高效的方式。
内容的提问来源于stack exchange,提问作者Jeff Learman
相关产品推荐
相关产品推荐

