基于欧几里得算法原理的乐谱生成APP的设计与应用

摘要:音乐可以陶冶情操,舒缓压力,放松心情,因此,音乐成为人们日常生活中不可或缺的一部分。该乐谱生成APP从满足人们对音乐生活的需求出发,利用欧几里得算法、乐谱识别技术实现对乐谱的自动生成系统的设计与实现,通过登录注册模块,搜索模块,曲目识别模块,讨论区模块,个人主页等一系列模块,提供一个音乐平台,为用户提供优质的服务,给用户一个自由的音乐空间。

近年来,我国科学不断进步和发展,人们的生活水平也在随之不断提高,人们对自身精神生活修养的要求也逐渐提高。同时,人们对自身以及周边人的文化水平及文化素养的要求也越来越高。音乐可以陶冶情操,舒缓压力,放松心情,因此,音乐成为人们日常生活中不可或缺的一部分。还有一部分人沒有系统学习过音乐相关知识,但是他们对音乐有着渴求,在自学同时也希望可以根据自己的喜好选择一些流行歌曲、小众歌曲来演奏,但大部分乐谱书都只有传统古典乐,所以寻找合适的乐谱非常困难。


随着信息技术的应用及互联网的迅速发展,人们可以网上听音乐,学习音乐相关知识,学习如何识曲、谱曲或者演奏,由此众多音乐类APP应运而生。目前国内听音乐的APP比较多,但是乐谱APP相对较少,且未形成一定范围内的影响力,有部分发展较好的软件虽比较贴合大众,可以供一些业余爱好音乐的人作谱演奏,但因其乐曲范围小,设计不能跟随时代改进,且曲内还容易出现一些错误、纰漏,无法给予用户更好的演奏体验。因此,音乐APP市场有着很大一片的空白,流通于网络的乐谱常常供不应求。


本研究旨在运用欧几里得算法等技术识别曲谱,进而转化为乐谱,满足人们对音乐、乐谱的需求,提供平台及讨论区以供爱好者探讨音乐,结交好友,为大众提供简单易行的音乐软件。


1、欧几里得算法原理及应用


1.1欧几里得算法


1.1.1欧几里得算法概述


欧几里得算法是求正整数的最大公约数的算法,广泛应用于数学和计算机研究领域。数学家欧几里得早在古希腊时就已经描述过这一算法,它可以用swift、C语言、C++等多种编程语言实现[1]。欧几里得算法具体的原理如图1所示。

该算法由C语言实现,具体代码为:


Int gcd(int a,int b)


{


If(b==0)


{


Return a;


Return gcd(b,a%b);


}


}


1.1.2应用


欧几里得算法的应用主要是在推荐系统中形成距离评价进而评估用户关系。基于欧几里得嵌入的推荐算法是将用户和物品嵌入到统一的欧几里得空间中,并用欧式距离表示用户与物品间的相关程度。通过公式计算,我们可以得到不同用户间的欧几里得系数,系数越小表示两个用户间的距离越小,即用户偏好相近[2]。


欧几里得距离评价的应用,让我们可以通过用户以前的喜好和与他兴趣相近的人的爱好来筛选过滤出乐谱,从而达到给用户推荐乐谱的目的。我们不难发现,目前市面上用户群较大的听歌软件如QQ音乐、网易云音乐以及大部分人经常使用的网购软件淘宝都具备类似的用户推荐算法。当然,世界上不会有兴趣爱好一模一样的人,当某一个用户喜欢上某一首不那么受大众欢迎的乐谱时,以上算法的推荐可能就没有那么准确了。因此,我们可以加权这个评价,用户的相似度越高,最终评分就越高,总结成公式为:


部分代码为:


#构建共同的评分向量


def build_xy(user_id1,user_id2):


bool_array=df.loc[user_id1].notnull()&df.loc[user_id2].notnull()


return df.loc[user_id1,bool_array],df.loc[user_id2,bool_array]


#欧几里德距离


def euclidean(user_id1,user_id2):


x,y=build_xy(user_id1,user_id2)


try:


value=sum((x-y)**2)**0.5


except ZeroDivisionError:


value=0


return value


#余弦相似度


def cosine(user_id1,user_id2):


x,y=build_xy(user_id1,user_id2)


#分母


denominator=(sum(x*x)*sum(y*y))**0.5


try:


value=sum(x*y)/denominator


except ZeroDivisionError:


value=0


return value


1.2基于乐器演奏水平调整乐谱难度

