用J发出声音

我一直对现场编码音乐着迷。 诸如Chuck,Supercollider,Overtone,Extempore和Sonic PI之类的框架,以及像Sam Aaron和Andrew Sorensen之类的受欢迎的表演者和音乐家,都从未间断过对我产生启发和启发。

就是说,每当我尝试使用其中一种工具或框架来创作自己的音乐时,我总是会很快放弃。 也许是因为我懒惰,学习新事物很困难,但是我一直告诉自己,这是因为我使用的工具与编程音乐的风格不符 。 从语法,人机工程学和概念上讲,这些工具并没有发挥作用。

然后我偶然发现了J。

J和整个APL语言家族对正在处理的数据都具有简洁而紧密的联系。 从根本上说,它们还设计为可在数组上运行,数组是一种易于音乐演奏的数据结构。 我已经说服自己,如果我可以学习J,那么我将能够构建自己梦想中的实时编码环境!

这是一个很大的目标,但我正在采取一些步骤。 今天,我将向您展示如何用J发出声音。

我用J制作噪音的计划实际上并不涉及我的J软件直接产生任何噪音。 相反,它将充当控制器,指示我的计算机上的其他软件代表它发出声音。

产生噪音的软件将为SimpleSynth,这是一个小型,易于使用的MIDI合成器。 如果您继续学习,请随意使用任何其他MIDI合成器,或者使用Ableton甚至GarageBand等完整的音频工作站。

当我们启动SimpleSynth时,它会询问它应该使用哪个MIDI源。 MIDI是一种协议,使我们可以在不同设备之间传递音乐信息,例如某些音符的播放时间和音量。 SimpleSynth正在询问应该听和播放哪些音符。

我使用MacOS的内置MIDI Studio创建了一个名为“ J”的虚拟MIDI通道,并带有一个名为“ Bus 1”的MIDI端口。确保虚拟设备在线后,我在SimpleSynth中选择了它。

最后一个难题是找到某种方式,通过我的“ J Bus 1”以编程方式发送MIDI消息,由SimpleSynth播放。 Geert Bevin的SendMIDI命令行工具可以达到目的。

安装后,我们可以使用SendMIDI从我们的命令行将MIDI音符发送到SimpleSynth:

  sendmidi开发“ J巴士1”在60 100 

on音符60并以100的速度有效地以全音量演奏中间C。

现在我们在做音乐!

下一个挑战在于让J执行sendmidi命令。

经过大量搜索和抓挠头后,我了解到J在“外国”( !: :)动词下展示了各种各样的杂项功能。 调用2!:1 y可以生成一个新进程,运行通过y传递的任何命令。

让我们尝试使用sendmidi命令调用生成动词:

  2!:1'sendmidi dev“ J Bus 1” on 60 100' 
|接口错误
| 2!:1'sendmidi dev“ J Bus 1” on 60 100'

经过更多的搜索和抓挠之后,我意识到在进行呼叫时需要使用完全限定的sendmidi路径:

  2!:1'60 100'上的/ usr / local / bin / sendmidi dev“ J Bus 1” 

我听到声音了! 成功!

尽管这很好,但是直接从命令行运行sendmidi命令并没有多大好处。 使我们变得更好的是,如果我们可以构建一个自己的play动词来演奏传递给它的所有音符。

例如,如果我要运行:

 播放60 64 67 

我希望J构建并执行我们的sendmidi命令,该命令应该演奏C大调和弦:

  sendmidi开发人员“ J Bus 1”在60100上在64100上在67100上 

在J上玩了几个有趣的周末之后,我想到了这个版本的play动词:

  on =:('on',5 |。'100',“ :)” 0 
播放=:[:2!:1'/ usr / local / bin / sendmidi dev“ J Bus 1”',[:,/ on

on动词将整数音符转换为'on 100 '格式的“ on字符串”,而play动词产生了将'/usr/local/bin/sendmidi ...'附加到映射对象的结果。应用于y

简而言之,它构造并执行了sendmidi命令。

我们可以演奏C大调和弦:

 播放60 64 67 

或我们想要的任何其他和弦:

 播放60 63 54 70 73 

请记住,我是J的新手,甚至是默认编程的新手。 如果您发现任何可以改进,澄清或纠正的内容,请告诉我。

在使用J时,我仍然感到笨拙和缓慢。构建这行两行程序花费了我数小时的时间。 就是说,我觉得这里有潜力。 随着我逐渐习惯于默认的范式并使用与DAW和其他音频制作人互动的其他方式,我觉得J可能会变成我理想的音乐创作环境。

时间会证明一切。


最初于 2018年7月2日 发布在 www.petecorey.com 上。