python 随机生成一段旋律
一直想能不能让计算机也能像音乐家一样作曲?但是自己知识有限,不能写出这样宏大的工程,所以就想能不能随机生成一段旋律呢?生成后的效果如何呢?于是就开始coding.
直接上代码:
#coding:utf-8
'''
作者:一江叶影
日期:2020.7.17
标题:随机生成一段旋律
'''
import numpy as np#调用np产生随机数
import wave#保存输出得旋律得函数库
framerate=44100#设置音频采样率
def can_shu_she_ding():#参数设定函数
shu_du=input("请输入旋律的速度(bpm):")
jie_pai=input("请输入每小节有多少拍:")
xiao_jie=input("请输入希望生成几个小节的旋律:")
return int(shu_du),int(jie_pai),int(xiao_jie)
def pin_nv(f,framerate):#得到do ,re ,mi ...等音阶对应的声音频率
num=int(framerate/f)#求相应频率一个周期对应的采样数
frame=[]#初始化一个空列表
for i in range(num):#记录半个周期的电平信号
a=b'255'
frame.append(a)
for i in range(num):#记录半个周期的无电平信号
a=b'0'
frame.append(a)
print("frame=",frame)
return frame#返回一个周期的频率对应的bytes
def get_yin_jie(num,framerate):#随机得到音阶得函数
if num==1:
frame=pin_nv(261.6,framerate)
return frame
if num==2:
frame=pin_nv(293.6,framerate)
return frame
if num==3:
frame=pin_nv(329.6,framerate)
return frame
if num==4:
frame=pin_nv(349.2,framerate)
return frame
if num==5:
frame=pin_nv(392.0,framerate)
return frame
if num==6:
frame=pin_nv(440.0,framerate)
return frame
if num==7:
frame=pin_nv(493.0,framerate)
return frame
path="D:/360MoveData/Users/Administrator/Desktop/AI音乐/test.wav"#我将生成的旋律放在D盘,可灵活改写
song=wave.open(path,'wb')#打开文件
song.setnchannels(1)#设置声道数,单身到道
song.setsampwidth(2)#设置码率,2个字节
song.setframerate(framerate)#设置采样频率44.1KHZ
comtype="NONE"#默认
compname="not compressed"#默认
shu_du,jie_pai,xiao_jie=can_shu_she_ding()#调用初始化函数设置参数
for j in range(xiao_jie*jie_pai):#对每一个节拍循环操作,共xiao_jie*jie_pai个节拍
print("第%d小节;"%(j/jie_pai))#为了跟踪程序运行得打印函数,可以不加
frame=get_yin_jie(np.random.randint(1,8),framerate)#取一个音阶得单周期频率
rand=int(60/shu_du*framerate/len(frame))#计算每拍有多少个音阶频率
for k in range(rand):
for i in frame:
song.writeframes(i)#写入文件夹
print("旋律输出成功")
song.close()#关闭文件夹
算法的核心思想是:
.WAV格式的文件的数据是比特流,其中有几个重要的参数:采样率,声道,码率,音频播放器播放音频时是逐桢播放的;一般的wav音频文件是双声道的,这样听起来比较真实,而单声道就比较好进行处理,它的每一帧是2Byte,这样我们就可以一帧一帧的生成,最后合起来就是一个音频文件了;
但是随即生成的音频听起来就是噪声,类似以前显像管电视机发出的雪花的声音,于是要对写入的每一帧进行调整;我们知道乐音是有规律的振动,七个音阶是有固定频率范围的,所以只需要生成音阶对应频率的帧序列,并将这些桢序列持续时间、强度、组合方式进行随机调整,就可以随机产生一组旋律了。
这样产生的旋律效果不是很好,节奏感、强弱变化较弱,而且随机的,也没有风格可言,所以还是可以继续改进。初步想法是用神经网络训练一下,可能可以生成比较好听的旋律,这一方面我还要继续学习;
链接:https://editor.csdn.net/md/?not_checkout=1.
图片: