利用Python生成钢琴音色

csdn上看到一篇博客“根据乐谱合成钢琴音乐(https://blog.csdn.net/u011478373/article/details/60470332)”,写得不错,非常感兴趣,就把博客中的Python代码拷贝下来运行了一下,结果不行,原因是缺乏了一下关键参数定义,如:

1)wave_data

2)ampli

3)windowsize

分析了一下,将这几个参数补充齐了,删除了部分冗余代码,现在程序可以运行了,可以用Python产生出钢琴音色了,十分好听。由于代码可以运行和调试,可以帮助大家理解音乐生成的原理。下面几张图是生成的钢琴声的波形图、声谱图、谐波特征和衰减特征。代码在后面,大家可以下载运行试试,我用的是Python3.4。

谐波特征和时域衰减特征
谐波特征和时域衰减特征

 

波形图
波形图
声谱图
声谱图
import waveimport numpy as np
import math
import matplotlib.pyplot as plt# TO DO: reform it into piano
#-----------------------------------------
#生成正弦波
def gen_sin(amp, f, fs, tau):#(开始值,结束值,个数)nT = np.linspace(0,tau, round(tau/(1.0/fs)))#根据步长生成数组,在指定的间隔内返回均匀间隔的数字,返回num个均匀分布的样本,在[start, stop]。signal =np.array([amp*np.cos(2*np.pi*f*t) for t in nT])return signal#model the harmonic feature in frequency domain
#1~15谐波与基频的比例关系
Amp=[1,0.340,0.102,0.085,0.070,0.065,0.028,0.085,0.011,0.030,0.010,0.014,0.012,0.013,0.004]
numharmonic=len(Amp)#谐波个数wave_data=np.array([0 for i in range(0,40000)])
wave_data = np.reshape(wave_data,[40000,1]).T
pianomusic=[0 for x in range(0,len(wave_data[0]))]
startpoint=0#model the piano note attenuation feature in the time domain
#对每个钢琴音的时域衰减建模
attenuation=[0 for x in range(0, 8000)]
#the attack stage
for i in range(0,200):attenuation[i]=i*0.005
#the attenuate stage
#衰减阶段
for i in range(200,800):attenuation[i]=1-(i-200)*0.001
#the maintain stage
#保持阶段    
for i in range(800,4000):attenuation[i]=0.4-(i-800)*0.000078
for i in range(4000,8000):attenuation[i]=0.15-(i-4000)*0.0000078#compose each note in each time quantum
nomalizedbasicfreq=[261.63,261.63,261.63,261.63,293.665,293.665,293.665,293.665,329.628,329.628,329.628,329.628,349.228,349.228,349.228,349.228,391.995,391.995,391.995,391.995,440,440,440,440,493.883,493.883,493.883,493.883,523.251,523.251,523.251,523.251,587.33,587.33,587.33,587.33,659.255,659.255,659.255,659.255]
ampli=[(math.pow(2,2*8-1)-1) for i in range(0,40)]
#40个/4=10
notestime=[4,4,4,4,4,4,4,4,4,4]#10个
windowsize=1000
for w in range(0,len(notestime)):#计算音符时长#初始化音符为0pianonote = [0 for x in range(0, windowsize*notestime[w])] #get the length according to the time of the note#计算每一个谐音并累加for i in range(0, numharmonic): #get the note by add each harmonic by the amplitude comparatively with the basic frequency#产生谐波,参数:幅度,频率,8000 ,结束=0.5pianonote = pianonote + gen_sin(ampli[startpoint] /50* Amp[i], nomalizedbasicfreq[startpoint] * (i + 1), 8000, 0.125*notestime[w])#矢量加法#attenuate the note with the time domain feature#进行衰减for k in range(0,windowsize*notestime[w]):#k:0---4000pianomusic[startpoint*windowsize+k]=pianonote[k]*attenuation[k]#0--4000 startpoint=0#4000-8000   =4#8000-12000  =8#36*1000---36*1000+4000(40000)4万startpoint=startpoint+notestime[w] #record the start point of the next note#startpoint变化规律:0,4,8,12,...32,36for i in range(0,len(wave_data[0])):wave_data[0][i]=pianomusic[i]#get a wave file
f = wave.open(r"pianomusic.wav", "wb")
#get the channel, sampling width and sampling frequency information
#see details in 2.9 of my report
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(8000)
f.writeframes(wave_data[0].tostring()) #put the data into the wave file
f.close()print("STEP 9: please see in figure and listen the pianomusic.wav file")
plt.figure()
plt.subplot(211)
plt.plot(Amp)
plt.title(r'frequency domain harmonic feature')
plt.subplot(212)
plt.plot(attenuation)
plt.title(r'time domain attenuation feature')
plt.figure()
plt.plot(pianomusic)
plt.title(r'STEP 9:reform it into piano')
plt.show()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/66752.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端作品-网页弹钢琴

点此查看 所有教程、项目、源码导航 文章目录 1. 作者简介2. 效果展示3. 源码下载 1. 作者简介 本网站作者田迅,是我的20级软件技术专业学生,爱好前端。擅长使用HTML、CSS、JS、jQuery、BootStrap等技术构建美观大气的网站,本文介绍其作品&a…

《科尼龙作曲家》——音乐课教学的绝佳工具

乔奥(Joao Carlos Ramalheiro,科思鹏的创始人)自己作为一名音乐老师,在教学的时候也经常需要用到五线谱工具。市面上虽然已经存在多款专业的五线谱工具软件,但是他发现,这些五线谱软件并不能很好地适应于音乐教学。它们功能繁多、…

编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。 可以弹奏的乐器包括二胡、钢琴和琵琶。 实现思路及关键代码

