论文为: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. C#中对字符串的加密和解密

    加密: /// <summary> /// 对字符串进行加密 /// </summary> /// <param name="proclaimText" ...

  2. 矩形周长(codevs 2149)

    题目描述 Description N(N<5000) 张矩形的海报,照片和其他同样形状的图片贴在墙上.它们的边都是垂直的或水平的.每个矩形可以部分或者全部覆盖其他矩形.所有的矩形组成的集合的轮廓 ...

  3. 用 Gearman 分发 PHP 应用程序的工作负载【转载】

    通过本文,了解工作分发系统 Gearman 并分发用 PHP.C.Ruby 及其他受支持语言编写的应用程序的工作负载. 尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体 ...

  4. 编写一个删除c语言程序文件中所有的注释语句

    //删除c语言程序中所有的注释语句,要正确处理带引号的字符串与字符串常量 #include <stdio.h> using namespace std; #define MAXLINE 1 ...

  5. HDU 5360 【优先队列+贪心】

    题意: 给定N个无序区间. 对合法区间的定义是: 在这个区间之前已经选出了至少l个合法区间,最多选出了r个合法区间.则该区间为合法区间. 输出最多能挑选出多少个合法区间,并输出合法区间的数量. 思路: ...

  6. 2016 ACM-ICPC CHINA-Final

    补题进度:10/12 地址:http://codeforces.com/gym/101194 A(签到) 略 B(数位DP) 题意: 定义一个01字符串为good串当且仅当将其奇数位或者偶数位单独拎出 ...

  7. Java调用WSDL接口

    1.首先准备jar包: 2.代码调用如下: String url="url地址"; QName qName=new QName("命名空间","接口名 ...

  8. POJ2573 Bridge 经典的过桥问题

    曾经遇到过类似的.纪念一下!这题同一时候也是  ZOJ1877.经典的过桥问题 是有个博客解说的非常好的 戳这里 挺久曾经.遇到过一个基本一样的,那个题目仅仅要求求出 最短时间就可以,如今还有过桥的过 ...

  9. java纯数字加密解密实例

    我们都知道,在用户加入信息时,一些比較敏感的信息,如身份证号,手机号,用户的登录password等信息,是不能直接明文存进数据库的.今天我们就以一个详细的样例来说明一下纯数字的java加密解密技术. ...

  10. 如何用css给博客换一个好看的样式

    第一步:点击设置,将如下代码复制到页面定制css代码 h3 { color: #fff; background-color: #008eb7; -moz-border-radius: 3px; bor ...