34、音乐变换:伸缩与阶梯移位

音乐变换:伸缩与阶梯移位

音乐创作中,常常需要对旋律、和声等元素进行变换,以创造出丰富多样的音乐效果。本文将介绍两种音乐变换方法:伸缩变换(Dilation)和阶梯移位变换(Step Shift),并详细探讨它们的原理、特点和应用。

伸缩变换

伸缩变换是一种通过改变音符时长、节拍和速度来调整音乐的方法。下面我们将详细介绍伸缩变换的原理、特点和应用。

伸缩变换的原理

伸缩变换基于一个称为伸缩因子(Dilation Factor)的正数,用于调整音符的时长和相对位置。具体来说,伸缩变换会对输入的乐谱(LiteScore)进行处理,包括旋律线(Line)、和声上下文轨道(Harmonic Context Track, HCT)、时间签名(Time Signature)和速度事件(Tempo Events)。

伸缩变换的过程可以概括为以下几个步骤:
1. 输入乐谱 :输入一个包含旋律线、和声上下文轨道、时间签名和速度事件的乐谱。
2. 应用伸缩因子 :使用一个正数作为伸缩因子,对音符的时长和相对位置进行调整。
3. 输出变换后的乐谱 :输出一个经过伸缩变换后的乐谱,包含变换后的旋律线、和声上下文轨道、时间签名和速度事件。

伸缩变换的特点

伸缩变换具有以下几个特点:
1. 典型伸缩因子 :典型的伸缩因子通常为 2 或 1/2,但也可以使用其他值。不过,这些非典型的伸缩因子在音乐中使用较少。
2. 音乐内容基本不变 :除了音符时长和节拍的变化外,音乐的其他方面基本保持不变。伸缩变换主要用于调整乐谱的布局。
3. 影响时间签名和速度 :伸缩变换会影响时间签名的节拍音符时长和速度的节拍音符时长。
4. 可自动改变速度 :伸缩变换提供了一个选项,可以自动改变速度本身。可以将伸缩因子“吸收”到速度中,以实现速度的变化。

伸缩变换的控制参数

为了更好地控制伸缩变换的效果,引入了两个布尔变量:
1. apply_to_notes :表示将伸缩因子应用于源旋律线的音符,以及时间签名和速度的节拍音符定义。
2. apply_to_bpm :表示将伸缩因子应用于速度的 BPM(Beats Per Minute)。

这两个变量的不同组合可以实现不同的变换效果,具体如下表所示:

apply_to_notes apply_to_bpm 音符 时间签名和节拍 速度 BPM
Yes Yes 时长 * 伸缩因子 时长 * 伸缩因子 时长 / 伸缩因子
Yes No 时长 * 伸缩因子 时长 * 伸缩因子 无变化
No Yes 无变化 无变化 时长 / 伸缩因子
No No 无变化 无变化 无变化
伸缩变换的 API

伸缩变换的 API 遵循构造/应用(Construct/Apply)范式,非常简单。构造函数只接受一个参数:
- score :一个 LiteScore 对象,包含旋律线、时间签名事件序列、速度事件序列和和声上下文轨道。

应用方法(apply())接受以下参数:
- dilation_factor :一个正分数或整数,作为伸缩因子。否则,将抛出异常。
- apply_to_bpm :一个布尔值,表示是否将伸缩因子应用于速度的 BPM。默认值为 False。
- apply_to_notes :一个布尔值,表示是否将伸缩因子应用于源旋律线的音符,以及时间签名和速度的节拍音符定义。默认值为 False。

应用方法返回一个新的 LiteScore 对象,包含所有根据参数进行的变化。

伸缩变换的示例

下面是两个伸缩变换的示例:

示例 1:巴赫《法国组曲》第二号小步舞曲开头

title = 'Bach, French Suite II BWV 813, MM 1-4 3/4 T.S. 42-46==dotted half f=2 (False, False)'
bach_line = '{<C-MelodicMinor:i>iG:4 Eb:5 D C B:4 C:5 <:iv> qAb:5 G F iEb:5 D F ’ \  
            ’Eb D C <:V> B:4 A C:5 B:4 A G}'
lite_score = create_score(bach_line, 'piano', (42, Duration(3, 4)),  
                                          (3, Duration(1, 4)))

trans = TDilation(lite_score)

#  case 0: apply_to_bpm=False apply_to_notes=True
new_score = trans.apply(Fraction(2), False, True)

示例 2:莫扎特《A 大调钢琴奏鸣曲》第一乐章开头

title = 'Mozart, Sonata in A KV331, I, MM 1-4 6/8 T.S. 60==eighth f=1/2 (True, False)'
mozart_line = '{<A-Major:I>i@C#:5 sD iC# qE iE <:VDom7> i@B:4 sC#:5 iB:4 qD:5 iD ‘ /
           ‘<:viMin7> qA:4 iA <:V>qB:4 iB <:I> qC#:5 sE D qC# <:V>iB:4}'
