31、音乐变换:和声转录与逆行转换

音乐变换:和声转录与逆行转换

1. 和声转录变换

和声转录变换是一个复杂的过程,其复杂性源于可应用的参数组合复杂、结果获取方式以及搜索时间等因素。下面通过几个例子来详细说明相关参数和处理细节。

1.1 莫扎特《C小调幻想曲》K. 475 示例

以莫扎特《C小调幻想曲》K. 475 的开头为例,在和弦分析中,选择了c(自然)小调的i - It - V和弦序列。其中,F#和Ab的组合起到意大利6和弦的作用。将这个和弦序列改为iv(A旋律小调) - i(A自然小调) - (V A旋律小调),通过和声转录得到了一种可能的结果。这只是多种解决方案之一,它对原曲进行了有趣的改动,尤其是以IV和弦开头并强烈模仿了原旋律。

1.2 舒伯特《A大调钢琴奏鸣曲》D.959 示例

从舒伯特《A大调钢琴奏鸣曲》D.959的第四乐章选取旋律和简单标注的和声。在和声转录时,模仿其和声但转换到C大调,并使用一组简单的和弦。以下是实现该和声转录的代码:

from transformation.harmonictranscription.t_harmonic_transcription import THarmonicTranscription

source_expression = '{<C-Natural: i> q@C:4 iEb <C-Natural: C-It> F# G Ab C ‘ \  
                    ‘<C-Melodic: V> iB:3}'

t_sub = THarmonicTranscription.create(source_expression)

target_harmonic_list = [('A-Melodic:iv', Duration(3, 4)),
                        ('A-Natural:i', Duration(1, 4)),
                        ('A-Melodic:V', Duration(1, 8))]
target_hct = build_hct(target_harmonic_list)

tag_map = {0: DiatonicPitch.parse('D:4')}
results = t_sub.apply(target_hct, 'B:3', tag_map, t_sub.height + 5, 100)

results_filter = MinContourFilter(t_sub.source_line, results.pitch_results)
scored_filtered_results = results_filter.scored_results

该变换指定了新的和声上下文集,将第一个音符标记为C:4以确定音域。生成了许多结果,基于音乐标准进行过滤将有助于整体选择。

1.3 违反传统和声规则示例

可以通过改变和声和约束条件,甚至违反传统和声序列规则来进行和声转录。例如,将原和声改为新的和声序列,代码如下:

source_expression = '{<A-Major: I> qC#:4 hE qa <:V> qA G# <:I> hA <:ii> q@B iB ' \ 
                    '<E-Major :viiHalfDim7> qC#:5 A:4 <A-Major:I> hA ig# f# e d}'

t_sub = THarmonicTranscription.create(source_expression)

target_harmonic_list = [('C-Major:I', Duration(1)),
                        ('C-Major:IV', Duration(1, 2)),
                        ('C-Major:V', Duration(1, 2)),
                        ('C-Major:vi', Duration(1, 2)),
                        ('C-Major:V', Duration(1, 2)),
                        ('C-Major:I', Duration(1)),
                        ]
target_hct = build_hct(target_harmonic_list)

tag_map = {0: DiatonicPitch.parse('C:4')}

results = t_sub.apply(target_hct, 'B:3', tag_map, t_sub.height + 5, 100)

results_filter = MinContourFilter(t_sub.source_line, results.pitch_results)
scored_filtered_results = results_filter.scored_results

这个例子表明,变换不需要遵循原旋律的和声上下文时间边界/持续时间,但新和声必须完全覆盖给定旋律的持续时间。虽然尝试不同的和声序列很有趣,但不能保证得到的音乐一定好听,只能在一定程度上使旋律符合提议的和声,其余部分则需要依靠“音乐技巧”。

1.4 莫扎特《G大调钢琴奏鸣曲》KV283 示例

将和声转录变换应用于莫扎特《G大调钢琴奏鸣曲》KV283的第8 - 10小节。该示例音符较多,展示了使用多种和弦进行修改可以产生有趣的结果。代码如下:

target_harmonic_list = [('C-Major:V', Duration(3, 4)),
                        ('C-Major:IV', Duration(1, 4)),
                        ('C-Major:I', Duration(1)),
                        ('C-Major:IV', Duration(1, 2)),
                        ('C-Major:I', Duration(1, 2)),
                        ('C-Major:V', Duration(1)),
                        ]

