改进的电子乐谱数据结构一.docx
《改进的电子乐谱数据结构一.docx》由会员分享,可在线阅读,更多相关《改进的电子乐谱数据结构一.docx(15页珍藏版)》请在冰豆网上搜索。
改进的电子乐谱数据结构一
电子乐谱数据结构设想
(二)
树型结构:
…………….多首歌曲数据结构……………………..
Typedefstructmultisong{
intnumber;//歌曲号
SYSTEMS*systems//歌曲链表
}MULTISONG;
………………一曲钢琴曲数据结构………………..
Typedefstructsystem{
Intlinedistance;//五线谱谱线间距离
Intstavecontype;//五线谱声部连接符号类型1,花括号2中括号
Intnumber;//五线谱数
STAVES*staves;
}SYSTEM
………………五线谱数据结构………………………
typedefstructstave{
intv_distance;//声部距离
intnumber;//声部数
VOICE*voice;//五线谱声部链表
}STAVE
………………声部数据结构……………………….
typedefstructvoice{
intnumber;//小节数
MEASURE*fmeasure;//指向前一小节
MEASURE*bmeasure;//指向后一小节
}VOICE
………………小节数据结构………………………….
typedefstructmeasure{
inttotalnumber;//音符的总数
intnumber;//组合音符看成一个音符时的音符总数,为确定连接线位置做基准
CLEF*clef;//谱号
KEYSIGATURE*keysignature;//调号
BAT*bats;//拍号
NOTATION*fnotation;//音符链表,指向第一个音符
NOTATION*bnotation;//指向最后一个音符
BARLINE*barline;//小节线
……………………………
CONNECTS*connect;//音符连接线
CONNECTS*connectsyin//连音符
TRAILBRIDGES*trailbridges;//尾桥队列
BOOLrepeat;//有无重复符号
intrepeattype;//重复符号的类型
intstart[4],end[4];//重复符号的起点,终点位置;位置五线谱号,声部,
小节和音符(组合音符看成一个音符)决定.
}MEASURE;
…………………….谱号数据结构……………………….
typedefstructclef{
CLEF_TPYEtype;//谱号类型
intlocation;//谱号线位置(从下加三线到上加三线,第一线位置设定为0)
}CLEF;
EnumCLEF_TYPE{G,F,C}
………………………调号数据结构…………………….
typedefstructkeysignature{
inttype;//调号值(-7—7)
intlocation;//调号线位置
}KEYSIGNATURE;
…………………………拍号数据结构……………………..
typedefstructbat{
inttop,down;//拍号上、下数字
intposx,posy//拍号线坐标
}BAT
…………………………..小节线数据结构…………………….
typedefstructbatline{
BARTLINE_TPYEtype;//小节线的类型
BOOLdecoration;//有无装饰符号
intdecorationtype[2];//小节线装饰符号类型,如延长音,换气符号等。
}BATLINE;
enumbarline{barline,dbline,sline}BARLINE_TYPE;//小节线类型,小节线,复纵线,终止线
typedefstructlegato{
BOOLtype;//连接线的类型,ture完全在一个小节内
intstart[4],end[4];//连接线起点和重点位置,位置定义同重复符号
}LEGATO
typedefstructconnectyin{
BOOLtype;//连音符的类型,几连音
intstart[4];//连接音起点位置,
}CONNECT
Typedefstructtrailbridge{
intstart[4],end[4],;//尾桥起点位置
}TRAILBRIDGE
………………………..特征音符数据结构………………………..
…………………………..基类符号数据结构………………………..
typedefstructnotation{
intlocation;
structnotation*flink;
structnotation*blink;
}
…………………………..单个音符数据结构………………………..
typedefstructnote{
BOOLe_stem;//标示音符有无符干
BOOLstemup;//标志符干的方向
BOOLhook;//标志有无符尾
intnflag;//记录符尾的数目
HEAD*head;
BOOLdot;
}Note
…………………………..符头数据结构………………………..
typedefstructhead{
HEAD_TYPEh_type;//记录符头形状(空心或实心)
intlocation;//记录符头谱线位置
ACCID_TYPEaccidental;记录变音记号类型;升音、降音和还原记号
inta_location;记录变音记号谱线位置
}Head;
enumhead_type{hollowness,solid};
…………………………..单个音符数据结构………………………..
typedefstructnote{
floatduration;
structnote*flink;
structnote*blink;
intnaugdots;//记录附点数
inttype;//记录特征音符和休止符的类型(如0表示全音符)
intlocation;//记录符头谱线位置
BOOLstemup;//标志符干的方向
ACCID_TYPEtype;//记录变音记号类型;升音、降音和还原记号
intnflags;//记录符尾个数
intvarlocation;//记录变音记号谱线位置
BOOLornament;//有无装饰音
Intornamenttype;//装饰音的类型
BOOLellipsis;//有无省略符号
Intellipsis;//省略符号的类型
BOOLcommon;//有无常用记号
Intcommon;//常用记号类型
BOOLyiyin;//有无倚音;
YIYINnote;//倚音信息;
}Note;
…………………………..和弦数据结构………………………..
typedefstructchord{
intnnotes;//记录和弦中音符个数
structnoteCnote[nnotes];//构成和弦的音符
intlocation[nnotes];//记录各音符符头在五线谱中的位置
intnaugdots;//记录附点数
inttype;//记录特征音符和休止符的类型(如0表示全音符)
intlocation;//记录符头谱线位置
BOOLstemup;//标志符干的方向
ACCID_TYPEtype;//记录变音记号类型;升音、降音和还原记号
intnflags;//记录符尾个数
intvarlocation;//记录变音记号谱线位置
BOOLornament;//有无装饰音
Intornamenttype;//装饰音的类型
BOOLellipsis;//有无省略符号
Intellipsis;//省略符号的类型
BOOLcommon;//有无常用记号
Intcommon;//常用记号类型
BOOLyiyin;//有无倚音;
YIYINnote;//倚音信息;
}CHORD;
…………………………..休止符数据结构………………………..
typedefstructrest{
intlocation;
rest_typertype;
BOOLedot;
floatduration;(1,1/2,1/4)
structnote*link;
}Rest
enumrest_type{}
…………………………..附点数据结构………………………..
typedefstructdot{
intlocation;
Dot_typedot;//记录附点类型(单附点,复符点)
}Dot
enumdot_type{singledot,doubledot};
…………………………..
typedefstructstrongweak{
inttype;//由强变弱,还是弱变强
intstart[2],end[2];//起点、终点位置,位置定义由小节,音符决定
intlength;//长度(几个音符)
}STRONGWEAK
Typedefstructpause{
intlocation;
}
typedefstructyiyin{
inttype;//倚音的类型,
intnotetype[2];//倚音中的音符类型
intlocation[2];//倚音音符号位置(在第几线上)
}YIYIN
-----------------------------------
typedefstructmordent{
inttype;//波音的类型
intnotetype[2];//波音中的音符类型
intlocation[2];//波音音符的位置
}Mordent
typedefstructtrill{
inttype;//颤音的类型
intnotetype[2];//颤音中的音符类型
intlocation[2];//颤音音符的位置
}Trill
typedefstructinvertedturn{
inttype;//回音的类型
intnotetype[2];//回音中的音符类型
intlocation[2];//回音音符的位置
}Turn
typedefstructoctave{
inttype;//八度记号的类型
intnotetype[2];//八度记号的音符类型
intlocation[2];//八度记号音符的位置
}Octave
typedefstructtrembolo{
inttype;//震音记号的类型
intnotetype[2];//震音记号的音符类型
intlocation[2];//震音记号音符的位置
}Trembolo//(震音记号的斜线数目和尾符相同)
typedefstructrptnotation{
inttype;//反复记号的类型
intnotetype[2];//反复记号的音符类型
intlocation[2];//反复记号音符的位置
}
Enumrepeat{
typedefstructstaccato{
inttype;//断音记号的类型
intnotetype[2];//断音记号的音符类型
intlocation[2];//断音记号音符的位置
}
typedefstructsostenuto{
intlocation;//保持音记号
}
typedefstructarpeggio{//琶音记号只用在和弦中
inttype;//琶音记号
intnotetype[2];
intlocation;
}
typedefstructglissando{
inttype;
intlocation;//滑音记号
}
typedefstructbreath{
intlocation;//呼吸记号
}
typedefstructaccent{
intlocation;//重音记号
}
typedefstructtie{
BOOLinterbar;//延音线是否在一个小节内
intstart[4],end[4];
}
(前奏prelude,间奏interlude,后奏coda)
Typedefstructinterval{
Interval_typetype;
}//音程
以悲怆交响乐第一乐章的五线谱为例,其五线谱数据结构可以表示为:
SYSTEMa;a.linedistance=20;//表示该歌曲五线谱谱线间隔为20个象素
a.stavecontype=1;//表示该歌曲五线谱两个声部之间由花括号相连
a.number=5;//表示该歌曲由五个五线谱构成
a.staves=b[0];//b[0]为其中一个五线谱,该歌曲中一共有五个,因为是描述第一五线谱,//所以取b[0],如果描述第2个,则取b[1]
STAVE*b[4];//五个五线谱
b[0].number=2;//表示第1个五线谱包含2个声部
b[0].voiceparts=&c[0];//c[0]为乐谱中的第一个声部,该歌曲中一共有10个,因为是描述第一个声部,//所以取c[0],如果描述第2个,则取c[1]
VOICEPART*c[10];//五个五线谱
c[0].number=4;//表示第1个声部包含4个小节
c[0].voiceparts=&d[0];//d[0]为乐谱中的一个小节,该歌曲中一共有40个,因为是描述//第一个小节,//所以取d[0],
MEASURE*d[40];//40个小节
d[0].pedigrees=&e1[0];//表示第1个谱号
d[0].signatures=&e2[0];//表示第1个调号
d[0].bats=&e3[0];//表示第1个拍号
d[0].chords=&e4[0];//表示第1个音符
d[0].barlines=&e5[0];//表示第1个小节线
d[0].connects=&f1[0];//表示有1个连接线,f1[0]表示
PEDIGREE*e1[40];//一共有40个谱号
SIGATURE*e2[40];//一共有40个谱号
BATS*e3[40];//一共有40个谱号
CHORDS*e4[40];//一共有40个谱号
BARLINES*e5[40];//一共有40个谱号
e1[0].type=1;//表示高音谱号
e1[0].location=3;//表示起点位置在第二线
调号,拍号,小节线的描述方法都相类型,只需对照数据结构即可很轻易的描述出来,在这里不再描述,下面把第一个乐谱符号表达如下:
e4[0].Naugdots=0;//表示没有附点数
e4[0].length=50;//表示符干的长度为50
e4[0].type=6;//表示4分休止符
e4[0].location=3;//位置在第二线上
e4[0].type=0;//表示无变音记号
e4[0].nflags=0;//表示无符尾
e4[0].varlocation=0;//表示无位置信息
e4[0].bflags;=0;//表示无尾桥
e4[0].decoration=false;//表示无装饰符号
CONNECT*f[10];
f1[0].type=false;//不在一个小节内
f1[0].start=false;//不在一个小节内
f1[0].end=false;//不在一个小节内
谱号的类型:
G谱,F谱,C一线谱C二线谱,C三线谱(中音谱表),C四线谱(次中音谱),C五线谱,
连谱号中的由括号(分为直括号和花括号两种)和起线(连接数行五线谱的垂直线)组成。
小节线类型:
单一垂直线,复纵线,终止线
音符类型:
全音符…..1/32音符,全休止符(四线下)二分休止符(三线上)…..1/32休止符,其他长休止符(表示整小节休止)(连续休止数小节时可在长休止符上方加小节号表示)
附点:
个数
连接线:
上括号或下括号,根据符头的位置来确定类型
延长记号:
放在休止符、音符的上方或下方,
连音符:
包括单纯音符构成的连音符和附点音符构成的连音符,常见的单纯音连音符有三连音,五连音,七连音,九连音,十连音(还有十一……十五)等,常见的附点音符构成的连音符有二连音和四连音(即将附点音符(即带附点的音符)分成两部分,四部分,代替三部分)。
变音符号:
升高,降低,重升,重降,还原
拍号:
分为分子和分母两部分
装饰音:
倚音(前倚音(记录在主要音的前面)和后倚音(记录在主要音的后面))、长倚音(符干向上,与主要音相隔2度,总在主要音的前面);波音(记录在音符上方,顺波,复顺波,逆波,复逆波);颤音(
音符的上方,显示的时候,只有颤音一种装饰音,使用第二种表示方法,否则使用第一种表示方法);回音(
顺回音或逆回音,记录在音符的上方或两个音符之间)
省略记号:
移动八度记号(高八度和低八度)(标记在声部信息内),重复八度(标记在音符的上方或者下方,标记作为音符装饰音的一种类型)
震音记号:
(用斜线表示,数目与符尾数目相同)