使用MetaSound创建程序化音乐
MetaSound 是一种高性能的音频系统,使音频设计师能够完全控制数字信号处理(DSP)图表,以生成声源。
本指南介绍了如何使用 MetaSound源(MetaSound Source) 和蓝图创建Gameplay驱动的程序化音乐系统。
先决条件
本指南需要一个支持玩家角色移动的项目,例如第一人称模板项目。
1 - 创建音乐MetaSound
点击查看大图。
首先创建播放程序化音乐的MetaSound。执行下面的每个子步骤,逐个分段构建上面的图表。
此过程会公开多个输入参数,以便在未来步骤中从蓝图访问。
1.1 - 初始设置
创建支持持久立体声音频的MetaSound源。
- 创建MetaSound源。
- 在 内容浏览器(Content Browser) 中,点击 添加(Add) 按钮。
- 选择 Sounds > MetaSound源(MetaSound Source) 。
- 为新创建的MetaSound命名,例如
MSS_Music
。
- 双击MetaSound打开 MetaSound编辑器(MetaSound Editor) 。
- 在 界面(Interfaces) 面板中,点击 UE.Source.OneShot 界面条目旁边的 删除(回收站)(Remove (Trash Bin)) 按钮。这会生成 On Finished Output 节点,它不在氛围声音或音乐等持久声音上使用。
- 点击 MetaSound编辑器工具栏(MetaSound Editor Toolbar) 上的 MetaSound 按钮。
- 在 细节(Details) 面板中,点击 MetaSound > 输出格式(Output Format) 下拉菜单并选择 立体声(Stereo) 。这会将 Out Mono Output 节点替换为 Out Left 和 Out Right Output 节点。
1.2 - 节奏和韵律

构建"节奏和韵律(Tempo and Rhythm)"分段,使用Trigger节点控制音乐的计时。
- 找到 On Play Input 节点并将引脚拖移到空白区域。在节点搜索中输入"Trigger Repeat",创建连接的节点。你可以拖动节点,在图表中将其四处移动。
- 在 Trigger Repeat 节点上:
- 拖移 周期(Period) 引脚并创建 BPM To Seconds 节点。
- 拖移 RepeatOut 引脚并创建 Trigger Counter 节点。
- 在 BPM to Seconds 节点上:
- 将 全音划分(Divisions of Whole Note) 设置为16。
- 拖移 BPM 引脚并选择 提升到图表输入(Promote to Graph Input) 。这会创建名为BPM的 Float Input 节点。
- 选择 BPM 节点。
- 在 细节(Details) 面板中,将 默认值(Default Value)> 范围(Range) 设置为60.0, 180.0。
- 在 Trigger Counter 节点上,将 重置计数(Reset Count) 设置为8。
- 选择除了 On Play Input 节点之外的所有节点,右键点击所选节点之一,然后选择 从选择内容创建注释(Create Comment From Selection) 。
- 将注释框命名为"节奏和韵律(Tempo and Rhythm)"。
你可以在 细节(Details) 面板中更改所选注释的颜色。
1.3 - 旋律生成

构建"旋律生成(Melody Generation)"分段,按指定音阶生成随机旋律。
- 在"节奏和韵律(Tempo and Rhythm)"分段中的 Trigger Counter 节点上:
- 拖移 触发时(On Trigger) 引脚并创建 Random Get (Float:Array) 节点。
- 拖移 重置时(On Reset) 引脚并将其连接到 Random Get (Float:Array) 节点上的 重置(Reset) 。
- 在 Random Get (Float:Array) 节点上:
- 拖移 数组中(In Array) 引脚并创建 Scale to Note Array 节点。
- 拖移 种子(Seed) 引脚并创建 Random (Int) 节点。
- 拖移 数值(Value) 引脚并创建 Add (Float) 节点。
- 在 Scale to Note Array 节点上,拖移 音级(Scale Degrees) 引脚并选择 提升到图表输入(Promote to Graph Input) 。这会创建名为Scale Degrees的 Enum Input 节点。
- 选择Scale Degrees节点。
- 在 细节(Details) 面板中:
- 将 通用(General)> 输入(Input) 设置为"Scale"以重命名输入。
- (可选)将 默认值(Default Value)> 默认(Default) 设置为你想使用的音阶。这会默认为大音阶。
- 在 Random (Int) 节点上:
- 将 最大值(Max) 设置为100000。
- 拖移 下一个(Next) 引脚并选择 提升到图表输入(Promote to Graph Input) 。这会创建名为Next的 Trigger Input 节点。
- 选择Next节点。
- 在 细节(Details) 面板中,将 通用(General)> 输入(Input) 设置为"NewMelody"以重命名输入。
- 在 Add (Float) 节点上,将底部加数设置为48.0。这是四个八度音的偏移。
- 将新节点封装在名为"旋律生成(Melody Generation)"的注释框中。
1.4 - 合成(正弦)

