扫一扫分享

Slang是由js实现一种简单的音频编程语言,解析由Ohm.js使用自定义语法处理,编辑器使用 CodeMirror 并采用简单的语法定义,运行时本身则使用 Web Audio api 以 JS 编写。
Slang 语言编写指南
Slang 语言包含声音行和播放行。声音行用于构建一个合成器(或鼓机),然后播放行则指示这些合成器或鼓机播放什么内容。
示例:
@synth (adsr (osc tri) 64n 8n 0.5 8n)
play @synth
(rhythm [8n])
(notes [c3 d3 e3 f3 g3 a3 b3 c4])事实证明,解释自己创建的编程语言异常困难,因此建议您先跳过文档直接阅读下方的示例部分,尝试运行后再来阅读完整文档。
声音行
声音行用于定义一个变量(总是以 @ 开头),该变量包含一个声音处理链。声音链总是以 (osc) 或 (drums) 开始,并可以使用 + 运算符将滤波器、声像和增益等工具连接起来。
以下是一个正弦波振荡器,其信号先后通过低通滤波器和增益处理:
@synth (osc sine)
+ (filter lp 100)
+ (gain 0.5)您可以为同一个变量添加多个声音行;当一个音符被播放时,所有对应的声音链都会触发。
这里是一个包含两个振荡器的声音,第二个振荡器音高提高了一个八度。当声音播放时,每个音符都会触发两个振荡器。
@synth (osc sine)
@synth (osc sine 12)
play @synth (notes [e3])提示: 尝试为您的合成器创建多个声音链,并通过左右声像调整来创造立体声合成器效果。
播放行
播放行以关键字 play 开头,后跟要播放的变量,然后声明要使用的节奏和音符。您可以有多个播放行引用同一个合成器,它们会独立播放(例如,用于播放复音旋律)。
rhythm 接受一个节奏值列表或一个返回节奏值的函数;而 notes 接受一个音符列表或一个返回音符的函数。我们先看一个简单例子,然后再了解如何利用更高级的函数。
一个简单的合成器:
@synth (adsr (osc sine) 64n 8n 0 8n)
play @synth (rhythm [8n]) (notes [e3 e4 e5])现在,我们使用 (chord) 函数创建一个播放音阶的合成器。Chord 函数的第二个参数是和弦类型(如:major, chromatic, phrygian 等),第三个参数是根音。
@synth (adsr (osc tri) 64n 8n 0 8n)
play @synth (rhythm [8n]) (notes (chord lydian e3))更进一步,我们将 chord 函数调用放在 random 函数内部,这样每次调用时都会从和弦中随机选取一个音符。
@synth (adsr (osc tri) 64n 8n 0 8n)
play @synth
(rhythm [8n])
(notes (random (chord lydian e3)))flatten 和 repeat 函数在 notes 内部使用时,是创建重复乐句的强大工具。由于 notes 只接受一个列表,我们使用 flatten 函数将多个不同的调用结果合并成一个平铺的列表。repeat 函数会将我们给它的列表重复若干次,省去了复制粘贴的麻烦。
@synth (adsr (osc sine) 64n 8n 0 8n)
play @synth
(rhythm [8n])
(notes (flatten [
(repeat 3 (chord lydian e4 4))
(chord lydian d4 4)
]))提示: 尝试为同一个声音创建多个播放行,以制作复音旋律和鼓点节奏。
仅供个人学习参考/导航指引使用,具体请以第三方网站说明为准,本站不提供任何专业建议。如果地址失效或描述有误,请联系站长反馈~感谢您的理解与支持!
手机预览