30、音乐旋律变换与和声转录技术解析

音乐旋律变换与和声转录技术解析

1. 旋律重塑变换

旋律重塑变换是一种强大且有前景的旋律塑造技术,可辅助音乐创作。以下是相关代码示例:

# 11 scalar notes to C:4 (0) to G:5 (11) with pitch unit 1/11
interpreter = ScalarRangeInterpreter(tonality, DiatonicPitch.parse('C:4'), 0, Fraction(1, 11))

pitch_function = GenericUnivariatePitchFunction(three_sin, Position(0), Position(3), False, interpreter)
t_reshape = TReshape(score, pitch_function, Range(0, 3), form, True)

results = t_reshape.apply()

在实际应用中,该变换能让旋律根据曲线规范生成。例如在 three_sin() 函数的应用中,每个小节开头有特定的主题,其余音符遵循 three_sin() 曲线。主题即使发生移位也能保留,如第二小节的音符 E、F、G、F 。然而,由于主题占用了时间空间,导致曲线在这期间未被遵循,主题外的音符与主题距离较远,会出现较大的音程跳跃。

从发展角度看,旋律重塑变换有望催生新的音乐创作工具,用户可以使用标准曲线或手绘草图作为构建旋律的种子,甚至可以用小草图进行细微修正。但要实现这一愿景,主要在于构建一个有效的用户界面,专注于这种交互方式。不过,实际应用中存在一些复杂情况:
- 曲线构建精度 :在构建曲线时需要高精度,特别是在音阶序列的示例中,这一点尤为明显。
- 和声与曲线的配合 :曲线和旋律之间存在和声因素,生成的曲线在为给定和声选择音高时可能不太配合。
- 约束条件的使用 :用户需要识别并建立符合意图的约束条件,例如识别和弦音符或确定并实施主题模式(如音程步长或音程约束)。同时,约束引擎可能需要很长时间来寻找解决方案,并且需要高效地搜索结果以找到最佳方案。约束引擎的优化是一个独立的研究课题。

2. 和声转录:在和声变化中保留旋律

在之前的变换讨论中,重点主要是在各种旋律破坏动作(如调性转换、反转或重塑为曲线)中为旋律音符分配音高。而和声转录变换则是要改变给定旋律的音高,使其符合新指定的和声(即和弦和/或调性变化),挑战在于在和声变化的情况下保留原旋律的相似性。

2.1 旋律相似性分析

为了实现和声转录,需要对旋律进行具体分析,以构建约束条件来确保旋律相似性。主要有以下两种分析方法:
- 和声角色分析 :确定一个音符是否强化了其和声的和弦,以及该音符是否属于调性。例如,在给定的 A - 大调和声中,找出和弦音(用红色圆圈标记)和音阶音(用绿色圆圈标记)。旋律相似性的一个方面是,和弦音在转录后的旋律中仍然是和弦音,音阶音仍然是音阶音。基于此信息,可以构建和弦和音阶音高约束,以确保转录后的旋律中的音符遵循相同的和声和调性角色。
- 旋律轮廓分析 :旋律轮廓捕捉了原始旋律线中音符音高的上升和下降。在旋律分析中,将旋律音符成对向前分析,从第一个到最后一个,以捕捉每对音符之间的关系。这里只考虑三种可能的关系:音高相同、第一个音高于第二个音、第一个音低于第二个音。根据这些信息,可以使用音高约束引擎构建比较音高约束来强制执行轮廓。可以将这些约束想象成拓扑约束,就像旋律画在一张可以沿每个轴拉伸的橡胶片上,相邻音符之间的间隙可以变大或变小,但音符的轮廓关系始终不变。以下是捕捉音符轮廓的代码示例:

pair_annotation_list = list()
note_list = line.get_all_notes()
for i in range(0, len(note_list) - 1):
    first = note_list[i]
    second = note_list[i + 1]
    pair_annotation_list.append(NotePairInformation(first, second))

class NotePairInformation(object):
    class Relationship(Enum):
        LT = -1
        EQ = 0
        GT = 1

    def __init__(self, first_note, second_note):
        self.__first_note = first_note
        self.__second_note = second_note

        self.__forward_interval = Interval.create_interval(
            self.first_note.diatonic_pitch,
            self.second_note.diatonic_pitch)

        cd = self.forward_interval.chromatic_distance
        self.__relationship = NotePairInformation.Relationship.GT if cd < 0 \
            else NotePairInformation.Relationship.LT \
            if cd > 0 else NotePairInformation.Relationship.EQ

