无限音乐生成器(下)
在上一节,我们刚刚完成了和弦进行随机生成的模块。接下来,只要创建不同乐器轨道,通过钢琴,贝斯,鼓的配置,在和弦进行的基础上做出一段完整的音乐。这样,我们就距离“无限音乐生成器”更近一步了。
创建轨道
创建不同的轨道,在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 里,如果用“=”将参数简单赋值,不同的轨道无法抓到这个参数。因为每个轨道内设置的变量,作用范围仅限于这个轨道。因此,在跨越轨道的前提下传递参数,就需要使用set与get,Set/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
鼓机,节奏设计的话题,在本书第一章有详细阐述,所以这里就不继续展开了。
不过我认为,这里没有好方法与笨方法的分别。对每个人来说,现阶段能让音乐听起来不错的指令,都是你能用到的最好方法。
代码走起来
本次项目的完整代码在这里:
试试看音乐生成器,只需要修改chordProgression里的罗马数字列表,列表内的罗马数字个数并没有被定死,可以是3个级数的和弦进行,也可以是8个。甚至还可以按照段落进行编排。
除了修改和弦进行,也可以尝试修改use_random_seed的数值,尝试不同的随机组合直到满意为止。
如果时不时出现不和谐的和弦,记得在和弦表格里把它删掉。
所有数值的更改都可以在程序运行时完成,更新数值后不需要按暂停键,直接按播放键就可以听到更新后的效果。