利用Matlab的声音函数和音乐理论知识演奏音乐——探索人工智能音乐生成的奇妙之旅

CSDN文章篇一:利用Matlab的声音函数和音乐理论知识演奏音乐——探索人工智能音乐生成的奇妙之旅

在这个高科技的世界里,音乐的世界也并没有被孤立出来。今天,我将向您介绍一种非常特别的方法,将计算机编程与音乐相结合,以此为您展示一种通过代码来演奏音乐的全新方式。这可能会打开您对音乐世界的全新认识。

我们的方法主要涉及到两个知识领域:一是Matlab的声音函数;二是十二平均律的乐理知识。在这篇文章中,我将逐步为您详解如何利用这些工具和知识来生成音乐。在介绍之前,我必须先承认,我并不是这方面的专家,我的知识和经验可能有限,但我希望我的分享能够对您有所启发,并激发您深入探索这个领域的热情。

源码下载

1. Matlab的sound函数

首先,我们需要了解Matlab的声音函数。Matlab是一种高级编程语言和交互式环境,用于进行数值计算、可视化和编程。在Matlab中,有一个叫做sound的函数,它可以播放指定的声音。

函数原型为:

sound(y,Fs)

其中,y是声音信号,Fs是采样频率。

这是一个非常简单易用的函数,只需要输入适当的参数,即可实现声音的播放。在接下来的内容中,我将告诉您如何使用这个函数来生成音乐。

2. 十二平均律的乐理知识

在音乐理论中,十二平均律是一种调律方法,即在一个八度内平均分配12个半音。这就是我们日常所说的十二个音阶。这12个音阶是相对于一个基准音(通常为A4,频率为440Hz)计算得来的。他们的频率计算公式如下:

f = 440 * 2 ^ ((n - 49) / 12)

在这个公式中,n表示的是音的序数。例如,A4的序数为49,A#4(或Bb4)的序数为50,B4的序数为51,等等。

如果我们结合上述的sound函数和这个频率计算公式,我们就可以在Matlab中生成任何音阶的声音了。

为了验证这个想法,我尝试在Matlab中生成了一段音乐。我选择了一首我非常熟悉的歌曲作为实验对象,那就是我的母校——中大的校歌。我根据本科生手册中的乐谱进行了扒谱,同时,我也配了一些和弦,如C,F和G7,以使音乐听起来更加饱满。

为了实现这个目标,我首先定义了一个函数来生成各个音符的声音,代码如下:

function tone = gen_tone(n, duration, Fs)
    % 根据十二平均律计算频率
    f = 440 * 2 ^ ((n - 49) / 12);
    % 创建时间向量
    t = 0 : 1/Fs : duration;
    % 生成音调
    tone = sin(2 * pi * f * t);
end

在这个函数中,n是音的序数,duration是音符的持续时间,Fs是采样频率。这个函数的返回值是一个音调的向量。

然后,我使用这个函数和sound函数来生成音乐:

% 定义采样频率
Fs = 8192;

% 扒谱
score = [52, 52, 53, 55, 55, 53, 52, 50, 48, 48, 50, 52, 52, 50, 50, ...
         52, 52, 53, 55, 55, 53, 52, 50, 48, 48, 50, 52, 50, 48, 48];

% 定义每个音符的持续时间
durations = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
             1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] / 2;

% 生成音乐
music = [];
for i = 1:length(score)
    tone = gen_tone(score(i), durations(i), Fs);
    music = [music, tone];
end

% 播放音乐
sound(music, Fs);

3. 和弦的配合

在前面的例子中,我们生成了单音符的音乐,但音乐的魅力远不止于此。现在,我们将尝试添加和弦以丰富音乐的层次感。在乐理中,和弦是由三个或更多个音符同时演奏的。根据音乐的节奏和旋律,不同的和弦会给人不同的感觉。在这个例子中,我选择了C,F和G7这三个和弦来陪衬旋律。

首先,让我们定义一些函数来生成和弦:

function chord = gen_chord(n, duration, Fs)
    % 定义和弦中的音符
    if n == 1  % C和弦
        notes = [40, 44, 47];  % C, E, G
    elseif n == 2  % F和弦
        notes = [41, 45, 48];  % F, A, C
    elseif n == 3  % G7和弦
        notes = [43, 47, 50, 54];  % G, B, D, F
    end

    % 生成和弦
    chord = zeros(1, round(duration * Fs));
    for i = 1:length(notes)
        tone = gen_tone(notes(i), duration, Fs);
        chord = chord + tone;
    end
