You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确为音乐多维数组中的音符分配数字键?

如何正确为音乐多维数组中的音符分配数字键?

看起来你是想用数字键标记每个音符的起始十六分拍位置,但当前写的0=[p.e4,2]这种语法在JavaScript里是不合法的,咱们来一步步修正这个问题~

问题根源

你现在的写法混淆了数组和对象的语法:JavaScript数组的字面量不能用键=值的方式指定元素,而且如果你的键是非连续的数字,用对象(Object)来存储每个声部的音符会更合适——数组更适合连续的索引,非连续索引会导致数组里出现大量空元素,既不清晰也浪费空间。

正确的写法(推荐用对象)

对象的键值对语法是键: 值,把每个声部改成对象后,代码就能正常运行了:

sampleSong1 = [
    // 高音声部
    {
        0: [p.e4, 2],  2: [p.d4, 2],  4: [p.c4, 2],  6: [p.d4, 2], 
        8: [p.e4, 4],              12: [p.e4, 2], 14: [p.d4, 2], 
        16: [p.e4, 4],             20: [p.e4, 2], 22: [p.a4, 2], 
        24: [p.g4, 8] 
    },
    // 低音声部
    {
        0: [p.c3, 16],
        16: [p.c3, 8],
        24: [p.g2, 8]
    }
];

这样每个声部都是一个明确的键值对集合,键是音符的起始十六分拍位置,值是包含音高和时长的数组。之后你要访问某个位置的音符,直接用sampleSong1[0][8]就能拿到高音声部第8拍开始的音符,非常直观。

如果一定要用数组(不推荐)

如果你坚持要用数组来实现,不能在字面量里直接写0=[...],得先创建空数组,再给指定索引赋值:

// 用立即执行函数来初始化每个声部的数组
sampleSong1 = [
    (() => {
        const trebleVoice = [];
        trebleVoice[0] = [p.e4, 2];
        trebleVoice[2] = [p.d4, 2];
        trebleVoice[4] = [p.c4, 2];
        trebleVoice[6] = [p.d4, 2];
        trebleVoice[8] = [p.e4, 4];
        trebleVoice[12] = [p.e4, 2];
        trebleVoice[14] = [p.d4, 2];
        trebleVoice[16] = [p.e4, 4];
        trebleVoice[20] = [p.e4, 2];
        trebleVoice[22] = [p.a4, 2];
        trebleVoice[24] = [p.g4, 8];
        return trebleVoice;
    })(),
    (() => {
        const bassVoice = [];
        bassVoice[0] = [p.c3, 16];
        bassVoice[16] = [p.c3, 8];
        bassVoice[24] = [p.g2, 8];
        return bassVoice;
    })()
];

不过要注意,这种写法的数组里,所有没赋值的索引(比如1、3、5...)都会是undefined,遍历的时候会遇到大量空元素,远不如用对象来得高效清晰,所以更推荐第一种写法。

最后别忘了确认p.e4、p.d4这些音高变量已经被正确定义,不然代码还是会报错哦~

备注:内容来源于stack exchange,提问作者Truth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:38:00