AI赋能音乐创作,自动生成乐谱,轻松合成并播放音乐新体验

AI自动生成乐谱、合成并播放音乐是一个涉及多个步骤的过程,以下是一个简化的流程:
### 1. 数据收集与处理 - "收集数据":从大量的音乐作品中收集数据,包括不同风格、流派和作曲家的作品。 - "特征提取":提取音乐数据中的特征,如旋律、和声、节奏等。
### 2. 模型训练 - "选择模型":选择合适的AI模型,如深度学习中的循环神经网络(RNN)、长短期记忆网络(LSTM)或生成对抗网络(GAN)。 - "训练模型":使用收集到的音乐数据进行训练,让模型学习音乐的结构和风格。
### 3. 乐谱生成 - "生成旋律":根据音乐风格和旋律模式,AI生成旋律线。 - "生成和声":根据旋律线,AI生成和声部分。 - "生成节奏":根据旋律和和声,AI生成节奏部分。
### 4. 合成音乐 - "音色选择":选择合适的音色来模拟乐器或人声。 - "音频合成":使用AI算法将生成的旋律、和声和节奏合成音频。
### 5. 播放音乐 - "音频播放":将合成的音频文件播放出来。
以下是一个简单的示例,展示了如何使用Python中的`mido`和`pretty_midi`库来生成和播放简单的旋律

相关阅读延伸:AI 自动生成乐谱、合成并播放音乐

我曾经在写 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();

运行效果:

发布于 2025-07-09 14:15
收藏
1
上一篇:吉他手必看,防白嫖指南!优雅劝退“顺手教一下”的秘诀解析 下一篇:不花一分钱!吹号自测肩部灵活度,打工人必备的肩颈保健技能