在JFugue 5.0.8中演奏和弦

从5.0.8版开始,JFugue支持折断和弦,其中和弦的音符以不同于所有音符的方式在同一时间和相同的持续时间演奏。

例如,通常,如果您要演奏C大调和弦,则可以同时演奏C,E和G。 但是也许您想风格化您弹奏和弦的方式。 您可能希望以稍微不同的方式弹奏和弦中的每个音符,从轻微的琶音到有节奏的方式都可以。 由于和弦的音符彼此分开,因此这些是和弦的例子。

要在JFugue中指定折断的和弦,请在和弦​​的末尾添加一个冒号,然后是一个替换字符串序列,该替换字符串序列通过其索引引用和弦中的音符。

替换字符串还用于ChordProgression类的eachChordAs()和allChordsAs()方法以及Intervals类的as()方法中。 与那些方法中使用的替换字符串不同,用于断开和弦的字符串需要用逗号分隔,并且不能有空格,因为空格会在和弦元素的结尾。

例如:“ Cmaj:$ 0q,$ 1q + $ 2q,$ 1q + $ 2q,Rq”。 这将被处理为“ Cq Eq + Gq Eq + Gq Rq”。 请注意,$ 0如何表示C,$ 1表示E,$ 2表示G。Rest字符不变。 (如果对您的应用程序有意义,您也可以以这种模式指定注释)。

如您所料,如果您熟悉替换字符串,则$! 将返回和弦本身。 它实际上会拼出和弦并将音符放在括号中。 例如,“ Cmaj:$!q”被转换为“(C + E + G)q”。

获取和弦的根或低音

您可以使用一些特殊字符来代替在和弦中列出索引(并且,通过扩展,替换格式现在支持特殊字符字典,映射到它们所扩展的范围)。 您可以使用$ ROOT指代和弦的根部,$ BASS指代和弦的贝司,$ NOTROOT指代除根部以外的所有音符,$ NOTBASS指代除贝司以外的所有音符。

从$ NOTROOT和$ NOTBASS返回的每组音符都像$!放在括号中。 例如,“ Cmaj:$ NOTROOTq”的结果为“(E + G)q”。

跨音符分配动力

和弦折断的另一个特征是,在另一个冒号结束替换字符串并开始将动态添加到所有音符之后,可以将要添加到折断和弦序列中每个音符的力度写入一次。 在此示例中,每个字符串在解析字符串时将以“ qa120d50”结尾:

“ Cmaj:$ 0,$ 1,$ 2,$ 2:qa120d50”被转换为“ Cqa120d50 Eqa120d50 Gqa120d50 Gqa120d50”

使用字典

您可以创建一个JFugue词典条目,为长替换字符串或计划重用的替换字符串做一个简短引用。 例如,这里是一个Staccato字符串,它太忙了:

new Player()。play(“ Cmaj:$ 0q,$ 1q + $ 2q,$ 1q + $ 2q,Rq Fmaj:$ 0q,$ 1q + $ 2q,$ 1q + $ 2q,Rq Gmaj:$ 0q,$ 1q + $ 2q, $ 1q + $ 2q,Rq Fmaj:$ 0q,$ 1q + $ 2q,$ 1q + $ 2q,Rq”);

看来我们多次使用相同的模式。 这是一个很长的模式,每次键入都很麻烦,我们只想键入一次。 重复使用可防止错误并简化生活。

在JFugue中,字典只是Map 。

Map 字典= player.getStaccatoParser()。getContext()。getDictionary();

dictionary.put(“ MARCH”,“ $ 0q,$ 1q + $ 2q,$ 1q + $ 2q,Rq”);

现在您可以说:

播放(“ Cmaj:[MARCH] Fmaj:[MARCH] Gmaj:[MARCH] Fmaj:[MARCH]”);

简单得多!

如果您对此感兴趣,为什么不只使用ChordProgression?

ChordProgression cp =新的ChordProgression(“ I IV VI”)。setRoot(“ C”)。eachChordAs(“ $ !: [MARCH]”);

新Player()。play(cp);

JFugue总是用很少的几行代码就尽可能地简化了音乐探索,并且对折断和弦的支持延续了这一传统。 请享用!