如何通过了解歌曲的和弦顺序以编程方式找到歌曲的键?
我问过一些人他们如何确定一首歌的关键,他们都说他们是"通过耳朵"或"反复试验"并通过判断一个和弦是否能解决一首歌......对于普通音乐家而言可能很好,但作为一个程序员,真的不是我想要的答案.
所以我开始寻找音乐相关的库,看看是否还有其他人为此编写过算法.但是我在GitHub上找到了一个名为'tonal'的真正大的库:https://danigb.github.io/tonal/api/index.html我找不到一种接受一组和弦并返回键的方法.
我选择的语言将是JavaScript(NodeJs),但我不一定要寻找JavaScript答案.伪代码或可以在没有太多麻烦的情况下翻译成代码的解释就完全没问题了.
正如你们有些人提到的那样,歌曲中的关键可以改变.我不确定是否可以足够可靠地检测到密钥更改.所以,现在让我们说,我正在寻找一种算法,可以很好地逼近给定和弦序列的键.
...在查看五度音程后,我想我找到了一种模式,可以找到属于每个键的所有和弦.我为此写了一个函数getChordsFromKey(key)
.通过检查每个键的和弦序列的和弦,我可以创建一个数组,其中包含键与给定和弦序列匹配的可能性的概率:calculateKeyProbabilities(chordSequence)
.然后我添加了另一个函数estimateKey(chordSequence)
,它获取具有最高概率得分的键,然后检查和弦序列的最后一个和弦是否是其中之一.如果是这种情况,则返回仅包含该和弦的数组,否则返回具有最高概率得分的所有和弦的数组.这样做可以,但它仍然找不到很多歌曲的正确键或返回具有相同概率的多个键.和弦之类的主要问题A5, Asus2, A+, A°, A7sus4, Am7b5, Aadd9, Adim, C/G
是不在五分之一圈内.事实上,例如,键C
包含与键完全相同的和弦Am
,以及G
相同的Em
等等...
这是我的代码:
'use strict'
const normalizeMap = {
"Cb":"B", "Db":"C#", "Eb":"D#", "Fb":"E", "Gb":"F#", "Ab":"G#", "Bb":"A#", "E#":"F", "B#":"C",
"Cbm":"Bm","Dbm":"C#m","Eb":"D#m","Fbm":"Em","Gb":"F#m","Ab":"G#m","Bbm":"A#m","E#m":"Fm","B#m":"Cm"
}
const circleOfFifths = {
majors: ['C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#', 'G#','D#','A#','F'],
minors: ['Am','Em','Bm','F#m','C#m','G#m','D#m','A#m','Fm','Cm','Gm','Dm']
}
function estimateKey(chordSequence) {
let keyProbabilities = calculateKeyProbabilities(chordSequence)
let maxProbability = Math.max(...Object.keys(keyProbabilities).map(k=>keyProbabilities[k])) …
Run Code Online (Sandbox Code Playgroud)我有一个网站,以文本格式显示吉他和弦/标签.这是我目前正在展示的内容:
EM:
| | | | | |
| | | | | |
| 2 2 | | |
| | | | | |
| | | | | |
Run Code Online (Sandbox Code Playgroud)
我了解GD可以为此创建动态图像.但我是PHP的新手,我不知道该怎么做.
在PHP中创建这样的东西以显示图像是否很简单?
谢谢
我正在开发依赖于音乐和弦检测的软件.我知道一些基于倒谱分析或自相关技术的音调检测算法,但它们主要关注单声道材料识别.但我需要使用一些复音识别,即同时进行多个音高,就像在和弦中一样; 有谁知道一些关于这个问题的好的研究或解决方案?
我目前正在开发一些基于FFT的算法,但如果有人对我可以使用的某些算法或技术有所了解,那将会有很大的帮助.
我希望在.NET(C#)表单上绘制音乐人员.我使用的是Microsoft Visual C#2010 Express.我想知道是否有人知道现有代码或现有的免费.NET库可以帮助解决这个问题.我正在考虑绘制高音和低音谱号的工作人员,并在工作人员的某些地方添加四分音符.我正在为我的儿子使用C#制作钢琴测试器应用程序.如果我自己编写代码,我可以直接覆盖onPaint方法.但我想我会看到是否有人看到一些免费的代码或库可以让我开始.
我正在WPF工作的主要目的是允许编辑并因此在其上打印带有吉他和弦的歌曲歌词.
即使你不玩任何乐器,你可能已经看过和弦.为了给你一个想法,它看起来像这样:
E E6
I know I stand in line until you
E E6 F#m B F#m B
think you have the time to spend an evening with me
Run Code Online (Sandbox Code Playgroud)
但是我不想使用这种丑陋的单行间距字体,而是希望Times New Roman
字体与歌词和和弦(粗体字的和弦)进行字距调整.我希望用户能够编辑它.
这似乎不是支持的方案RichTextBox
.这些是我不知道如何解决的一些问题:
TextPointer
是歌词行).当用户编辑歌词时,我希望和弦保持在正确的角色上.例:.
E E6
I know !!!SOME TEXT REPLACED HERE!!! in line until you
Run Code Online (Sandbox Code Playgroud)
.
E E6
think you have the time to spend an
F#m B F#m B
evening with me
Run Code Online (Sandbox Code Playgroud)
.
F#m E6
...you have the ti …
Run Code Online (Sandbox Code Playgroud) 我是一个想要构建乐谱应用程序的蟒蛇黑客.我很乐意阅读/理解乐谱(多年来演奏钢琴).这是我完整的新手问题..
是否有以数字方式表示笔记的标准?我不想重新发明任何轮子.
给定一系列音符和持续时间,是否有用于以乐谱格式显示这些音符的库?
基本上我正在寻找一个开始的地方.我不是很重视图形,所以现有的开源库会很棒.如果Python中不存在,我也能胜任Java/Javascript/C.
谢谢
问题
我正在使用LilyPond为教堂合唱团排版乐谱.根据任何给定周的人数,歌曲将以各种键播放.我们有一位出色的钢琴演奏家可以演奏我们扔在她身上的任何东西,吉他手通常会以交替的和弦方式画笔,但我希望通过在我们想要的任何键上提供精美排版的乐谱来让事情变得更轻松.
所以说我们要唱我们的ABC.首先,我将采用任何可用的源代码转换并将其输入LilyPond脚本:
melody = \relative c' {
c c g g
a a g2
f f e e
d d c2 }
Run Code Online (Sandbox Code Playgroud)
我希望能够自动转置它,所以如果我想要'G'中的整个内容我将这首歌包装在\ transpose调用中,如下所示:
melody = \transpose c g \relative c' {
c c g g
a a g2
f f e e
d d c2 }
Run Code Online (Sandbox Code Playgroud)
我真正想要的是用'g'替换某些东西并多次为旋律生成输出.简单的LilyPond变量似乎在这里不起作用,到目前为止,我在定义一个方案函数时没有成功.
我暂时使用的是获取上述文件,将其称为twinkle.ly并将其转换为名为twinkle.ly.m4的M4脚本,其内容如下所示:
melody = \transpose c _key \relative c' {
c c g g
a a g2
f f e e
d d c2 }
Run Code Online (Sandbox Code Playgroud)
然后我通过执行以下行来编译while事物:
> m4 -D _key=g …
Run Code Online (Sandbox Code Playgroud) 我正试图找出一种能够存储同步吉他和弦的纯文本音乐歌词的好方法.在显示时,我希望看到歌词在相应单词上方的"空白"行中以和弦双倍间距呈现.这是我自己的个人歌词书,所以最终渲染将最常见于死树与屏幕,但最终可能会改变.我想我会给Markdown一个镜头,并且当与一些CSS结合使得<a>标签呈现为准上标时,能够获得以下格式"有点"工作.我有点喜欢使用<a>标签,因为我可以在文件底部有任何包含和弦的参考链接:
#Supertramp - Give A Little Bit
[A]
[D]Give a little bit[A][] [D]
Give a little bit[G] of your[A] love to me[G][][A]
[D]: http://guitar.about.com/library/blchord_dmajor.htm "D major"
[G]: http://guitar.about.com/library/blchord_gmajor.htm "G major"
[A]: http://guitar.about.com/library/blchord_amajor.htm "A major"
Run Code Online (Sandbox Code Playgroud)
CSS和转换的markdown在这里:http://jsfiddle.net/654ct/13/
h1 {
font-family: Arial;
font-size: 2em;
margin-bottom: 1em;
}
p {
line-height:1em;
margin-bottom:1.1em;
font-family: Arial;
}
a {
position: relative;
top: -1em;
display:inline-block;
width: 0;
overflow:visible;
color:#00F;
font-weight:bold;
font-family: Arial;
text-decoration: none;
}
Run Code Online (Sandbox Code Playgroud)
我从这里借了很多CSS: 样式文本使它显示在行上方(对于歌词上方的和弦) 我正在写一个新主题,因为这主要是对降价帮助的呼吁.
到目前为止,这种格式的优点在于和弦能够与歌词"内联"编写,因此无论使用何种字体,单词和音乐都保持同步.此外,我还获得了降价本身相当可读的额外好处.
唯一的问题是:
有没有一种很好的方法来解决CSS中的一个或两个问题或改变降价?如果没有,除了为此编写我自己的吉他和弦特定标记语言之外,是否有人知道完全不同的选择?(即使我没有写我自己的标记语言,这一点,我仍然需要与问题1.帮助)我知道的标签格式和我在寻找显著不太精细的东西,因为我需要的是时候提醒每个和弦都不是我手指需要的明确图表.
谢谢!
我想知道如何创建一个用于转置音乐和弦的javascript函数.
由于我不希望每个人都成为这里的音乐家,我会试着解释它在音乐理论中是如何运作的.我希望我不要忘记一些事情.如果是的话,请音乐家纠正我.
1)简单的和弦
简单的和弦几乎和字母一样简单,它是这样的:
C,C#,D,D#,E,F,F#,G,G#,A,A#B
从B开始它再次循环到C.因此,如果原始和弦是E
并且我们想要转置+1,则产生的和弦是F
.如果我们转置+4,产生的和弦就是G#
.
2)扩展的和弦
它们几乎像简单的和弦一样工作,但包含更多的字符,在转置时可以安全地忽略它们.例如:
Cmi,C#7,Dsus7,Emi,Fsus4,F#mi,G ......
再次,就像简单的和弦一样,如果我们转置Dsus7
+ 3 =Fsus7
3)非根低音
当低音演奏与和弦根音不同的音调时会出现问题.这是以和弦后的斜线为标记,也需要调换.例子:
C/G,Dmi/A,F#sus7/A#
与示例1和示例2一样,一切都是相同的,但是斜杠之后的部分也需要转置,因此:
C/G
+ 5 = F/C
F#sus7/A#
+ 1 = Gsus7/B
我认为这应该是全部,除非我忘记了什么.
所以基本上,假设你有一个调用的javascript变量chord
和转置值transpose
.什么代码会转换和弦?
例:
var chord = 'F#sus7/C#';
var transpose = 3; // remember this value also may be negative, like "-4"
... code here ...
var result; // expected result = 'Asus7/E';
Run Code Online (Sandbox Code Playgroud) 对于用常规标准符号编写的单个乐器,您如何为简单的乐谱建模?当然,有很多图书馆正是这样做的.我对在数据结构中表示音乐的不同方式感到好奇.什么运作良好,什么不运作?
忽略一些像动态这样棘手的方面,显而易见的方法是将所有内容直接翻译成对象 - 得分是由Notes组成的.我想,合成将意味着计算每个音符的开始/结束时间并混合正弦波.
这显然是一种好方法吗?有什么其他方法可以做到这一点?