“计算机创作”的版本间的差异
(创建页面,内容为“{{TOCright}} ==通过程序输出音频的概述== 通过程序将一段乐谱输出成音频时,通常需要先将乐谱保存为midi格式,再根据需求转…”) |
|||
第5行: | 第5行: | ||
但是,midi文件的格式较为复杂,直接通过程序将一段音符输出为midi格式存在一定的困难。因此,我们考虑使用现成的模块mido来完成这个任务。 | 但是,midi文件的格式较为复杂,直接通过程序将一段音符输出为midi格式存在一定的困难。因此,我们考虑使用现成的模块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) 来实现。 |
2023年3月5日 (日) 12:03的版本
百科首页 | 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 值可以更改。