用 L 系统和颗粒合成做算法音色设计
来源:nathanho.me — 2026-10-17
📋 概述
Nathan Ho 重写了自己几年前那篇不满意的 L 系统加颗粒合成文章,这次给出完整系统 EvoGrain:一个离线程序,合成几秒到三十秒的音频片段,定位介于合成器与算法作曲之间,输出不是成品而是可供采样和再处理的原料。架构是一条回环:随机生成 L 系统规则 → 展开成乌龟指令序列 → 乌龟解释成约两万颗粒子(每颗带起始时间、时长、音高、声像、包络、合成引擎等)→ 对颗粒集做「调整」提升音乐性 → 合成音频并统计评分 → 反复随机并挑出得分最高者。灵感来自 2010 年前后马拉加大学的 Iamus,那个项目完全基于规则、不用人类作品训练,作者从中得到的关键启发是「间接编码」:基因型与表型之间的关系才是音乐性所在,比适应度函数更关键。技术上最有意思的是边界处理:MoveParam 会让乌龟一路漂到参数边界并粘住,他先借鉴 Manousakis 的阈值重置,再用梯形模糊隶属函数做插值——越接近边界,被重置的概率越高,于是参数分布自然向边界衰减,比硬裁剪或镜像更合音乐直觉。
🔑 核心要点
- EvoGrain 是离线工具而非实时合成器:输出几秒到三十秒的音频,定位在合成器与算法作曲之间,给采样和变形提供原料
- 整条流水线是闭环:随机生成 L 系统 → 展开指令 → 乌龟产出约两万颗粒子 → 调整 → 合成 → 统计评分 → 择优
- 乌龟指令集很小但够用:Grain 出颗粒并推进时间、MoveParam 相对改参、SetParam 绝对设值、Push/Pop 存栈使乌龟能回到过去制造复调
- 灵感来自 Iamus 的「间接编码」:L 系统符号的含义如何映射成乐谱,比适应度函数和进化算法本身更决定结果好坏
- 边界问题是算法音乐的经典坑:相对改参会把乌龟推到参数边缘并粘住,硬裁剪和镜像都不好听
- 解法是模糊逻辑:给每个参数配一个梯形隶属函数,越界越多重置权重越大,参数边缘分布自然衰减,灵感与旋律生成里的「橡皮筋」一致
💡 金句
记住,给乌龟设边界不是自私,你只是在练习自我照顾。
👍 0
👎 0
← 返回 Lobsters 首页