TwilightRain | AI写歌,怒怼老资历MIDI

AI写歌,怒怼老资历MIDI

约 3512 字 · 阅读约 9 分钟

我本来只想让 AI 帮我写首歌,没想到最后连二十多年前的老 MIDI 都给修了。

事情的起因很简单:突然想试试,能不能让 AI 直接给我写一首 MIDI 曲子。

注意,是 MIDI,不是那种点一下按钮就生成一首歌的 AI 音乐。我要的是一个真正的音乐文件,能在里面改音符、换乐器、调节奏。

我不会专门写音乐软件,也没打算为了这件事先学一遍编程。

既然现在有 AI,那就让它干呗。

然后,我拥有了一个充实得过分的下午。


一、先找个会写歌的 AI 助手

我本地已经装了 27 个 AI 技能,翻了一圈,没有一个能直接生成 MIDI。

于是去技能商店搜了一下。

结果看起来挺热闹,仔细一看却不是我要的。有的只能把 MIDI 转成音频,有的负责把人声变成 MIDI,还有的虽然能生成音乐,给出来的却是普通音频文件。

我需要的是能直接写出 MIDI 的。

最后找到一个冷门技能 tubone24/midi-agent-skill,安装量只有 16。它的介绍倒是很对口:能用乐理和各种乐器生成 MIDI 文件,而且不需要调用付费 API。

tubone24/midi-agent-skill
安装量只有 16 的那个 MIDI 生成技能,后来我给它提过 issue

先检查文件,再安装。让 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 文件。

重新打开。

能播了。

再试听,之前那片恼人的噪音消失了,整首曲子终于恢复正常。

修复版也放出来了:

touhou_fixed.mid

有需要的朋友可以拿去试听。

当然,这份文件的问题不代表所有老 MIDI 都有相同毛病。只能说,这次正好让我碰上了一个特别会折腾人的案例。


七、原来普通人也能这样玩 AI

回头看这一整个下午,起点真的很小。

我只是想让 AI 把一段熟悉的旋律变成一首完整的 MIDI 曲子。

后来,我让它加快速度、调整结构、增加乐器;发现旋律提前结束,就让它排查原因;遇到工具自身的缺陷,就让它修改;修完之后,还顺手把问题反馈给了开源项目作者。

最后又拿一份几十年前的老文件开刀,把一首被噪音毁掉的曲子救了回来。

我没有因为这件事突然变成音乐软件开发专家,也不敢说自己已经搞懂了 MIDI 的全部原理。

但我确实完成了一件原本不知道该怎么下手的事。

这大概就是我喜欢氛围编程的原因。

你不必一开始就知道每一步该怎么做,但你得知道自己想做成什么样。

听起来不对,就指出哪里不对;结果不符合预期,就继续追问;发现问题,就让 AI 帮你查清楚,再验证修改有没有用。

AI 并不是每次都能一次做对。有时候它会犯错,有时候它使用的工具本身就有缺陷,有时候一个看似简单的问题,也得来回折腾好几轮。

但以前,遇到这些问题,我可能连第一步都迈不出去。

现在,我至少可以先把想法做出来,再和 AI 一起解决路上的问题。

所以,如果你也有一个想折腾的小念头,不妨试试。

不必先学完一门编程语言,不必先把所有技术名词弄懂,也不必等到自己什么都会了才开始。

先做一个能用的版本。

不好听,就改到好听。

出了问题,就追着它查。

说不定你本来只想写首歌,最后却顺手修复了一段被时间遗忘的音乐。

至于我?

我现在只想问一句:

下一次,我还能指使 AI 折腾点什么? ( ̄▽ ̄)/

评论