我本来只想让 AI 帮我写首歌,没想到最后连二十多年前的老 MIDI 都给修了。
事情的起因很简单:突然想试试,能不能让 AI 直接给我写一首 MIDI 曲子。
注意,是 MIDI,不是那种点一下按钮就生成一首歌的 AI 音乐。我要的是一个真正的音乐文件,能在里面改音符、换乐器、调节奏。
我不会专门写音乐软件,也没打算为了这件事先学一遍编程。
既然现在有 AI,那就让它干呗。
然后,我拥有了一个充实得过分的下午。
#一、先找个会写歌的 AI 助手
我本地已经装了 27 个 AI 技能,翻了一圈,没有一个能直接生成 MIDI。
于是去技能商店搜了一下。
结果看起来挺热闹,仔细一看却不是我要的。有的只能把 MIDI 转成音频,有的负责把人声变成 MIDI,还有的虽然能生成音乐,给出来的却是普通音频文件。
我需要的是能直接写出 MIDI 的。
最后找到一个冷门技能 tubone24/midi-agent-skill,安装量只有 16。它的介绍倒是很对口:能用乐理和各种乐器生成 MIDI 文件,而且不需要调用付费 API。
先检查文件,再安装。让 AI 跑了个小测试,成功生成了一份小样。
好,能干活。
这时候我其实还没想好要写什么歌,只是确认了手里的工具能用。
接下来,才是正戏。
#二、给 AI 一段旋律,让它把歌写出来
我电脑的下载目录里正好有一份《主旋律.txt》,记着一段熟悉的旋律——东方 Project 里的 ZUN 节。
文件里没有什么复杂的乐谱,就是我自己记下来的简谱。
我把旋律交给 AI,要求也很朴素:用钢琴演奏,配上伴奏,有个开头,主题重复几遍,最后好好收尾。
第一版很快就出来了。
40 小节,120 BPM,两轨钢琴,一共 80 秒。
我让 AI 检查了一下文件时长,结果正好 80 秒。
听起来也还不错。
于是我开始提要求。
「速度太慢了,翻倍。」
「结构有点平淡,把最后十秒剪出来,放到中间当一段过渡。」
「结尾不能戛然而止,给我补一个完整的终止。」
这些要求说起来都不复杂。就像跟一个懂音乐、会干活的助手商量:这里太慢,那里不够好,结尾再处理一下。
我负责听,负责判断哪里不满意,AI 负责动手修改。
听起来很顺利,对吧?
然后,Bug 来了。
#三、歌还在播,主旋律怎么没了?
改完结构,我重新试听。
奇怪的事情发生了:伴奏还在继续,主旋律却提前结束了。最后十秒,只剩伴奏孤零零地响。
这就像一支乐队演出,钢琴手提前下班了,其他人还在台上坚持营业。
我把问题交给 AI,让它检查生成文件的各个部分。
查了一圈,终于发现了原因。
这个技能有个很不起眼的缺陷:它知道每个音符要弹多久,却不知道有些时候应该什么都不弹。
听起来很荒唐,但确实如此。
比如一段旋律应该是:
弹三个音,停一拍,再弹三个音。
如果工具只记录「弹什么音、弹多久」,却不记录「什么时候停」,后面的音符就会自动往前挪。
一开始可能听不出明显问题,等歌曲结构一变化,前后的时间就对不上了。
原来 AI 也会一本正经地犯错,而且错得还挺有道理。
我让 AI 修改了这个技能,给音符补上了明确的时间位置。改完重新生成,旋律和伴奏终于重新对齐。
这次我没有只看文件能不能生成,而是把整首歌重新检查了一遍。
一个小坑填平了。
但我还不满足。
#四、从钢琴独奏,到一支六人乐队
只有钢琴,总觉得少了点味道。
既然 AI 能改,那就继续加东西。
先加弦乐,让它在后面铺着和声,不要抢钢琴的风头。
再加钢片琴,只在过渡段和结尾出现,给音乐添一点清亮的感觉。
听了一遍,还是觉得缺少节奏。
「再加个军鼓。」
AI 改完,我一听,发现效果不对。继续查,才知道原来的技能在处理乐器时有个限制:它没有正确照顾到专门用于打击乐的通道。
好吧,又改。
接着加低音,让整首曲子听起来更有支撑感。
最后再让小号在后半段加入,把主旋律重新吹一遍,结尾和钢片琴一起收住。
这样一来,整首歌终于有了层次。
最终文件放在这里:
ZUN_Festival_Ensemble_Full.mid
最终版本有六个声部:两轨钢琴、弦乐、军鼓、低音和小号。速度 240 BPM,全长 44 秒。
每次修改之后,我都会让 AI 检查生成结果,再实际试听。不是它说「完成了」就算完成,而是要听起来对,结构也对,才算过关。
从一份简单的旋律,到一首有铺垫、有变化、有结尾的小曲子,整个过程就是不断提出要求、试听、发现问题、再修改。
我没有先学会怎么写 MIDI 生成程序,也没有自己从头敲出一大堆代码。
但我知道自己想听到什么,也能判断结果是不是自己想要的。
这就够开始了。
#五、顺手给技能作者提了个醒
两个 Bug 修完,我突然想到:既然这不是我自己写的技能,别人用的时候,会不会也遇到同样的问题?
于是我去项目仓库看了一眼。
整个项目只有 25 颗星,挺冷清的。我先检查有没有人报告过类似问题,再把自己遇到的情况、重现方法和修改方案整理出来,给作者发了一个 issue。
简单说,就是告诉作者:
「你的工具在某些情况下会把旋律的时间弄乱。我这里已经找到原因,也试着修了一下。下面是具体情况,你可以参考。」
发出去的时候,我还特意说明,自己的修改方案尚未经过项目作者验证。
以前看到开源项目,我大概只会下载下来用。遇到问题,要么放弃,要么等别人解决。
这次不一样。
AI 帮我读懂了相关代码,帮我找问题,也帮我整理报告。最后,我把一个自己实际遇到的问题反馈给了项目作者。
至于作者最后会不会采纳,是另一回事。至少这一次,我不只是一个等着工具变好的人,也能给工具的改进添上一点东西。
本来想写首歌,顺便还参与了一下开源项目。
这算不算意外收获?
#六、没想到,真正难缠的是二十多年前的老 MIDI
本来以为故事到这里就该结束了。
结果我又从网上下载了一首《众神眷恋的幻想乡》,准备继续折腾。
这是一份很有年代感的 MIDI 文件。三个音轨,几百上千个音符,连里面的乐器说明都带着老 Windows 时代的气息。
我把文件交给工具读取。
报错。
再试,还是报错。
用播放器打开,前面还能听,播放到两三秒左右,突然冒出一大片刺耳的噪音。
好家伙,刚修完自己的歌,现在还得给老前辈看病。
我让 AI 帮忙检查文件。最初怀疑是下载不完整,检查之后发现文件的整体结构没有问题;又怀疑音符数据损坏,继续检查,也没找到问题。
折腾一圈,终于发现,毛病出在音乐里的另一类信息上。
MIDI 不只记录什么时候弹什么音,还会记录音量、延音踏板等演奏控制信息。
这份老文件里,有些控制数据不太正常:音量设置超出了合理范围,而延音踏板更离谱——它被打开之后,就一直没有正常松开。
你可以想象一下,钢琴演奏时,脚一直踩着延音踏板,前面弹过的音不会及时消失,后面的音又不断叠上来。
刚开始还好,越弹越混,最后所有声音糊成一团。
这就解释了为什么文件开头能听,过了两三秒却开始炸成噪音。
找到原因后,我让 AI 把有问题的控制数据修正,再保存成新的 MIDI 文件。
重新打开。
能播了。
再试听,之前那片恼人的噪音消失了,整首曲子终于恢复正常。
修复版也放出来了:
有需要的朋友可以拿去试听。
当然,这份文件的问题不代表所有老 MIDI 都有相同毛病。只能说,这次正好让我碰上了一个特别会折腾人的案例。
#七、原来普通人也能这样玩 AI
回头看这一整个下午,起点真的很小。
我只是想让 AI 把一段熟悉的旋律变成一首完整的 MIDI 曲子。
后来,我让它加快速度、调整结构、增加乐器;发现旋律提前结束,就让它排查原因;遇到工具自身的缺陷,就让它修改;修完之后,还顺手把问题反馈给了开源项目作者。
最后又拿一份几十年前的老文件开刀,把一首被噪音毁掉的曲子救了回来。
我没有因为这件事突然变成音乐软件开发专家,也不敢说自己已经搞懂了 MIDI 的全部原理。
但我确实完成了一件原本不知道该怎么下手的事。
这大概就是我喜欢氛围编程的原因。
你不必一开始就知道每一步该怎么做,但你得知道自己想做成什么样。
听起来不对,就指出哪里不对;结果不符合预期,就继续追问;发现问题,就让 AI 帮你查清楚,再验证修改有没有用。
AI 并不是每次都能一次做对。有时候它会犯错,有时候它使用的工具本身就有缺陷,有时候一个看似简单的问题,也得来回折腾好几轮。
但以前,遇到这些问题,我可能连第一步都迈不出去。
现在,我至少可以先把想法做出来,再和 AI 一起解决路上的问题。
所以,如果你也有一个想折腾的小念头,不妨试试。
不必先学完一门编程语言,不必先把所有技术名词弄懂,也不必等到自己什么都会了才开始。
先做一个能用的版本。
不好听,就改到好听。
出了问题,就追着它查。
说不定你本来只想写首歌,最后却顺手修复了一段被时间遗忘的音乐。
至于我?
我现在只想问一句:
下一次,我还能指使 AI 折腾点什么? ( ̄▽ ̄)/
评论