source_expression = '{<G-Major: I> sD:5 E F# G A B C:6 D <:IV> sC:6 B:5 A G F# E D C <:I> \ 
                      sB:4 D:5 B:4 G <:VDom7> A C:5 A:4 F#  <:I> qG}'
t_sub = THarmonicTranscription.create(source_expression)
target_harmonic_list = [('G-Melodic:v', Duration(1, 2)),
                        ('D-Natural:i', Duration(1, 2)),
                        ('D-Major:V', Duration(1, 4)),
                        ('D-Major:IV', Duration(1, 4)),
                        ('A-Melodic:i', Duration(1, 4))
                        ]
target_hct = build_hct(target_harmonic_list)

tag_map = {0: DiatonicPitch.parse('D:5')}
results = t_sub.apply(target_hct, 'F#:4', tag_map, t_sub.height + 4, 20,  
                      tunnel_half_interval=Interval(3, IntervalType.Major))

results_filter = MinContourFilter(t_sub.source_line, results.pitch_results)
scored_filtered_results = results_filter.scored_results

这段代码有两个有趣的方面。一是新的和声上下文序列在调式和调性类型上具有多样性,甚至在小节之间也有所不同。二是半隧道方差的指定,当搜索空间过大时,搜索可能会陷入构建新旋律的子序列中,直到指定大三度的半隧道方差高度时才会出现解决方案。

1.5 和声转录变换的改进建议

和声转录变换在很多方面只是一个更广泛、更有用变换的开始,以下几个功能可以大大提高其实用性:
- 允许使用音阶和非音阶约束,例如要求音阶音偏离其调性进行“降半音”或“升半音”处理。
- 限制轮廓内的跳跃距离,例如不允许超过纯五度或八度的跳跃。
- 覆盖通过旋律分析创建的约束,例如一个音符可能被分析为和弦音,但实际上旋律只需要其音阶属性。
- 允许指定和弦音的角色,例如根音、三音、五音或其他张力音。
- 开发更符合音乐品质(如声部进行和旋律流畅性)的解决方案排名过滤器。
- 开发规则分析步骤,以定位容易检测到的导致无解的规则冲突。

2. 逆行变换

逆行是一种重要的音乐创作技巧,通过将主题、动机或旋律反转来生成新的创作思路。在古典音乐中,海顿《第47号交响曲》的小步舞曲就是逆行运用的典型例子。

2.1 逆行变换的问题分析

虽然逆行在某些情况下可以产生不错的旋律,但作为一种通用的旋律构建方法,它也存在一些实际问题:
- 和弦音问题 :反转一段四个八分音符的乐句,常常会导致和弦音变成非和弦音,反之亦然。这意味着使用原和声(即使反转)与反转后的旋律搭配可能效果不佳。
- 弱拍问题 :很多旋律以弱拍开始,即旋律以休止符开始第一拍。反转这类旋律可能会给人一种不完整的感觉。
- 不对称边界问题 :旋律通常不完全与小节边界对齐,可能有弱起拍,并且旋律可能在小节内结束。反转具有这些特征的旋律在小节和节拍上可能会完全不同步,尤其是在完全原位替换原旋律时。
- 和声异常问题 :简单地反转和声可能会导致一些问题。例如,原旋律的结尾和开头可能在不同的调上,反转后会在反转旋律的开头出现突然的调变化。此外,典型的转调公式反转后会变得非常不典型甚至罕见。

2.2 逆行变换的设计

逆行变换是在脱离作曲编辑的环境下开发的,不假设反转后的旋律会被原位植入。它提供了保留原和声或反转和声的选项,方便用户使用和声转录。如果用户想使用不同的和声,可以在逆行后应用和声转录。最后,还提供了将反转后的旋律适配原和声的选项,但这作用有限,只是为用户提供便利。

其设计相对简单,主要是对旋律反转技术的重新包装,并提供了几种处理和声的选项。具体步骤如下:
1. 反转原旋律线和和声上下文(hct)。
2. 考虑三种情况:
- 反转和声 :返回反转后的旋律线和反转后的和声,无需转录。
- 原和声且不转录 :返回反转后的旋律线和原和声。
- 原和声且转录 :对反转后的旋律线应用和声转录,使其适配原和声,然后返回转录后的反转旋律线和原和声。