构建"合成(正弦)(Synthesis (Sine))"分段,按输入音符的频率生成正弦波。
- 在"旋律生成(Melody Generation)"分段中的 Add (Float) 节点上:
- 拖移输出引脚并创建 MIDI To Frequency (Float) 节点。
- 再次拖移输出引脚并创建另一个 Add (Float) 节点。
- 在新的 Add (Float) 节点上:
- 拖移输出引脚并创建另一个 MIDI To Frequency (Float) 节点。
- 拖移底部加数引脚并选择 提升到图表输入(Promote to Graph Input) 。这会创建名为AdditionalOperands的 Float Input 节点。
- 选择AdditionalOperands节点。
- 在 细节(Details) 面板中:
- 将 通用(General)> 输入(Input) 设置为"Detune"以重命名输入。
- 将 默认值(Default Value)> 默认(Default) 设置为12.0。
- 将 默认值(Default Value)> 范围(Range) 设置为0.0, 12.0。
- 在每个 MIDI To Frequency (Float) 节点上,拖移 输出频率(Out Frequency) 引脚并创建 Sine 节点。
- 在第一个 Sine 节点上,拖移 音频(Audio) 引脚并创建 Add (Audio) 节点。
- 在第二个 Sine 节点上,将 音频(Audio) 引脚连接到 Add (Audio) 节点的底部加数。
- 将新节点封装在名为"合成(正弦)(Synthesis (Sine))"的注释框中。
1.5 - 合成(锯齿)

构建"合成(锯齿)(Synthesis (Saw))"分段,按输入音符的频率生成锯齿波。
- 选择"合成(锯齿)(Synthesis (Saw))"分段中的所有节点,右键点击所选节点之一,然后选择 复制(Duplicate) 。
- 确保 Add (Float) 和 MIDI to Frequency (Float) 节点的输入引脚连接到"旋律生成(Melody Generation)"分段中 Add (Float) 节点的输出引脚。
- 删除两个 Sine 节点并将其替换为 Saw 节点。
- 将新节点封装在名为"合成(锯齿)(Synthesis (Saw))"的注释框中。
1.6 - 交叉过渡

构建"交叉过渡(Crossfade)"分段,控制正弦和锯齿合成的比率。
- 在"合成(正弦)(Synthesis (Sine))"分段中的 Add (Audio) 上,拖移输出引脚并创建 Crossfade (Audio, 2) 节点。
- 在 Crossfade (Audio, 2) 节点上:
- 将 输入1(In 1) 引脚连接到"合成(锯齿)(Synthesis (Saw))"分段中的 Add (Audio) 节点上的输出引脚。
- 拖移 交叉过渡值(Crossfade Value) 引脚并选择 提升到图表输入(Promote to Graph Input) 。这会创建名为Crossfade Value的 Float Input 节点。
- 选择Crossfade Value。
- 在 细节(Details) 面板中,将 通用(General)> 输入(Input) 设置为"Crossfade"以重命名输入。
- 将新节点封装在名为"合成(交叉过渡)(Synthesis (Crossfade))"的注释框中。
1.7 - 滤波

构建"滤波(Filtering)"分段,平滑声音。
- 在"交叉过渡(Crossfade)"分段中的 Crossfade (Audio, 2) 节点上,拖移 输出(Out) 引脚并创建 Ladder Filter 节点。
- 在 Ladder Filter 节点上:
- 将 谐振(Resonance) 设置为6.0。
- 拖移 截止频率(Cutoff Frequency) 引脚并创建 LFO 节点。
- 在 LFO 节点上:
- 将 频率(Frequency) 设置为0.5。
- 将 最小值(Min Value) 设置为500.0。
- 将 最大值(Max Value) 设置为5000.0。
- 将新节点封装在名为"滤波(Filtering)"的注释框中。
1.8 - 波封

构建"波封(Enveloping)"分段,使用起音衰减波封去除旋律中音符的延持。
- 在"旋律生成(Melody Generation)"分段中的 Random Get (Float:Array) 节点上,拖移 下一个时(On Next) 引脚并创建 AD Envelope (Audio) 节点。
- 在 AD Envelope (Audio) 节点上,将 衰减时间(Decay Time) 设置为0.1。
- 将新节点封装在名为"波封(Enveloping)"的注释框中。
1.9 - 效果处理