编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。 可以弹奏的乐器包括二胡、钢琴和琵琶。 实现思路及关键代码: 1)定义乐器类Instrument,包括方法makeSound() 2)定义乐器类的子类:二胡Erhu、钢琴Piano和小提琴Violin 3…

matlab钢琴音教程,手把手教你钢琴基本指法(有图有真相,通俗易懂,钢琴入门必备)...

示例图片: b、如果 2、3、4 指在白键上,那么 1 指在穿指后不可以落到黑键上。否则就是别马腿, 大家可以试一试。这是要说一下,1 指由于其生理构造,不太适合经常上黑键。但它在相 对少数的一些场合还是需要上黑键的。但…

怎样才能让计算机发出钢琴的按键声,这篇文章教你如何弹出钢琴好音色

原标题:这篇文章教你如何弹出钢琴好音色 怎样演奏好钢琴的音色 导读:在教学中往往容易陷于就事论事地去应付面临的各种视谱、节奏、速度、熟练、背谱等问题的解决之中,而无暇去顾及声音的质量,这恰恰是误区之所在。本文的重点即在…

用Unity的GetSpectrumData方法识别钢琴曲中的钢琴琴键

目录 要解决的问题音律五度相生律与 3 2 \frac{3}{2} 23​纯率与 5 4 \frac{5}{4} 45​十二平均律与 2 1 12 2^\frac{1}{12} 2121​88键钢琴各键键位与音高 Unity GetSpectrumData获取的音频数据与88键钢琴各键的映射全部代码与测试结果未解决的问题 要解决的问题 我在上一篇系…

国内智能音箱市场逐渐崛起,那么问题来了……

来源:AI锐见 “嗨,Alexa,放首歌。” 2014年,搭载了亚马逊虚拟语音个人助理Alexa的Echo面世,让人类同机器的交互方式出现了另一种可能。 苹果联合创始人Steve Wozniak就曾在2016年表示,智能语音交互将成为计…

前途未卜的智能音箱,语音助手还差一个杀手级应用

作者 | Rani Molla 译者 | 刘旭坤 整理 | 非主流、Jane 出品 | AI科技大本营 近日,亚马逊推出了一款可以用语音控制的智能微波炉。至此,亚马逊推出的由 Alexa 语音控制的智能家居产品的数量已累计超过十种。由此,我们可以看到亚马逊推广自家语…

当你问智能音箱问题的时候,它会回答你什么?

笔者测试了25个不同类型的问题,比较了小爱mini和小度在家的回答,借此设计声学测试的问题,问题、问题类型、期望回复以及音箱的真实回复如下。测试时间为2018年10月份左右。 对话服务 序号对话期望回复对话类型小爱mini小度在家1珠海明天天气…

热闹了一年的智能音箱,为什么说只是过渡?

IT派 - {技术青年圈} 持续关注互联网、大数据、人工智能领域 关注 往期 精彩回顾 重大改变!Excel即将接入Python!办公软件也要革命 2017年大数据领域薪资有多高? 支付宝的套路 行业热,行业洗牌,行业发展,下…

智能音箱对比:Google,Amazon,Apple,讯飞

智能音箱 好久没写Blog,最近主要也在关心异军突起的智能音箱行列,这里也来稍微的分析下。 前言 2014年,Amazon不声不响的推出了智能音箱Echo,并慢慢建立了Alexa语音服务平台,直到2016年销量忽然剧增达到了1000万台。消…

钉钉添加代收邮箱地址

如163邮箱添加到钉钉客户端代收,需要在163邮箱登录后在设置中添加协议,并获取验证密码,验证密码在代收客户端使用,代收客户端输入账号是原始账号,密码就是获取的验证密码

出口托收与进口代收

出口托收与进口代收 出口托收(Ontward Documentary Collection)与进口代收(Import Documentary Collection)同属于托收业务范畴,出口托收和进口代收均为商业银行的业务之一,如托收流程图来说,对…

用EXCEL表格发送物业催费短信

催费成功者都是英雄 (一)催费的困境 做为一名物业工作人员,你是否也遇到过这样的困境呢? 1、心理被一种潜在的恐惧所困扰着——业主肯定会拒交费用,“那个业主真难办,我根本没办法说服他,真不…

批量查询快递单号筛选出代收单号

查询多个快递还在一个一个查吗?费时又费力,今天小编教你使用一款查询工具“快递批量查询高手”轻松解决难题,有兴趣的接着看下去吧。 工具/原料 快递批量查询高手 多个快递单号 方法/步骤 打开软件点击【添加单号】将需要查询的单号复制到文…

开快递代收点挣钱吗?怎么盈利?

现在是网络时代,很多事情都是在网络上面进行的。由于人们已经习惯了这种生活,网购显得更加受欢迎。正是因为如此,快递行业越来越红火。很多人开始开快递代收点,这样是否挣钱呢? 一、挣钱吗? 首先农村快递代收点会和各个快递公…

(附源码)计算机毕业设计SSM快递代收系统

(附源码)计算机毕业设计SSM快递代收系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&#xf…

多多买菜代收被叫停?拼多多这样回应

最近,有媒体报道称“多多买菜快递代收业务未取得经营许可被叫停”。在舆论不断发酵的情况下,拼多多方面对此做出了回应:拼多多并未在多多买菜所有站点开展快递代收业务,而是为有快递业务资质的站点提供“多多买菜”代收服务系统。…

香农 | 流行潮(bandwagon)

【编者按:面对当前的Chatgpt热潮,该如何看待呢?英语当中有种说法叫 jump on the bandwagon,意为跟风随大流。60多年前,当信息论的发展进入越来越多的领域,一向低调的香农在《流行潮》(The Bandw…

AI学术交流——“人工智能”和“神经网络学习”

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 一.人工智能 1.“人工智能之父” 2.达特茅斯会议(人工智能起源&a…