音乐中的旋律搜索、模式替换与伸缩变换
1. 旋律搜索基础
旋律搜索的结果“answers”是一个位置匹配列表。例如,在某个搜索中,在位置(1, 2)处有一个匹配,也就是在音乐的半音符处。默认的搜索是基于轮廓和结构匹配,通常不会对和声语境轨道(HCT)进行匹配,比如调性主音。不过,也可以进行精确的调性主音匹配。
以下是一段示例代码,展示了如何进行旋律搜索:
from search.melodicsearch.global_search_options import GlobalSearchOptions
from search.melodicsearch.melodic_search import MelodicSearch
lge = LineGrammarExecutor()
pattern = '{<C-Major: I> qC:4 D}'
target = '{qC:4 D <E-Major: v> F# <Ab-Minor: ii> Bb C Db <D-Major: I> D E F#}'
target_line, target_hct = lge.parse(target)
search = MelodicSearch.create(pattern)
answers = search.search_hct(target_hct, GlobalSearchOptions())
answers = search.search(target_line, target_hct,
GlobalSearchOptions(hct_match_tonality_key_tone=True))
2. 旋律模式替换基础
旋律模式替换是旋律搜索的扩展。在旋律搜索中,我们有一个用于匹配的模式;而在旋律模式替换中,我们有一个用于替换每个匹配的模式。这里涉及到几个重要的概念:
-
搜索模式(search_pattern)
:定义了我们要搜索的旋律片段(以及伴随的和声),包括旋律和和声,分别表示为 search_pattern_line 和 search_pattern_hct。
-
替换模式(replacement_pattern)
:对于每个匹配的搜索模式实例,替换模式将作为替换的基础,同样有旋律和和声,分别表示为 replacement_pattern_line 和 replacement_pattern_hct。
-
搜索实例(search_instance)
:指在搜索过程中使用搜索模式找到的实例,也有旋律和和声,分别为 search_instance_line 和 search_instance_hct。
下面是一个简单的流程说明:
1. 定义搜索模式和替换模式。
2. 进行搜索,找到搜索实例。
3. 将搜索实例传递给替换过程,使用替换模式进行替换。
3. 旋律模式替换的方法
旋律替换与普通的单词替换不同,替换实例需要在上下文中与搜索实例相匹配。不仅和声需要根据替换实例的上下文进行调整,替换实例的旋律也必须与替换音乐的和声相匹配。
我们采用的方法是为替换实例(B’)开发一个和声上下文轨道,并利用和声转录来生成 B’的旋律线。具体来说,B’是搜索实例 A’和替换模式 B 的函数:
[B’ = f(A’, B)]
进一步地,我们引入了一组规则(rules),即和声上下文表达式(HC 表达式):
[B’ = f(A’, B, rules)]
4. 和声上下文表达式规则
和声上下文表达式规则用于构建替换实例 B’的 HCT。B’的和声上下文数量与替换模式 B 的 HCT 中的数量相同,而搜索实例 A’的 HCT 中的和声上下文数量与搜索模式 A 的相同。
以下是一些 HC 表达式的示例:
| 表达式 | 说明 |
| ---- | ---- |
| @0-Natural: vi | 使用搜索实例的第 0 个 HC 的主音,但采用自然小调模式,并使用 vi 和弦 |
| @0:v | 使用搜索实例的第 0 个 HC 的 v 和弦 |
| (@0)P:5-Melodic:v | 使用搜索实例的第 0 个 HC 的主音,向上移动纯五度,采用旋律小调模式,并使用 v 和弦 |
HC 表达式的语法如下:
HC := Key Modality Chord
Key := (Abs_Key | Reference) (Key_Distance)?
Modality := (Abs_Modality | Reference) (Mode_Index)?
Chord := (Chord_Degree | Reference) (Chord_Name)?
下面是一个创建 HC 表达式并生成和声上下文的示例代码:
lge = LineGrammarExecutor()
s = '{<C-Minor: I> C:4 <D-Major:IV> F A <Bb-Major:V> G D <C-Major:VI> a c b a}'
line, hct = lge.parse(s)
hce = HCExpression.create('(@1)M:6-(@0)')
hc = hce.interpret(hct.hc_list(), Duration(1, 2))
print(hc)
5. 旋律模式替换 API
旋律模式替换(TPatSub)的 API 较为复杂,涉及多个参数。大部分参数包含在 SubstitutionPattern 对象中,该对象作为 TPatSub 的唯一参数。
SubstitutionPattern 的参数包括:
- search_pattern_line:用于搜索的旋律线。
- search_pattern_hct:搜索中使用的 HCT。
- replacement_pattern_line:替换模式的旋律线。
- replacement_pattern_hct:替换模式的 HCT。
- hc-expression_list:用于将搜索实例的 HCT 转换为替换实例的 HCT 的 HC 表达式列表。
创建 TPatSub 对象后,调用 apply() 方法获取替换结果。apply() 方法的参数包括:
- search_instance_line:搜索实例的旋律线。
- search_instance_hct:搜索实例的 HCT,与 HC 表达式一起用于生成替换 HCT。
其他参数用于控制和声转录,如 window_anchor_pitch、tag_map、window_height 和 num_solutions(默认无限制)。apply() 方法返回 MCSResults 和替换 HCT,用户可以对 MCSResults 中的结果进行扫描和排序,选择合适的结果进行替换。
以下是一个简单的 mermaid 流程图,展示了旋律模式替换的过程:
graph LR
A[定义搜索模式和替换模式] --> B[进行搜索]
B --> C[找到搜索实例]
C --> D[传递搜索实例到替换过程]
D --> E[使用替换模式和 HC 表达式进行替换]
E --> F[生成替换实例]
6. 旋律模式替换示例
示例一
搜索模式如图 20.11 所示,替换模式如图 20.12 所示。使用以下一组 HC 表达式:
replacement_hc_expressions = [
'@0:i',
'@0:vi',
'@0:v',
'@0:i',
'@0:iv',
'@0:i',
]
代码如下:
t_pat_sub = TPatSub.create(pattern_expression, replacement_expression,
replacement_hc_expressions)
tag_map = {0: DiatonicPitch.parse('D:5')}
results, replacement_instance_hct = t_pat_sub.apply(replacement_instance_line,
replacement_instance_hct,
'C:4',
tag_map,
t_pat_sub.target_height,
200)
filter = MinContourFilter(t_pat_sub.substitution_pattern.target_pattern_line, results.pitch_results)
scored_filtered_results = filter.scored_results
示例二
搜索模式如图 20.15 所示,替换模式如图 20.16 所示。使用以下一组 HC 表达式:
replacement_hc_expressions = [
'@0:i',
'@0:iv',
'@0:v',
'(@0)P:5-Melodic:i',
'(@0)P:5-Melodic:v',
'(@0)P:5-Natural:iv',
'@0:v',
'@0:vi',
'@0:iv',
'@0:i',
]
代码与示例一类似。
7. 搜索与替换的思考
在旋律搜索中,大部分情况下基于旋律轮廓进行搜索,但仅靠轮廓可能过于宽松,因为它允许选择音程间隔过大的段落。可以通过限制音程间隔来改进搜索,例如根据搜索模式中的音程,将音高搜索限制在相邻音程范围内。同时,要确保轮廓搜索尊重音阶和琶音段落,并且在基于音符是否为和弦音设置约束时要谨慎。
在模式替换中,引入 HC 表达式有助于根据搜索实例的和声上下文构建替换的和声环境,但可能还不够。音乐创作需要更多的上下文关注,例如参考替换模式本身的和声质量,或者搜索实例周围的和声信息。此外,基于转录构建替换实例的轮廓也存在与搜索标准类似的问题,如纯轮廓匹配标准过于宽松,需要引入音程限制和更严格的音阶、琶音模式遵循规则。
对于音乐记谱编辑器中的搜索和替换功能,可以设计一个弹出对话框来定义和控制。用户可以从菜单中请求搜索或搜索/替换,或者选择一个旋律短语后请求相应操作。对话框中会有一个可编辑的五线谱用于输入搜索旋律,如果在乐谱中已经选择了旋律,它会自动显示。如果用户选择“替换”,还会出现一个单独的可编辑五线谱,用于指定替换旋律和基于和声表达式的 HCT,这些和声表达式可以通过模拟搜索实例 HCT 的可选元素来制定。
8. 音乐伸缩变换(Dilation)
音乐创作者在创作过程中需要决定时间签名和速度。一旦这些确定,节奏结构就可以建立起来。不过,在创作早期,可能需要改变时间签名的节拍,例如从二分音符(h)改为四分音符(q),这可能是为了更整齐地处理音符复杂度,避免使用 128 分音符等。这种改变会影响速度节拍音符,但本质上音乐听起来与改变前相同,只是表示方式发生了变化,我们将这种变换称为伸缩变换。
伸缩变换虽然使用较少,但它的细节能让我们更深入地了解重要的记谱决策。下面通过一个例子来说明。
假设有一段音乐,其时间签名为简单的 4:4,速度节拍为四分音符,中等速度为 90 拍每分钟。如果创作者对这种记谱方式不满意,希望得到更紧凑、更密集的乐谱,选择将节拍和速度音符都改为八分音符,就会得到新的乐谱。
伸缩变换会影响时间签名、速度、音符、音符结构以及和声上下文轨道。同时,我们也需要探讨创作者在加快或减慢速度与改变节拍定义之间的权衡。
以下是一个简单的表格,展示伸缩变换前后的一些变化:
| 变换前 | 变换后 |
| ---- | ---- |
| 时间签名:4:4 | 时间签名:可能改变 |
| 速度节拍:四分音符 | 速度节拍:八分音符 |
| 音符复杂度:可能较高 | 音符复杂度:可能降低 |
通过对旋律搜索、模式替换和伸缩变换的研究,我们可以更好地理解音乐在软件中的表示和变换,为音乐创作和编辑提供更多的可能性和工具。
音乐中的旋律搜索、模式替换与伸缩变换
9. 伸缩变换的具体影响分析
伸缩变换对音乐的多个方面都有着具体的影响,下面我们详细分析其对时间签名、速度、音符、音符结构以及和声上下文轨道的影响。
- 时间签名 :时间签名的改变是伸缩变换的一个重要方面。例如,从常见的 4:4 时间签名变换到其他时间签名,会改变每小节的节拍数量和节拍的强弱规律。在伸缩变换中,时间签名的改变可能是为了适应不同的节奏表达需求。比如,将节拍细分或合并,以达到更紧凑或更宽松的节奏效果。
- 速度 :速度的变化与时间签名的改变密切相关。当时间签名的节拍发生变化时,速度节拍音符也会相应改变。例如,从以四分音符为节拍变为以八分音符为节拍,虽然音乐的实际速度感受可能不变,但速度的数值表示会发生变化。在这个过程中,需要确保音乐的整体节奏感觉保持一致,避免出现节奏混乱的情况。
- 音符 :音符的表示和时值会因伸缩变换而改变。原本较长的音符可能会被拆分成多个较短的音符,或者较短的音符会合并成较长的音符。这不仅影响了音符的视觉呈现,还会对演奏者的演奏方式产生影响。例如,在变换后,演奏者可能需要更快速地弹奏或演唱一些音符。
- 音符结构 :音符之间的组合和结构也会发生变化。伸缩变换可能会打破原有的节奏型,形成新的节奏模式。这对于音乐的韵律和风格有着重要的影响。例如,原本的节奏型可能是较为规整的,经过伸缩变换后,可能会变得更加复杂和多样化。
- 和声上下文轨道 :和声上下文轨道也会受到伸缩变换的影响。由于时间签名和节拍的改变,和声的进行和转换可能需要进行相应的调整。在新的节奏框架下,和声的稳定性和紧张感可能会发生变化,需要重新考虑和声的配置,以确保音乐的和声效果依然和谐。
以下是一个 mermaid 流程图,展示伸缩变换对各元素的影响关系:
graph LR
A[伸缩变换] --> B[时间签名改变]
A --> C[速度变化]
A --> D[音符改变]
A --> E[音符结构变化]
A --> F[和声上下文轨道调整]
B --> G[节拍数量和强弱规律改变]
C --> H[速度数值和感受调整]
D --> I[音符表示和时值变化]
E --> J[节奏型和韵律改变]
F --> K[和声进行和稳定性调整]
10. 伸缩变换的权衡与决策
在进行伸缩变换时,创作者需要在加快或减慢速度与改变节拍定义之间进行权衡。以下是一些需要考虑的因素:
- 音乐风格和表达需求 :不同的音乐风格对节奏和速度有着不同的要求。例如,古典音乐可能更注重节奏的规整和稳定,而现代流行音乐则可能更倾向于多样化和灵活的节奏变化。在进行伸缩变换时,需要根据音乐的风格和表达需求来选择合适的变换方式。
- 演奏难度 :伸缩变换会影响演奏的难度。如果变换后的节奏过于复杂,可能会给演奏者带来较大的挑战。因此,在决策时需要考虑演奏者的技术水平和能力,确保变换后的音乐仍然能够被顺利演奏。
- 听觉效果 :最终的听觉效果是衡量伸缩变换是否成功的重要标准。变换后的音乐应该在节奏、速度和和声等方面保持和谐统一,给听众带来良好的听觉体验。创作者需要通过试听和调整,不断优化伸缩变换的参数,以达到理想的听觉效果。
以下是一个表格,总结了不同决策的优缺点:
| 决策 | 优点 | 缺点 |
| ---- | ---- | ---- |
| 加快速度 | 增加音乐的活力和紧张感,适合表现激情的段落 | 可能增加演奏难度,对演奏者的技巧要求较高 |
| 减慢速度 | 营造舒缓、抒情的氛围,便于听众感受音乐的细节 | 可能使音乐显得拖沓,失去原有的节奏感 |
| 改变节拍定义 | 可以创造出新颖的节奏模式,丰富音乐的韵律 | 可能需要重新调整和声和旋律,增加创作难度 |
11. 伸缩变换示例
为了更直观地理解伸缩变换,我们来看一个具体的示例。假设有一段音乐,其原始参数如下:
- 时间签名:3:4
- 速度节拍:四分音符
- 速度:60 拍每分钟
现在,创作者希望将音乐变得更加紧凑,决定将节拍和速度音符都改为八分音符。以下是变换后的参数:
- 时间签名:6:8
- 速度节拍:八分音符
- 速度:120 拍每分钟
虽然速度的数值从 60 变为 120,但由于节拍的细分,音乐的实际节奏感觉保持一致。在记谱上,原本的一个四分音符现在会被表示为两个八分音符,音符的结构和节奏型也会相应改变。
以下是一个简单的代码示例,模拟伸缩变换的过程:
# 定义原始音乐参数
original_time_signature = "3:4"
original_beat_note = "quarter"
original_tempo = 60
# 进行伸缩变换
new_time_signature = "6:8"
new_beat_note = "eighth"
new_tempo = 120
print(f"原始时间签名: {original_time_signature}, 原始速度节拍: {original_beat_note}, 原始速度: {original_tempo} bpm")
print(f"变换后时间签名: {new_time_signature}, 变换后速度节拍: {new_beat_note}, 变换后速度: {new_tempo} bpm")
12. 总结与展望
通过对旋律搜索、模式替换和伸缩变换的研究,我们深入了解了音乐在软件中的表示和变换方式。旋律搜索和模式替换为音乐创作和编辑提供了强大的工具,能够帮助创作者快速找到和替换特定的旋律片段,丰富音乐的内容。而伸缩变换则让我们认识到时间签名和速度对音乐节奏的重要影响,以及如何通过改变这些参数来实现不同的音乐效果。
在未来的音乐创作中,我们可以进一步探索这些技术的应用。例如,开发更智能的旋律搜索算法,能够更好地处理复杂的旋律和和声;优化模式替换的规则,使其能够更灵活地适应不同的音乐情境;以及设计更便捷的用户界面,让创作者能够更轻松地进行伸缩变换和其他音乐操作。同时,我们也可以将这些技术与人工智能相结合,实现更自动化和智能化的音乐创作过程,为音乐产业带来新的发展机遇。
总之,音乐中的旋律搜索、模式替换和伸缩变换是音乐技术领域的重要研究方向,它们的发展将为音乐创作和欣赏带来更多的可能性和乐趣。
超级会员免费看
3万+

被折叠的 条评论
为什么被折叠?



