PureData 单音 FM 合成器实战:频率调制、包络控制与音色调节
PureData 是一个开源的图形编程语言,广泛应用于音频处理、音乐制作和实时音频控制等领域。本文将围绕 PureData 语言,实现一个单音 FM 合成器,通过频率调制(FM)、包络控制(ADSR)和音色调节等功能,展示如何使用 PureData 进行音频合成。
FM 合成器原理
频率调制(Frequency Modulation,简称 FM)是一种通过改变载波频率来产生音调的合成方法。在 FM 合成器中,一个高频振荡器(载波)的频率被调制器(调制信号)所控制,从而产生新的音调。
PureData 环境搭建
在开始编写代码之前,我们需要搭建一个 PureData 环境。以下是搭建步骤:
1. 下载并安装 PureData:从官方网址(https://puredata.info/downloads)下载并安装最新版本的 PureData。
2. 打开 PureData:双击桌面上的 PureData 图标,打开软件。
3. 创建新项目:在 PureData 界面中,点击“File”菜单,选择“New”创建一个新的项目。
FM 合成器代码实现
以下是一个简单的 FM 合成器代码示例,包括频率调制、包络控制和音色调节等功能。
```pd
N canvas 0 0 1024 768 fm-synth 0;
X obj 100 100 cnv 15 400 200 empty empty FM_Synth 20 12 0 14 -233017
-66577 0;
X obj 100 130 hsl 300 15 0 127 0 0 empty empty Frequency 0 -8 0 10 -262144
-1 -1 0 1;
X obj 100 150 hsl 300 15 0 127 0 0 empty empty Modulation 0 -8 0 10 -262144
-1 -1 0 1;
X obj 100 170 hsl 300 15 0 127 0 0 empty empty Resonance 0 -8 0 10 -262144
-1 -1 0 1;
X obj 100 190 hsl 300 15 0 127 0 0 empty empty Attack 0 -8 0 10 -262144
-1 -1 0 1;
X obj 100 210 hsl 300 15 0 127 0 0 empty empty Decay 0 -8 0 10 -262144
-1 -1 0 1;
X obj 100 230 hsl 300 15 0 127 0 0 empty empty Sustain 0 -8 0 10 -262144
-1 -1 0 1;
X obj 100 250 hsl 300 15 0 127 0 0 empty empty Release 0 -8 0 10 -262144
-1 -1 0 1;
X obj 100 270 hsl 300 15 0 127 0 0 empty empty Volume 0 -8 0 10 -262144
-1 -1 0 1;
X obj 100 300 cnv 15 400 100 empty empty Output 20 12 0 14 -233017 -66577
0;
X obj 100 320 outlet~;
X obj 100 340 cnv 15 400 50 empty empty Controls 20 12 0 14 -233017 -66577
0;
X obj 100 360 nbx 5 14 -1e+37 1e+37 0 0 empty empty Frequency 0 -8 0 10
-262144 -1 -1 0 256;
X obj 100 380 nbx 5 14 -1e+37 1e+37 0 0 empty empty Modulation 0 -8 0 10
-262144 -1 -1 0 256;
X obj 100 400 nbx 5 14 -1e+37 1e+37 0 0 empty empty Resonance 0 -8 0 10
-262144 -1 -1 0 256;
X obj 100 420 nbx 5 14 -1e+37 1e+37 0 0 empty empty Attack 0 -8 0 10 -262144
-1 -1 0 256;
X obj 100 440 nbx 5 14 -1e+37 1e+37 0 0 empty empty Decay 0 -8 0 10 -262144
-1 -1 0 256;
X obj 100 460 nbx 5 14 -1e+37 1e+37 0 0 empty empty Sustain 0 -8 0 10 -262144
-1 -1 0 256;
X obj 100 480 nbx 5 14 -1e+37 1e+37 0 0 empty empty Release 0 -8 0 10 -262144
-1 -1 0 256;
X obj 100 500 nbx 5 14 -1e+37 1e+37 0 0 empty empty Volume 0 -8 0 10 -262144
-1 -1 0 256;
X obj 100 520 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Frequency 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 540 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Volume 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 560 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Resonance 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 580 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Attack 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 600 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Decay 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 620 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Sustain 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 640 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Release 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 660 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Volume 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 680 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Frequency 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 700 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Resonance 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 720 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Attack 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 740 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Decay 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 760 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Sustain 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 780 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Release 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 800 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Volume 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 820 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Frequency 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 840 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Resonance 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 860 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Attack 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 880 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Decay 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 900 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Sustain 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 920 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Release 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 940 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Volume 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 960 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Frequency 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 980 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Resonance 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 1000 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Attack 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1020 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Decay 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1040 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Sustain 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1060 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Release 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1080 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Volume 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1100 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Frequency 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 1120 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Resonance 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 1140 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Attack 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1160 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Decay 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1180 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Sustain 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1200 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Release 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1220 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Volume 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1240 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Frequency 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 1260 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Resonance 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 1280 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Attack 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1300 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Decay 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1320 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Sustain 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1340 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Release 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1360 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Volume 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1380 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Frequency 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 1400 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Resonance 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 1420 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Attack 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1440 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Decay 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1460 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Sustain 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1480 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Release 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1500 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Volume 0 -8
0 10 -262144 -1 -1 0 256;
X obj 100 1520 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Frequency 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 1540 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Resonance 0
-8 0 10 -262144 -1 -1 0 256;
X obj 100 1560 nbx 5 14 -1e+37 1e+37 0 0 empty empty Current_Attack 0 -8
0 10 -262
Comments NOTHING