今天我们学习了用python写一个校歌,
import wave
import math
import struct
ff = wave.open("henu.wav", "w")#打开一个名为henu.wav的文件,如果没有自己写一个
ff.setframerate(8000)#频率
ff.setnchannels(1)#一个声道
ff.setsampwidth(2)#音宽
def wv(t=0, f=0, v=0.5, wf=ff, sr=8000):#设置一个函数,设置变量
'''
t:写入时长
f:声音频率
v:音量
wf:一个可以写入的音频文件
sr:采样率
'''
tt = 0
dt = 1.0 / sr #每8000分之一取一次
while tt <= t:
s = math.sin(tt * math.pi * 2 * f) * v * math.pow(math.e, -2.5 * tt) * 32768 # 采样,调节音量,映射到[-2^15,2^15)
s = int(s) #转化为整型数
fd = struct.pack("h", s) # 转换成8bit二进制数据
wf.writeframes(fd) # 写入音频文件
tt += dt # 时间流逝
note = {"-": 0, "0": 0, "1---": 49, "1#---": 52, "2b---": 52, "2---": 55, "2#---": 58, "3b---": 58, "3---": 62,
"4---": 65, "4#---": 69, "5b---": 69, "5---": 73, "5#---": 78, "6b---": 78, "6---": 82, "6#---": 87,
"7b---": 87, "7---": 92, "1--": 98, "1#--": 104, "2b--": 104, "2--": 110, "2#--": 117, "3b--": 117, "3--": 123,
"4--": 131, "4#--": 139, "5b--": 139, "5--": 147, "5#--": 156, "6b--": 156, "6--": 165, "6#--": 175,
"7b--": 175, "7--": 185, "1-": 196, "1#-": 208, "2b-": 208, "2-": 220, "2#-": 233, "3b-": 233, "3-": 247,
"4-": 262, "4#-": 277, "5b-": 277, "5-": 294, "5#-": 311, "6b-": 311, "6-": 330, "6#-": 349, "7b-": 349,
"7-": 370, "1": 392, "1#": 415, "2b": 415, "2": 440, "2#": 466, "3b": 466, "3": 494, "4": 523, "4#": 554,
"5b": 554, "5": 587, "5#": 622, "6b": 622, "6": 659, "6#": 698, "7b": 698, "7": 740, "1+": 784, "1#+": 831,
"2b+": 831, "2+": 880, "2#+": 932, "3b+": 932, "3+": 988, "4+": 1047, "4#+": 1109, "5b+": 1109, "5+": 1175,
"5#+": 1245, "6b+": 1245, "6+": 1319, "6#+": 1397, "7b+": 1397, "7+": 1480, "1++": 1568, "1#++": 1661,
"2b++": 1661, "2++": 1760, "2#++": 1865, "3b++": 1865, "3++": 1976, "4++": 2093, "4#++": 2217, "5b++": 2217,
"5++": 2349, "5#++": 2489, "6b++": 2489}
#对照这首歌的谱子打
n = [
"5-", "1", "1", "1", "7-",
"1", "3", "3", "3", "2",
"5", "5", "6", "5",
"4", "3", "2", "-",
"3", "2", "1", "7-", "6-",
"7-", "1", "2", "3", "4",
"6", "5", "4", "3",
"2", "3", "1", "5", "-",
"2", "3", "4", "4",
"6", "6", "5", "4", "3",
"4", "2", "3", "5",
"2", "3", "2", "7-", "5-",
"1", "3", "5", "6", "5", "-",
"6", "4", "2", "-",
"2", "3", "4", "3 ","2", "-",
"6-", "7-", "1", "-"
]
#调整每个音所持续的时间
tm = [
2, 2, 2, 1, 1,
2, 2, 2, 1, 1,
3, 1, 2, 2,
2, 2, 2, 2,
3, 1, 1, 1, 2,
3, 1, 1, 1, 2,
2, 2, 2, 2,
2, 1, 1, 2, 2,
3, 1, 2, 2,
3, 1, 1, 1, 2,
2, 2, 2, 2,
3, 1, 1, 1, 2,
1, 1, 1, 1, 2, 2,
2, 2, 2, 2,
1, 1, 1, 1, 2, 2,
3, 1, 3, 4
]
#用一个for循环调用函数,并赋值,开始写歌
for i in range(len(n)):
wv(tm[i] / 4.0, note[n[i]])
ff.close()#关闭程序