树莓派应用系列讲座
CICET©2014.6
使用 SONIC PI 进行音乐创作 在本讲中,我们准备使用树莓派上独有的程序 - Sonic Pi - 来制作一些有趣的音乐,因此你需 要一副耳机、扬声器或带有内建扬声器的显示器。Sonic Pi 是由英国剑桥大学的计算机科学家专门 为树莓派而设计的,儿童可以通过制作音乐来学习计算机编程的基本知识。Sonic Pi 使用了与 Ruby 编程语言想似的语法结构。
第一步:在 SONIC PI 中播放声音 我们先来播放一些声音:
Sonic Pi 的应用界面有三个窗口。最大的一个窗口用于书写你的代码,称之为“编程面板”。右 上侧的窗口是“输出面板”,显示程序运行时的信息。在其下面是第三个窗口为“错误面板”,如 果你的程序有问题会在这里显示信息。 活动步骤: 1. 运行 Sonic Pi; 2. 选择 Workspace 1. 3. 键入: play 60 1
树莓派应用系列讲座
CICET©2014.6
4. 点击屏幕顶部的播放图标。 5. 如果你键入的是 pley 60,点击后会怎样? 6. 现在键入: play 60 play 67 play 69 7. 点击屏幕顶部的播放图标,看看会发生什么。 计算机会依次播放序列中的每个音符,但对我们而言这发生的太快了,以至于听起来像是同时 播放的。 8. 我们需要告诉计算机在每个音符之间暂停一下,在每个 play 后面键入 sleep 1 sleep 后面跟随的值表示按秒计算的时间,所以值 1 代表一秒钟。 9. 现在写一组 play 和 sleep 的序列使声音听起来有旋律! 第 二 步 : FRÈRE JACQUES( 两 只 老 虎 ) 在关键词 play 后面键入的数字表示音符,事实上,这些数字是 MIDI 音符数。这意味着我们可 以将钢琴上演奏的音符转换到 Sonic Pi。我们准备编码 Frère Jacques,按照 MIDI 音符表示,这首 歌曲的前几个音符是: C D E C 或者 60 62 64 60 音符与 MIDI 音符值的对应(完整对应表见文末) C
D
E
F
G
A
B
60
62
64
65
67
69
71
活动步骤: 1. 选择 Workspace 2; 2. 键入下列代码: play 60 sleep 0.5 play 62 sleep 0.5 play 64 sleep 0.5 play 60 sleep 0.5 3. 现在点击屏幕顶部的播放图标,将会播放 Frère Jacques 的第一部分。 这个第一小节要播放两次,你可以再次键入相同的小节,或者在你的代码中使用循环。 4. 在这段代码的开始部分(第一个 play 60 的上面)键入: 2.times do 5. 在代码的结束部分(最后一个 sleep 0.5 的下面)键入: end 2
树莓派应用系列讲座
CICET©2014.6
6. 点击屏幕顶部的播放图标。 下面是第一小节完整的代码: 2.times do play 60 sleep 0.5 play 62 sleep 0.5 play 64 sleep 0.5 play 60 sleep 0.5 end 试试看: 1. 使用下列音符表将歌曲 Frère Jacques 翻译为 Sonic Pi 音符值: CDECCDEC EFGEFG GAGFECGAGFEC CDECCDEC 2. 使用已学到的知识创建自己的旋律。 第三步:改变声音 现在该让你的旋律听起来更悦耳了!我们可以通过改变所使用的合成器声音来做到这一点。Sonic Pi 的默认合成器称为"pretty_bell"。要使用不同的合成器,你需要在希望使用它的代码序列的 上面加上代码:with_synth "name of synth"。 在下面的例子中,"fm"是合成器的名字: with_synth "fm" 2.times do play 60 sleep 0.5 play 67 sleep 0.5 end 试试不同的合成器 "pretty_bell" "dull_bell" "beep" "saw_beep" "fm" 活动步骤: 1. 在你的代码的顶端(2.times do 的上面),加入下列代码: with_synth "fm" 2. 点击屏幕顶部的播放图标。 3
树莓派应用系列讲座
CICET©2014.6
3. 使用上述合成器列表进行改变,找出你喜欢听的。 第四步:使用函数 目前,你的 Sonic Pi 版 Frère Jacques 只能按设定的音符键组播放,它总是播放相同八度音高中 的相同音符。为使你的程序能使用不同的音高,我们可以使用函数。 函数是一组经过命名的语句。你可以将 Frère Jacques 的第一部分放到一个函数内: def frere play 60 sleep 0.5 play 62 sleep 0.5 play 64 sleep 0.5 play 60 sleep 0.5 end 然后,你就可以通过键入 frere 来调用这个函数来播放。但是,这并不能解决使用不同音高播 放歌曲的问题。现在我们就来解决这个问题! 活动步骤: 1. 打开一个新的 workspace,你代码将存储在这里。 2. 为歌曲的第一部分创建一个函数: def frere(n) play n sleep 0.5 play n + 2 sleep 0.5 play n + 4 sleep 0.5 play n end 如果你按下播放按钮,什么事情也不会发生。你需要在调用的函数后面留下一个空格,然后跟上一 个数字,如 frere 60。这里参数 n 的值是 60,但你可以改变它。 3. 尝试改变 n 的值:frere 40 或 frere 80。 现在你会听到每次按不同音高播放的旋律。 第四步:同时播放两种旋律 音乐经常会有重复的背景,其旋律与主旋律分离。到目前为止,你在 Sonic Pi 中只能播放一种 旋律。现在我们来试试同时播放两种旋律。 活动步骤: 1. 点击打开一个新的 workspace。 2. 用于同时播放的两个旋律必须介于 in_thread do 和 end 之间。
4
树莓派应用系列讲座
CICET©2014.6
3. 在 in_thread do 下方键入你的旋律,此处我们使用前面的 Frère Jacques: in_thread do with_synth "saw_beep" 2.times do play 60 sleep 0.5 play 67 sleep 0.5 end end 这第一个'thread'用做音乐的主旋律,在其下面,你可以键入用在背景或基线的代码。 4. 键入: in_thread do with_synth "pretty_bell" 30.times do play 49 sleep 1 end end
附录:标准音乐键盘与 MIDI 音符的编码对照表 (左:正向;右:反向)
5