首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合度与音阶音符

结合度与音阶音符
EN

Code Review用户
提问于 2016-01-09 20:55:23
回答 1查看 219关注 0票数 10

我有一个JS文件,当给定一个键(也就是主音/音符)时,它用音乐音阶上的音符创建一个对象。代码起作用了,做了我想做的事。我需要对它的写作方式,什么可以做得更好,代码的质量-即使它是缩进。请。我从来没有写过代码,所以我没有参考框架。

我要把评论留在里面。我知道getKey()对于正在发生的事情是不必要的,我把它放在那里是为了以后的另一个目的。

代码语言:javascript
复制
(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
*/

输出如下所示:

代码语言:javascript
复制
-------------------------------------------------------------------->> 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()时,我尝试在它们的创建过程中初始化它们,但是它似乎不起作用:

代码语言:javascript
复制
var superTonic[array[1]] = 2; //didn't work

我将这个过程分成两个步骤,然后返回一个容器对象。

我还没调查过但自从我写了这个..。如果我改变‘色’阵列中的元素,整个东西就会融化。

EN

回答 1

Code Review用户

发布于 2019-05-22 10:06:53

评论

当分析音阶的音符时,只有使用预定义的音符名集时才会丢失信息。C#Db不一样。

//chromatic scale var chromatic = ['c', 'c#', 'd', 'Eb', 'e', 'f', 'f#', 'g', 'Ab', 'a', 'Bb', 'b'];

我会允许任何程度的学位和可选的意外:

代码语言:javascript
复制
C# = Db = Ebbb = ..

与其使用固定的比例尺名称和神奇的映射,我更愿意选择一种通用方法,该方法采用比例的标识值。

开关(类型){大小写“主要”:.案件“未成年人”:。

尺度可以通过标称id、区间模式和基音类集来识别。我选择使用音调类集作为标识符。这些标识符由伊恩环解释。例如,主要比额表可确定为:

  • 名义编号: 2741
  • 基音类集:0,2,4,5,7,9,11
  • 区间模式:{2,2,1,2,2,2,1}

变量leadingTone = {};

主音是一个误导性的词,因为它是在主音之下的半音调时使用的。但是并不是所有的比例都使用这种模式,因此另一种选择是使用超集名称subTonic

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/116319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档