如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
音乐合成实验报告自03张驰昱2010012028简单音乐合成(1)(2)(4)题可以合并成一道题,即最终合成的音乐要求如下:1、每个音符有准确音高和节拍;2、每个音节有合理的包络线,且相邻音节有部分叠接;3、每个音节有至少三个谐波分量。解决步骤:构造一个音高向量的生成函数m,入口参数为简谱的数字和升降八度,出口参数为一个波形向量,长度为乐曲总时间、例如:在F调中,降F为m(1,-1),A为m(3,0),升C为m(5,1)。构造一个包络线向量的生成函数shape,控制节拍,考虑到包络线和包络线还有叠接的部分,这个函数应该还能控制音符的起始时间。即入口参数为节拍和起始时间,出口参数为一个包络线向量,长度也为乐曲总时间。这样音高向量与这个包络线向量的对应位相乘就得到乐曲中的一个音符了。例如:一个01:00开始的四分音符的包络为shape(4,1)。根据乐谱做出所有符合节拍、音高、和起始时间的音符向量,再把所有音符向量叠加起来就得到一个乐曲的向量了。具体实现:functionmusic()clc;clear;m=m(5,0).*shape(4,0)+m(5,0).*shape(8,0.48)+...m(6,0).*shape(8,0.70)+m(2,0).*shape(2,0.93)+...m(1,0).*shape(4,1.92)+m(1,0).*shape(8,2.4)+...m(6,-1).*shape(8,2.62)+m(2,0).*shape(2,2.85);%完整乐曲sound(m,8000);returnfunctionm0=m(x,y)%音高函数,x为简谱数字,y为升降八度t=[0:1/8000:4]';a=[349.23,392,440,493.88,523.25,587.33,659.25]*2*pi;%基频向量m0=sin(a(x)*(2^y)*kron(t,[1:3]))*[10.20.1]';%谐波幅度:二次0.2,三次0.3returnfunctions=shape(x,a)t=[0:1/8000:4]';speed=0.5;%四分音符为0.5秒limit=a+4*speed/x*[00.10.20.81];%分段函数的各个界点向量fori=1:4u(:,i)=(t>limit(i)&t<=limit(i+1));%生成分段函数和区间ends=3*x/speed*(t-limit(1)).*u(:,1)+...(1.2-0.5*x/speed*(t-limit(2))).*u(:,2)+...1.*u(:,3)+(1-1.25*x/speed*(t-limit(4))).*u(:,4);%生成包络Return代码优化:实验中我的大部分时间花在了代码优化上,即尽量少的出现循环,尽量多的化归为二维矩阵或向量。如程序中的m0=sin(a(x)*(2^y)*kron(t,[1:3]))*[10.20.1]';张量积构成含有3次倍频的矩阵,与分量系数列向量相乘得到含有谐波的音高列向量。(3)用最简单的办法使乐曲升降八度、升降半音阶。问题分析:不改变sound采样频率,只要改变信号自身的采样密度即可。具体实现:m_d=resample(m,1,2);%降八度m_u=resample(m,2,1);%升八度md=resample(m,1059,1000);%降半音阶mu=resample(m,1000,1059);%升半音阶(5)自选其他音乐合成解决步骤:把总时间拉长到6秒t=[0:1/8000:6]';把F调降到C调,重写函数m的基频向量a=[261.63293.66329.63349.23,392,440,493.88]*2*pi;重写原程序乐谱m=m(1,1).*shape(16/3,0)+m(1,1).*shape(16,0.375)+...m(1,1).*shape(8,0.5)+m(1,1).*shape(8,0.75)+...m(1,1).*shape(8,1)+m(1,1).*shape(8/3,1.25)+...m(1,0).*shape(8,2)+m(1,0).*shape(4,2.25)+...m(3,0).*shape(8,2.75)+m(5,0).*shape(8,3)+...m(5,0).*shape(4,3.25)+m(6,0).*shape(8,3.72)+...m(1,1).*shape(8/3,4)+m(6,0).*shape(8,4.75)+...m(5,0).*shape(8/3,5);用傅里叶级数分析音乐用wavread试听fmt.wav