论文为:COCHONUT: Recognizing Complex Chords From MIDI Guitar Sequences
出处:international symposium/conference on music information retrieval(ISMIR) 2008
 
自动和弦辨别的难点:
strong context dependency and the large number of possible combinations of the intervals which the chords are made of, specially when dealing with dissonances,and suspended chords.
论文提出一个新的方法COCHONUT (Complex Chords Nutting)来识别midi guitar的和弦,基于contextual harmonic information + decision theory + optimization + pattern matching + rule-based recognition
COCHONUT的目标不仅是辨认1,3,5音,复杂音符,4音符,5音符,6音符和弦也能被辨认出来。
 
代码中是基于musicXML来进行解析,因此可以得到歌曲大小调标志(后续根据上下文来增强识别和弦时需要用到)
第一步,a segmentation algorithm判断出最可能的和弦变化的点,这一步做分割。主要函数
,segments是一个记录了n个segment的list,每一个segment记录了一段共用和弦的时间段。划分原理大概是基于note的数量的。这里
 
第二步,utility function判别每个segmentation的和弦;

这里构建了一个weight权重数组(12音阶),统计出该段中的音符值次数(权重比例),将该权重数组与事先定义好的和弦template一起匹配,得到每个和弦的得分,并得出最佳得分的和弦。

templates = [{'name': 'maj', 'pattern': [0, 4, 7]},
{'name': 'minor', 'pattern': [0, 3, 7]},
{'name': 'diminished', 'pattern': [0, 3, 6]},
{'name': '-5', 'pattern': [0, 4, 6]},
{'name': 'aug', 'pattern': [0, 4, 8]},
{'name': 'sus4', 'pattern': [0, 5, 7]},
{'name': 'sus2', 'pattern': [0, 2, 7]},
{'name': 'maj7', 'pattern': [0, 4, 7, 11]},
{'name': 'maj7+5', 'pattern': [0, 4, 8, 11]},
{'name': 'dom', 'pattern': [0, 4, 7, 10]},
{'name': 'add9', 'pattern': [0, 4, 7, 14]},
{'name': '1/2dim', 'pattern': [0, 3, 6, 10]},
{'name': 'dim7', 'pattern': [0, 3, 6, 9]},
{'name': 'min7', 'pattern': [0, 3, 7, 10]},
{'name': 'min/maj7', 'pattern': [0, 3, 7, 11]},
{'name': '7+5', 'pattern': [0, 4, 8, 10]},
{'name': '7-5', 'pattern': [0, 4, 6, 10]},
{'name': '7sus4', 'pattern': [0, 5, 7, 10]},
{'name': 'maj6', 'pattern': [0, 4, 7, 9]},
{'name': 'minor6', 'pattern': [0, 3, 7, 9]},
{'name': 'madd9', 'pattern': [0, 3, 7, 14]},
{'name': 'm6/9', 'pattern': [0, 3, 7, 9, 14]},
{'name': '6add9', 'pattern': [0, 4, 7, 9, 14]},
{'name': '7/6', 'pattern': [0, 4, 7, 9, 10]},
{'name': '9', 'pattern': [0, 4, 7, 10, 14]},
{'name': '7/13', 'pattern': [0, 4, 7, 10, 21]},
{'name': '9-5', 'pattern': [0, 4, 6, 10, 14]},
{'name': '9+5', 'pattern': [0, 4, 8, 10, 14]},
{'name': 'min9', 'pattern': [0, 3, 7, 10, 14]},
{'name': '7-9', 'pattern': [0, 4, 7, 10, 13]},
{'name': '7+9', 'pattern': [0, 4, 7, 10, 15]},
{'name': 'maj9', 'pattern': [0, 4, 7, 11, 14]},
{'name': 'min/maj9', 'pattern': [0, 3, 7, 11, 14]},
{'name': '9/6', 'pattern': [0, 4, 7, 9, 10, 14]},
{'name': 'maj11', 'pattern': [0, 4, 7, 11, 14, 17]},
{'name': '9+11', 'pattern': [0, 4, 7, 10, 14, 18]},
{'name': '11', 'pattern': [0, 4, 7, 10, 14, 17]},
{'name': '11-9', 'pattern': [0, 4, 7, 10, 13, 17]},
{'name': 'aug11', 'pattern': [0, 4, 7, 10, 14, 18]},
{'name': 'min11', 'pattern': [0, 3, 7, 10, 14, 17]},
{'name': 'min13', 'pattern': [0, 3, 7, 10, 14, 17, 21]},
{'name': 'maj13', 'pattern': [0, 4, 7, 11, 14, 17, 21]},
{'name': '13', 'pattern': [0, 4, 7, 10, 14, 17, 21]},
{'name': '13-9', 'pattern': [0, 4, 7, 10, 13, 17, 21]},
{'name': '13-9-6', 'pattern': [0, 4, 6, 10, 13, 17, 21]},
{'name': '13-9+11', 'pattern': [0, 4, 7, 10, 13, 18, 21]},
{'name': '13+11', 'pattern': [0, 4, 7, 10, 14, 18, 21]},
{'name': '13b', 'pattern': [0, 4, 7, 10, 14, 17, 20]}]
 