以下是逆行变换逻辑的mermaid流程图:

graph TD;
    A[开始] --> B[反转原旋律线和hct];
    B --> C{选择情况};
    C -->|反转和声| D[返回反转后的旋律线和反转后的和声];
    C -->|原和声且不转录| E[返回反转后的旋律线和原和声];
    C -->|原和声且转录| F[对反转后的旋律线应用和声转录];
    F --> G[返回转录后的反转旋律线和原和声];

2.3 逆行变换的API

逆行变换的API遵循与其他变换相同的调用模式,即创建/应用调用模式。构造函数只接受一个参数:
- score :输入的音乐,以LiteScore表示。

apply() 方法接受以下参数:
- reverse_harmony True 表示输入的和声应反转以用于逆行结果。
- time_interval :一个数字区间,指定要提取逆行的音乐的全音符时间范围。
- transcription :仅在不反转和声时,使用和声转录将旋律转录到原和声。默认值为 True
- result_sample_size :当和声不反转时,和声转录应生成的最大解决方案数量。使用 MinContourFilter 来找到与原反转旋律轮廓“最匹配”的旋律以适配原和声。该值越大,所需的计算机时间和资源就越多。

返回值是一个由反转后的旋律线和根据指定参数确定的hct组成的对。需要注意的是,只有由时间区间界定的音乐部分以逆行形式返回。在不反转和声且指定转录的情况下,结果是由 MinContourFilter 使用 result_sample_size 参数确定的最佳解决方案。

2.4 逆行变换的示例

2.4.1 简单旋律示例

考虑一个简单的C大调旋律和非常简单的和声。反转旋律和和声后,在不应用转录的情况下,和声匹配非常好。代码如下:

from transformation.retrograde.t_retrograde import TRetrograde

source_instance_expression = '{<C-Major:I> qC:4 D E G <:v> [iD:5 B:4 A G] qC:5 D ‘ \ 
                             ’<:IV> A:4 iF E hC}'
lite_score = create_score(source_instance_expression, 'piano', (4, 4, 'swww'))

trans = TRetrograde(lite_score)
reversed_line, hct = trans.apply()

最后,将原和声应用于反转后的旋律并进行转录,结果也还不错,但不是最佳的。可以观察到由于适配不同的和声,旋律发生了调整。

2.4.2 莫扎特《G大调钢琴奏鸣曲》KV283 示例

以莫扎特《G大调钢琴奏鸣曲》KV283第一乐章的一段旋律为例,作者对和声进行了轻微改动以增强逆行变换的演示效果。反转旋律和和声后,结果很有趣。代码如下:

source_instance_expression = '{<G-Major:I> sD:5 E F# G A B C:6 D <:IV> C ‘ \  
          ‘B:5 A G <:VDom7> sF# E D C <:I> B:4 D:5 B:4 G <:VDom7> A C:5 A:4 F# }'  
lite_score = create_score(source_instance_expression, 'piano', (3, 4, 'sww'))  

trans = TRetrograde(lite_score)  
# 旋律反转,和声反转;不重新适配旋律到和声
reversed_line, hct = trans.apply()  

最后,像第一个示例一样,尝试保留原和声并应用和声转录。

逆行变换为音乐创作提供了一种新的思路,但在实际应用中需要考虑到各种问题,并根据具体情况进行调整和处理。通过合理运用逆行变换和和声转录,可以为音乐创作带来更多的可能性。

2.5 逆行变换的实际应用建议

在实际应用逆行变换时,可以参考以下建议来更好地处理上述提到的问题:
- 灵活处理和声 :可以只反转旋律,忽略和声,将反转后的旋律作为新的素材。或者尝试使用反转后的和声,尽管可能存在问题,但也能带来新的创意。还可以通过和声转录将反转后的旋律适配原和声,或者为反转后的旋律设计新的和声。
- 注意节拍和和弦音角色 :要理解反转后节拍角色可能发生的变化,以及和弦音角色可能出现在不合适的节拍上。在适配和声时,需要仔细考虑这些因素。

