使用 Linux 进行算法音乐创作 - athenaCL

作者:Dave Phillips

在我对 Linux 算法音乐作曲系统的调查总结中,我将介绍 Christopher Ariza 的 athenaCL

根据其网站,athenaCL 是

... 一个用 Python 编写的开源、面向对象的作曲工具。该系统可以编写脚本和嵌入,并包括集成的乐器库、后调性和微音调音高建模工具、多种格式的图形输出,以及 Csound、SuperCollider、Pure Data、MIDI、音频文件、XML 和文本格式的音乐输出... 超过八十个专门的生成器、节奏和滤波器参数对象提供了用于随机、混沌、细胞自动机、基于马尔可夫、生成语法和林氏系统 (L-system)、波形、分形噪声 (1/f)、遗传、Xenakis 筛法、线性和指数断点分段、掩码和各种其他算法模型的工具。参数对象可以嵌入到其他参数对象中,以提供强大的动态和掩蔽值生成。

我对 athenaCL 的体验与我对 CM/Grace 和 CsoundAC 的探索略有不同。该系统以一种独特的组织方式构建,起初我感到困惑。然而,最初的困惑很快让位于惊叹,我必须承认,我已经成为一个忠实的用户。


测试

对于本次评测,我测试了 athenaCL1,这是该程序于 2009 年 8 月发布的最新稳定版本。AthenaCL2 现在以 alpha 阶段软件的形式提供,但项目文档尚未准备就绪。我在运行 Python 2.5 的 64 位 Debian 和运行 Python 2.6 的 32 位 Ubuntu 上运行了该程序。除了 64 位机器的速度之外,系统表现完全相同。

CsoundAC、Steven Yi 的 blue 和 Oeyvind Brandtsegg 的 ImproSculpt 中使用 Python 表明 Python 与算法音乐作曲任务具有特殊的亲和力。实际上,该语言是可扩展的,相对容易学习,并且在现代硬件上表现良好。然而,实时渲染音频并不是 Python 的优势之一,因此在 athenaCL 中,该任务被移交给指定的音频渲染子系统,例如 Csound。


安装与配置

可以为 UNIX/Linux 和 MacOSX 机器下载源代码包,并且 Windows 提供安装程序。在 Linux 机器上安装很简单。从 athenaCL 站点下载稳定的 tarball,并在您选择的目录($HOME 是个不错的选择)中解压缩。阅读 README 文本文件。此时,大多数系统应该都准备就绪。但是,athenaCL 的依赖项可能会根据您的项目要求而有所不同。您可以在没有任何播放或图形输出支持的情况下使用该系统,但完整的环境包括 Csound5、TkInter、Python Image Library 和可用的 ALSA 声音系统。音频和 MIDI 文件播放器是用户可定义的。athenaCL 使用 Csound 来渲染系统生成的文件,这要归功于 Csound 的乐器和效果库。原生用户界面是 Python 解释器的命令行,但用户可以请求 GUI 文件对话框和 JPG/PNG 图形显示以用于某些命令。

我在所有机器上都维护着最新和最好的 Csound,但 athenaCL 的默认 MIDI 播放器没有安装在任何一台机器上。我决定将默认设置为 TiMidity,Ubuntu 为其系统 MIDI 文件播放器所做的选择。我的老旧 64 Studio 机器没有 TiMidity,所以我下载并构建了源代码。安装快速而完美。在两台机器上,我都编辑了 /usr/share/timidity/timidity.cfg 以使用 Fluid General MIDI 音色库,这是一种比默认音色集听起来更好的替代方案。AthenaPreferences 外部应用程序命令引导我完成了设置首选播放器的过程,我就可以使用 MIDI 和 athenaCL 了。


运行系统

安装完首选支持包后,您可以运行源代码包顶层目录中的 setup 和 start-up 脚本

  sudo python setup.py
  python athenacl.py

首次启动 athenaCL 后,您应该在提示符下看到类似这样的输出

  dlphilp@The3800:~/src/athenaCL$ python athenacl.py 

  athenaCL 1.4.9 (on linux2 via terminal threading off)
  Enter "cmd" to see all commands. For help enter "?".
  Enter "c" for copyright, "w" for warranty, "r" for credits.

  :: AUup
  check online for updates to athenaCL? (y or n): y
  athenaCL 1.4.9 (2009.08.15) is up to date.

  [PI()TI()] ::

这个奇怪的提示符意义重大。PI() 表示尚未定义路径实例,TI() 告诉我们纹理实例的情况也是如此。我们可能还不知道它们意味着什么,但显然它们对系统很重要。我们将在稍后看到它们有多重要。此时,我们准备开始运行一些命令和脚本。我将从一个相当高级别的操作开始 - 创建一个音高资源,即一个路径 - 然后继续进行另一个这样的操作 - 制作一个纹理 - 然后再转向音频/MIDI 文件输出。该示例说明了获得音乐上有效的结果所需的代码简洁性。如果您不完全理解正在发生的事情,请不要担心,我将在稍后澄清。

