“计算机创作”的版本间的差异

来自人工智能助力教育知识百科
跳转至: 导航搜索
(创建页面,内容为“{{TOCright}} ==通过程序输出音频的概述== 通过程序将一段乐谱输出成音频时,通常需要先将乐谱保存为midi格式,再根据需求转…”)
 
音乐音色、速度等控制信息的设置
 
(未显示同一用户的4个中间版本)
第5行: 第5行:
 
但是,midi文件的格式较为复杂,直接通过程序将一段音符输出为midi格式存在一定的困难。因此,我们考虑使用现成的模块mido来完成这个任务。
 
但是,midi文件的格式较为复杂,直接通过程序将一段音符输出为midi格式存在一定的困难。因此,我们考虑使用现成的模块mido来完成这个任务。
  
安装方法:在命令行中输入 pip3 install mido 或 python3 -m pip install mido 。
+
安装方法:
 +
 
 +
在命令行中输入 pip3 install mido 或 python3 -m pip install mido 。
  
 
==通过程序生成一个音符实例==
 
==通过程序生成一个音符实例==
第26行: 第28行:
 
在这段代码中,为mid对象添加一个音符的操作是在 mido.Message('note_on', <......>) 和 mido.Message('note_off', <......>) 这两行实现的。值得说明的是这个 Message 函数的几个参数
 
在这段代码中,为mid对象添加一个音符的操作是在 mido.Message('note_on', <......>) 和 mido.Message('note_off', <......>) 这两行实现的。值得说明的是这个 Message 函数的几个参数
  
    type 这个参数确定信号的类型。其中 note_on 表示一个音符的开始,note_off 表示一个音符的结束。
+
type : 这个参数确定信号的类型。其中 note_on 表示一个音符的开始,note_off 表示一个音符的结束。
    note 这个参数确定音符的音高。60代表中央C,每增加12,音高升高一个八度。
+
note : 这个参数确定音符的音高。60代表中央C,每增加12,音高升高一个八度。
    velocity 这个参数确定音符的音量。0表示静音,127表示最大音量。
+
velocity : 这个参数确定音符的音量。0表示静音,127表示最大音量。
    time 这个参数确定消息所在的时间。这个时间以tick为单位,而在mido的默认配置中,1拍中有480个tick。所以要想生成一个长度为1拍的音符,应该设置其time值为480,而不是1。
+
time : 这个参数确定消息所在的时间。这个时间以tick为单位,而在mido的默认配置中,1拍中有480个tick。所以要想生成一个长度为1拍的音符,应该设置其time值为480,而不是1。
 
         每条消息中,time值的含义是这条消息与上一条消息的时间差,而不是一条消息在乐曲中的绝对时间。
 
         每条消息中,time值的含义是这条消息与上一条消息的时间差,而不是一条消息在乐曲中的绝对时间。
 
         想要获取每拍中tick的数量,可以通过 print(mid.ticks_per_beat) 来实现。
 
         想要获取每拍中tick的数量,可以通过 print(mid.ticks_per_beat) 来实现。
 
         上面的 mid.ticks_per_beat 值可以更改。
 
         上面的 mid.ticks_per_beat 值可以更改。
 +
 +
==音乐音色、速度等控制信息的设置==
 +
一个完整的乐谱中,除了有音符组合以外,还应该有一些整体的控制信息,如速度(bpm)、歌名、音色等。这些信息可以通过输入如下代码在程序中进行配置。
 +
 +
====1.设置音色====
 +
 +
设置一个音轨的音色的代码是 track.append(mido.Message('program_change', program=1, time=0))。
 +
 +
其中,program 这个参数确定了这个音轨的音色。
 +
 +
如果想要知道 program 的值和具体乐器的对照关系,可以自行搜索“midi音色表”。
 +
 +
除了打击乐通道以外,音色的默认值为Piano 1。
 +
 +
====2.设置速度====
 +
 +
设置乐曲速度的代码是 track.append(mido.MetaMessage('set_tempo', tempo=500000, time=0))。
 +
 +
