我有一个arduino附加在斯特拉系统钢琴手风琴。我在左手12个和弦的每个音符上都有光学感应器。当我演奏和弦时,它会触发三个感应器。如果我想让合成器演奏和弦,那没关系,但有时我希望它只演奏根音;所以,如果我演奏C大调,我希望它只演奏C音符。
在下表中,您可以看到chord 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任何建议都很贴切!
发布于 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,以获得钥匙。
示例:
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];发布于 2013-11-16 15:27:46
看着它,我会把处理分成两个步骤。首先,用最低的音调。如果不是0、1或2,请使用(唯一标识的)和弦。如果是这三种中的一种,请检查哪一种音调是第二低的。
在最坏的情况下,这只需要一个循环(找到最低的音调)和最多一个查找。
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知道最有可能的和弦,你也可以检查第三个音调,如果你想确保和弦目前正在播放。
发布于 2013-11-16 15:31:22
我会创建一个集合(如果您所使用的语言支持这个集合)或只创建一个排序列表(对于3个值,我认为您可以使用一些IFs),然后使用它作为哈希表的一个键来查找chord。
https://stackoverflow.com/questions/20020081
复制相似问题