构建"效果处理(Effects Processing)"分段,生成立体声范围扩大效果。衰减会带来单声道信号就是立体声信号的错觉。
- 在"波封(Enveloping)"分段中的 AD Envelope (Audio) 节点上,拖移 输出波封(Out Envelope) 引脚并创建 Multiply (Audio) 节点。
- 在 Multiply (Audio) 节点上:
- 将底部乘数引脚连接到"滤波(Filtering)"分段中的 Ladder Filter 节点上的 输出(Out) 引脚。
- 拖移输出引脚并创建 Delay 节点。
- 在 Delay 节点上:
- 将 衰减时间(Delay Time) 设置为0.02。
- 拖移 输出(Out) 引脚并创建 Stereo Delay 节点。
- 在 Stereo Delay 节点上:
- 将 输入右(In Right) 引脚连接到 Multiply (Audio) 节点上的输出引脚。
- 将 衰减模式(Delay Mode) 设置为 "乒乓效应(Ping Pong)"。
- 将 衰减时间(Delay Time) 设置为0.2。
- 将 衰减比率(Delay Ratio) 设置为0.2。
- 将 干度(Dry Level) 设置为0.7。
- 将 湿度(Wet Level) 设置为0.2。
- 将 反馈(Feedback) 设置为0.4。
- 将 输出左(Out Left) 引脚连接到 Out Left Output 节点。
- 将 输出右(Out Right) 引脚连接到 Out Right Output 节点。
- 将 Delay 和 Stereo Delay 节点封装在名为"效果处理(Effects Processing)"的注释框中。
1.11 - 播放MetaSound
MetaSound现已准备好播放。
- 保存MetaSound。
- 点击 MetaSound编辑器工具栏(MetaSound Editor Toolbar) 上的 播放(Play) 按钮,播放MetaSound。
- 使用控件或 细节(Details) 面板调整输入值并实时监听更改。
2 - 构建蓝图Actor

