Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当以任意顺序给出三个音符时,如何解析和弦。数学_C - Fatal编程技术网

C 当以任意顺序给出三个音符时,如何解析和弦。数学

C 当以任意顺序给出三个音符时,如何解析和弦。数学,c,C,我有一个arduino附在一个Stradella系统的钢琴手风琴上。我在左手的12个和弦的每个音符上都有光学传感器。当我弹奏和弦时,它会触发三个传感器。如果我想让合成器演奏和弦,那没关系,但有时我想让它只演奏根音;所以如果我弹C大调,我希望它只弹C音符 在下表中,您可以看到C大调和弦的触发传感器是传感器0、4和7。但由于它们都是在同一时间触发的,因此它们可能不会按该顺序到达,即它们可能以4,0,7或任何组合的形式到达 找到C大调的根音符很容易,找到两个音符的差值为7,根是两者中较低的。D大调和E

我有一个arduino附在一个Stradella系统的钢琴手风琴上。我在左手的12个和弦的每个音符上都有光学传感器。当我弹奏和弦时,它会触发三个传感器。如果我想让合成器演奏和弦,那没关系,但有时我想让它只演奏根音;所以如果我弹C大调,我希望它只弹C音符

在下表中,您可以看到C大调和弦的触发传感器是传感器0、4和7。但由于它们都是在同一时间触发的,因此它们可能不会按该顺序到达,即它们可能以4,0,7或任何组合的形式到达

找到C大调的根音符很容易,找到两个音符的差值为7,根是两者中较低的。D大调和E大调都是一样的,但是像F大调这样的高和弦有一个高音符,再次环绕到底部,所以数字差不再是7

           0  1  2  3  4  5  6  7  8  9  10 11
C  Major   X           X        X 
C# Major      X           X        X
D  Major         X           X        X
D# Major            X           X        X
E  Major               X           X        X
F  Major   X              X           X      
F# Major      X              X           X     
G  Major         X              X           X  
G# Major   X        X              X             
A  Major      X        X              X             
A# Major         X        X              X           
B  Major            X        X              X 
有人知道我如何能以相当便宜的价格确定这些和弦的根音吗(它以每秒600次的速度循环运行,arduino正在做很多其他的事情)

我完全被难住了,我尝试过递增循环,直到达到11,然后再从0开始,对每个和弦都这样做三次,但看起来很混乱

我也希望能够解决手风琴上的其他两排按钮,主按钮和主按钮

这是C的四个形状,其他11个音符将是相同的形状,但向右移动,直到它再次回到0

          0 1 2 3 4 5 6 7 8 9 10 11
C Major   X       X     X
C Minor   X     X       X
C 7th     X       X           X
C Dim7th  X     X           X

任何建议都值得赞赏

看看它,我会将处理分为两个步骤。首先,获得最低的音调。如果不是0、1或2,请使用(唯一标识的)和弦。如果是这三种音调中的一种,检查哪种音调是第二低的

这只需要一个循环(找到最低音调),在最坏的情况下最多需要一次查找

找出正在播放的最低音调。
如果是4⇒ D#少校,返回。
否则,如果是5⇒ E大调返回。
否则,如果为0⇒ 
检查是否正在播放4⇒ C大调和返回
其他的⇒ F大调
否则,如果它是1⇒
检查是否正在播放5⇒ 主修和返回
其他的⇒ 少校
否则如果是2⇒ 
检查是否正在播放6⇒ D大调和返回
其他的⇒ G大调

知道最可能的和弦后,如果您想确保当前正在播放和弦,也可以检查第三个音调。

我会创建一个集合(如果您使用的语言支持该集合),或者只是一个排序列表(对于3个值,我想您可以使用几个IFs进行排序),然后将其作为哈希表的键来查找和弦。

差值仍然是7-您必须只进行所有的模12计算。因此,对于F大调,你只有5,9,12,模12,这是5,9,0。反之亦然:你有5、9、0和7的差值,所以只给12(最低)(0)加上(12),基音则是5。< /P> 一个更简单的方法是,如果你的音差为7,则记下较低的音符;如果你的音差为5,则记下较高的音符

#############编辑: 另一种方法是有一个映射(Int,Chord)或1024个元素的数组,您只需用所有已知的和弦填充即可。如上所述,您已经完成了工作。这个想法是要有12位数字,你只需将一个1移动到lft的每一个数字上很多次就可以得到密钥

例如:

char * notes[1024];
// earlier, in initialization:
notes[0x221] = "F-Major";
notes[....]  = ....;   // do that for all chords you're interested in
// this are the numbers you get:
int a = 5, b= 9, c=0;    // F Major
int key = (1 << a) | (1 << b) | (1 << c);   // 0b10 0010 0001 = 0x221
char *chord = notes[key];
char*notes[1024];
//在前面的初始化中:
注释[0x221]=“F大调”;
注释[…]=…;//对所有你感兴趣的和弦都这样做
//以下是您得到的数字:
int a=5,b=9,c=0;//F大调
int key=(1关于:有没有人知道我如何可以相当便宜地确定这些和弦的根音符

看起来,给出的答案似乎已经满足了需要,但我只是想提供另一个视角,万一您需要将其扩展到某个通用应用程序

FFT(快速傅立叶变换)或DFT(离散傅立叶变换)也可以将一组频率(如和弦)解析为其基本频率,从而允许您选择根音符或任何其他分量


有很多实现,但我发现特别有用。它是开源的。有很多关于如何使用FFT/DFT的例子,包括,和

,嗨,乔纳斯,谢谢你的快速回答,我编辑了这个问题以显示全部12个和弦。不幸的是,正如你所看到的,4将是一个完整的和弦也可以匹配一个大调,但仍在试图了解你的回答,我不确定我的编辑是否有任何改变。JI在arduino上,所以我知道我应该能够制作集合,但我在google上看不到集合和arduino的任何引用。所以你是说我应该创建一个包含所有48个预先编程的和弦的哈希表?我是说它是wh我会的。我不认为这是最好的方法。啊,澄清一下!这看起来适合大调和小调,非常感谢!所以通过你的系统,我可以通过取区间10的最低值或区间2的最高值来识别第七个。最后一个问题是Dim7th。它可以是9的最低值,但3的最高值是match很多其他和弦,有什么想法吗?@jason你仍然可以使用另一种方法-如果没有有意义的和弦,只需在最低的数字上加上12,然后看看它是否有意义。酷,我会接受这个答案,一边解决这些琐事!干杯!让你知道我进展如何!我喜欢这个,但我不认为这是最简单的解决方法7.7和弦由4个音符组成,仅用于注释一个由输入表示的简单和弦表。对输入进行排序,然后在表中找到三元组。无数学==较低的功率要求。FFT可应用于音频信号。这里我们不