lite_score = create_score(mozart_line, 'piano', (60, Duration(3, 8)), (6, Duration(1, 8)))
trans = TDilation(lite_score)

# apply_to_bpm=True apply_to_notes=False
new_score = trans.apply(Fraction(1, 2), True, False)
print_score(title, new_score)
阶梯移位变换

阶梯移位变换是一种通过将每个音符的音高升高或降低一定数量的音阶步数来调整音乐的方法。下面我们将详细介绍阶梯移位变换的原理、特点和应用。

阶梯移位变换的原理

阶梯移位变换基于一个称为阶梯增量(Step Increment)的整数,用于表示每个音符的音高升高或降低的音阶步数。具体来说,阶梯移位变换会对输入的乐谱中的每个音符进行处理,将其音高按照阶梯增量进行调整。

阶梯移位变换的过程可以概括为以下几个步骤:
1. 确定调性 :确定当前音乐的调性。
2. 确定阶梯增量 :确定一个整数作为阶梯增量,表示每个音符的音高升高或降低的音阶步数。
3. 音高重映射 :根据调性和阶梯增量,建立一个音高映射表,将原始音阶中的音符映射到移位后的音阶中的音符。
4. 应用音高映射 :对输入乐谱中的每个音符,根据音高映射表进行音高调整。
5. 输出变换后的乐谱 :输出一个经过阶梯移位变换后的乐谱,包含变换后的旋律线和和声上下文轨道。

阶梯移位变换的特点

阶梯移位变换具有以下几个特点:
1. 常用于序列模式 :阶梯移位变换常用于音乐中的序列模式,即重复的节奏、旋律和和声模式,且不改变调性。
2. 可创建新旋律 :阶梯移位变换可以用于创建新的旋律或部分旋律,为音乐创作者提供了更多的创作可能性。
3. 处理非音阶音 :阶梯移位变换需要处理非音阶音的映射问题,即如何将非音阶音映射到不同的音高。
4. 影响和弦 :阶梯移位变换会影响和声上下文轨道中的和弦,需要考虑如何调整和弦以适应音高的变化。

音高重映射

音高重映射是阶梯移位变换的核心,它基于一个音高映射表,将原始音阶中的音符映射到移位后的音阶中的音符。例如,对于 Eb 大调,阶梯增量为 3 的音高映射表如下:

原始音阶 移位后的音阶
Eb Ab
F Bb
G C
Ab Db
Bb Eb
C F
D G

对于非音阶音,音高映射表会将其字母部分映射到对应的移位后的音阶中的音符,然后保持其变音符号不变。例如,对于 G#,音高映射表会将 G 映射到 C,然后保持 # 不变,得到 C#。

下面是音高映射的代码实现:

def tonal_function(self, tone):
    result_tone = self.tone_map[tone.diatonic_letter]
    alteration = tone.augmentation_offset
    result_tone = DiatonicTone.alter_tone_by_augmentation(result_tone, alteration)
    return result_tone