首先,我将创建一个音高资源,athenaCL 称之为路径实例,即提示符中的 PI。我将从一些简单的东西开始

  [PI()TI()] :: pin
  name this PathInstance: p1
  enter a pitch set, sieve, spectrum, or set-class: c3,d3,e3,f3,g3,a3,b3,c4
    SC 7-35 as (C3,D3,E3,F3,G3,A3,B3,C4)? (y, n, or cancel): y
      add another set? (y, n, or cancel): n
      PI p1 added to PathInstances.

  [PI(p1)TI()] :: 

提示符下忽略大小写。大小写区分用于记录 athenaCL 命令并指示命令的简短形式。例如,随机均匀数生成器可以缩写为 ru,这是 athenaCL 中的众多 UI 便利之一。

提示符的变化表明 p1 是活动的路径实例。我们有一个音高集合,但现在我们需要乐器、速度控制、节奏生成器、声像和其他音乐因素。我们需要制作一个纹理实例,但首先我们应该设置默认事件模式 EMo 命令。我们可以使用 EMls 命令查看可用的事件模式

  [PI(p1)TI(t1)] :: emls
  EventMode modes available:
  {name}
    csoundExternal   
  + csoundNative     
    csoundSilence    
    midi             
    midiPercussion

我们想要创建一个 MIDI 文件,所以我们将更改模式

  [PI(p1)TI(t1)] :: emo m
  EventMode mode set to: midi.

检查一下

  [PI(p1)TI(t1)] :: emls
  EventMode modes available:
  {name}
    csoundExternal   
    csoundNative     
    csoundSilence    
  + midi             
    midiPercussion

现在我们可以制作新的纹理实例 (TIn)。正如我所说,如果现在还不能完全理解,请不要担心。我们从用户所需的最少输入开始 - 纹理的名称和通用 MIDI 乐器编号

  [PI(p1)TI()] :: tin
  name this texture: t1
  enter instrument number:
  (0 ... 127)
  or "?" for instrument help: 5
  TI t1 created.

  [PI(p1)TI(t1)] ::

提示符再次反映了变化。现在我们有了一个活动的纹理,但我们还没有完成定义它。我们将使用 TIv - 纹理实例查看命令 - 来查看我们还可以在 t1 中操作什么

  [PI(p1)TI(t1)] :: tiv
  TI: t1, TM: LineGroove, TC: 0, TT: TwelveEqual
  pitchMode: pitchSpace, polyMode: set, silenceMode: off, postMapMode: on
  midiProgram: ePiano
  status: +, duration: 000.0--20.09
  (i)nstrument        5 (generalMidi: ePiano)                        
  (t)ime range        00.0--20.0                                     
  (b)pm               constant, 120                                  
  (r)hythm            loop, ((4,1,+),(4,1,+),(4,5,+)), orderedCyclic 
  (p)ath              p1                                             
                      (C3,D3,E3,F3,G3,A3,B3,C4)                      
                      20.00(s)                                       
  local (f)ield       constant, 0                                    
  local (o)ctave      constant, 0                                    
  (a)mplitude         constant, 0.9                                  
  pan(n)ing           constant, 0.5                                  
  au(x)iliary         none                                           
  texture (s)tatic                                                   
     s0               parallelMotionList, (), 0.0                    
     s1               pitchSelectorControl, randomPermutate          
     s2               levelFieldMonophonic, event                    
     s3               levelOctaveMonophonic, event                   
  texture (d)ynamic   none 

事实上,我们可以通过接受纹理的其余默认值来继续文件实现,但这有什么乐趣呢?让我们编辑时间范围、速度 (bpm)、节奏结构、幅度值和声像。这次 TIe - 纹理实例编辑命令 - 是我们的朋友

  ; Set the output duration in seconds.
  [PI(p1)TI(t1)] :: tie t 0.0,60		

  ; Set the tempo to 200 bpm.
  [PI(p1)TI(t1)] :: tie b c,200		

  ; Define the rhythm structure.
  [PI(p1)TI(t1)] :: tie r l,((2,2,4),(4,2,4),(6,4,2,2)),rc

  ; Determine amplitude scaling from uniform random 
  ; distribution between .3 and .7.
  [PI(p1)TI(t1)] :: tie a ru,.3,.7

  ; Set pan position from linear random distribution
  ; between .1 and .9.
  [PI(p1)TI(t1)] :: tie n rl,.1,.9

