返回

文章详情

Xenharmlib(音乐理论库)添加对纯音阶的支持

Hacker News2026年7月28日 16:10

在新功能方面,版本0.4.0不是一步,而是跨越式的进步。Xenharmlib的核心已被重构,不仅允许等分调式,还支持多生成器音程的调音。这意味着它现在支持所有常规调式,包括纯音阶。除了不规则调式(如“Werckmeister调式”)之外,xenharmlib可以最终用数学形式表示整个音乐传统的宇宙。它现在可用于准确分析来自拜占庭帝国、欧洲文艺复兴、印度古典音乐、印尼歌舞传统、阿拉伯Maqam和20世纪美国实验音乐(如Harry Partch或Ben Johnston的作品)。根据其整体方法,xenharmlib允许对所有常规调式使用现有分析工具,只要它们在数学上与这些调式兼容。例如,Prime Form和Normal Form计算也可以在(多维)常规调式上执行。此外,文档已完全重写:功能示例按调音和记谱法组织,所有谐波基元都提供全面、专门的文档。我们将在以下简要概述上述(和其他)功能。(完整的更改日志请见此处) 目录 纯音阶 / 质因子限制调音 自定义常规调式 完整音程算术 额外谐波基元 音程类别向量 最接近频率近似 纯音阶 / 质因子限制调音¶ 纯音阶是指基于“纯音程”的调音。纯音程的特征是两个整数的分数,例如\(\frac{3}{2}\)。历史上,大多数调音系统都基于纯音阶。直到18和19世纪,等音阶系统才开始在实践中获得广泛接受。Xenharmlib现在引入了纯音阶的支持,通过质因子限制调音构造: from xenharmlib import PrimeLimitTuning limit11 = PrimeLimitTuning ( 11 ) 例如,现在可以通过从根音叠加5个上升的纯五度和6个下降的纯五度生成一个毕达哥拉斯12音半音阶: from xenharmlib import PrimeLimitTuning from xenharmlib import periodic pythagorean = PrimeLimitTuning ( 3 ) C0 = pythagorean . rs_pitch ( '1/1' ) P5 = pythagorean . rs_interval ( '3/2' ) iseq_a = pythagorean . interval_seq ([ P5 ] * 5 ) iseq_b = pythagorean . interval_seq ([ - P5 ] * 6 ) chromatic_scale = ( C0 . scale ( iseq_a ) | C0 . scale ( iseq_b ) ) . pcs_normalized () print ( chromatic_scale ) PrimeLimitPitchScale([1, 256/243, 9/8, 32/27, 81/64, 4/3, 1024/729, 3/2, 128/81, 27/16, 16/9, 243/128], 3-Limit) 大多数软件程序将纯音阶的功能实现为一种标量转位系统,而不是作为完整的算术系统。例如,在通过五度转位时,通常会使用某种定义的半音阶(如上文提及的)作为基础,转位理解为7个音级的偏移: for i in range ( 0 , 12 ): pitch = chromatic_scale [ i ] result = periodic . scalar_transpose ( chromatic_scale , pitch , 7 ) interval = pitch . interval ( result ) print ( f ' { pitch . short_repr } --> { result . short_repr } ( { interval . short_repr } )' ) 结果表明,在毕达哥拉斯半音阶中,按音级的转位并不总会导致相应音程的实际转位。这是调谐键盘乐器(如钢琴或羽管键琴)时常见的问题,因为其每个八度的音符数量有限。从数学的角度看,这种按五度转位的定义是不规则的:五度的大小取决于选择哪个音符作为起始点。与键盘乐器不同,无品弦乐器或人声没有受限的音符选择问题。因此,xenharmlib实现的默认转位不是标量转位,而是常规转位,其结果是将上述半音阶的最后一个音符转位后的音高类别不再在半音阶本身中表示。 for i in range ( 0 , 12 ): pitch = chromatic_scale [ i ] result = pitch . transpose ( P5 ) interval = pitch . interval ( result ) try : scale_degree = periodic . index ( chromatic_scale , result ) except ValueError : scale_degree = '不在半音阶中' print ( f ' { pitch . short_repr } --> { result . short_repr } ' , end = '' ) print ( f '( { int ...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