def __getitem__(self, pitch):
    if pitch is None:
        return None

    result_tone = self.tonal_function(pitch.diatonic_tone)

    crosses = DiatonicPitch.crosses_c(pitch.diatonic_tone,  
                                      result_tone,
                                      True if self._sign(self.increment) >= 0  
                                           else False)

    result_register = pitch.octave +  
                         self._sign(self.increment) *  
                             ((abs(self.increment) // 7) + (1 if crosses else 0))
    return DiatonicPitch(result_register, result_tone)
阶梯移位变换的示例

下面是一个简单的阶梯移位变换的示例:

假设我们有一个简单的旋律模式,在第一小节中出现,然后重复两次,每次开始时降低一个音阶步,形成一个序列。这个示例展示了阶梯移位变换在序列模式中的应用。

graph LR
    A[原始旋律] --> B[第一次移位]
    B --> C[第二次移位]

在这个示例中,第一小节的旋律是主模式或主题,然后重复两次,每次比前一次降低一个音阶步。相邻的音符之间保持与主题相同的音阶步数。

综上所述,伸缩变换和阶梯移位变换是两种非常有用的音乐变换方法,它们可以帮助音乐创作者创造出丰富多样的音乐效果。伸缩变换主要用于调整音符时长、节拍和速度,而阶梯移位变换主要用于调整音符的音高。通过合理运用这两种变换方法,音乐创作者可以实现更多的创作可能性。

音乐变换的进一步探讨与应用建议

伸缩变换的深入分析与应用场景

伸缩变换虽然在实际音乐创作中使用频率相对不高,但在某些特定场景下却能发挥独特的作用。

伸缩因子的选择

典型的伸缩因子为 2 或 1/2,这是因为传统音乐记谱大多基于 2 的幂次方的音符时长。然而,使用其他伸缩因子如 1/3、3/7 等并非完全不可行。例如,当使用 4/7 作为伸缩因子时,会得到一些非标准的音符时长和时间签名,如 4 1/7 拍的时间签名,以及 1/7、1/14 等非传统的音符。但实际上,这些看似奇特的结果可以通过反向操作(如乘以 7/4)恢复到接近原始的记谱形式。

不过,在实际应用中,不规则的伸缩因子可能会带来一些问题。例如,不规则的音符时长在束线和连音结构的配置上会变得困难,时间签名和速度也难以稳定或有意义地指定。但如果能统一应用一个伸缩因子到整个乐谱中,除了束线和速度值外,乐谱的其他方面仍能保持一定的组织性,就像常见西方音乐记谱的一个略微变形的镜像。

不同控制参数组合的应用场景
  • apply_to_notes = True, apply_to_bpm = True :这种组合会同时改变音符时长、时间签名、节拍和速度。适用于需要整体调整音乐节奏和速度的情况,例如在音乐需要突然加快或减慢节奏,同时改变音符的疏密程度时。
  • apply_to_notes = True, apply_to_bpm = False :只改变音符时长和时间签名、节拍,速度保持不变。常用于在不改变音乐整体速度感的前提下,调整乐谱的布局,使音符更加紧凑或宽松。
  • apply_to_notes = False, apply_to_bpm = True :不改变音符、时间签名和节拍,而是通过改变速度来实现音乐的变化。可以用于在不改变音符形态的情况下,调整音乐的快慢,例如在需要快速过渡到不同节奏但又不想改变旋律结构时。
  • apply_to_notes = False, apply_to_bpm = False :不进行任何改变,输入和输出的乐谱相同。这种情况在实际应用中较少使用,但在调试或测试代码时可能会用到。
阶梯移位变换的实际应用与注意事项

阶梯移位变换在音乐创作中有着广泛的应用,特别是在序列模式的构建中。

序列模式的应用

序列模式是阶梯移位变换最常见的应用场景之一。通过重复相同的旋律、节奏和和声模式,并将其逐步升高或降低一定的音阶步数,可以创造出富有层次感和连贯性的音乐效果。例如,在一些古典音乐作品中,常常可以看到旋律在不同的音高上重复,形成序列,增强了音乐的张力和吸引力。

处理非音阶音和和弦的问题

在进行阶梯移位变换时,需要特别注意非音阶音和和弦的处理。非音阶音的映射需要根据具体的音乐情境和创作意图来确定。对于和弦,需要考虑如何调整和弦以适应音高的变化,确保和声的协调性。

例如,在处理二级和弦时,需要根据阶梯增量对和弦的根音、三音、五音等进行相应的调整。可以通过建立和弦音的音高映射表,将原始和弦音映射到移位后的和弦音。

创作中的灵活性

虽然阶梯移位变换有其固定的算法和规则,但在实际创作中,音乐创作者可以根据需要对变换后的旋律进行适当的修改和调整。例如,可以改变某些音符的节奏、音高或添加装饰音,以增加音乐的色彩和个性。

总结与建议

伸缩变换和阶梯移位变换是两种强大的音乐变换方法,它们为音乐创作者提供了丰富的创作可能性。在实际应用中,需要根据具体的创作需求和音乐风格选择合适的变换方法和参数。

  • 伸缩变换 :适用于需要调整音符时长、节拍和速度的情况。在选择伸缩因子时,尽量优先考虑 2 或 1/2 等典型值,以避免出现过于复杂的记谱和难以处理的问题。同时,根据不同的控制参数组合,灵活调整音乐的节奏和速度。
  • 阶梯移位变换 :常用于构建序列模式,创造富有层次感和连贯性的音乐效果。在处理非音阶音和和弦时,需要谨慎考虑,确保和声的协调性。在创作过程中,可以适当对变换后的旋律进行修改和调整,以增加音乐的个性。

希望通过对这两种音乐变换方法的介绍和分析,能帮助音乐创作者更好地运用它们,创作出更加精彩的音乐作品。

变换方法 适用场景 注意事项
伸缩变换 调整音符时长、节拍和速度,改变乐谱布局 优先选择典型伸缩因子,注意不规则伸缩因子带来的问题
阶梯移位变换 构建序列模式,创造连贯音乐效果 处理非音阶音和和弦时确保和声协调,可适当修改旋律
graph LR
    A[音乐创作需求] --> B{选择变换方法}
    B -->|伸缩变换| C[确定伸缩因子和控制参数]
    B -->|阶梯移位变换| D[确定阶梯增量和处理非音阶音、和弦]
    C --> E[应用变换得到新乐谱]
    D --> E
    E --> F[根据需要修改调整]
    F --> G[完成音乐创作]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值