我曾经在写 aardio 的 sys.midiOut 库的时候设计过一种可编程的记谱规则,用于通过编程代码合成音乐。例如两只老虎记为 `1__,2__,3__,1__` ,音符后面的下划线就表示时长。
今天我们尝试一下能否让 AI 理解这个规则并生成乐谱,合成并播放音乐。
首先,我们需要使用 aardio 的专用 AI 接口提供的大模型,因为接入了完整的 aardio 知识库,AI 可以获取到相关的记谱规则。
然后我测试了一下,AI 成功生成了符合要求的代码,让我惊讶地是除了实现桌面歌词,编程记谱,它还运用了多线程合奏,三个线程同时播放乐曲、海浪声,鸟鸣声。运行了一下,效果非常好。
我在提示词里并没有要求 AI 使用多线程,而且 aardio 里原来也并没有相关的范例。 主要是原来我自己试过一次多线程合奏没成功,以为是哪里理解错了一直也没有再去试,没想到 AI 生成的代码一次性成功了。
当然,不是每个大模型都能做到这一点。谁行谁不行,大家可以自己试试。
下面是 AI 生成的 aardio 代码:
import sys.midiOut;
import win.util.lyric;
// 创建桌面歌词
var lyric = win.util.lyric();
lyric.show();
// 打开 MIDI 播放设备
var midiOut = sys.midiOut();
midiOut.log = function(v) {
lyric.text = v;//显示字幕
};
// 创建工作线程播放鸟鸣效果
thread.invoke(
function(midiOut) {
// 指定不同的通道以实现合奏
midiOut.channel = 3;
// 选择乐器为鸟鸣音效(乐器编号 123)
midiOut.changeInstrument(123);
// 播放鸟鸣效果,音量适中,节奏较快
midiOut.setVelocity(52);
//鸟鸣 - 森林的生机
midiOut.play("
delay(1000), 5'_,6'_,5'_,
delay(500), 6'_,5'_,6'_,
delay(800), 5'_,6'_,5'_,
delay(1200), 6'_,5'_,6'_,
delay(600), 5'_,6'_,5'_,
delay(1000), 6'_,5'_,6'_,
delay(1500), 5'_,6'_,5'_,
delay(2000), 森林晨曦结束,
","C5",100); // 高音区,延时单位短促
}, midiOut
);
// 伴奏
thread.invoke(
function(midiOut) {
midiOut.channel = 2;
midiOut.changeInstrument(122);
midiOut.setVelocity(50);
//伴奏 - 海浪声,
midiOut.play("
1____,5____,
1____,5____,
3____,6____,
1____,5____,
3____,6____,
1____,5____,
3____,5'____,
1____,1____,
","C3",500);
}, midiOut
);
// 在主线程中播放音乐,选择钢琴
midiOut.changeInstrument(0);
// 演奏乐曲,必须先运行其他线程,因为 midiOut.play 函数本身是阻塞运行的。
midiOut.play("
清晨的第一缕阳光,
1__,2__,3__,5__,
3__,2__,1__,5_,
森林中的鸟鸣,
6__,5__,3__,2__,
1__,2__,3__,1__,
微风拂过树梢,
5__,6__,5__,3__,
2__,1__,2__,5_,
晨雾渐渐散去,
3__,5__,6__,5'__,
3__,2__,1__,1__,6000
","C4",300);
//关闭窗口
lyric.close();
运行效果: