第二部
忙里偷闲,先把strudel相关的写了,不然我画漫画就会忘掉这个事情,其实是换个事情做休息一下,构思漫画的前期可太累了。
用strudel做第二首音乐🎶,相比第一首写得有点吵,这次像是打通任督二脉一样,感觉非常流畅,应该是熟练起来了,不过还是挺辛苦的。
为了给大脑减负,我还画了个流程图,在制作的时候能减少一些脑容量,我是在做了前三分一的流程才画的,这个概念版的模式已经变成我的日常工作流了。
(本地的话用obsdian的白板功能,我更多则是用Kinopio)

从水下第一个生命的萌芽开始
最先的并没有什么想法,而是尝试随便用strudel做点什么loop玩一下,跟ai随便瞎聊,从聊的过程产生具体的想法,然后具体锁定成节奏、风格、配器、和弦,让ai生成基础的JavaScrip代码。

目前我用的DeepSeek会把.sound("sawtooth")里面的音色默认生成为sawtooth一个基础合成器音色,我则是把bass改为了gm_electric_bass_finger一个Strudel音色包里面比较硬的电bass音色。
改写、调试,一轮操作得出来的效果是这样的。
(导出export为.wav格式化后,bass有点小,不过还能接受。)
一直做一直改只会听觉疲劳,然后变烦。所以我就只作为一个background到此为止,保留扩展性。
现在听起来就是一个作为游戏背景的氛围音乐,醉意的庭院,酔いの庭(よいのにわ)什么的,就很咋咋呼呼。
石器时代的巨型野兽
即兴用的笛子
之后我进了Tenacity录制了旋律即兴,用的是10¥的PVC塑料笛子,应该也能算竖笛recorder吧。

它吹到高音E(大概是E4?)就会跑得很厉害。而且很容易漏气或者啸叫,而已有一些奇怪的不可控的微分音。
这可不是缺点哦,我觉得是一种很有特点的残破音色。
正式进入Tenacity录制即兴
其实就是正常操作,把background放进去,想象成伴奏乐团,然后上面solo呼吸、配合,边吹边想边吹,自然就流露出来了。

录完后有点干,我就再进了Reaper加一点混响。 (加了一点增益、压缩、混响,三件套)
音频在之后完成版里面。
人类第一次直立行走
既然都做了一大堆东西了,那干脆做成EP规格,画一个封面图。
于是我参考John Coltrane在1965年发布的自由爵士专辑《A Love Supreme》封面,致敬了一版。
(参考的封面图)

(用Krita绘制一张封面)

