我有一个JS文件,当给定一个键(也就是主音/音符)时,它用音乐音阶上的音符创建一个对象。代码起作用了,做了我想做的事。我需要对它的写作方式,什么可以做得更好,代码的质量-即使它是缩进。请。我从来没有写过代码,所以我没有参考框架。
我要把评论留在里面。我知道getKey()对于正在发生的事情是不必要的,我把它放在那里是为了以后的另一个目的。
(function () {
console.time("-------------------------------------------------------------------->> mainFunction");
"use strict";
//gets key and returns tonic object
var getKey = function (key) {
var tonic = {};
tonic[key] = 1;
return tonic;
};
//takes a tonic and type and returns the scale objects in an array
var getScale = function (tonic, type) {
//chromatic scale
var chromatic = ['c', 'c#', 'd', 'Eb', 'e', 'f', 'f#', 'g', 'Ab', 'a', 'Bb', 'b'];
//extract key from tonic object
var extractTonic = Object.keys(tonic)[0];
//get position of key in chromatic array
var positionOfTonic = chromatic.indexOf(extractTonic);
//if positionOfTonic is > 0, split the array into two at above position
if (positionOfTonic !== 0) {
var arrayOne = chromatic.splice(positionOfTonic);
var arrayTwo = chromatic.splice(0,(positionOfTonic));
//reset chromatic to set tonic at index 0
chromatic = arrayOne.concat(arrayTwo);
}
switch(type) {
case "major":
var majorArray = chromatic.slice(0);
var removeValFromIndex = [1, 3, 6, 8, 10];
for (var i = removeValFromIndex.length - 1; i >= 0; i--) {
majorArray.splice(removeValFromIndex[i],1);
}
break;
case "minor":
var minorArray = chromatic.slice(0);
var removeValFromIndex = [1, 4, 6, 9, 11];
for (var i = removeValFromIndex.length - 1; i >= 0; i--) {
minorArray.splice(removeValFromIndex[i],1);
}
break;
}
var getScaleObject = function (array) {
//can't create objects with values from array....try with new constructor.
var superTonic = {};
var mediant = {};
var subDominant = {};
var dominant = {};
var subMediant = {};
var leadingTone = {};
superTonic[array[1]] = 2;
mediant[array[2]] = 3;
subDominant[array[3]] = 4;
dominant[array[4]] = 5;
subMediant[array[5]] = 6;
leadingTone[array[6]] = 7;
var majorObject = {tonic, superTonic, mediant, subDominant, dominant, subMediant, leadingTone};
return majorObject;
};
if (type === "major") {
console.time("-------------------------------------------------------------------->> getScaleObject (major)");
var consoleTimeForMajor = getScaleObject(majorArray);
console.timeEnd("-------------------------------------------------------------------->> getScaleObject (major)");
return consoleTimeForMajor;
}
else if (type === "minor") {
console.time("-------------------------------------------------------------------->> getScaleObject (minor)");
var consoleTimeForMinor = getScaleObject(minorArray);
console.timeEnd("-------------------------------------------------------------------->> getScaleObject (minor)");
return consoleTimeForMinor;
}
};
////////////////INPUT////////////////
console.time("-------------------------------------------------------------------->> getKey");
// console.log(getKey('c'));
console.timeEnd("-------------------------------------------------------------------->> getKey");
console.time("-------------------------------------------------------------------->> getScale(getKey)");
console.log(getScale(getKey('a'),'minor'));
console.timeEnd("-------------------------------------------------------------------->> getScale(getKey)");
// console.time("-------------------------------------------------------------------->> getScale");
// console.log(getScale({c:1},'major'));
// console.timeEnd("-------------------------------------------------------------------->> getScale");
}());
console.timeEnd("-------------------------------------------------------------------->> mainFunction");
/*
todo
rename keys to first||tonic, second||superTonic...
build loop and presentation
add other types
use obj.prototype for inheritance in getKey
bugs
capitalizing [chromatic] elements breaks everything...splice not working?
restrictions
cant compare/calculate enharmonic scales - scaleObject created for a given tonic
*/输出如下所示:
-------------------------------------------------------------------->> getKey: 7ms
-------------------------------------------------------------------->> getScaleObject (minor): 1ms
{ tonic: { a: 1 },
superTonic: { b: 2 },
mediant: { c: 3 },
subDominant: { d: 4 },
dominant: { e: 5 },
subMediant: { f: 6 },
leadingTone: { g: 7 } }
-------------------------------------------------------------------->> getScale(getKey): 8ms
-------------------------------------------------------------------->> mainFunction: 23ms我把console.time的东西放在里面,我意识到它使代码看起来很混乱,我也怀疑它们是否是精确的度量。相对于浏览器控制台,我在Node上得到了更快的执行速度,但是即使这样,时间也会随着windows运行的其他事情而波动。请不要理会这些。
在创建getScaleObject()时,我尝试在它们的创建过程中初始化它们,但是它似乎不起作用:
var superTonic[array[1]] = 2; //didn't work我将这个过程分成两个步骤,然后返回一个容器对象。
我还没调查过但自从我写了这个..。如果我改变‘色’阵列中的元素,整个东西就会融化。
发布于 2019-05-22 10:06:53
当分析音阶的音符时,只有使用预定义的音符名集时才会丢失信息。C#与Db不一样。
//chromatic scale var chromatic = ['c', 'c#', 'd', 'Eb', 'e', 'f', 'f#', 'g', 'Ab', 'a', 'Bb', 'b'];
我会允许任何程度的学位和可选的意外:
C# = Db = Ebbb = ..与其使用固定的比例尺名称和神奇的映射,我更愿意选择一种通用方法,该方法采用比例的标识值。
开关(类型){大小写“主要”:.案件“未成年人”:。
尺度可以通过标称id、区间模式和基音类集来识别。我选择使用音调类集作为标识符。这些标识符由伊恩环解释。例如,主要比额表可确定为:
变量leadingTone = {};
主音是一个误导性的词,因为它是在主音之下的半音调时使用的。但是并不是所有的比例都使用这种模式,因此另一种选择是使用超集名称subTonic。
https://codereview.stackexchange.com/questions/116319
复制相似问题