有简单和_弦效果的音乐发生器
很久以前发现在http://elm-chan.org/works/mxb/report.html上面一个音乐程序,我深深给它吸引了,就想自己也做一个。但是他的程序是汇编语言,并且我也不理解音乐的乐理,所以没有办法理解他的程序。上一周,无意中在电脑里又看到它,心里感觉到非常遗憾,突然间下定决心,要消化它,现在终于可以有安慰了。下面的程序,是使用GCC编译器,AVR Studio 4调试器,音乐和音乐效果以及程序框架和http://elm-chan.org/works/mxb/report.html提供的一样。程序除了中断程序之外,其他是C语言。由于中断程序的中断频率是32KHz,所以用汇编语言写,中断程序执行时间是24.5us左右。
电路是使用M8,外接16MHz的晶振,PB1和PB2接喇叭的两个引脚。如果不接外面的晶振,可以使用内部8MHz RC振荡器,效果另有一番风味(要设置M8的熔丝).如果要改其他频率的晶振,则需要修改pitch_table里面的相位步进表数据。根据公式Fo=K*Fc/(2^15),其中K就是pitch_table里面的相位步进,Fc是中断程序中断频率(最好需要大于音符最大频率的5倍以上);2^15:这里的相位累加器是15位的。输出信号频率与PWM的频率没有关系,但是需要PWM的频率大于Fc(最好2倍以上);Fo就是输出音符的频率。
由于不懂得音乐的乐理,所以很难自己根据简谱编写程序提供的tone表。
点击此处下载 ourdev_487453.rar(文件大小:1.04M) (原文件名:yinyue.rar) 音乐效果(与http://elm-chan.org/works/mxb/report.html里面提供一样)
将文件后缀名txt改为:mpeg
点击此处下载 ourdev_487457.txt(文件大小:995K) (原文件名:mg.txt) 真的很NB哦,至少我觉得。 嗯,我最近也在看这个
Kanon in Dourdev_487459.txt(文件大小:4K) (原文件名:mel3.txt)
纯手工转D大调卡农,attiny45通过,或许过两天可以写一个自动转换程序 效果真的很好.真的是单片机做出来的音效吗? 想起楼主不一定有PERL
点击此处下载 ourdev_487461.rar(文件大小:2K) (原文件名:melody.rar) 很早就看到elm-chan的这个和_弦发生,也一直有和lz一样的欲消化的想法,不过最终没有像lz一样去实现.
谢谢lz 顶,要是有个自动乐谱转换程序就好了 请问楼主乐谱是不是放在全局变量上?
我试过做过一个音乐盒,将乐谱数组记在全局变量上(方便编程)
结果存了三首歌后ram不够…… 先顶一下,以后再看。 to:yqhpaladin123
乐谱放在ROM中,RAM只是存放一个54字节的结构体以及4个unsigned char 变量 声音效果不错 顶起来,前几天看到这个也想自己试试,有楼主的成功经验应该很容易了,谢谢楼主.希望有人能搞出乐谱转换程序. to:【3楼】 iamseer
你提供的D大调卡农效果如下(将后缀名txt改为:mp3):
点击此处下载 ourdev_487499.txt(文件大小:2.22M) (原文件名:卡农.txt) 强。
本贴该置酷。
proteus仿真:
http://cache.amobbs.com/bbs_upload782111/files_19/ourdev_487530.JPG
(原文件名:Image0162.JPG)
仿真用8M时钟,听起来感觉比16M要好。
点击此处下载 ourdev_487533.rar(文件大小:30K) (原文件名:vsm.rar) 效果不错 to LZ
你是用什么喇叭?
我用3V CR2450 ,attiny45,0.25w喇叭会爆音,2W喇叭还好但还是有沙沙声
后来顺便拿到实验课上滤波后接到B类功放上接20W喇叭,效果还不错 好东西 LZ厉害,可惜我不会AVR,更不懂音乐.请教LZ喇叭用蜂明器能响吗 效果有那么好? 很早以前就有51做的和_弦,我这还有电路图,可以做到8和_弦,程序不知道扔哪去了,实际效果比这个更好,可以有钢琴、风琴、小提琴、圆号、黑管等音色选择,用020可以存储1K多首歌 mark mark 和_弦是什么意思?
到底是什么让 声音 听起来顺耳的? 把手上的AVR-USB稍加修改试了一下,很有意思,谢谢楼主共享。
但发现有破音,总觉有点缺憾。由于代码量不大,仔细阅读了代码。
发现楼主的isr.s程序文件中有一处错误,R8应为R18,可能是手误,破音就是因为这个产生。 to:【24楼】 hwbrat
你是正确的,谢谢你的指正。 to:【18楼】 lovely-teddy
我没有试过用蜂鸣器的,你可以尝试一下。我直接连接到15W左右的喇叭上。用耳塞也可以(小心耳朵)。 to:【20楼】 czzhouyun
你再细心找找,看看能否找到,如果我有机会看到你的,也许我就不需要折腾这么长时间了。我E文太差了,AVR的汇编是一边看指令一边写程序。如果是51单片机,我还是比较熟悉的。
你说你的有多种音色,我到现在为止还不知道那个波表数据是怎样生成的,你能够给于指导? mark 【27楼】 lzf713
波表数据 表示音色。
你的程序里的波表数据实际就是一段简单的钢琴音的开始部分,起音部分是完整的(这个很重要),后面部分用一个周期的正弦波来表征,之后的忽略,要配合包罗波来产生持续音和音尾。
本程序的包罗波是简单的RC曲线,与实际的钢琴包罗波差别较大,但是音头是完整的,所以仍然听到类似于钢琴的音色。 to:【29楼】 coody
我能理解你意思。我不知道这个数据表是怎样得到的,是不是用软件录制?如果是,那么录制那个频率的音符?用什么采样频率去录制等等问题,我一直搞不清楚。 我不熟悉AVR的汇编,所以没详细看你ISR里的程序,否则我可以告诉你这个表是录的哪个音和采样频率。
我以前得到音色,直接将WAVE转成数据表的 之前也看过这个网站的程序,可惜看不明白,谢谢lz分享! bucuo 这个程序并不是模仿钢琴,而是八音盒,声音分为attack 和 sustain 两部分(原文如此)
http://cache.amobbs.com/bbs_upload782111/files_19/ourdev_488549.png
(原文件名:wt.png) TO:【31楼】 coody
在中断程序里面所使用数据表格就是【34楼】 iamseer 所示波形所对应的数据。
也就是wavetable.h文件中的wave_table[]数组 原作者提供好像还提供了两个PERL脚本把WAV文件转换成数据表. 很好听,不知道用51怎么实现?用51和蜂鸣器做过,效果忒差,改用喇叭声音也不好听…… to:【37楼】 chengpiaopiao
用51单片机,如果晶振频率是24MHz的,绝对可以,如果是12MHz,那么输出音频频率可能比较低一些。但是常见的51单片机没有PWM,所以一般用外接DAC或者用R2R电阻网络作DAC(这样的速度明显比AVR的PWM快,如果用R2R作为DAC,由于51单片机输出驱动能力很弱,所以中间需要数据缓冲器,如:74HC245) mark 也想做一个 请推荐一款 效果好 好买到的
喇叭
这个好像作者没有特别说明型号,在原理图中也只是用SP表示一下
谢谢 to:【37楼】 chengpiaopiao
你那是单个方波的吧?所以不好听,LZ这个是等效于直接播放乐器的WAVE。。。
to 【38楼】 lzf713
有部分51,比如象STC这样的51,输出可以用PUSH-PULL,要不就用一片很便宜的立体声DAC(1元RMB左右)做输出。 好东西,有时间也搞一个 windows xp 下面有一个名字叫:gm.dls软波表,有许多音色,但是我不懂得它的内部结构(不知道那些音色对应那些数据),如果知道它的结构,那么就可以将需要音色数据找出来并用在这个音乐盒里面,这个音乐盒就不会如此单调了。
我现在准备做的就是将MIDI转换为该音乐盒能识别的音符代码。 to lz 前面的数字是指音符的起始时间,以10ms为单位
以卡农为例,4/4是指以四分音符为一拍,每小节4拍。80bpm指每分钟80拍。即每个四分音符750ms。对应该音乐盒75。
从简谱转换大体是
1 2 3 4 5 6 7
C3 D3 E3 F3 G3 A4 H4
elm-chan使用的是十二平均律定的音。具体可参阅mg.inc 很好玩,两个IO脚,是不是一个输出音色,一个输出包络? MARK 效果不错, 比直接方波的效果好很多. 【44楼】 lzf713
MIDI数据解析很容易,关键是音色,还有多通道 to:【49楼】 coody
你说得没有错。我计划在原来基础上增加几个不同音阶对应的波表(我已经能在GM.DLS软波表里面提取出来,用awave软件提取),但是ROM又紧张了。至于多通道,我还没有考虑。 to:【46楼】 LRNAVR
不是你所说那样。两个脚输出反相的信号,至于衰减,在信号输出前已经通过运算处理好了。 很好
最好谁能介绍一下实现的原理 mark~ mark 何不外置存储器?应该制作电子琴也无妨 简单的电子琴很容易,不用音色波表,而是用音色的包络波来输出方波,效果还可以的,小孩玩的低档电子琴都是这样的多,TW的合适做这个的MCU一般是2、3元左右,可以2、4或8通道。 to 【50楼】 lzf713
“我已经能在GM.DLS软波表里面提取出来,用awave软件提取”。。。
方法能否说得详细些?我也试试看 MARK 记号 to:【57楼】 coody
下载“和谐版”的awave studio,然后安装。gm.dls在C:\WINDOWS\system32\drivers下面(我的系统是XP),然后用awave studio打开gm.dls(最好预先备份该文件),你就会看到许多音色数据(如果你E文不是很好,那么最好有翻译工具),选择你需要的音色数据,然后另存为*.wav格式就可以了。但是所保存的*.wav是16位的,你需要下载一个Cool Edit软件,用该软件打开你所得的wav文件,然后你将它保存为*.txt格式并且是8位的。 mark 不错,是个好东西。
有无大侠可以解决MIDI文件用M8播放? to 【60楼】 lzf713
谢谢,我有cooledit,并且很熟悉 调试成功,开始用WINAVR 2005版本,编译出来不工作,和楼主的BIN相比,长度一样,但是有数十字节不一样,改用WINAVR2009编译,长度不一样了,不过能工作。修正了R8->R18,并用OSCCAL=0XFF将内部RC频率整定到最高,效果很好! 哪位详细说说原理,怎么用PWM实现?
我只做过R2R的。 这个要顶 需要用 学习 做了一个由MIDI解析出来的音符旋律程序,但是效果不理想,播放出来的效果与原来的差比较远。我无法忍受,不知道各位意见如何。
由该程序提取出来的童年:
(将后缀名txt改为h,然后替代原程序的tone.h,编译连接下载就可以了)
旋律输出表ourdev_491652.txt(文件大小:22K) (原文件名:tone.txt)
童年mid文件(将后缀名txt改为mid)
MID文件ourdev_491653.txt(文件大小:13K) (原文件名:童年.txt)
转换程序:
转换程序ourdev_491654.rar(文件大小:297K) (原文件名:MIDI旋律输出程序.rar) 打算自己编写一个类似钢琴琴键一样输入简谱的程序。但是我搞不清楚类似1=C调,1=D调,1=F调这些到底是什么,所以迟迟没有下手。由于用MIDI转换程序所输出的文件比较大,所以最多能装2首旋律,根本没有空间装其他音色了,如果有M128,或者M32就好了(可以将钢琴音色装进里面)。 提供用MIDI转换器转换出来旋律的播放效果,(将后缀名txt改为mp3)
点击此处下载 ourdev_491663.txt(文件大小:1.87M) (原文件名:童年.txt) 【70楼】 lzf713
1=C调,1=D调,1=F调
这是调式,表明歌曲的调高。 to:【72楼】 coody
单独知道知道这些还不够的。我在网络上找过,但是许多人认为这些是很基础的乐理,不屑一问(很多人建议买一本基础乐理书看看就知道了),所以我都不好意思公开发帖提问。
我现在理解的就是,C,D,E,F,G,A,B是音符的音名,是固定不变的(我认为其对应频率固定)。如果按全音和伴音描述,一个8度里面有:C,#C,D,#D,E,F,#F,G,#G,A,#A,B(假设中音符A的频率是440Hz,那么其他音符频率就可以推断出来,例如#A的频率=440×2^(1/12)),B的频率=440×2^(2/12),#G的频率=440/(2^(1/12))等。
假设中音符A的频率是440Hz,也许不是假设的,而是规定的。但是一般来说,人们常说低音,中音,高音等,是不是用C,#C,D,#D,E,F,#F,G,#G,A,#A,B表示一个8度里面的中音,C-1,#C-1,D-1,#D-1,E-1,F-1,#F-1,G-1,#G-1,A-1,#A-1,B-1表示比中音低8度的(也是所谓低音),C1,#C1,D1,#D1,E1,F1,#F1,G1,#G1,A1,#A1,B1表示比中音高8度的音符(也是所谓高音)?这些下标是否自由指定?例如我认为C1,#C1,D1,#D1,E1,F1,#F1,G1,#G1,A1,#A1,B1表示中音的音符而不是高8度音符,这样是否可以?
话说回来,在简谱上面经常用1=D,1=F这些,很多人就简单说一句,哦,这些是表示歌曲的调,到底是什么意思?妖,你怎么这么××的,那些就是唱这首个的调呀,你去买一本乐理的书看看,那么一大把。(没有艺术细胞的,特别难的,大哥你就别笑了)
现在我所理解的(不知道是否正确,希望各位指正),以1=C为例:
音符有音符名字,例如是C,#C,D,#D,E,F,#F,G,#G,A,#A,B,也有音符的唱名1,#1,2,#2,3,4,#4,5,#5,6,#6,7
这里1=C,表示:
唱名1对应音符C,
唱名#1对应音符#C,
。
。
。
。
。
唱名7对应音符B
那么高8度的和低8度类似有相应对应关系,不知道我这样理解是否正确?
如果是1=D,那么:
唱名1对应音符名D
唱名#1对应音符名#D
唱名2对应音符名E
唱名#2对应音符名F
唱名3对应音符名#F
唱名4对应音符名G
唱名#4对应音符名#G
唱名5对应音符名A
唱名#5对应音符名#A
唱名6对应音符名B
唱名#6对应音符名C1(该C1表示比C高8度的)
唱名7对应音符名#C1(该#C1表示比#C高8度的)
他们好像固定音符名,然后将1=C调的唱名相对音符名向右平移2个半音位置。
同理1=F,就是固定音符名,然后将1=C调的唱名相对音符名向右平移5个伴音位置。
这样理解是否正确? 还有,什么大调小调的,学音乐的烦不烦,这么多抽象的概念,令门外汉像丈二的金钢,摸不到脑袋。 我试着改了音调,还能改,但是节拍啥的不会改,改一下全乱了。。。 唉。。。一年前上的音乐课现在基本全还给老师了。。。。 mark 很简单,比如一首歌,女声的,是1=B,的,但是男声唱不下来,太高了。
如果改成1=C,则男声唱下来没有任何问题,注意,这时候,乐谱没有任何改变,仅仅改变了调高。 谁能介绍下原理啊 mark CDEFGAB称音名,调则是将任何一个音高作为乐曲的主音,其他音是围绕这个主音形成一个体系,这个体系就叫调式
135称之为大三和_弦,由大三和_弦为主的调式称大调式
6.(下点无法表示,就这么凑合吧)1 3 称小三和_弦,由小三和_弦为主的调式称小调式
分辨大调小调一般看结尾音,结尾是1是大调,结尾是6.是小调,还有其他方法就不多说了,旨在普及。
其实只要印象中有钢琴的黑白键就很能明白音乐到底是怎么回事。
相邻两个键之间是半音关系,注意这里中间的黑键也算一个键。
一组键有12个键,一般完整的钢琴为88键,每12个键称为一组,从左开始是大字二组、大字一组、大字组、小字组、小字一组。。。。小字五组。
我们平常所唱的1应在大字组的C。
乐曲中最重要的是拍子就是我们俗称的节奏,五线谱的调号后面有个分数,分母表示以几分音符为一拍,分子表示一小节有几拍。
乐曲可以错但节拍不能乱。
音乐好久不玩了,搜肠刮肚写些东西,可能有描述有误的地方,大家自己去找些资料。
另有空还是要学点音乐,一直认为汉人是没有节奏感的民族,主要是对音乐不重视,懂点音乐对生活和工作帮助很大,拙见别拍砖 mark一下,回去试试! 我想将问题简单化。
有下列唱名:
1(duo)
#1
2(lei)
#2
3(mi)
4(fa)
#4
5(suo)
#5
6(la)
#6
7(xi)
如果是1=C
那么上面唱名对应频率是多少?
如果是1=D
那么上面唱名对应频率又是多少?
如果是1=F
那么上面唱名对应频率又是多少?
各个调的唱名与频率有什么规律?
我想编写一个简谱转换程序,紧急需要知道上面唱名对应的频率,至于其他的乐理,以后再学习。
假定音名对频率如下:
音符 频率
a0 27.5
a#0 29.13523509
b0 30.86770633
c1 32.70319566
c#1 34.64782887
d1 36.70809599
d#1 38.89087297
e1 41.20344461
f1 43.65352893
f#1 46.24930284
g1 48.9994295
g#1 51.9130872
a1 55
a#1 58.27047019
b1 61.73541266
c2 65.40639133
c#2 69.29565774
d2 73.41619198
d#2 77.78174593
e2 82.40688923
f2 87.30705786
f#2 92.49860568
g2 97.998859
g#2 103.8261744
a2 110
a#2 116.5409404
b2 123.4708253
c3 130.8127827
c#3 138.5913155
d3 146.832384
d#3 155.5634919
e3 164.8137785
f3 174.6141157
f#3 184.9972114
g3 195.997718
g#3 207.6523488
a3 220
a#3 233.0818808
b3 246.9416506
c4 261.6255653
c#4 277.182631
d4 293.6647679
d#4 311.1269837
e4 329.6275569
f4 349.2282314
f#4 369.9944227
g4 391.995436
g#4 415.3046976
a4 440
a#4 466.1637615
b4 493.8833013
c5 523.2511306
c#5 554.365262
d5 587.3295358
d#5 622.2539674
e5 659.2551138
f5 698.4564629
f#5 739.9888454
g5 783.990872
g#5 830.6093952
a5 880
a#5 932.327523
b5 987.7666025
c6 1046.502261
c#6 1108.730524
d6 1174.659072
d#6 1244.507935
e6 1318.510228
f6 1396.912926
f#6 1479.977691
g6 1567.981744
g#6 1661.21879
a6 1760
a#6 1864.655046
b6 1975.533205
c7 2093.004522
c#7 2217.461048
d7 2349.318143
d#7 2489.01587
e7 2637.020455
f7 2793.825851
f#7 2959.955382
g7 3135.963488
g#7 3322.437581
a7 3520
a#7 3729.310092
b7 3951.06641
c8 4186.009045
c#8 4434.922096
d8 4698.636287
d#8 4978.03174
e8 5274.040911
f8 5587.651703
f#8 5919.910763
g8 6271.926976
g#8 6644.875161
a8 7040
a#8 7458.620184
b8 7902.13282 音调频率(HZ)=(15625*(2^音阶数))/(511-音调值)
音符 音调值
A 3
A# 31
B 58
C 83
C# 107
D 130
D# 151
E 172
F 191
F# 209
G 226
G# 242
音阶 范围(HZ)
0 31-61
1 61-122
2 122-244
3 244-488
4 489-977
5 978-1.95k
6 1.96-3.91k
7 3.910-7.81k
这是GOOGLE搜出来的,具体多少频率自己算下。
以下举例为假定值,如有错误盖不负责。
假定1=D,假定D的频率是164Hz,则1=164,#1=173.6。。。。。。。依次类推,
最简单的方法是将钢琴的每个键的频率都测定出来,假定1=D,就将1放在D键上然后234567依次往后一一对应即可 频率必须精准到小数点后一位数 to 【85楼】 czzhouyun
频率必须精准到小数点后一位数
==========================================
根本不需要这么准,一般的人,很难区分20个音分的间隔,专业人士也很难区分10个音分。
============================================
to 【83楼】 lzf713
比如1=C,则曲里的1就是C的频率,其他类推 【86楼】 coody
比如1=C,则曲里的1就是C的频率,其他类推
我不是很明白你的意思,希望更加具体一些。还是按83楼提出问题逐个回答吧(是不是要求太高了?) Mark 音調 頻率 1=C(C大调) 1=D(D大调) 1=F(F大调) 1=C(C小调)
C 262 低音 1 5 1
#C(bD) 7
D 294 2 低 1 6 2
#D(bE) 3
E 330 3 2 7
F 349 4 低 1 4
#F(bG) 3
G 392 5 4 2 5
#G(bA) 6
A 440 6 5 3
#A(bB) 4
B 494 7 6 7
C 523 中音 1 5 1
#C 7
D 587 2 中 1 6 2
#D 3
E 659 3 2 7
F 698 4 中 1 4
#F 3
G 784 5 4 2 5
#G 6
A 880 6 5 3
#A 4
B 988 7 6 7
C 1047 高音 1 5 1
#C 7
D 1175 2 高 1 6 2
#D 3
E 1319 3 2 7
F 1397 4 高 1 4
#F 3
G 1568 5 4 2 5
#G 6
A 1760 6 5 3
#A 4
B 1976 7 6 7
=======================================================================
1。通常以C大调的低、中、高三个8度为基准。
2。半音的频率我没加上,你自己补充。
3。人的声音基本在这个频率段,音乐频率需要在两端扩展,规律相同。
4。小调唱歌比较少用,听上去不太和谐,通常是在音乐中使用,表示躁动、不安分等情绪或气氛等。 lz的工作非常好,我也早看过这个小的设计,只是手上没有合适的芯片,比如tiny45,所以没有去试一下效果。
LZ将其移值到M8上,我直接使用了你的HEX文件听了效果,确实感觉还不错。
设计该DD的日本人最近又推出了一个仅使用一片TINY45就能直接读取SD卡上的WAVE文件,并播放出来(还是双声道的),也是非常妙的东西。http://elm-chan.org/works/sd8p/report.html
这个东西如果效果可以的话,会有一定的应用前景的,可以做为许多场合的自动语音提示系统(播放人声的WAVE文件),成本非常低。
下面就几个问题说说我的看法。
通常一个HIFI系统的频率在20-20KHz,一般的人声最高也就3K,作为一般放音乐,定个频率上限为10K吧。
原设计采用TYNI45/85,主要是该芯片有1个250K的PWM功能(16M,PLL到64M,64M/256(8位) = 250k)。因此最高10K的频率的一个周期有25个点构成,而使用M8,它的PWM最高只能是16M/256 = 62.5k,这样最高10K的频率的一个周期就只有6个点构成,所以高频部分的效果就比较差了。
我认为是否可以使用AVR系列的AT90PWM2B,这是一片24PIN的芯片,也能产生高频的PWM,另外就是它有一个10位的DA,是否可以直接使用这个DA,而不使用PWM方式了?另外,24PIN的芯片,还有的I/O可以做通信口、接按键、LED指示等,可以构成一个小的完整的放音控制系统。
另外还应该考虑加上使用简单的模拟的LPF和功放电路,实际应用中音量还是需要放大的。 谢谢machao的指导!
http://elm-chan.org/works/sd8p/report.html 提供的程序,我粗略看了,自问在短时间内无法实现,原因我对FAT文件根本没有了解。 FAT是文件系统,PC操作硬盘、U盘、SD卡等都是基于FAT的。
应该要了解FAT,32位嵌入式的应用,手机、MP3、MP4、数码相框.....都需要FAT系统,这个系统基本上主要是软件实现的,网上有大量的介绍。
我已经推荐我的学生学习这个东西了,如果你是从事这个工作的,或者准备将来从事这方面的工作,学习FAT肯定有好处。不要放弃。 mark 我也做过挺有意思! 收了 编写了一个手工输入简谱的程序。
界面如下:
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_494021.GIF
界面截图 (原文件名:界面.GIF)
程序:
手工简谱输入转换程序ourdev_494022.rar(文件大小:269K) (原文件名:note.rar) 有新意,不错。
和_弦(多个键同时按下)如何输入?
输出文件中,节拍时间和音调的位置好象反了吧,好象原来时间在前面,音调在后面。
生成文件前面为何开始有2个0,时间吗? 本来打算设计多个键同时按下的,但是我发现输入简谱时候很少出现同时出现多个音符一起的,所以将它除掉了。如果要和_弦(多个键同时按下)如何输入,那么在音符-时间(MS)里面手工添加。
前面的两个0,表示从0时刻开始演奏。
“好象原来时间在前面,音调在后面。”,是不错。但是如果从另一方面去理解也可以,由于前面加了2个0,表示从0时刻开始演奏音符,而音符后面的时间减去前面开始时间的差就是这个音符演奏的时间。
下一个音符是从前面那个时间开始,持续时间是这个音符后那个时间值减去前面开始时间的差值。 MARK mark,有空试试玩