无限音乐生成器(下)

在上一节,我们刚刚完成了和弦进行随机生成的模块。接下来,只要创建不同乐器轨道,通过钢琴,贝斯,鼓的配置,在和弦进行的基础上做出一段完整的音乐。这样,我们就距离“无限音乐生成器”更近一步了。

创建轨道

创建不同的轨道,在sonic pi里相当于为每种乐器创建一个独立线程。在每一个线程里,需要定义一个loop,之后程序就会无限循环播放定义好的内容。我推荐使用live_loop为每个乐器创建轨道,因为在live_loop里可以随时更改参数,这就好比你在现场演出时用推子和旋钮调整参数,非常方便。

live_loop :piano do
    use_synth :dsaw
    piano_chord = get :chord2play
    play piano_chord if(spread 7,16).tick
    sleep 0.25
end

live_loop :bass do
    use_synth :tb303
    with_fx :lpf ,cutoff: 80 do
        tick
        play (choose(get :chord2play)-12),release: 0.3, cutoff: rrand(60,120), amp: 0.4 if(spread 5,16).look
        sleep 0.125
    end
end

live_loop :drum do
    tick
    sample :drum_cymbal_soft, amp: 1.5 if (spread 5,16).rotate(4).look
    sample :bd_tek, amp: 1.5 if(spread 4,16).look
    sleep 0.25
end

因此,我用live_loop 创建了三个不同的新轨道,分别命名为:piano, :bass, :drum。piano与bass使用合成器use_synth,drum轨道会播放鼓的采样。

之后,我将之前的和弦进行生成的轨道命名为chord_generator。这个轨道不参与演奏,只负责向piano与bass轨道传递和弦这个参数。

不同轨道间传递MIDI

不同轨道之间传递参数的功能,其实很像ableton live在各个轨道内设置MIDI input。在sonic pi 里,如果用“=”将参数简单赋值,不同的轨道无法抓到这个参数。因为每个轨道内设置的变量,作用范围仅限于这个轨道。因此,在跨越轨道的前提下传递参数,就需要使用setgetSet/get所做的事就像是抛球与接球的动作一样。

具体的使用方式是,在chord_generator轨道内,用set: chord2play, currentChord将参数发送出去,currentChord是轨道内的本地变量,而chord2play是可以被不同轨道抓取的变量,现在它已经被赋值。Live_loop每次更新currentChord的和弦变量时,chord2play也被同步更新。

live_loop :chord_generator do
    use_random_seed 2000
    currentChord = chordProgression.tick.choose
    set :chord2play, currentChord
    sleep 1
end

之后,piano轨道用get :chord2play 抓住了当前需要演奏的和弦,这样midi在轨道之间相互传递变量的任务就大功告成了。

live_loop :piano do
    use_synth :dsaw
    piano_chord = get :chord2play
    play piano_chord if (spread 7,16).tick
    sleep 0.25
end

在和弦的基础上添加节奏

虽然钢琴与贝斯都得到了相同的和弦,但设定不同的演奏节奏与织体会变得更有趣,也能提升作品的完成度。所以最后一步同样十分重要。

这里的设计方法不为一。可以使用琶音器,也可以通过时值设定不同节奏。

简单的方法是使用sleep设置不同音符的时值,相当于在loop内把谱子打出来。

复杂的方法是使用spread这个内置函数,将类似于16步进的鼓机中自定义个数的开关点亮,从而实现不同曲风的节奏。

live_loop :drum do
    tick
    sample :drum_cymbal_soft, amp:1.5 if(spread 5,16).rotate(4).look
    sample :bd_tek, amp: 1.5 if(spread 4,16).look
    sleep 0.125
end

鼓机,节奏设计的话题,在本书第一章有详细阐述,所以这里就不继续展开了。

不过我认为,这里没有好方法与笨方法的分别。对每个人来说,现阶段能让音乐听起来不错的指令,都是你能用到的最好方法。

代码走起来

本次项目的完整代码在这里:

https://github.com/SuperMegaPlantet/SonicPi_jam/blob/master/chordProgression/chordProgression_test2.rb

试试看音乐生成器,只需要修改chordProgression里的罗马数字列表,列表内的罗马数字个数并没有被定死,可以是3个级数的和弦进行,也可以是8个。甚至还可以按照段落进行编排。

除了修改和弦进行,也可以尝试修改use_random_seed的数值,尝试不同的随机组合直到满意为止。

如果时不时出现不和谐的和弦,记得在和弦表格里把它删掉。

所有数值的更改都可以在程序运行时完成,更新数值后不需要按暂停键,直接按播放键就可以听到更新后的效果。

results matching ""

    No results matching ""