end

接下来,我们再次用sound函数播放音乐,这次我们将在每个音符之间添加和弦:

% 定义采样频率
Fs = 8192;

% 扒谱
score = [52, 52, 53, 55, 55, 53, 52, 50, 48, 48, 50, 52, 52, 50, 50, ...
         52, 52, 53, 55, 55, 53, 52, 50, 48, 48, 50, 52, 50, 48, 48];

% 定义每个音符的持续时间
durations = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
             1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] / 2;

% 定义和弦序列
chords = [1, 1, 2, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
          1, 1, 2, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1];

% 生成音乐
music = [];
for i = 1:length(score)
    tone = gen_tone(score(i), durations(i), Fs);
    chord = gen_chord(chords(i), durations(i), Fs);
    music = [music, tone + chord];
end

% 播放音乐
sound(music, Fs);

现在,我们的音乐已经有了旋律和和弦的伴奏,听起来更加丰富和动听了。但是,我们是否能够做得更好呢?在下一节,我将介绍如何使用专家系统来生成随机音乐。

4. 专家系统的音乐生成

专家系统是一种模拟人类专家解决问题的智能系统。在音乐生成中,我们可以使用专家系统来模拟音乐家或作曲家创作音乐的过程。在这个例子中,我将为您展示如何编写一个专家系统,用于生成随机音乐。

首先,让我们定义一些基本的乐理规则。在西方音乐中,一个最基本的规则是,音乐应该始终回到主音。例如,如果一段音乐是C大调,那么它通常会以C音结束。另一个基本的规则是,音乐的旋律通常会在一个小的音程内进行跳跃。为了模拟这些规则,我们可以创建一个概率矩阵,用于描述从一个音符转移到另一个音符的概率。

接下来,我们编写一个函数,根据这些规则生成随机音乐:

function music = random_music(length, Fs)
    % 定义概率转移矩阵
    P = [0.2, 0.6, 0.2, 0, 0, 0, 0, 0.1, 0, 0, 0, 0;  % C
         0.1, 0.2, 0.6, 0.1, 0, 0, 0, 0, 0, 0, 0, 0;  % D
         0, 0.1, 0.2, 0.6, 0.1, 0, 0, 0, 0, 0, 0, 0;  % E
         0, 0, 0.1, 0.2, 0.6, 0.1, 0, 0, 0, 0, 0, 0;  % F
         0, 0, 0, 0.1, 0.2, 0.6, 0.1, 0, 0, 0, 0, 0;  % G
         0, 0, 0, 0, 0.1, 0.2, 0.6, 0.1, 0, 0, 0, 0;  % A
         0, 0, 0, 0, 0, 0.1, 0.2, 0.6, 0.1, 0, 0, 0;  % B
         0.6, 0.1, 0, 0, 0, 0, 0.1, 0.2, 0, 0, 0, 0;  % C
         0, 0, 0, 0, 0, 0, 0, 0.1, 0.2, 0.6, 0.1, 0;  % D
         0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.2, 0.6, 0.1;  % E
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1, 0.2, 0.6;  % F
         0.6, 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0.1, 0.2]; % G

    % 生成随机音乐
    music = [];
    note = randi([1, 12]);  % 随机选择一个初始音符
    for i = 1:length
        duration = rand(1) + 0.5;  % 随机选择一个持续时间
        tone = gen_tone(note, duration, Fs);
        music = [music, tone];
        note = find(rand(1) <= cumsum(P(note, :)), 1);  % 根据转移矩阵选择下一个音符
    end
end

最后,我们使用sound函数播放我们的随机音乐:

% 定义采样频率
Fs = 8192;

% 生成随机音乐
music = random_music(100, Fs);

% 播放音乐
sound(music, Fs);

就是这样!现在,我们已经用Matlab和专家系统创建了一段随机音乐。每次运行此代码时,都会生成不同的音乐。这真是一个既有趣又富有挑战性的项目。

这是对使用Matlab进行音乐生成的完整探讨,希望对您有所帮助。如果有任何疑问或想要讨论更多相关主题,请随时与我联系。祝您编程愉快!

猜你喜欢

转载自blog.csdn.net/qq_38334677/article/details/131179338