首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决和弦时,给出三个音符的任何顺序。数学

如何解决和弦时,给出三个音符的任何顺序。数学
EN

Stack Overflow用户
提问于 2013-11-16 15:22:04
回答 4查看 249关注 0票数 3

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

在下表中,您可以看到chord C大调的触发传感器是传感器0、4和7。但是由于它们都是同时触发的,所以它们可能不会按照这个顺序到达,即它们可以以4、0、7或任何组合到达。

找出C大调的根音很容易,找出两个音符的差值是7,而根是两者中较低的一个。D和E大调等也是如此,但是像F大调这样的较高和弦有一个高音,又绕到了底部,所以数值上的差别不再是7。

代码语言:javascript
复制
           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。

代码语言:javascript
复制
          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

任何建议都很贴切!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-16 15:39:36

差别仍然是7-你必须只做所有的计算模12。因此,对于F大调,你只有5,9,12和12 -这是5,9,0。或者相反:你有5,9,0,没有差7,所以把12加到最低的(0),给出(12),然后大写是5。

一个更简单的方法是,如果你有7的差,就取较低的音符;如果你的差为5,则取较高的音符。

#############编辑:

另一种方法是有一个Map(Int,Chord)或一个1024个元素的数组,您只需填充所有已知的和弦。就像上面一样,你已经完成了工作。这个想法是有12位的数字,你只需把一个1,那么多次,对每个数字的lft,以获得钥匙。

示例:

代码语言:javascript
复制
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];
票数 3
EN

Stack Overflow用户

发布于 2013-11-16 15:27:46

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

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

代码语言:javascript
复制
Find out the lowest tone being played.
If it is 4 ⇒ D# major and return.
Else if it is 5 ⇒ E major and return.
Else if it is 0 ⇒ 
   check if 4 is being played ⇒ C major and return
         else ⇒ F major
Else if it is 1 ⇒
   check if 5 is being played ⇒ C# major and return
         else ⇒ F# major
Else if it is 2 ⇒ 
   check if 6 is being played ⇒ D major and return
         else ⇒ G major

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-16 15:31:22

我会创建一个集合(如果您所使用的语言支持这个集合)或只创建一个排序列表(对于3个值,我认为您可以使用一些IFs),然后使用它作为哈希表的一个键来查找chord。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20020081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档