声音
R.卢克杜布瓦和威尔姆 · 托宾
音乐的历史在许多方面都是技术的历史。从音乐 (符号) 的写作和转录的发展到音乐表演空间的设计 (声学) 到乐器的创作,作曲家和音乐家利用人类理解的进步来完善和推进他们的职业。因此,不足为奇的是,我们发现在机器时代,这些相同的人发现自己首先利用电力、电信和,在上个世纪,数字计算机利用所有这些系统来创造新的、富有表现力的声波艺术形式。事实上,语音技术的发展 (机械地再现声音的能力) 本身已经,对听觉文化产生了如此大的变革影响,以至于现在回到一个声音只能从其原始来源发出的时代似乎是不可思议的。1 创造、操纵、在撰写本文时,通过数字方式再现无损声音对我们的倾听方式产生了同样革命性的影响。因此,今天从事声音工作的艺术家不仅有大量的工具可供使用,而且还有一种非常适合技术实验的媒介。
艺术中的音乐和声音编程
托马斯斯·爱迪生的 1857 留声机发明和尼古拉 · 特斯拉的无线无线电演示 1893年为在机电传输和声音再现方面进行的一个世纪的创新铺平了道路。Emile Berliner 的留声机唱片 (1887) 和 AM 无线电广播在古列尔莫·马可尼下的出现 (1922) 使音乐消费民主化和普及,启动一个过程,通过这个过程,流行音乐迅速从一种明斯特雷西的艺术转变为一个价值数百亿美元的全球商品化产业。2 新的电子乐器,从庞大而不切实际的远程和声到简单而优雅的 theremin 与录音和广播技术一起倍增,并预装了今天的合成器、音序器和采样器。当时的许多作曲家都被这些新的转录、传输和表演媒介的潜力所吸引,这并不是不合理的。未来主义作曲家路易吉·鲁索洛在他的 1913 宣言中写下了未来主义管弦乐队利用机械噪音制造 (和录音复制) 的力量的噪音艺术从纯粹的音乐剧的暴政中 “解放” 声音。约翰·凯奇在他的 1937 专著《信条: 音乐的未来》中写下了这个椭圆主义:
使用噪音来制作音乐将继续并增加,直到我们获得通过电子仪器产生的音乐,该仪器将为音乐目的提供任何和所有可以听到的声音。将探索用于合成音乐制作的光电、电影和机械介质。然而,在过去,分歧的焦点一直是不和谐和和谐之间,在不久的将来,它将是噪音和所谓的音乐声音之间
磁带作为记录音频信号的媒介的发明和广泛采用为等待纯粹用声音作曲的作曲家提供了突破。在战后早期,第一个电子音乐工作室在巴黎 (ORTF) 和科隆 (WDR) 的广播电台蓬勃发展。巴黎工作室的作曲家,最著名的是皮耶·亨利和皮耶·薛菲,开发了 musique concrte 的早期作曲技巧,直接使用留声机和磁带上的录音,通过类似于我们现在认为的采样的过程来构建构图。谢弗的《精妙的化学》 (1948) 和亨利和谢弗的交响曲《与世隔绝》是这一流派的经典。与此同时,在科隆,像赫伯特 · 艾玛特和卡尔海因茨·施托克豪森这样的作曲家正在研究使用机电振荡器来产生可以高度精确地混合和测序的纯声波。这种经典的 elektronische 音乐与当代现代主义前卫的系列技术密切相关,他们在美学上特别适合成为电子和,后来,计算机音乐。4 哥伦比亚-普林斯顿电子音乐中心,由弗拉迪默·尤薩切夫斯基奧圖·盧寧米尔顿·巴比特,1957年在纽约罗杰·塞欣斯,将其声誉押在了大规模的 RCA Mark II 声音合成器上,一种房间大小的机器,能够以前所未有的精度和控制生产和排序电子产生的音调。在流行音乐领域,录音工程领域迈出了开创性的一步,例如吉他手于 1954年发明萊斯·保羅多轨磁带录音。这项技术使单个表演者能够将自己 “过度” 到多个单独的 “轨道” 上,这些 “轨道” 以后可以混合到一个复合材料中,填补了录音技术的一个关键空白,并将赋予录音室实验令人难以置信的繁荣,这将永久巩固录音室录音在流行音乐中的商业可行性。
作曲家慢慢采用数字计算机作为一种创造性的工具,因为他们最初缺乏实时响应能力和直观的界面。尽管第一个记录在案的使用计算机来制作音乐发生在 1951年在 CSIRAC 机器在悉尼,澳大利亚,最基本的技术在计算机音乐的起源,正如我们今天所知道的,当麦克斯·马修斯,美国贝尔实验室的研究员,为 IBM 704 大型机开发了一款名为 MUSIC 的软件。1957 年,音乐节目呈现了纽曼 · 古特曼的 17 秒作品,名为 “银色音阶”。最初的任务是开发可理解的合成语音,Mathews 开发了一个用于数字编码和解码声波的系统,以及一个用于设计和计算实现数字音频处理的系统。他对这些代表性方案的假设仍在使用中,将在本文的后面进行描述。更快的机器、计算机音乐编程语言和能够实时交互的数字系统的出现带来了从模拟到计算机技术的快速过渡,用于声音的产生和操作,到 20世纪90年代中期,这一过程基本上是全面的
声音程序员 (作曲家、声音艺术家等) 在创作过程中使用计算机完成各种任务。许多艺术家使用计算机作为音乐的算法和计算机辅助创作的工具,然后离线实现。对于莱扬 · 希勒的《弦乐四重奏》 (1957) 的 Illiac 套件,作曲家在计算机上运行了一个算法,为现场音乐家阅读和表演生成已标注的指令,就像任何其他的记名音乐一样。这种作曲的计算方法与二十世纪音乐现代主义的美学趋势很好地吻合,包括作曲家作为 “研究者” 的有争议的概念,这些概念最好由米尔顿·巴比特和皮埃尔·布列兹等系列作家阐述,IRCAM 的创始人。事实证明,使用计算机来操纵音乐的符号语言对许多艺术家来说是不可或缺的,其中一些人已经成功地采用了人工智能计算研究中的技术,尝试对先前存在的音乐风格和形式进行建模; 例如大卫 Cope 的 5000 作品.布拉德 · 加顿 (Brad Garton) 的《粗糙的 Raga 即兴演奏》使用了来自信息论的随机技术,如马尔可夫链来模拟 J 的音乐。S.巴赫和印度卡纳蒂西塔尔音乐的风格分别。
如果音乐可以被认为是描述声音组织的一套信息学,那么声音本身的合成和操作是艺术家可以利用计算系统力量的第二类。使用计算机作为合成声音的制作人将艺术家从先入为主的乐器能力概念中解放出来,并允许她/他直接专注于声波制品的音色,导致电脑允许我们发出任何我们能想象的声音。作曲家,如让-克劳德 · 里塞特 (贝尔实验室目录) 、伊阿尼斯·泽纳基斯 (GENDYN3) 和巴里 · 特鲁克斯 (里弗朗),我认为计算机是研究声音本身成分可能性的重要工具,无论是模仿真实仪器 (Risset),还是对合成声音质量随机排列的正式研究(Xenakis) 使用颗粒合成原理 (Truax) 的技术。计算机还为沿着 musique concr è te 模型装配和操作先前存在的声音提供了广泛的可能性,尽管数字计算机可以提供所有替代方案。数字采样的组成过程,是否用于流行唱片 (布莱恩·伊诺和大卫 · 伯恩的《我在幽灵的灌木丛中的生活》,公敌对黑色星球的恐惧) 或者概念构图 (约翰 · 奥斯瓦尔德的《 Plunderphonics 》,克里斯 · 贝利的《 Ow 》,《我的头》),现在可以通过数字形式声音获得极大的帮助。计算机还能够将音频信号转码为允许彻底重新调查的表示,如 Leif Inge (9 甜菜拉伸,贝多芬第九交响曲的 24 小时 “延伸”) 和这篇文章作者的延时录音 (弥赛亚,亨德尔弥赛亚的 5 分钟 “压缩”)。
从事声音工作的艺术家通常会将这两种方法结合起来,允许创造声音艺术的生成作品,其中底层的结构系统以及声音的产生和传递是由计算决定的。迈克尔·舒马赫、史蒂文 · 维蒂洛、卡尔 · 斯通和理查德詹姆士 (艾費克斯雙胞胎) 等艺术家都使用这种方法。最令人兴奋的是,计算机提供了巨大的可能性,作为声音表演的演员和互动代理,允许表演者整合算法伴奏 (乔治 · 刘易斯),超乐器设计 (Laetitia Sonami,界面),和数字效果处理 (寶琳·奧利維洛,Mari Kimura) 进入他们的曲目。
既然我们已经谈了一点计算机上声音艺术的潜力,我们将研究一些特定的底层技术,这些技术使我们能够在数字领域使用声音。
声音和音乐信息学
简而言之,我们将声音定义为通过介质 (通常是空气) 传播的振动,我们可以通过听觉感知。声音以纵波的形式传播,它交替地压缩和压缩物质 (如空气) 中的分子。因此,我们通常将声音表示为随时间变化的压力图:
这种声音的时域表示提供了声音在现实世界中如何工作的准确描述,并且,正如我们将很快看到的,它是数字化音频工作中使用的最常见的声音表示。当我们尝试对声波进行技术描述时,我们可以很容易地得出一些指标来帮助我们更好地理解正在发生的事情。首先,通过观察声压波引起的位移量,我们可以测量声音的振幅。这可以在科学的压力尺度上进行测量,但更典型的是沿着分贝的对数尺度进行量化。如果声压波以规则或周期模式重复,我们可以查看该模式的单次迭代的波长,并从那里导出该波的频率。例如,如果声音以每秒 343米的速度在介质中传播 (室温下空气中的声速),包含每半米重复一次的波,那个声音的频率为 686 赫兹,或每秒循环。下图显示了一个 440 赫兹的大提琴音符; 因此,波形的周期模式 (用垂直线划分) 每 2.27 毫秒重复一次:
通常,自然世界中发生的声音包含许多离散的频率成分。在嘈杂的声音中,这些频率可能彼此完全无关,或者按边界类型分组 (e.g.,小鼓可以产生随机分布在 200 和 800 赫兹之间的频率)。然而,在谐波声音中,这些频率通常以整数比率为间隔,因此大提琴在 200 赫兹下演奏音符不仅会产生 200 的基本频率,但是在谐波级数上升 200 的倍数下,即在 400,800,1200,1600,2000,等等。制作相同音符的男歌手的声音中会有相同的频率成分,尽管与大提琴的比例不同。这些谐波的存在、缺失和相对强度 (也称为部分或泛音) 提供了我们认为的声音的音色。
当声音到达我们的耳朵时,会发生一个重要的感官转换,这在处理音频时对理解很重要。正如不同波长和亮度的光激发你眼睛中的不同视网膜受体产生彩色图像一样,你内耳的耳蜗包含在基底膜上的一系列毛细胞,这些毛细胞被调谐以响应不同的声音频率。内耳含有对频率大约在 20 到 20,000 赫兹之间产生反应的毛细胞,尽管随着年龄的增长或暴露在嘈杂的噪音中,这些毛细胞中的许多会逐渐变得不敏感。这些细胞反过来通过你的听觉神经将电信号发送到你大脑的听觉皮层,在那里它们被解析以创建到达你耳朵的声音的频域图像:
这种声音的表示,作为频率和振幅的独立 “框架”,与时间无关,更类似于我们感知声音环境的方式,而不是时间域的原始压力波。19 世纪的法国数学家 Jean-Baptiste-约瑟夫·傅里叶开发了方程,使我们能够将声压力波 (无论多么复杂) 转化为其组成频率和振幅。这种傅里叶变换是在计算机中处理声音的重要工具。
我们的听觉系统从我们的两只耳朵中获取这些频率和振幅信息,并使用它们来构建听觉 “场景”,类似于从到达我们视网膜的光线中得出的视觉场景。6 我们的大脑基于许多参数分析声学信息,如开始时间、立体相关、谐波比,以及解析大量声源的复杂性,然后将这些声源放置在代表我们所听到的三维图像中。心理声学专家认为我们用来理解我们的声音环境的许多参数与格式塔心理学中定义的分组原则相似。
【processing官方教程|【18】processing-声音(中文)】
如果我们松散地将音乐定义为声音的组织和表现,一套新的指标就会暴露出来。虽然对音乐理论的全面概述,无论是西方的还是其他的,都远远超出了本文的范围,但值得注意的是,对音乐的描述有一个词汇,类似于我们描述声音的方式。我们的感知响度和音调的系统 (有用的 “音乐” 等同于振幅和频率) 沿着对数刻度工作,因此,100 赫兹的音调和 200 赫兹的音调在音调方面被认为与 2000 和 4000 赫兹的音调距离相同。两种频率加倍的声音之间的距离被称为八度,是大多数文化进化的音乐理论所依赖的基本原则。然后,大多数音乐文化将八度音阶细分为一系列音高 (e.g., 12 在西方色阶中,7 在印度尼西亚佩罗格音阶中),然后用于各种收藏 (模式或键)。这些音高通常反映一些气质或调音系统,以便多个音乐家可以一起演奏; 例如,音符 A4 (中间 C 上方的 A) 在西方音阶上,在当代音乐中通常校准为 440 赫兹的声音。
声音和音乐的数字表示
根据前面解释的时域表示,声音通常从外部世界进入计算机 (反之亦然)。在数字化之前,声音的声波压力波首先被转换成声波的电磁波,它是声波的直接模拟物。然后,该电信号被送入一个称为模数转换器 (ADC 或 a/D) 的计算机硬件,然后,通过对压力波的振幅进行定期采样,并对压力读数进行数字量化,将它们以小包或矢量形式上游传递给主处理器,在那里可以存储或处理它们。同样,数字样本的矢量可以从计算机发送到称为数模转换器 (DAC 或 D/a) 的硬件设备,它采用数值并使用它们来构造平滑的电磁压力波,然后将其送入扬声器或其他设备进行回放:
大多数当代数字音频系统 (声卡等) 都包含 A/D 和 D/A 转换器 (通常每个转换器不止一个,用于立体声或多通道录音和回放) 并且可以同时使用两者 (所谓的全双工音频)。使用这种方法编码和解码音频的特定系统被称为 PCM (或脉冲编码调制); 由亚历克 · 里维斯于 1937年开发,是目前使用中最普遍的方案。
音频信号数字化的速度被称为采样率; 它是决定可以测量的最高声音频率的分辨率 (等于采样率的一半,根据奈奎斯特定理)。根据计算机存储空间,每个样本的数字分辨率称为位深度; 该值决定了数字化信号可以描述多少离散幅度。例如,光盘上的数字音频以 44,100 赫兹的 16 位分辨率进行数字化,允许高达 22,050 赫兹的频率 (i e.,略高于人类听力范围),每个样本可能有 65,536 (216) 不同水平的振幅。专业音频系统将会更高 (在 24 位或 32 位分辨率下为 96 或 192 千赫),而工业电话系统将会更低 (例如 g., 8 位时 8,192 赫兹)。代表多个声源 (如乐器) 或目的地 (如扬声器) 的数字化声音被称为多通道音频。单声道声音自然只由一个流组成; 立体声 (双流) 音频是所有当代计算机音频硬件的标准,各种类型的环绕声 (五七种音频流,有一个或两个低频特殊通道) 越来越普遍。
一旦进入计算机,声音就会使用各种格式存储,既可以作为 PCM 样本的序列,也可以以其他表示形式存储。两种最常见的 PCM 声音文件格式是由苹果电脑和电子艺术开发的音频交换文件格式 (AIFF) 和由微软和 IBM 开发的 WAV 文件格式。这两种格式在质量和互操作性方面实际上是等效的,并且两者本质上都是无损格式,包含来自数字化源的未压缩 PCM 数据。近年来,压缩音频文件格式受到了极大的关注,最著名的是 MP3 (MPEG-1 音频层 3) 、 Vorbis 编解码器和高级音频编码 (AAC) 编解码器。许多这些 “有损” 音频格式将声音转换到频域 (使用傅立叶变换或称为线性预测编码的相关技术) 通过丢弃声音中感知到的不相关频率,以一种允许基于人类听觉模型做出压缩选择的方式包装声音。与上面概述的 PCM 格式不同,MP3 文件很难实时编码、操作和处理,由于解压缩和压缩音频进出时域所需的额外步骤。
合成
数字音频系统通常通过在信号处理网络中运行进程来执行各种任务。网络中的每个节点通常执行一个简单的任务,即生成或处理音频信号。大多数在计算机上生成和操纵声音的软件都遵循这种模式,最初由麦克斯·马修斯概述为计算机音乐的单元生成器模型,其中,对通过系统的每个样本 (或样本向量) 执行信号处理链的映射或函数图。一个简单的用计算机合成声音的算法可以用这个只有三个单元发生器的范例来实现,描述如下。
首先,假设我们有一个单元发生器,它产生一个重复的声音波形,并且有一个重复频率的可控参数。我们将这段代码称为振荡器。大多数典型的数字振荡器的工作原理是通过回放显示特定波形的 PCM 音频数据的小表或阵列。这些波形可以包含难以置信的简单模式 (e.g.,正弦波或方波) 或来自外部世界的复杂图案 (例如 g.,钢琴的专业录制片段,演奏一个音符)。
如果我们直接播放振荡器 (i。e.,将其频率设置为可听值,并将其直接路由到 D/A) 我们将听到恒定的音调,因为波形可重复一遍又一遍。为了获得更细致和清晰的声音,我们可能希望随着时间的推移改变振荡器的音量,以便它保持沉默,直到我们希望声音出现。然后振荡器的音量会增加,这样我们就能听到它。当我们希望声音再次静音时,我们将振荡器淡出。我们可以设计一个第二单元发生器,它可以获取时间和振幅指令的列表,并使用这些指令来生成所谓的包络,而不是重写振荡器本身以适应音量控制的指令,或者随着时间的推移而变化的斜坡。我们的包络发生器生成 0 到 1 范围内的音频信号,尽管它的声音从未直接经历过。我们的第三单元发生器简单地乘以,每个样本的样本,振荡器的输出和包络发生器的输出。这个扩音器代码允许我们使用我们的包络斜坡来动态改变振荡器的音量,允许声音随心所欲地淡入淡出。
在商业合成器中,进一步的算法可以插入到信号网络中 -- 例如,滤波器可以在振荡器到达放大器之前塑造振荡器的频率内容。许多综合算法依赖于多个振荡器,或者并行 (e.g.,加法合成,通过添加许多简单的波形或调制 (e.g.,频率调制,其中一个振荡器调制另一个振荡器的音调)。
采样
我们可以使用存储在计算机硬盘上的 AIFF 或 WAV 文件中的更长的录制音频,而不是使用计算机内存中的小波形作为振荡器。然后,该样本可以以不同的速率回放,从而影响其音高。例如,以两倍于录制速度的速度回放声音将导致音高上升一个八度。同样,以半速播放声音会导致音高下降八度。
大多数采样器 ,基于将录音作为声源播放的乐器) 的工作原理是假设录音有一个基本频率,尽管这个频率通常与录音中乐器的真实音调有关,最终是任意的,简单地表示采样器以正常速度回放录音的频率。例如,如果我们录制一个大提琴演奏 220 赫兹的声音 (西部音阶中 C 以下的音符 a),当我们要求采样器以 220 赫兹的频率给我们播放声音时,我们希望录音能正常播放。如果我们向采样器询问不同频率的声音,我们的采样器会将请求的频率除以基频,并使用该比率来确定采样器的播放速度。例如,如果我们想从大提琴样本中听到 440 赫兹的声音,我们会以双倍速度回放。如果我们想听到中间 C (261.62558 赫兹) 的声音,我们以原始速度的 1.189207136 倍回放我们的样本。
许多采样器使用具有与其相关的元数据的录音来帮助采样器算法提供正确回放声音所需的信息。基频通常是这些信息之一,就像录音中的循环点一样,采样器可以安全地使用这些循环点来使声音重复超过原始录音的长度。例如,加载到商业采样器中的管弦乐字符串样本可能只持续几秒钟,但是唱片制作人或键盘播放器可能需要声音持续更长时间; 在这种情况下,录音的设计是为了在录音的中间有一个可以安全重复的区域,如果需要的话可以无限重复,以创造一种更长的录音感。
效果处理
除了作为声音的发生器,计算机被越来越多地用作处理音频的机器。数字音频处理 (DAP) 领域是学术计算机音乐社区和商业音乐产业中最广泛的研究领域之一。更快的计算速度和数字音频处理系统的日益标准化使得大多数声音处理技术能够实时发生,使用软件算法或音频 DSP 协处理器,如数字设计 TDM 和 T | C 电子 Powercore 卡。
正如我们在音频表示中看到的,音频效果处理通常使用处理音频矢量流的时域或频域算法来完成。例如,通过创建一个样本内存缓冲区来延迟声音并在以后回放,并将其与原始声音混合,可以轻松实现回声效果。极短的延迟 (一个或两个样本) 可用于实现数字滤波器,从而衰减或提升声音的不同频率范围。稍长的延迟会产生称为梳状滤波器的共振点,这些共振点在模拟室内混响中的短回声时形成重要的构建模块。可变延迟梳状滤波器产生了称为翻边的共振涌动效应。较长的延迟用于创建各种回声、混响和循环系统,也可用于创建音调转换器 (通过改变稍微延迟的声音的播放速度)。
音频分析
最后一个重要的研究领域,尤其是在交互式声音环境中,是从音频分析中获取信息。语音识别也许是这方面最明显的应用,今天存在着各种识别语音的范例,主要分为 “训练有素的” 系统 (接受来自单个用户的广泛词汇) 和 “未经训练” 的系统 (试图理解任何人所说的一小部分单词)。语音识别系统中实现的许多工具都可以抽象出来,从几乎任何声源中获取大量信息。
“听” 音频输入的交互式系统通常使用一些简单的技术将复杂的声源抽象成可以作为交互设计参数映射的控制源。例如,音频信号随时间变化的平均振幅图可用于通过称为包络跟踪的技术连续调制变量。同样,可以设置一个振幅阈值,当声音达到一定程度时触发事件; 这种攻击检测技术 (“攻击” 是声音发作的常见术语) 可以使用,例如,创建与进入计算机的撞击声同步的视觉动作。
基音跟踪技术,它使用各种分析技术来尝试识别输入声音的基频,通常用于交互式计算机音乐中实时跟踪音乐家,将她/他的音符与计算机内存中的 “乐谱” 进行比较。这种记谱跟踪技术可以用来在计算机程序中对交互式事件进行排序,而不必依赖绝对的时间信息,允许音乐家偏离严格的节奏,即兴发挥,或者在表演中注入更流畅的音乐天赋。
也存在各种各样的音色分析工具,将音频信号转换为可以映射到计算机介导的交互式事件的数据。简单的算法,如过零计数器,它将时域音频信号从正负极性交叉的次数制成表格,可用于推导音频信号中的噪声量。例如,傅立叶分析也可以用来发现声音中最响亮的五个频率分量,从而检查声音的谐度或音色亮度。滤波器组和包络跟随器可以组合在一起,将声音分成重叠的频率范围,然后可以用来驱动另一个过程。这种技术用于称为声码器的常见效果硬件,其中谐波信号 (如合成器) 有不同的频率范围被噪声信号 (通常是语音) 放大或衰减。效果是一种声音通过另一种声音 “说话”; 它是一系列被称为交叉合成的技术之一。
音乐作为信息
与声音不同,音乐的数字表示在范围和特征上差异很大。到目前为止,表示实时音乐表演数据的最常见系统是乐器数字接口 (MIDI) 规范,合成器制造商联盟于 1983年发布,旨在鼓励不同品牌数字音乐设备之间的互操作性。基于单向、低速串行规范,MIDI 将不同类别的音乐事件 (音符、连续变化、节奏和同步信息) 表示为抽象数值,几乎总是具有 7 位 (0-127) 的数字分辨率。
多年来,合成器和计算机音乐系统的日益复杂开始引起人们对简单 MIDI 规范的缺点的注意。特别是,缺乏对数字音频快速传输的支持以及沿同一电缆的高精度语法合成器控制规范导致了许多替代系统。由加州大学伯克利分校的一个研究小组开发的开放式声音控制,提出了一个有趣的假设,即录音室 (或计算机音乐工作室) 未来将使用标准网络接口 (以太网或无线 tcp/ip 通信) 作为通信媒介。OSC 允许控制器 (键盘、触摸屏) 和数字音频设备 (合成器、效果处理器或通用计算机) 之间的客户端-服务器通信模型,所有通过 UDP 数据包在网络上传输。
声音编程工具
数字艺术家可以使用各种各样的工具来处理声音。录音、编辑、混音和回放通常通过数字声音编辑器和所谓的数字音频工作站 (DAW) 环境来完成。声音编辑器从开源和自由软件 (Ardour,Audacity) 到专业级工作室或现场节目 (Ableton live,Logic Pro,数字表演者,Nuendo,Pro Tools)。这些程序通常允许您导入和录制声音,使用剪贴板功能 (复制,粘贴等) 编辑它们,并执行各种简单的数字声音处理 (DSP) 对声音文件本身进行非破坏性的任务,例如信号规范化、衰落编辑和采样率转换。通常,这些程序将充当最初为 DAW 软件内部工作而设计的软件插件的主机。
数字音频工作站套件提供全方位的多轨录音、回放、处理和混合工具,允许生产大规模、高度分层的项目。DAW 软件现在被认为是音乐录制和制作行业的标准。Avid/数字化设计专业工具软件,被认为是行业标准,允许沿着大致类似于视频 NLE (非线性编辑) 环境中的时间线实时录制和混合许多音频轨道。可以绘制自动化曲线来指定这些曲目的不同参数 (音量、平移),这些曲目包含可以无损地组装和编辑的音频片段 (“区域” 或 “声音片段”)。市场上的其他 DAW 软件应用是苹果的逻辑音频,独角兽的数字表演者或斯坦伯格的标志。所有这些平台还支持以各种格式编写的第三方音频插件,例如苹果的 AudioUnits (AU) 、斯坦伯格的虚拟工作室技术 (VST),或微软的 DirectX 格式。大多数 DAW 程序还包括对 MIDI 的广泛支持,允许包控制和排列外部合成器、采样器和鼓机; 以及作为声音发生器在 DAW 内部运行的软件插件 “乐器”。2001 年,Ableton 推出了一款名为 LIVE 的革命性 DAW 软件。该软件不仅用于录音室工作,还用于录音机的隐喻,还用于现场表演和重振提示列表习语。用户可以切换到实时视图,这是一个非线性的、基于模块化的音乐材料视图,以列表的形式组织。
经典的电脑音乐 “语言”,其中大部分来源于马克斯 · 马修斯的音乐程序,今天仍在广泛使用。其中一些,如 CSound (由麻省理工学院的貝瑞·佛柯开发) 有广泛的追随者,并在计算机音乐工作室作为电声合成的标准工具教授。大多数这些 MUSIC-N 程序使用文本文件进行输入,尽管它们越来越多地可用于许多任务的图形编辑器。通常,使用两个文本文件; 第一个包含使用规范语言生成的声音的描述,该规范语言定义了一个或多个通过组合简单单元生成器生成的 “乐器”。第二个文件包含 “分数”,这是一个指令列表,指定第一个文件中的哪个乐器播放什么事件、何时、持续多长时间以及使用什么变量参数。这些程序中的大多数都超越了简单的基于任务的合成和音频处理,以促进算法的合成,通常是在标准编程语言的基础上构建的; 例如,Bill Schottstaedt 的 CLM 包,是建立在普通 LISP 之上的。近年来,这些语言中的一些已经被改造为实时工作 (而不是将声音文件渲染到磁盘); 例如,实时 Cmix,包含一个 C 风格的解析器,以及支持通过网络套接字和 MIDI 从客户端连接。
许多计算机音乐环境都是在实时交互作为系统基本原则的前提下开始的。的马克斯开发环境实时媒体,首次开发 IRCAM 在 20世纪80年代开发 Cycling' 74,是一个基于 “对象” 控制图的可视化编程系统,实时执行并相互传递消息。MSP 扩展马克斯允许设计可定制的合成和信号处理系统,所有这些系统都实时运行。开源姐姐转马克斯称为纯数据由原作者马克斯,米勒·普凱特。詹姆士 McCartney 的 SuperCollider 程序是开源的,戈王和 Perry Cook 的 ChucK 软件都是旨在执行实时交互式声音算法的文本语言。
最后,在使用声音时,标准计算机语言有多种 api 可供选择。Phil Burke 的 JSyn (Java 合成) 提供了一个基于单元生成器的 API,用于在 Java 中进行实时声音合成和处理。CCRMA 合成工具包 (STK) 是一个针对低级合成器设计的 C + + 例程库,以物理建模合成技术为中心。
Sound 是一个用于处理的库,与上述语言有许多共同的功能,在本文的示例中使用。
示例 1,2: 合成器
这些例子展示了合成声音的两种基本方法。首先,通过将五个正弦波相加产生一簇声音。为了计算每个正弦波的正确振幅,填充一个带有与每个振荡器振幅相对应的浮点数的数组。首先,1.0 的最大振幅除以振荡器的数量,以避免超过整体最大振幅。然后振幅降低因子 1 / (i + 1),这导致更高的频率比更低的频率更安静。每个振荡器的频率在 draw() 函数中计算。基于 150 和 1150 赫兹之间的可变基频,通过将频率与 1-5 之间的一系列整数相乘来计算下一个谐波泛音。然后应用范围为-0.5 到 0.5 的失谐因子将纯谐波频谱偏离为非谐波簇。
在第二个示例中,信封函数用于创建基于事件的声音,如乐器上的音符。声音提供 ASR (攻击/维持/释放) 信封。信封描述了振幅随时间变化的过程。使用 ASR 信封,可以在几秒钟内定义攻击阶段、维持阶段和释放阶段。创建信封后,振荡器可以直接传递给函数。在这种情况下,由 midiToFreq() 函数将 midi 音符数组转换为频率。为了对音符的顺序进行排序,我们用当前时间和音符之间的持续时间创建了一个触发器。
/* *
* 处理声音库,示例 1
*
* 五个正弦波被分层以构造一组频率。
* 这种方法称为添加剂合成。使用鼠标位置
* 在显示窗口内取消集群。
*/import processing.sound.*;
SinOsc[] sineWaves;
// 无人机阵列
float[] sineFreq;
// 频率阵列
int numSines = 5;
// 要使用的振荡器数量void setup() {
size(640, 360);
background(255);
sineWaves = new SinOsc[numSines];
// 初始化振荡器
sineFreq = new float[numSines];
// 初始化频率数组
for (int i = 0;
i < numSines;
i++) {
// 计算每个振荡器的振幅
float sineVolume = (1.0 / numSines) / (i + 1);
// 创建振荡器
sineWaves[i] = new SinOsc(this);
// 启动振荡器
sineWaves[i].play();
// 设置所有振荡器的振幅
sineWaves[i].amp(sineVolume);
}
}
void draw() {
//将鼠标从0映射到1
float yoffset = map(mouseY, 0, height, 0, 1);
//将mouseY对数映射到150-1150以创建基频范围
float frequency = pow(1000, yoffset) + 150;
//使用从-0.5映射到0.5的mouseX作为失谐参数
float detune = map(mouseX, 0, width, -0.5, 0.5);
for (int i = 0;
i < numSines;
i++) {
sineFreq[i] = frequency * (i + 1 * detune);
// 设置所有振荡器的频率
sineWaves[i].freq(sineFreq[i]);
}
}
/**
* 处理声音库,示例 2
*
* 此草图显示了如何使用信封和振荡器。
* 信封描述了随着时间的推移的振幅过程。
* 声音库提供了一个 ASR 信封,代表
* 攻击,维持,释放。
*
*.________
*.---
*.---
*.---
*ASR
*/
import processing.sound.*;
//振荡器和包络
TriOsc triOsc;
Env env;
// ASR 信封的时间和级别
float attackTime = 0.001;
float sustainTime = 0.004;
float sustainLevel = 0.2;
float releaseTime = 0.2;
// 这是 MIDI 音符的八度音阶。
int[] midiSequence = {
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72
};
// 设置笔记之间的持续时间
int duration = 200;
// 设置音符触发器
int trigger = 0;
// 统计笔记的索引
int note = 0;
void setup() {
size(640, 360);
background(255);
// 创建三角波和包络
triOsc = new TriOsc(this);
env= new Env(this);
}
void draw() {
//如果触发器的值等于计算机时钟,如果不是全部
//音符已经播放,下一个音符被触发。
if ((millis() > trigger) && (note
示例 3,4: 示例播放
使用声音库播放声音文件相当简单。Soundfile 类只需要使用文件的路径进行实例化。示例三使用一组声音文件作为采样器的基础。文件由整数命名,这使得用循环将文件读入数组变得容易。Soundfile 类有一个叫做 rate() 的方法,它允许我们改变播放的采样率,简而言之: 速度和音高。默认值等于 1。如果我们分配 0.5,播放速度将是原来的一半,音高将比原来的低一个八度。对于 2.0,音高将高于八度,速度增加一倍。这是移动样本的最简单方法,我们可以用它来生成一个简单的算法组合。在本例中,创建了一个触发器,该触发器表示当前时间 (以毫秒为单位) 加上 200 到 1000 毫秒之间的随机整数。如果那个时刻已经过了 5 个矩形,每个矩形都被随机颜色填充。由于此语句处于循环中,因此只需一行代码即可播放多达 5 个声音。在此之前,为每个声音分配一个随机八度。我们播放的矩形和声音的数量由数组播放声音决定。这个数组在音序器的每次迭代中被重新分配,当索引等于 1 时,将播放声音文件数组中的相应文件,并绘制一个矩形。
/* *
* 处理声音库,示例 3
*
* 此示例说明如何制作简单的采样器和序列器
* 带有声音库。在这个草图中,五个不同的样本是
* 在不同的音高上加载和回放,在这种情况下是五个
* 不同的八度音阶。序列发生器每 200-1000 触发一次事件
* 毫秒随机。每次播放声音时,都会有彩色的
* 显示随机颜色的矩形。
*/
import processing.sound.*;
SoundFile[] files;
//创建一个表示八度的值数组。
// 1.0 以正常速度播放,0.5 是一半,因此
//一个八度下降。2.0 是双倍,所以一个八度上升。
float[] octave = {
0.25, 0.5, 1.0, 2.0, 4.0
};
//PlaySound 数组正在定义将有多少个样本
//在每个触发事件中播放
int[] playSound = {
1, 1, 1, 1, 1
};
//触发器是以毫秒为单位的整数,所以我们
//可以在绘制循环中调度新事件
int trigger=0;
//该数组保存矩形的像素位置
//绘制每个事件
int[] posx = {
0, 128, 256, 384, 512
};
void setup() {
size(640, 360);
background(255);
//创建一个包含 5 个空声音文件的数组
files = new SoundFile[5];
//从 for 循环中的文件夹加载 5 个声音文件。通过命名
//文件 1.,2.,3.,[.],如果很容易迭代
//通过文件夹,在一行代码中加载所有文件。
for (int i = 0;
i < files.length;
i++) {
files[i] = new SoundFile(this, (i+1) + ".aif");
}
}
void draw() {
//如果确定的触发时刻与
//计算机时钟事件被触发。
if (millis() > trigger) {
//每次都重绘背景以删除旧的 rects
background(255);
//通过迭代我们检查的 playSound 数组
// 1 或 0,1 播放声音并绘制矩形,因为 0 什么也没发生
for (int i = 0;
i < files.length;
i++) {
//检查哪些索引是 1 和 0。
if (playSound[i] == 1) {
float rate;
//选择随机颜色并设置为 noStroke()
fill(int(random(255)), int(random(255)), int(random(255)));
noStroke();
//在我们之前在 posx 中定义的位置绘制矩形
rect(posx[i], 50, 128, 260);
//选择八度数组的随机索引
rate = octave[int(random(0, 5))];
//使用各自的
//速率和循环设置为 false
files[i].play(rate, 1.0);
}
//更新 playSound 的索引,以便在下一个事件中
//顺序不同且随机。
playSound[i] = int(random(0, 2));
}
//在将来创建一个新的触发时间,带有随机偏移量
//在 200 到 1000 毫秒之间
trigger = millis() + int(random(200, 1000));
}
}
/* *
* 处理声音库,示例 4
*
* 五个声音文件映射到键盘上的数字。
* 数字 1-5 播放低八度和数字
* 6-0 高八度。
*/
import processing.sound.*;
AudioDevice device;
SoundFile[] file;
int red, green, blue;
void setup() {
size(640, 360);
background(255);
//创建低缓冲区大小的音频设备
//并创建一个包含 5 个空声音文件的数组
device = new AudioDevice(this, 48000, 32);
file = new SoundFile[5];
//从 for 循环中的文件夹加载 5 个声音文件。
for (int i = 0;
i < file.length;
i++) {
file[i] = new SoundFile(this, (i+1) + ".aif");
}
}
void draw() {
background(red, green, blue);
}
void keyPressed() {
//从 for 循环中的文件夹加载 5 个声音文件。
red=int(random(255));
green=int(random(255));
blue=int(random(255));
//为键盘上的每个数字分配声音。1 5 玩
//文件原始音高以下的八度,6-0 播放
//以上八度音阶。
switch(key) {
case '1':
file[0].play(0.5, 1.0);
break;
case '2':
file[1].play(0.5, 1.0);
break;
case '3':
file[2].play(0.5, 1.0);
break;
case '4':
file[3].play(0.5, 1.0);
break;
case '5':
file[4].play(0.5, 1.0);
break;
case '6':
file[0].play(2.0, 1.0);
break;
case '7':
file[1].play(2.0, 1.0);
break;
case '8':
file[2].play(2.0, 1.0);
break;
case '9':
file[3].play(2.0, 1.0);
break;
case '0':
file[4].play(2.0, 1.0);
break;
}
}
示例 5,6: 音频分析
除了用于生成和操作音频流的类之外,声音还提供了用于音频分析的两个类: 快速傅立叶变换 (FFT) 和振幅跟随器。FFT 类分析音频流,并用音频频谱正方的箱 (频域中的样本) 填充阵列,最高可达采样率的一半。这允许我们使用特定声音的不同频带来触发事件或在 draw() 循环中可视化它们。代码绘制声音文件的归一化频谱图。首先,声明一些变量,如比例因子、要检索的频带数和频率数据的数组。然后将声音文件播放器传递给 FFT 对象。输入 () 方法。在视觉表示中,根据正在分析的频带数,动态计算每个频带的宽度。对于每个帧的方法。需要调用 parse () 来检索 FFT 的当前分析帧。平滑振幅值后,每个 bin 仅由一条垂直线表示。
示例 6 与示例 5 非常相似,但是检索一个值而不是值数组。该值表示音频最后一帧的均方根,即平均振幅。分析声音和使用数据进行可视化的重要因素是平滑、波段数量和缩放因子。
/* *
* 处理声音库,示例 5
*
* 此草图显示如何使用 FFT 类分析流
* 声音。更改变量带以获得更多或更少
* 可使用的光谱带。平滑因子变量确定
* 信号将在 0-1 的比例下平滑多少。
*/
import processing.sound.*;
//声明处理声音变量
SoundFile sample;
FFT fft;
AudioDevice device;
//声明缩放因子
int scale = 5;
//定义我们想要多少个 FFT 频带
int bands = 128;
//声明用于计算 rect 宽度的图形变量
float r_width;
//创建平滑向量
float[] sum = new float[bands];
//创建平滑因子
float smooth_factor = 0.2;
void setup() {
size(640, 360);
background(255);
//如果缓冲区大小大于 FFT 大小,FFT 将失败
//所以我们将 Buffersize 设置为等于波段
device = new AudioDevice(this, 44000, bands);
// 根据我们有多少波段来计算凹槽的宽度
r_width = width/float(bands);
// 加载并播放声音文件并循环播放。这必须被称为
//在创建 FFT 之前。
sample = new SoundFile(this, "beat.aiff");
sample.loop();
// 创建并修补 FFT 分析器
fft = new FFT(this, bands);
fft.input(sample);
}
void draw() {
// 设置背景颜色、 noStroke 和填充颜色
background(204);
fill(0, 0, 255);
noStroke();
fft.analyze();
for (int i = 0;
i < bands;
i++) {
// 通过平滑因子平滑 FFT 数据
sum[i] += (fft.spectrum[i] - sum[i]) * smooth_factor;
// 用比例因子绘制凹槽
rect( i*r_width, height, r_width, -sum[i]*height*scale );
}
}
/* *
* 处理声音库,示例 6
*
* 此草图显示了如何使用振幅类来分析
* 声音流。在这种情况下,分析样本。平滑因子
* 变量决定了信号在一个刻度上的平滑程度
* 从 0-1。
*/
import processing.sound.*;
// 声明处理声音变量
SoundFile sample;
Amplitude rms;
// 声明缩放因子
float scale = 5.0;
// 声明平滑因子
float smoothFactor = 0.25;
// 用于平滑
float sum;
void setup() {
size(640, 360);
//加载和播放声音文件并循环
sample = new SoundFile(this, "beat.aiff");
sample.loop();
// 创建并修补 rms 跟踪器
rms = new Amplitude(this);
rms.input(sample);
}
void draw() {
// 设置背景颜色、 noStroke 和填充颜色
background(0, 0, 255);
noStroke();
fill(255, 0, 150);
// 通过平滑因子平滑 rms 数据
sum += (rms.analyze() - sum) * smoothFactor;
//Rms.Analysis () 返回一个介于 0 和 1 之间的值。它是
//缩放到高度/2,然后乘以比例因子
float rmsScaled = sum * (height/2) * scale;
// 根据音频分析绘制大小的椭圆
ellipse(width/2, height/2, rmsScaled, rmsScaled);
}
注解
1.道格拉斯 · 卡恩,《噪音、水、肉: 艺术史中的声音》 (麻省理工学院出版社,2001),第 10 页。
2.保罗 th é berge,任何你能想象的声音: 制作音乐/消费技术 (卫斯理大学出版社,1997),105 页。
3.约翰·凯奇,《信条: 音乐的未来 (1937) 》,载于《约翰·凯奇: 选集》,理查德 · 科斯特拉内茨编辑 (普雷格,1970),第 52 页。
4.約珥 · 查达贝,《电子声音: 电子音乐的过去和承诺》 (普伦蒂斯 · 霍尔,1996),145 页。
5.柯蒂斯路,《计算机音乐教程》 (麻省理工学院出版社,1996),第 43 页。
6.艾伯特 · 布雷格曼,听觉场景分析 (麻省理工学院出版社,1994),215 页。
推荐阅读
- 玩一玩|超立方体及其可视化(Processing)
- Image|LOG斑点检测
- R|记一次R的可视化使用-生成城市各个景点的多边形图
- 数据挖掘|使用R完成均值检验
- R|使用R完成决策树分类
- R|使用R完成正太分布检验
- PyTorch|BERT_Pytorch下游任务-萌新向
- mfc|MFC ListControl如何使用