现在让我们看看我们的纹理

  [PI(p1)TI(t1)] :: tiv
  TI: t1, TM: LineGroove, TC: 0, TT: TwelveEqual
  pitchMode: pitchSpace, polyMode: set, silenceMode: off, postMapMode: on
  midiProgram: ePiano
  status: +, duration: 000.0--60.14
  (i)nstrument        5 (generalMidi: ePiano)                         
  (t)ime range        00.0--60.0                                      
  (b)pm               constant, 200                                   
  (r)hythm            loop, ((2,2,+),(4,2,+),(6,4,+)), randomChoice   
  (p)ath              p1                                              
                      (C3,D3,E3,F3,G3,A3,B3,C4)                       
                      60.00(s)                                        
  local (f)ield       constant, 0                                     
  local (o)ctave      constant, 0                                     
  (a)mplitude         randomUniform, (constant, 0.3), (constant, 0.7) 
  pan(n)ing           randomLinear, (constant, 0.1), (constant, 0.9)  
  au(x)iliary         none                                            
  texture (s)tatic                                                    
    s0               parallelMotionList, (), 0.0                     
    s1               pitchSelectorControl, randomPermutate           
    s2               levelFieldMonophonic, event                     
    s3               levelOctaveMonophonic, event                    
  texture (d)ynamic   none 

TImap 命令将创建一个漂亮的纹理及其组件的图形显示。图 1 展示了 athenaCL 对 TkInter 的支持,TkInter 是 Python 到 Tk 图形小部件的接口。显示命令对于可视化随机分布和其他分布的效果特别有用。在图 1 中,您可以看到幅度曲线和声像曲线的映射,每个曲线都使用不同的随机分布创建。

图 1. athenaCL 纹理的 TkInter 图形显示

好的,我们已经定义了一个路径实例和一个纹理实例。剩下的就是输出阶段。我们将使用 ELn 和 ELh 命令来创建一个新的事件列表 (ELn),然后调用默认播放器来收听处理后的列表的结果 (ELh)。请注意分号分隔的多个命令

  [PI(p1)TI(t1)] :: eln ~/el-new.xml; elh
  EventList el-new complete:
  /home/dlphilp/el-new.mid
  /home/dlphilp/el-new.xml

  Playing /home/dlphilp/el-new.mid.
  MIDI file: /home/dlphilp/el-new.mid.
  Format: 1  Tracks: 1 Divisions: 960
  Sequence: el-new
  Text: created with athenaCL
  Track name: t1
  Playing time ~64 seconds
  Notes cut: 0
  Notes totally lost : 0
  EventList hear initiated: /home/dlphilp/el-new.mid

您可以在 el-new.mp3 听到结果

本教程说明了纹理实例的中心性质。纹理是系统的核心,用户将花费大部分时间开发用于自身目的的纹理。根据其文档,纹理的概念始于

... 对音乐形状的广泛结构原型的一种构想,在此上下文中用于指任何类型的音乐手势、乐句、形式或结构。

如示例中所示,纹理定义了各种音乐因素,其中一些因素可以将复杂的表达式作为参数,例如示例中节奏的表示法

  l,((2,2,4),(4,2,4),(6,4,2,2)),rc

l 标识一个循环结构。括号中的数字表示节奏值集。每次循环遍历这些集合时,它都会进行随机选择 - rc 表示法 - 以在每次传递时创建不同的节奏结构。顺便说一下,randomChoice 选择选项可以替换为 randomPermutation、randomWalk、orderedCyclic 或 orderedOscillate。仅仅更改选择机制就可以使输出产生巨大的差异。

此时,我可以复制我的纹理并在副本上执行其他操作。纹理确实是作曲家在使用 athenaCL 时关注的中心。唉,我只给出了使用纹理实例可以完成的事情的最简单的提示。幸运的是,该系统易于学习,并且鼓励广泛的实验。Python 解释器的命令 shell 包括命令完成和调用、多命令堆叠以及访问 athenaCL 的在线帮助。作者建议您将 athenaCL 视为一个生成系统,其输出旨在被带入其他程序以进行进一步处理和创作。您可以使用 athenaCL 创建完整的作品而无需使用外部软件,但其设计更倾向于分段方法。

关于路径实例的更多说明。您的路径为您的纹理提供音高/频率/噪声资源集合。路径可以通过多种方式构建 - 包括一个简洁的“从 Audacity 频谱分析文件导入”功能 - 并且单个实例可以包含多个资源集,即路径。每个路径都有自己的名称,并且可以对其进行操作,无论是否与其他路径一起操作。支持微音调,并且有各种预定义的律制可用于您的路径。还有更多,但您已经了解了大概。路径实例是一种强大而灵活的方法,用于在使用算法制作音乐时处理音高问题。


GUI 工具