当用户创建 MelodicSearchAnalysis 对象时,会生成三种类型的分析信息列表:
| 信息类型 | 说明 |
| ---- | ---- |
| NoteInformation | 提供每个音符的和声和调性角色信息 |
| NotePairInformation | 提供每对连续音符之间的关系信息 |
| HCInformation | 提供每个和声上下文的信息(本文未使用) |

2.2 进一步限制搜索空间

虽然上述对音符角色和轮廓的约束解决了和声转录变换中旋律塑造的基本问题,但如果音高和音域的搜索空间过大,这些约束可能不足以有效控制约束引擎的运行时间。因此,需要进一步限制搜索空间:
- 旋律窗口 :通过定义一个音高范围,即音高窗口,来限制每个旋律音符可以分配的音高范围。在这个模型中,指定一个最低音高( WindowAnchorPitch )和一个窗口高度( WindowHeight ,即从锚定音高到最高音高的半音数)。音高窗口在时间上的体现称为旋律窗口。可以使用音高窗口创建 PitchRangeConstraint ,确保所有变换后的旋律音符的音高都在音高窗口的最低和最高音高之间。如果未指定窗口高度,则默认使用输入旋律的高度(最低和最高音高之间的半音数)。
- 旋律方差(隧道) :尽管旋律窗口有一定的限制作用,但音高搜索空间仍然可能过大。为了进一步限制搜索空间,可以基于转录后旋律的近似渲染,为每个音符定义一个狭窄的音高带,即方差隧道。具体来说,假设可以为旋律中的一个或多个音符指定音高,形成一个标签映射( tag map )。根据这个标签映射,可以想象整个旋律按相同的音程移动,得到一个隧道旋律。然后指定一个隧道半音程,对于隧道旋律上的每个音符,从该音符上下由隧道半音程定义的范围内选择音高,这个范围就是方差隧道。不过,定义方差隧道并不总是开发结果的最佳选择,它可能过于限制,用户可能需要更广泛的搜索空间。但这种方法有助于优化搜索时间,特别是当源旋律较长时。默认的隧道半音程是纯五度。此外,还可以通过指定变换的最大结果数量来限制旋律搜索。

2.3 和声转录变换的 API

和声转录变换的 API 遵循之前讨论的所有变换所建立的创建/应用模式。 THarmonicTranscription 对象的创建可以通过对象构造函数或静态创建方法实现:
- 构造函数参数
- source_line :包含旋律的 Line 对象。
- source_hct :源旋律的原始和声的 HarmonicContextTrack 对象。
- source_melodic_form :旋律的可选 MelodicForm 对象。
- 静态创建方法参数
- source_expression :源旋律和和声的文本表示,使用 LineGrammarExecutor 进行解析。

apply() 方法用于指定要应用于源旋律的替代和声,以及之前讨论的旋律窗口、锚点和轮廓方差的参数:
- target_hct :指定要应用于源旋律的替代和声的 HarmonicContextTrack 对象。
- window_anchor_pitch :用于音高分配的最低音高。
- tag_map :将源旋律演员索引映射到 DiatonicPitches 的字典。
- window_height :锚定音高上方的半音距离,定义了允许分配音高的音高窗口。
- num_solutions :可选参数,指定在终止搜索之前要找到的最大解决方案数量(默认值为 -1,表示无限制)。
- tunnel_half_interval :定义隧道半方差,即隧道旋律上搜索音高范围的半音程。

apply() 方法返回一个 MCSResults 对象,该对象包含一个 PMaps 列表,通过 MCSResults.pitch_results() 方法可以访问该列表,该列表将旋律演员映射到重新分配的音符。

和声转录变换的逻辑主要包括根据所有参数设置约束条件,这些约束条件包括:
- 从输入旋律/和声的旋律分析中得出的约束条件。
- 旋律窗口定义的限制。
- 隧道方差。

此外,还可以选择对约束引擎的运行进行限制,直到找到指定数量的解决方案或搜索终止(以先到者为准)。以下是使用和声变换的步骤流程图:

graph TD
    A[开始] --> B[创建 THarmonicTranscription 对象]
    B --> C[设置参数]
    C --> D[调用 apply() 方法]
    D --> E[获取 MCSResults 对象]
    E --> F[访问 pitch_results() 方法获取结果]
    F --> G[结束]

综上所述,旋律重塑变换和和声转录变换为音乐创作提供了新的思路和方法,但在实际应用中需要考虑各种因素,通过合理设置约束条件和参数,才能实现理想的音乐效果。

音乐旋律变换与和声转录技术解析

3. 代码示例与实际应用

为了更好地理解和声转录变换的实际应用,下面给出一个具体的代码示例:

l = LineGrammarExecutor()
s = '{qC:4 D:4 [<E - Major: A - Maj> G F A B]}'
line, hct = l.parse(s)

analysis = MelodicSearchAnalysis(line, hct)

note_annotation_list = analysis.note_annotation
for na in note_annotation_list:
    print(na)

note_pair_annotation_list = analysis.note_pair_annotation
for npa in note_pair_annotation_list:
    print(npa)

在这个示例中,首先使用 LineGrammarExecutor 解析一个包含旋律和和声信息的文本表达式,得到 line hct 对象。然后创建 MelodicSearchAnalysis 对象对旋律进行分析,分别获取音符注释列表和音符对注释列表,并打印出相关信息。

从输出结果可以看到每个音符的详细信息,如音高、偏移量、和声上下文、音阶度数、是否为音阶音、是否为和弦音以及持续时间等,同时也能看到音符对之间的关系。例如:

[C:4<1/4>-(1/4)] off=0 f=1 hc=h.c.[C - Major, TI [C, E, G], 1/2] scale_degree=0 interval=P:1 is_scalar=True is_chordal=True duration=1/4 
[D:4<1/4>-(1/4)] off=1/4 f=1 hc=h.c.[C - Major, TI [C, E, G], 1/2] scale_degree=1 interval=None is_scalar=True is_chordal=False duration=1/4 
[G:4<1/8>-(1/8)] off=0 f=1 hc=h.c.[E - Major, TAMaj [A, C#, E], 1/2] scale_degree=None interval=None is_scalar=False is_chordal=False duration=1/8 
... 
[C:4<1/4>-(1/4)] off=0 f=1 "< [D:4<1/4>-(1/4)] off=1/4 f=1" 
[D:4<1/4>-(1/4)] off=1/4 f=1 "< [G:4<1/8>-(1/8)] off=0 f=1" 
[G:4<1/8>-(1/8)] off=0 f=1 "> [F:4<1/8>-(1/8)] off=1/8 f=1" 
[F:4<1/8>-(1/8)] off=1/8 f=1 "< [A:4<1/8>-(1/8)] off=1/4 f=1" 
[A:4<1/8>-(1/8)] off=1/4 f=1 "< [B:4<1/8>-(1/8)] off=3/8 f=1" 

这些信息对于构建约束条件和实现和声转录变换非常重要。

4. 技术总结与应用建议

通过对旋律重塑变换和和声转录变换的介绍,我们可以总结出以下关键技术点:
| 技术点 | 描述 |
| ---- | ---- |
| 旋律重塑变换 | 通过曲线规范塑造旋律,可辅助音乐创作,但实际应用中需考虑曲线构建精度、和声与曲线配合以及约束条件使用等问题 |
| 和声转录变换 | 改变旋律音高以符合新和声,通过旋律相似性分析(和声角色分析和旋律轮廓分析)构建约束条件,同时可通过旋律窗口和旋律方差进一步限制搜索空间 |
| 约束引擎 | 用于解决音高分配和旋律相似性问题,但可能存在搜索时间长和优化困难的问题 |

在实际应用中,以下是一些建议:
- 明确创作目标 :在使用这些变换技术之前,明确自己的音乐创作目标,例如是想要改变旋律的形状还是调整和声。
- 合理设置参数 :根据创作需求,合理设置约束条件和参数,如旋律窗口的高度、方差隧道的半音程等,以平衡搜索空间和搜索效率。
- 结合多种技术 :可以将旋律重塑变换和和声转录变换结合使用,创造出更丰富多样的音乐效果。
- 不断尝试和调整 :音乐创作是一个创造性的过程,需要不断尝试不同的参数和方法,通过多次调整来达到理想的音乐效果。

5. 未来展望

随着技术的不断发展,旋律变换和和声转录技术有望在音乐创作领域发挥更大的作用。未来可能会出现以下发展趋势:
- 更智能的用户界面 :开发更加智能、易用的用户界面,降低技术门槛,让更多的音乐创作者能够轻松使用这些技术。
- 与人工智能的结合 :将这些技术与人工智能算法相结合,实现自动生成旋律和和声的功能,为音乐创作提供更多的灵感和可能性。
- 跨平台应用 :实现这些技术在不同平台(如移动设备、音乐制作软件等)上的应用,方便创作者随时随地进行音乐创作。

总之,旋律重塑变换和和声转录变换为音乐创作带来了新的机遇和挑战。通过深入理解这些技术的原理和应用方法,音乐创作者可以充分发挥其潜力,创作出更加精彩的音乐作品。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值