接下来,把前后相关的segments和调式一起结合起来,从上下文的角度来增强和弦挑选的准确性。

大调和小调的区别处理

事先定义好的和弦走向转换图

第三步,graph is built表示出最可能的和弦整体图,A rule base containing common chord sequences patterns in jazz harmony is used to solve ambiguous cases.
 
 
 
 

基于COCHONUT做和弦识别的更多相关文章

  1. 基于Python使用SVM识别简单的字符验证码的完整代码开源分享

    关键字:Python,SVM,字符验证码,机器学习,验证码识别 1   概述 基于Python使用SVM识别简单的验证字符串的完整代码开源分享. 因为目前有了更厉害的新技术来解决这类问题了,但是本文作 ...

  2. 基于FPGA的肤色识别算法实现

    大家好,给大家介绍一下,这是基于FPGA的肤色识别算法实现. 我们今天这篇文章有两个内容一是实现基于FPGA的彩色图片转灰度实现,然后在这个基础上实现基于FPGA的肤色检测算法实现. 将彩色图像转化为 ...

  3. 基于ARM的车牌识别技术研究与实现

    在云盘里包含了我本科毕业设计的全部资料和代码.主要涉及下面摘要中的几个部分.虽然系统无法实用,但是适合机器视觉和嵌入式方向的入门.希望能对有志从事相关方向的朋友有所帮助.本人现在在深圳从事机器视觉算法 ...

  4. 基于FPGA的数字识别的实现

    欢迎大家关注我的微信公众号:FPGA开源工作室     基于FPGA的数字识别的实现二 作者:lee神 1 背景知识 1.1基于FPGA的数字识别的方法 通常,针对印刷体数字识别使用的算法有:基于模版 ...

  5. 【文智背后的奥秘】系列篇——基于CRF的人名识别

    版权声明:本文由文智原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/133 来源:腾云阁 https://www.qclou ...

  6. 基于 OpenCV 的人脸识别

    基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...

  7. 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)

    学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧.前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码.今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码.这里没有使用 ...

  8. 基于node.js人脸识别之人脸对比

    基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...

  9. 基于ORB-SLAM2的图片识别

    基于ORB-SLAM2的图片识别,其功能是首先运行ORB-SLAM2,在运行过程中调起另一个线程进行图像识别,识别成功后在图片上渲染AR中的立方体模型. 识别过程主要基于ORB-SLAM2中的BoW算 ...

随机推荐

  1. 【概率dp】C. Race to 1 Again

    https://www.bnuoj.com/v3/contest_show.php?cid=9146#problem/C [题意] 给定一个数D,每次随机选取这个数的一个因子x得到新的数D=D/x,知 ...

  2. 【树形DP】codeforces K. Send the Fool Further! (medium)

    http://codeforces.com/contest/802/problem/K [题意] 给定一棵树,Heidi从根结点0出发沿着边走,每个结点最多经过k次,求这棵树的最大花费是多少(同一条边 ...

  3. 如何在Eclipse中生成Native类对应的JNI的.h文件

    1 致谢 感谢super_level网友 他的博客写的很清楚 给了我很多帮助 链接如下:http://blog.csdn.net/super_level/article/details/2124353 ...

  4. mysql针对转义字符的模糊搜索

    由于urlencode之后会产生很多'%'符号,这个符号在mysql模糊搜索中代表任意字符,显示会出现问题,例如 name字段经过urlencode之后变成‘%E6%9D%8E%E5%87%A1’,如 ...

  5. POJ 1860【求解是否存在权值为正的环 屌丝做的第一道权值需要计算的题 想喊一声SPFA万岁】

    题意: 有n种钱币,m个钱币兑换点,小明一开始有第n种钱币数量为w. 每个兑换点可以将两种不同的钱币相互兑换,但是兑换前要先收取一定的费用,然后按照比例兑换. 问小明是否可以经过一系列的兑换之后能够将 ...

  6. java学习——关于java课件上动手动脑问题简单的分析

    问题一:关于以下的代码为什么会产生错误的问题的简单分析. 第一个动手动脑提供了一下的代码,可以发现,在Foo的这个类中只定义了一个Foo(int)类型的构造函数,在之前的学习工程中,我们并没有接触到j ...

  7. 【OpenGL】Shader实例分析(七)- 雪花飘落效果

    转发请保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一个雪花飘落效果.感觉挺不错的.分享给大家,效果例如以下: 代码例如 ...

  8. webpack-Hot Module Replacement(热更新)

    模块热替换(Hot Module Replacement) 模块热替换(HMR - Hot Module Replacement)功能会在应用程序运行过程中替换.添加或删除模块,而无需重新加载整个页面 ...

  9. 深度学习笔记之CNN(卷积神经网络)基础

    不多说,直接上干货! 卷积神经网络(ConvolutionalNeural Networks,简称CNN)提出于20世纪60年代,由Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经 ...

  10. GCC 编译详解 (转)

    GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...