论文为: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. javascript 保护变量不被随意修改------优雅的编程

    /* * 1.如果在renderTitle,renderContent里面,这样总数据谁都能修改,不安全 * 改进 * 1.规定一个专门修改数据的方法,如果想修改数据只能走这个方法 * * actio ...

  2. 【Ural1297】Palindrome(后缀数组)

    题意:求一个字符串的最长回文子串 n<=1000 思路:这是一道论文题 需要注意的细节: 1.奇偶分类 2.中间的分割符与最后的附加字母都是最小值,但两者不能相同,否则height可能会出现问题 ...

  3. poj1523求割点以及割后连通分量数tarjan算法应用

    无向图,双向通道即可,tarjan算法简单应用.点u是割点,条件1:u是dfs树根,则u至少有2个孩子结点.||条件2:u不是根,dfn[u]=<low[v],v是u的孩子结点,而且每个这样的v ...

  4. django学习之- session

    session和cookie关系:session依赖于cookie基于cookie做用户验证时,敏感信息不适合放在cookie中原理:cookie定义:保存在用户游览器端的键值对session定义:保 ...

  5. hihocoder 1873 ACM-ICPC北京赛区2018重现赛 D Frog and Portal

    http://hihocoder.com/problemset/problem/1873 时间限制:1000ms 单点时限:1000ms 内存限制:512MB 描述 A small frog want ...

  6. Borg Maze-POJ3026(bfs+最小生成树)

    http://poj.org/problem?id=3026 如果一个一个普通搜处理不好的话会超时  可以连到一块搜 我觉得这个方法特别好 #include<stdio.h> #inclu ...

  7. 洛谷—— P1133 教主的花园

    https://www.luogu.org/problem/show?pid=1133 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都 ...

  8. P2839 畅通工程

    P2839 畅通工程 题目描述 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连, ...

  9. javascript 自定义错误处理

    php 中是可以自定义程序的错误和异常处理函数的(handler).于是,我在想,javascript 中是否也存在和PHP中一样的异常和错误处理函数呢? try{}catch(){} 这种捕捉异常和 ...

  10. android findVIewById()在线生成工具

    今天突然发现一个好工具,能够依据你输入的XML布局文件,自己主动生成findViewById的代码.还支持android annotation的注解方式.真是太棒了.由于我正是使用androidann ...