音乐合成实验报告版.doc

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验一 音乐合成 背景知识: 乐音的基本特征可以用基波频率、谐波频率和包络波形三个方面来描述, 我们用大写英文字母 CDEFGAB 表示每个音的“音名”(或称为“音调”),当 指定某一音名时,它对应固定的基波信号频率。 图 1 表示钢琴的键盘结构,并注明了每个琴键对应的音名和基波频率值。 这些频率值是按“十二平均律”计算导出,下面解释计算规则: 图 1 钢琴键盘和相应频率 从图 1 可以看到,靠下边的 A 键称为小字组 A,它的频率值 fA0 = 220Hz, 而靠上面的另一个 A 键是小字一组 A,它的频率值是 fA1 = 440Hz。两者为二 倍频率关系,即 f 相当于 f 的二次谐波。也称为 8 度音或倍频程 Octave(即 A1 A0 我们画频响特性图时所用的术语“倍频程”)。 从小字组 A 到小字一组 A 共有 12 个键,其中 7 个白色键,5 个黑色键, 其频率计算规律为相邻音倍乘系数 K = 21/12 = 1由此可求出图中各 琴键对应之频率值。 从图 1 可以看出 7 个白建之间插入了 5 个黑键。在 EF 之间和 BC 之间没 有黑键,也即这两组相邻的白键之间的基波频率倍乘系数为 21/12,也称为相隔 半音,而在其他白键之间都有黑键相隔,因而他们的频率倍乘系数为 22/12, 也称为相隔全音(如 CD、DE、FG……)。若以白键英文字母为基准,则升高半 音以“#”符号表示,降低半音则以“b”符号表示。于是,可以依次写出12 个音名从低到高的字母表示为: C,bD,D,bE,E,F,bG,G,bA,A,bB,B 当然,若改用“#”号表示黑键,则 bD 改为#C,bE 改为#D…… 下面给出“唱名”的概念。所谓唱名是指平时读乐谱唱出的 do,re,mi…… 每个唱名并未固定基波频率。当指定乐曲的音调时才能知道此时唱名对应的 音名,也即确定了对应的频率值。 下面给出一个乐曲的实例,练习写出每个唱名对应的基波频率值,如图 2,这是《东方红》的开头两句曲谱,用简谱写出。曲调定为F,于是可查出 第一个音 5 对应 C,频率值为 523.25Hz,其他音之频率可依次写出。稍后, 我们将以此为基础进行音乐合成练习。 练习题: 1.2.1 简单的音乐合成: (1) 请根据《东方红》片段的简谱和“十二平均律”计算出该片段中各个乐音的 频率,在 MATLAB 中生成幅度为 1、抽样频率为 8kHz 的正弦信号表示这些乐 音。请用 sound 函数播放每个乐音,听一听音调是否正确,最后用这一系列 乐音信号拼出《东方红》片段,注意控制每个乐音持续的时间要符合节拍, 用 sound 函数播放你合成的乐音,听起来感觉如何? 答:根据 F 调与 C 调的基本规律,F 调的七个基本乐音唱名的对应基本频率列于 下表: 唱名 1 2 3 4 5 6 7 频率/Hz 349.23 392 440 466.16 523.25 587.33 659.25 音名 F G A bB C D E 表 1 F 调七个音名的基频 由此可得到《东方红》的各个唱名所对应的频率: 唱名 5 5 6 2 1 1 6 2 音名 C C D G F F D C 频率 523.25 523.25 587.33 392 349.23 349.23 293.66 523.25 /Hz 表 2 《东方红》乐谱信息 对于乐谱的信息,我进行了归类,主要分为基本音名,升降调信息,持续时间。 对于基本音名,按照乐谱中唱名所对应的数字表示,这样可以与表 1 中基本频率 相对应,如果该乐音比唱名表示的数字高一个八度(上方加点)则在升降调信息 中表示为 1,若低一个八度,则在升降调信息中表示为-1,若与实际相同,则表 示为 0,持续时间(节拍)信息即为对应的每个乐音的持续时间,将此三类信息 存入结构体中,即可得到完整的乐谱信息。 实现代码如下(由于注释复制粘贴显示为乱码,此处略去): clear all; close all; clc; score = struct('name',{5,5,6,2,1,1,6,2},'range',{0,0,0,0,0,0,-1,0},'time',{1, 0.5,0.5,2,1,0.5,0.5,2}); t = 0:1/8000:4; speed = 0.5; stop = 0.1*speed; standard = [349.23,392,440,466.16,523.25,587.33,659.25]; wave = zeros(1,length(t)); freq = 0.0; t_start = 0.0; t_end = 0.0; for k = 1:8 t_end = score(k).time.*speed + t_

文档评论(0)

Kaiser + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档