在同一张乐谱中,不同的乐器需要使用不同的调来演奏,这是因为有些乐器需要通过移调,才可以达到和别的乐器一样的音高。比如,B调单簧管比普通乐器低二度,也就是说,单簧管乐谱上的do,就是si的音高。因此,为了更好地满足用户的需求,我们添加了一个乐器选择的栏目,以一种乐器的乐谱为基准,根据用户选择的乐器,将原有的乐谱整体移高或降低相应的度数从而生成相应的乐谱。


1.3乐谱识别方法


乐曲的构成成分十分复杂,若使用的乐器种类较为单一,那么识别出该乐曲的难度会相对较低,识别出的乐谱也会更加精准。此外,当泛音的强度超过了一定水平时,可能会出现频谱混叠的现象。实际应用时,我们识别处理的乐曲通常使用多种乐器,构成的成分也比较复杂,为了准确识别这些乐谱,多声部的乐谱音符基频识别功能是必须的[3]。首先需要去除噪音,这些噪音存在于乐谱之中,比如工频噪音和高斯白噪音,对这些噪音的每一帧都进行处理,就可以轻易地去除噪音,获得平滑音符。此外,我们还需要得到基频特征序列,通过计算每一帧音符的能量,就可以获知各个音符的基频特征参数,根据每一帧音符的参数创建基频特征序列。在乐曲音符识别过程中,需要将人声和伴奏分为两个频道,进行分离操作,并且通过主旋律提取等技术识别乐谱,Adobe Audition cs6,Logic Pro X等软件可以辅助我们实现这些操作。最后,根据改进后的欧几里得算法,我们可以收集不同风格,不同类型的曲谱比如慢歌,快歌,摇滚,古风,中文歌,西语歌,日语歌,韩语歌,等等,以它们为基础,收集足够的数据,然后构建多种不同类型的数据模型,将千千万万的乐曲进行分析和分类,乐曲中相似的部分可以套用同一个数据模型,有效地提高了乐谱识别的效率。


1.4主旋律提取


主旋律提取技术是基于欧几里得算法进一步扩展到浮点数据,它根据每个顶点的频率估计候选音高,把选中的音高集合到足够接近时间和频率的地方,以形成音高轮廓,根据音高轮廓的显著函数形成音高序列。为了打破音乐的不稳定性和有限的音高选择的限制,我们可以首先改进欧几里得算法来选择候选音高,再利用动态规划算法跟踪主旋律轮廓,让主旋律提取的过程更加准确、优化[4]。


部分代码为:


#计算区段相似矩阵


def compute_similarity_slow(self,chroma):


num_samples=chroma.shape[1]


time_time_similarity=np.zeros(num_samples)


for i in range(num_samples):


for j in range(num_samples):


time_time_similarity[i,j]=(np.linalg.norm(chroma[:,-1]-chroma[:,-1])/sqrt(12))


return time_time_similarity


1.5獲取音频数据


为了获得范围广阔,数量庞大的乐库,我们需要广泛的收集歌曲并且合法购买它们的版权。这个乐库就是最基础的音频,音频需要转化成数据才能为机器所使用。获取音频数据首先要将乐曲导入,或者通过麦克风录入声音。其次,通过脉冲代码(PCM编码)或者模数转换器对导入的音频或者获取的声音进行采样编码,形成数字编码,最终音频会被转化为数据资料为机器所利用。在这个过程中,有三个基本参数:采样频率,采样位数,声道数,通过这三个参数来解析音频文件[5]。


部分代码实现为:


#将左右声道的数据分离成两个文件


int pcm16le_split(char*pcmfile){


FILE*sfp=fopen(pcmfile,"r");


FILE*dfp1=fopen("output_l.pcm","w+");


FILE*dfp2=fopen("output_r.pcm","w+");


char*sample=malloc(sizeof(char)*4);


while(!feof(sfp))


{


fread(sample,sizeof(char),4,sfp);


fwrite(sample,sizeof(char),2,dfp1);


fwrite(sample+2,sizeof(char),2,dfp2);


}


free(sample);


fclose(sfp);


fclose(dfp1);


fclose(dfp2);


return 0;


}


int main(int argc,char const*argv[])


{


pcm16le_split("samples/test.pcm");


return 0;


}


2、乐谱生成系统设计


2.1 UI设计


界面设计可以根据制作者和设计者的需求,既可选择自主设计,制作出一套“定制”版APP,也可以选择套用现在已经成熟的设计风格和设计规范。在实际运用中,一个APP的页面不能太过繁杂,这会使人眼花缭乱而感到不适,简洁美观而又方便操作才是UI设计最重要的。同时,规范的字体和格式等等可以使页面显得一目了然,更加简洁直观,降低使用者使用的门槛。本次的APP图标设计,我们选择制作使用简洁美观,有记忆性及可选择性的图标。


