如何正确为音乐多维数组中的音符分配数字键?
如何正确为音乐多维数组中的音符分配数字键?
看起来你是想用数字键标记每个音符的起始十六分拍位置,但当前写的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
相关产品推荐
相关产品推荐