使用 盒体碰撞物(Box Colliders) 创建 蓝图Actor(Blueprint Actor) ,以在运行时期间触发MetaSound中的更改。
2.1 - 创建蓝图类
- 在 内容浏览器(Content Browser) 中,点击 添加(Add) 按钮。
- 选择 蓝图类(Blueprint Class) 。
- 从 选择父类(Pick Parent Class) 窗口中,选择 Actor 。
- 为新创建的蓝图Actor命名,例如
BP_MusicPlayer
。
2.2 - 添加组件
将组件添加到Actor,以创建三个单独的触发区域,这些区域在玩家移入和移出时会做出响应。
- 双击蓝图Actor打开 蓝图编辑器(Blueprint Editor) 。
- 添加盒体碰撞组件。
- 在 组件(Components) 面板中:
- 点击 添加(Add) 按钮。
- 在搜索栏中输入"Box Collision"并按Enter键。
- 在 细节(Details) 面板中:
- 将 变换(Transform)> 缩放(Scale) 设置为5.0、5.0、1.0。
- 禁用 渲染(Rendering)> 在游戏中隐藏(Hidden In Game) 。
- 在 组件(Components) 面板中:
- 将文本渲染组件添加到盒体碰撞组件。
- 在 组件(Components) 面板中:
- 选择盒体碰撞组件。
- 点击 添加(Add) 按钮。
- 在搜索栏中输入"Text Render"并按Enter键。
- 在 细节(Details) 面板中:
- 将 变换(Transform)> 位置(Location) 设置为0.0、0.0、150.0。
- 将 文本(Text)> 水平对齐(Horizontal Alignment) 设置为"居中(Center)"。
- 将 文本(Text)> 世界大小(World Size) 设置为64.0。
- 在 组件(Components) 面板中:
- 创建组件的两个额外副本。执行以下操作两次:
- 在 组件(Components) 面板中,按住Ctrl键的同时点击,选择盒体碰撞组件和文本渲染组件。
- 右键点击并选择 复制(Duplicate) 。
- 自定义BPM触发器。
- 在 组件(Components) 面板中,右键点击第一个盒体碰撞组件,选择 重命名(Rename) ,并将其命名为
Trigger_BPM
。 - 在 细节(Details) 面板中,将 变换(Transform )> 位置(Location) 设置为0.0、350.0、0.0。
- 在 组件(Components) 面板中,选择子文本渲染组件。
- 在 细节(Details) 面板中,将 文本(Text)> 文本(Text) 设置为BPM。
- 在 组件(Components) 面板中,右键点击第一个盒体碰撞组件,选择 重命名(Rename) ,并将其命名为
- 自定义交叉过渡触发器。
- 在 组件(Components) 面板中,右键点击第二个盒体碰撞组件,选择 重命名(Rename) ,并将其命名为
Trigger_Crossfade
。 - 选择子文本渲染组件。
- 在 细节(Details) 面板中,将 文本(Text)> 文本(Text) 设置为"交叉过渡(Crossfade)"。
- 在 组件(Components) 面板中,右键点击第二个盒体碰撞组件,选择 重命名(Rename) ,并将其命名为
- 自定义旋律触发器。
- 在 组件(Components) 面板中,右键点击第三个盒体碰撞组件,选择 重命名(Rename) ,并将其命名为
Trigger_Melody
。 - 在 细节(Details) 面板中,将 变换(Transform )> 位置(Location) 设置为0.0、-350.0、0.0。
- 在 组件(Components) 面板中,选择子文本渲染组件。
- 在 细节(Details) 面板中,将 文本(Text)> 文本(Text) 设置为"旋律(Melody)"。
- 在 组件(Components) 面板中,右键点击第三个盒体碰撞组件,选择 重命名(Rename) ,并将其命名为
- 添加MetaSound的音频组件。
- 在 组件(Components) 面板中:
- 点击 添加(Add) 按钮。
- 在搜索栏中输入"Audio"并按Enter键。
- 在 细节(Details) 面板中,将 声音(Sound)> 声音(Sound) 设置为音乐MetaSound。
- 在 组件(Components) 面板中:
2.3 - 添加触发器事件
为每个区域添加碰撞响应事件。
- 在 组件(Components) 面板中,选择Trigger_BPM。
- 在 细节(Details) 面板中:
- 选择 事件(Events)> 在组件开始重叠时(On Component Begin Overlap) 旁边的 添加(Add (+)) 按钮。
- 选择 事件(Events)> 在组件结束重叠时(On Component End Overlap) 旁边的 添加(Add (+)) 按钮。
- 在 组件(Components) 面板中,选择Trigger_Crossfade。
- 在 细节(Details) 面板中:
- 选择 事件(Events)> 在组件开始重叠时(On Component Begin Overlap) 旁边的 添加(Add (+)) 按钮。
- 选择 事件(Events)> 在组件结束重叠时(On Component End Overlap) 旁边的 添加(Add (+)) 按钮。
- 在 组件(Components) 面板中,选择Trigger_Melody。
- 在 细节(Details) 面板中,选择 事件(Events)> 在组件开始重叠时(On Component Begin Overlap) 旁边的 添加(Add (+)) 按钮。
2.4 - 构建触发器事件
点击查看大图。
将节点附加到每个事件以控制音乐。
你可能需要关闭位于搜索上下文菜单右上角的 上下文相关(Context Sensitive) 筛选器,才能找到下面使用的 Set Float Parameter (Audio) 和 Execute Trigger Parameter 节点。
- 在 On Component Begin Overlap (Trigger_BPM) 节点上,拖移 Exec Output (>) 引脚,并创建 Set Float Parameter (Audio) 节点。
- 在 Set Float Parameter 节点上:
- 将 输入名称(In Name) 设置为BPM。
- 将 输入浮点(In Float) 设置为120.0。
- 在 On Component End Overlap (Trigger_BPM) 节点上,拖移 Exec Output (>) 引脚,并创建另一个 Set Float Parameter (Audio) 节点。
- 在新的 Set Float Parameter 节点上:
- 将 输入名称(In Name) 设置为BPM。
- 将 输入浮点(In Float) 设置为90.0。
- 在 On Component Begin Overlap (Trigger_Crossfade) 节点上,拖移 Exec Output (>) 引脚,并创建另一个 Set Float Parameter (Audio) 节点。
- 在新的 Set Float Parameter 节点上:
- 将 输入名称(In Name) 设置为Crossfade。
- 将 输入浮点(In Float) 设置为1.0。
- 在 On Component End Overlap (Trigger_Crossfade) 节点上,拖移 Exec Output (>) 引脚,并创建另一个 Set Float Parameter (Audio) 节点。
- 在新的 Set Float Parameter 节点上:
- 将 输入名称(In Name) 设置为Crossfade。
- 将 输入浮点(In Float) 设置为0.0。
- 在 On Component Begin Overlap (Trigger_Melody) 节点上,拖移 Exec Output (>) 引脚,并创建 Execute Trigger Parameter 节点。
- 在 Execute Trigger Parameter 节点上:
- 将 输入名称(In Name) 设置为NewMelody。
- 在 组件(Components) 面板中,将音频组件拖到 目标(Target) 引脚上。
- 编译并保存蓝图。
3 - 测试关卡
蓝图已准备好进行测试。
- 将BP_MusicPlayer从 内容浏览器(Content Browser) 拖入 关卡(Level) 中来放置它。
- 使用变换控件放置Actor,以便你的角色可以移入和移出其中。
- 点击 关卡编辑器工具栏(Level Editor Toolbar) 上的 播放(Play) 按钮。
- 移入和移出触发器,观察对音乐的影响。