不干正事儿系列文章1:Sonic Pi简单应用


系列文章:
不干正事儿系列文章2:AD/DA转换PCF8591模块和树莓派4

半个月前,我打开了树莓派上的Sonic Pi。从此走上了一条不归路。

——陈端午

Sonic Pi简单应用

可以先看一下我传到B站的我作的乐曲的视频
视频链接

0. Intro

先说说我打开了Sonic Pi之后都干了啥吧。
某一个周五的晚上,我突然看到了一个Sonic Pi的入门视频,然后就入坑了。当天晚上看完了不太完整的入门视频,然后第二天开始研究软件中的Tutorial。略略地看了一下发现很好上手,然后就开始了我的不归路。
当天我就写出了一段旋律(也是唯一的旋律)。然后我就很想让这段旋律可视化好让我发B站。但是我研究了一段时间都没有弄通如何让Python或者其他语言读取设备的音频输出。有说拿PyAudio来做的,有说在shell里面敲命令的。反正我也没整明白。没整明白那就不整了!我决定土法上马!
方法非常的简单粗暴。找一根3.5mm的音频公公线,找三个鳄鱼夹,利用数模转换芯片直接读取音频输出的电压不就好了吗?
在我诞生这个想法之后的两周里,我的生活变得异常的充实。

1. Sonic Pi简单介绍

废话不多说了,还是回到本文的主题Sonic Pi(关于我这两周的生活是如何充实的,我会在未来的文章中进行更新)。
先简单介绍一下Sonic Pi,如它的官网所说的:The Live Coding Music Synth for Everyone. 他一改以往传统的作曲方式,让我们可以通过敲代码的形式来创作自己想要的乐曲。

1.1 安装

如果你拥有一个树莓派的话,那么你无需再额外地安装了,树莓派内置Sonic Pi。点击左上角的开始菜单,选择Programming,其中倒数第4个就是Sonic Pi了。Sonic Pi同样也支持Windows和MacOS,点击前文中提供的官网链接可以很容易地找到安装地址。

1.2 案例

安装完成之后我们打开软件。在文本框中输入如下内容:

play 60

点击左上角的run,我们就可以听到c4了。
再比如利用如下这段简短的内容:

define :chordplayer do |root, type, amp|
  range(-3,3).each do |i|
    play (chord root, type, invert: i), amp: amp
    sleep 0.25
  end
end

我们就可以播放出一段和弦了。
我们可以这样调用:

chordplayer :c, :major, 1

他表示的就是C Major也就是i, iii, v。最后的占据amp位置的1可以用于控制和弦的响度。


如果有兴趣对这个软件有更深入的了解的话,建议可以去看一下再软件下方的官方提供的Tutorial。虽然是全英语的,但是我个人认为语言比较通俗易懂。内容上逐层递进,学习难度不是很高。

2. Sonic Pi和随机数

显然我并不是专业学音乐的,我的乐理知识也非常的有限,所以如果下文内容中有任何不通之处还请在评论区中向我指出。
去年我写过一首曲子。这次学习Sonic Pi的过程当中,我就利用了我之前写的曲子的和弦走向。具体的走向可以在源码中阅读,这里就不多罗嗦了。
下面我先大致的说一下我的思路:我在规定了和弦走向以后,对于旋律的选择非常非常的随意。我先将一个小节分为数个时间长短不一的小段,然后我利用自带的shuffle函数对之进行打乱,这样一来,我就获得了一个由随机数控制的节奏。对于音符的选择,也十分简单的粗暴。预先规定一个音域范围,然后在这个范围内随机地选择和这个小节的和弦当中的音。
现在我来分段说明一下我程序的内容:

2.1 和弦的生成

define :chordplayer do |root, type, amp|
  range(-3,3).each do |i|
    play (chord root, type, invert: i), amp: amp
    sleep 0.25
  end
end

这一段就是之前已经提到过的和弦播放器,一个数组的循环从-3开始到2结束,然后chord可以返回某个和弦经过invert之后的音符。
我来举个例子说明一下invert的作用:比如我们的C是c4, e4, g4。如果我们对之进行Invert: 1的话,那么他就变为了:e4, g4, c5。

2.2 旋律的生成

define :melodyplayer do |root, type, pos, amp, i|
  if i<8
    time = 1.5/6
    seperate = shuffle [1, 2, 3]
    len = 3
  end
  
  if i<16 && i>=8
    time = 1.5/6
    seperate = shuffle [1, 1, 2, 2]
    len = 4
  end
  
  if i<24 && i>=16
    time = 1.5/12
    seperate = shuffle [1,1,2,2,3,
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值