与 Common Music 和 CsoundAC 一样,athenaCL 被设计为从命令行使用,更具体地说是从 Python 解释器的提示符使用。在 UNIX/Linux 上,这种设计运行良好,这要归功于用户友好的便利设施,例如命令完成和前面已经提到的其他功能。但是,该系统还支持用于 TImap 和其他 map 命令的图形。APgfx 命令允许用户选择文本、tk(取决于 TkInter)、eps (PostScript)、JPG 或 PNG 的默认图形格式。当命令调用 athenaCL 图形功能时,显示将以文本和用户选择的格式出现。图形无法编辑,但在设计纹理时非常有用。

图 2. envl.net 上的 Web 界面

搜索“athenaCL GUI”使我找到了 ComposGUI,这是一个基于浏览器的界面,依赖于 PHP 和 mod_python 模块。一个可用的示例页面可用,但不幸的是,该项目似乎已成为弃置软件。一个更发达的基于 Web 的 GUI 存在于 envl.net(图 2),这是一个由 Christopher Ariza 本人维护的交互式网站。虽然他没有称其为 athenaCL 的 GUI,但它是“由 athenaCL 提供支持”。该网站的主菜单提供以下交互式生成器

  • CloudBeta:Beta 分布事件密度生成器。
  • HarmonyHitch:算法和声生成器。
  • HarmonyQuake:算法和声重组。
  • PolyPulse:基于循环脉冲的复节奏生成器。
  • PolyPulsePlus:算法脉冲式复节奏生成器。
  • RhythmRemap:算法节奏生成器。
  • RhythmWeight:算法加权随机节奏生成器。
  • SieveSequence:筛法节奏生成器。
  • TuneTile:算法音高和节奏卡农生成器。
  • TuneTwine:算法音高和节奏生成器。
  • TuneWeight:算法加权随机旋律生成器。

用户输入所需的数据,网站处理它并返回一个 XML 文件,该文件格式化为与 athenaCL 一起使用或一个可在任何地方使用的 MIDI 文件。太棒了。

Ariza 先生还建立了一个 athenaCL netTools,这是他的系统的另一组基于 Web 的实用程序。当前可用的工具包括集合类和映射类分析器以及音高类转换器。MIDI 和 Csound 有不同的音高表示方法,当在单个会话期间在目标之间移动时,转换实用程序是一个方便的设备。

我理解为什么许多用户更喜欢基于 GUI 的工具。我的大部分 Linux 音频工作都是使用此类工具完成的,但在算法音乐作曲领域,我喜欢保持接近基于文本的界面。AthenaCL 利用 Python 环境来促进非常快速和高效的工作流程。但是,如果您想在几乎不打字的情况下测试 athenaCL,请查看 envl.net 上的菜单。


文档

athenaCL 的文档内容广泛而详尽。它包括作者的书籍长度的论文 计算机辅助算法音乐作曲的开放设计:athenaCL、教程手册、使用 athenaCL 辅助生成的各种研究和作品,以及一些配乐由 athenaCL 制作的 实验视频

系统帮助可通过 help 命令获得,或者您可以添加一个特定命令以获得特定帮助,例如 help TIv。为了更悠闲的演示,AUdoc 命令会在您的默认浏览器中打开 athenaCL 文档。无论您如何找到它,帮助都提供了有关命令及其用法的广泛信息。我建议新用户浏览各种命令的帮助文件,我保证您会对可能性的广度印象深刻。


评估

在许多方面,athenaCL 是我使用过的最全面的算法作曲系统。它的功能集包含丰富且不寻常的资源,并且它对 Python 的依赖通过强大的通用编程语言简化了进入系统的方式。与 Grace 和 CsoundAC 一样,athenaCL 不需要精通其核心语言 - 当您完成教程示例时,您将学到很多关于 Python 的知识 - 但当然,如果您已经使用过 Python 或类似的脚本语言,您的体验将会得到增强。

我想强调 Python 解释器命令行界面的用户友好性。它的灵活性极大地促进了非常快速的工作周期,并帮助使像 athenaCL 这样复杂的系统成为学习和使用的一种乐趣。

Christopher Ariza 深入参与算法音乐作曲的研究。感谢他的努力,我们有了 athenaCL 系统本身、其出色的文档以及许多代表性作品。令人高兴的是,这些作品包括用于生成它们的 athenaCL 脚本,为学生提供了更多材料来指导他们对系统的探索。


结尾

本文结束了我们 Linux 算法作曲环境的迷你之旅。我希望您一路上享受了风景和声音,并且我敦促读者和作曲家同行检查这些系统,以了解与其自身工作相关的可能性。惊喜元素是音乐不可或缺的组成部分,本系列中评测的程序能够产生一些非常令人惊讶的结果。

我正在撰写各种文章,包括对 PulseAudio 的研究、对 AVLinux 发行版的赞赏以及关于运行旧版 DOS 和 Atari MIDI 软件的报告。我并不缺乏事情可做,但欢迎随时提出您希望在此处看到的任何与 Linux 声音相关的主题。

加载 Disqus 评论