完成版
最后得到就是这样一个封面图+音乐的完整Ep。
《Just-love》 © 2026 顾游Gizeku,采用 CC BY-NC-SA 4.0 许可协议。
后续工作
用ffmpeg把图片和音频合成mp4视频,之后发布b站就行了,这么多灵活的版本多平台发布想怎么发都行。
这样就算是跑完一套完整的制作流程,虽然截止现在发布两天只有45的播放量,不过作为一个纯音乐/精神爵士Spiritual Jazz风格,有人听就不错啦😊。
当然,喜欢的话可以在b站用yt-dlp下载。记得给我结账就行,可以先欠着,等我做完十首单曲做出专辑再来支持就行💿。
对了,如果你们看了整个流程有什么启发,或者喜欢我的音乐,请一定要发邮件到gizeku@outlook.com来鼓励我,我会更有动力的,也欢迎来分享交流你是怎么创作的,写成blog让我看那就更好了。
额外的代码部分
我把用到代码和指令放这里了,大家需要的话拿去玩吧,随便改。
用到的ffmpeg合成指令
ffmpeg -loop 1 -i 你的图片.png -你的音频.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest output.mp4
Just-love的背景音乐代码,扔进Strudel就能播了。
// LOADING// 电爵士 / 碎拍 / Chill
// 在 Strudel REPL 中运行
setcpm(85/4)
// ---------- 鼓组(带混响)----------
let drums = s("bd ~ ~ [~ bd] sd ~ [~ bd] ~")
.bank("RolandTR808")
.room(0.25)
.roomsize(0.4)
// 碎拍军鼓,不规则交错
let breakbeat = s("~ ~ sd ~ ~ sd ~ ~ sd ~ ~ sd sd ~ ~ ~")
.bank("RolandTR808")
.room(0.2)
// ---------- 电 Bass(Slap 感)----------
let bassLine = note("d2 ~ d3 ~ f2 a2 ~ c3")
.sound("gm_electric_bass_finger") //电bass
.lpf(600)
.gain(sine.slow(2).range(2, 5))
.attack(0.005).decay(0.08).sustain(0.2).release(0.12)
.distort(0.3)
.sometimes(x => x.note("d2 ~ d3 f2 ~ a2 c3 ~ b2")) // 偶尔切到 Dorian 特征音 b2,同时打乱切分位置
.sometimes(x => x.note("d2 d3 ~ f2 ~ a2 ~ c3")) // 偶尔重复根音,制造 funk 的八度击弦感
.sometimes(x => x.note("d2 ~ f2 ~ a2 ~ [c3|b2] ~")) // 偶尔拉宽线条,留更多空白,让律动呼吸
// ---------- Roland 电钢琴(一点点混响)----------
let epianoChords = note("[d3,f3,a3,c4,e4] [g3,b3,d4,f4,a4]")
.sound("sawtooth") //这里用了原本的合成器,不改成电钢琴也行,需要可以替换。
.lpf(1800)
.attack(0.01).decay(0.4).sustain(0.6).release(0.8)
.gain("[0.6|0.7|0.8|0.75|0.7|0.6|0.75|0.6|0.7|0.8] [0.4|0.5|0.7|0.6|0.75|0.6|0.7|0.8]") //有变化不会那么无聊,太抢注意力可以选择注释掉。
//.swing(4, 0.1) ///加上太懒了,可选
.nudge(0.2) ///←追加这个前后随机,拖或者抢一点
.room(0.15)
.roomsize(0.3)
// ---------- 电小号(近似)----------
let motifA = note("f4 ~ a4 ~ g4 ~ ~ ~")
.sound("sawtooth") // 用锯齿波模拟铜管质感
.bpf(1200) // 带通滤波,收窄频率,靠近小号音色
.attack(0.03).decay(0.2).sustain(0.7).release(0.3) // 包络:慢起音+短衰减+长延续+短释放
.gain(sine.slow(2).range(0.05, 2)) // 音量自动起伏,每 2 个循环一次,若隐若现
.room(0.2) // 混响湿度 0.2
.roomsize(sine.slow(4).range(0.15, 0.6)) // 混响空间动态变化,每 4 个循环一次,0.15~0.6
.sometimes(x => x.note("[e4|f4|fs4] ~ a4 ~ [g4|ab4] ~ ~ ~"))
// 约一半的循环里,随机替换第 1 拍和第 5 拍:
// 第 1 拍在 E4 / F4 / F#4 中随机选一个
// 第 5 拍在 G4 / Ab4 中随机选一个
// 打破原旋律的呆板感,制造意外和变化
let motifB = note("c5 ~ bb4 a4 g4 ~ f4 ~")
.sound("sawtooth")
.bpf(1400)
.attack(0.03).decay(0.2).sustain(0.7).release(0.3)
.gain(sine.slow(2).range(0.05, 1.5))
.room(0.2)
.roomsize(0.35)
// C 句:只在特定小节替换切入
let motifC = note("d5 ~ c5 bb4 ~ a4 ~ g4")
.sound("sawtooth")
.bpf(1600)
.attack(0.03).decay(0.2).sustain(0.7).release(0.3)
.gain(sine.slow(2).range(0.05, 1.5))
.room(0.2)
.roomsize(0.35)
// 原来那句,保留不动
let trumpetMelody = seq(motifA, motifA, motifB).slow(2)
// C 句独立成线,每 8 个循环替换切入一次
let cLine = seq(motifC).slow(2)
// 用 mask 控制谁在什么时候出声
let trumpetFinal = stack(
trumpetMelody.mask("<1 1 1 1 1 0>"),
cLine.mask("<0 0 1 1 0 1 1>")
)
// ---------- 演奏 ----------
stack(
drums,
breakbeat,
bassLine,
epianoChords,
trumpetFinal
).slow(1)