jQuery   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用javascript或jquery转置音乐大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个我编写的和弦图应用程序,我想允许用户使用onClick处理程序转置图表的键.

我的图表看起来像这样

{C}My name is Blanket,{F}And I can run fast

括号内的和弦出现在它前面的字母上方.

我想使用javascript或jquery来做到这一点.我该如何创建这个转置按钮?任何帮助表示赞赏.先感谢您.

编辑

所以这就是我想出来的……

$('.transposeUp').click(function(){
    $('.chord').each(function(){
        var currentChord = $(this).text(); // gathers the chord being used
        if(currentChord == $(this).text()){
        var chord = $(this).text().replace("F#","G")
        }
        //... the if statements conTinue though every chord
        //but I didn't place them here to save space
    });
});

所以这就是问题……

我在混音中有一个斜线和弦(G / B),它改变了转置,但因为它改变了“B”,和弦现在是(G / C),它与“currentChord”不同,所以它没有当它达到各自的if状态时,不要改变G.直到我在Chord最终(G / G)的位置进行了足够的转置,然后第一个“G”开始转置,使最后一个“G”保持相同.有任何想法吗?非常感谢您的知识和帮助.提前致谢.

解决方法

您需要按顺序匹配和弦,以便一次更新一个.如果你试图一次匹配所有内容,你会遇到像你所描述的问题,因为你一遍又一遍地匹配相同的和弦.

完成此任务的一个方法是使用正则表达式来解析和分割和弦.获得匹配的和弦值后,使用和弦数组找到要转置的下一个/上一个和弦.以下是我作为演示开发的一些示例代码

<p><span class="chord">{C}</span>My name is Blanket,</p>
<p><span class="chord">{G / B}</span>And I can run fast</p>

<p>
<input id="transposeDown" type="button" value="Down" /> |
<input id="transposeUp" type="button" value="Up" />
</p>

var match;
var chords =
    ['C','C#','D','Eb','E','F','F#','G','Ab','A','Bb','B','C','Db','D#','Gb','G#','A#','C'];
var chordRegex = /C#|D#|F#|G#|A#|Db|Eb|Gb|Ab|Bb|C|D|E|F|G|A|B/g;

$('#transposeUp').click(function() {
    $('.chord').each(function() {
        var currentChord = $(this).text();
        var output = "";
        var parts = currentChord.split(chordRegeX);
        var index = 0;
        while (match = chordRegex.exec(currentChord))
        {
            var chordIndex = chords.indexOf(match[0]);
            output += parts[index++] + chords[chordIndex+1];
        }
        output += parts[index];
        $(this).text(output);
    });
});

$('#transposeDown').click(function() {
    $('.chord').each(function() {
        var currentChord = $(this).text();
        var output = "";
        var parts = currentChord.split(chordRegeX);
        var index = 0;
        while (match = chordRegex.exec(currentChord))
        {
            var chordIndex = chords.indexOf(match[0],1);
            output += parts[index++] + chords[chordIndex-1];
        }
        output += parts[index];
        $(this).text(output);
    });
});

示例演示:http://jsfiddle.net/4kYQZ/2/

有几点需要注意

>我采用了@ gregp的想法,即拥有密钥列表的多个副本,以便我可以处理锐利和平面.第一个音阶包括在移调期间使用的首选#/ b.第二个音阶包括其他格式,以便如果音乐包含它们,它们将正确转置.例如,因为Eb是第一个比例,所以当你上下移调时,它将被用来代替D#;但是,如果音乐开头有D#,它将正确移动到D / E(需要注意的是,如果你向后移动,它将再次成为Eb).随意修改首选比例 – 我根据个人音乐经验使用了我受过教育的判断.
>正则表达式必须首先使用锐化/平坦键,否则当C#不正确时,C#就像C一样容易匹配.
>我在数组的开头和结尾都有C,这样我就可以从任何位置开始并移动两个方向而不通过数组的末尾.为了使其工作,transposeDown代码调用chords.indexOf时有一个额外的参数从位置1开始,因此它匹配数组中的最后一个C而不是第一个C.然后当它尝试移动到前一个元素,它不传递数组的开头.
>我正在使用正则表达式来分割和弦,这是多余的,但是通过将原始字符串部分与更新的和弦键交错,可以非常容易地将最终字符串重新组合在一起(不要忘记最后一块到底!).
>我正在使用元素而不是按钮的类.

希望这可以帮助!

更新1:OP的每条评论,pre-ie9不支持在数组上使用indexOf.这可以通过使用执行相同操作的辅助函数解决

function arrayIndexOf(arr,match)
{
    for (var i = 0; i < arr.length; i++)
        if (arr[i] == match)
            return i;
    return -1;
}

而这一行

var chordIndex = chords.indexOf(match[0]);

将被替换为:

var chordIndex = arrayIndexOf(chords,match[0]);

请参阅更新的示例演示:http://jsfiddle.net/4kYQZ/11/

大佬总结

以上是大佬教程为你收集整理的使用javascript或jquery转置音乐全部内容,希望文章能够帮你解决使用javascript或jquery转置音乐所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。