其中,tempo 这个参数确定了乐曲的速度。
 +
 +
tempo 值的含义是每一拍为多少微秒。500000表示每一拍为0.5秒,即每分钟120拍。bpm和tempo的关系为bpm = 60000000 / tempo
 +
 +
====3.设置音轨名称====
 +
 +
设置音轨名称的代码为 track.append(mido.MetaMessage('track_name', name='Piano', time=0))。
 +
 +
其中,name这个参数确定了音轨的名称。
  
 
==参考资料==
 
==参考资料==
链接:https://www.jianshu.com/p/f45e0da1416e
+
链接:简书https://www.jianshu.com/p/f45e0da1416e

2023年3月5日 (日) 12:10的最新版本

百科首页 | 3D虚拟世界 | 音乐与人工智能 | 人工智能机器人 | 关于我们 | 网站首页

通过程序输出音频的概述

通过程序将一段乐谱输出成音频时,通常需要先将乐谱保存为midi格式,再根据需求转化为其他格式的音频。因为midi格式存储的是音符、控制指令等信息,相比于其他常见的音频格式,如wav、mp3、ogg等,它和原始乐谱更为贴近。

但是,midi文件的格式较为复杂,直接通过程序将一段音符输出为midi格式存在一定的困难。因此,我们考虑使用现成的模块mido来完成这个任务。

安装方法:

在命令行中输入 pip3 install mido 或 python3 -m pip install mido 。

通过程序生成一个音符实例

下面这段Python代码实现了生成一个长度为1拍、音量为75%的中央C音符的功能,并将它以mid文件的形式输出。

import mido


mid = mido.MidiFile()
track = mido.MidiTrack()
mid.tracks.append(track)

track.append(mido.Message('note_on', note=60, velocity=96, time=0))
track.append(mido.Message('note_off', note=60, velocity=96, time=480))

mid.save('a1.mid')

在这段代码中,为mid对象添加一个音符的操作是在 mido.Message('note_on', <......>) 和 mido.Message('note_off', <......>) 这两行实现的。值得说明的是这个 Message 函数的几个参数

type : 这个参数确定信号的类型。其中 note_on 表示一个音符的开始,note_off 表示一个音符的结束。
note : 这个参数确定音符的音高。60代表中央C,每增加12,音高升高一个八度。
velocity : 这个参数确定音符的音量。0表示静音,127表示最大音量。
time : 这个参数确定消息所在的时间。这个时间以tick为单位,而在mido的默认配置中,1拍中有480个tick。所以要想生成一个长度为1拍的音符,应该设置其time值为480,而不是1。
       每条消息中,time值的含义是这条消息与上一条消息的时间差,而不是一条消息在乐曲中的绝对时间。
       想要获取每拍中tick的数量,可以通过 print(mid.ticks_per_beat) 来实现。
       上面的 mid.ticks_per_beat 值可以更改。

音乐音色、速度等控制信息的设置

一个完整的乐谱中,除了有音符组合以外,还应该有一些整体的控制信息,如速度(bpm)、歌名、音色等。这些信息可以通过输入如下代码在程序中进行配置。

1.设置音色

设置一个音轨的音色的代码是 track.append(mido.Message('program_change', program=1, time=0))。

其中,program 这个参数确定了这个音轨的音色。

如果想要知道 program 的值和具体乐器的对照关系,可以自行搜索“midi音色表”。

除了打击乐通道以外,音色的默认值为Piano 1。

2.设置速度

设置乐曲速度的代码是 track.append(mido.MetaMessage('set_tempo', tempo=500000, time=0))。

其中,tempo 这个参数确定了乐曲的速度。

tempo 值的含义是每一拍为多少微秒。500000表示每一拍为0.5秒,即每分钟120拍。bpm和tempo的关系为bpm = 60000000 / tempo

3.设置音轨名称

设置音轨名称的代码为 track.append(mido.MetaMessage('track_name', name='Piano', time=0))。

其中,name这个参数确定了音轨的名称。

参考资料

链接:简书https://www.jianshu.com/p/f45e0da1416e