2.2页面设计


乐谱生成系统的总体部分,可分为iOS系统与Android系统两个版本。APP界面的设计采用简单美观大方实用的形式,分为前端和后端,前端模块分三个部分,分别是个人、功能和软件反馈,功能模块图如图2所示。


下文具体介绍介绍前端功能:


第一个部分是用户的个人主页,这一部分可分为两个部分,一是用户的个人详细信息,比如昵称,年龄,性别等等,二是用户查询管理功能,用户可以查看自己的软件使用情况并进行管理,包括对账户的信息更改,添加删除收藏记录,对消息是否自动推送的设置,对个人计划文本档的管理。


对于我的界面,包含用户个人账号信息、用户个人账号管理、用户搜索记录、曲目收藏、用户以往计划,推送信息,以及用户可根据需求制定自己的练习计划。具体实现如图3所示。


部分代码为:


{{us.nickName}}


請登录


收藏


搜索记录


个人练习计划


账号信息及管理


第二個部分是软件的主要功能模块,最基本的功能是搜索功能,通过检索关键词给出相应的信息,若未检测出结果也要给出相应的反应。与之相关联的功能是能够与其他软件实现跳转操作,实现分享乐曲的功能[6]。此外,还需要信息推送功能,实时更新动态等一系列必要的功能。具体实现如图4所示。


部分代码表示为:


首页


搜索喜欢的音乐


{{item.content}}


APP功能界面能够帮助用户进行账号注册:首先APP内部要有存储功能,能够准确且迅速地查找到用户所检索的内容,与此同时请用户进行一些个人属性的设置。因此用户如果想要更加方便快捷的使用APP功能,就必须进行账号注册,拥有自己的账号来存放相关信息。用户可以选择采用手机号注册,邮箱注册或者第三方账号登录注册的方式进行账号注册。另外需要注意的是,可能有些人因为担心个人信息会遭到泄露,而选择不注册账号,甚至直接放弃使用APP。由此可知,确保用户信息安全,这一点至关重要。


此款APP中,在首页界面,用户可进行曲目识别与分类检索,对于每首曲子都可发弹幕、发表评论,且在首页会根据用户标签或者检索内容提供相关用户可能感兴趣的曲目及合作方所需要的音乐宣传。另外,还可以分类选择乐谱,如钢琴,吉他等,也可制作特辑或合集,供用户选择。


社区界面,大体分为三部分,关注、动态、圈子,关注界面为关注喜欢的歌手、朋友等发的动态,动态界面中包含热议话题、百科知识、同城动态,可在此界面发表自己的动态(根据使用情况,可紧跟时事提供直播等功能),圈子界面里为不同群组发表的动态,对于有相同兴趣的人可建分组群聊。


商城界面,用户可在其中购买乐器等所需品,此界面也会按商品进行分类,为用户提供快捷、便利的购物环境,用户可在此界面看到订单的所有情况,包括全部订单、待支付订单、代签收订单及售后。


第三部分是用户软件反馈,即对软件进行系统设置以及用户给予软件开发者的使用反馈。软件反馈区块包括软件的基本设置(用户的注册与注销,版本的更新,系统后台继续运作等),用户意见反馈(使用文字,语音等方式向软件开发者提交用户的使用意见),商业合作联系方式(需要宣传的乐曲可通过此渠道与专人展开联系)。软件后端即软件后台管理系统,统筹管理用户所上传的各类信息及各种消息的推送。与此同时,软件也通过应用大数据技术同时记录用户的搜索记录等,便于软件的升级与更新换代[7]。


3、结论


本文介绍了基于欧几里得算法的乐谱生成APP的设计与应用。欧几里得算法的应用主要是在推荐系统中形成距离评价进而评估用户关系,基于欧几里得嵌入的推荐算法,软件可以更加精确、迅速地捕捉用户的兴趣所在,从而达到给用户推荐乐谱的目的。该APP主要包括搜索歌曲,识别乐谱,查看并管理个人信息,社区交流等功能。通过这些功能,我们可以更加方便快捷地提供音乐需求服务,为音乐爱好者提供一个平台。


来源:现代信息科技刘雨欣 陈佳欣 董瑞雪 刘卓尔 朱吟秋

文章内容来自网络,如有侵权,联系删除、联系电话:023-85238885

参与评论

请回复有价值的信息,无意义的评论将很快被删除,账号将被禁止发言。

评论区