2.6 逆行变换的总结

逆行变换是一种具有独特魅力的音乐创作技巧,它能够为作曲家带来全新的创作视角和灵感。然而,在使用过程中,需要充分认识到其可能带来的问题,并采取相应的措施进行处理。通过合理运用逆行变换以及相关的和声处理方法,可以创作出更具创新性和独特性的音乐作品。

3. 和声转录与逆行变换的对比与结合

3.1 对比分析

变换类型 核心目的 主要问题 改进方向
和声转录变换 在保持旋律的基础上改变和声 搜索空间大、约束条件易冲突 增加约束类型、优化过滤规则、开发规则分析步骤
逆行变换 通过反转旋律生成新的创作思路 和弦音、弱拍、边界、和声异常问题 灵活处理和声、注意节拍和和弦音角色

从对比中可以看出,和声转录变换侧重于和声的改变,而逆行变换侧重于旋律的反转。两者都面临一些实际问题,但改进方向有所不同。

3.2 结合应用

和声转录变换和逆行变换可以结合使用,为音乐创作带来更多的可能性。例如,可以先对一段旋律进行逆行变换,然后再对反转后的旋律应用和声转录变换,使其适配新的和声。这样可以在保留旋律特色的同时,创造出全新的音乐效果。

以下是一个简单的结合应用流程:
1. 选择一段原始旋律和相应的和声。
2. 对原始旋律进行逆行变换,得到反转后的旋律。
3. 根据创作需求,确定新的和声上下文。
4. 对反转后的旋律应用和声转录变换,使其适配新的和声。
5. 对结果进行评估和调整,根据需要进一步修改和声或旋律。

graph LR;
    A[原始旋律与和声] --> B[逆行变换];
    B --> C[反转后的旋律];
    C --> D[确定新和声上下文];
    D --> E[和声转录变换];
    E --> F[适配新和声的反转旋律];
    F --> G[评估与调整];
    G --> H[最终音乐作品];

4. 结论

和声转录变换和逆行变换是两种重要的音乐创作技巧,它们各自具有独特的特点和应用场景。和声转录变换可以在保持旋律的基础上改变和声,为音乐带来新的色彩;逆行变换则通过反转旋律,为创作提供新的思路。

在实际应用中,这两种变换都面临一些挑战,需要我们不断探索和改进。通过增加约束类型、优化过滤规则、开发规则分析步骤等方法,可以提高和声转录变换的实用性;通过灵活处理和声、注意节拍和和弦音角色等措施,可以更好地应对逆行变换带来的问题。

此外,将和声转录变换和逆行变换结合使用,可以进一步拓展音乐创作的可能性。作曲家可以根据自己的创作需求,灵活运用这两种变换,创作出更具创新性和独特性的音乐作品。未来,随着音乐技术的不断发展,这两种变换可能会得到进一步的完善和拓展,为音乐创作带来更多的惊喜。

内容概要:本文提出了一种基于融合鱼鹰算法和柯西变异的改进麻雀优化算法(OCSSA),用于优化变分模态分解(VMD)的参数,进而结合卷积神经网络(CNN)双向长短期记忆网络(BiLSTM)构建OCSSA-VMD-CNN-BILSTM模型,实现对轴承故障的高【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】(Matlab代码实现)精度诊断。研究采用西储大学公开的轴承故障数据集进行实验验证,通过优化VMD的模态数和惩罚因子,有效提升了信号分解的准确性稳定性,随后利用CNN提取故障特征,BiLSTM捕捉时间序列的深层依赖关系,最终实现故障类型的智能识别。该方法在提升故障诊断精度鲁棒性方面表现出优越性能。; 适合人群:具备一定信号处理、机器学习基础,从事机械故障诊断、智能运维、工业大数据分析等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决传统VMD参数依赖人工经验选取的问题,实现参数自适应优化;②提升复杂工况下滚动轴承早期故障的识别准确率;③为智能制造预测性维护提供可靠的技术支持。; 阅读建议:建议读者结合Matlab代码实现过程,深入理解OCSSA优化机制、VMD信号分解流程以及CNN-BiLSTM网络架构的设计逻辑,重点关注参数优化故障分类的联动关系,并可通过更换数据集进一步验证模型泛化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值