音乐主要规模转换器

时间:2009-12-09 10:48:00

标签: c#

我正在尝试创建音乐主要规模转换器。 任何人都有信息如何做到

到目前为止我已经

rootNote是基本注释,如cMajor或gMajor 请注意,我想转换成0-126的主要比例 如果我插入rootNote 60和注释60,则右边的返回值为0, 如果我插入rootNote 60和注释61,则右边的返回值为2, 如果我插入rootNote 60和注释62,则右边的返回值为4, 如果我插入rootNote 60和注释63,则右边的返回值为5,

如果我插入rootNote 61并注释60,则右侧返回为0, 如果我插入rootNote 61和note 61,则右边的返回值为1, 如果我插入rootNote 61和note 62,则右边的返回值为3, 如果我插入rootNote 61和注释63,则右返回将为5,

好吧,我有另外一个,它似乎工作 我想把我的序列映射到大规模 但是,我可以使用某种配方吗?

public int getINMajorScale(int note, int rootNote)
    {

            List<int> majorScale = new List<int>();
            //int bNote = (int)_bNote.CurrentValue;

            int bNoteMpl = bNote / 12;
            bNote = 12 + (bNote - (12 * bNoteMpl)) - 7;
            majorScale.Add(bNote + (12 * bNoteMpl));
            int tBnote = bNote;
            int res = 0;
            for (int i = bNote; i < bNote + 6; i++)
            {
                //algorytm
                res = tBnote + 7;
                int mod = 0;
                if (res >= 12)
                {
                    mod = res / 12;
                    res = res - 12 * mod;
                }
                tBnote = res;
                majorScale.Add(res + (bNoteMpl * 12));
            }
            majorScale.Sort();
            int modNuller = 0;
            if (nmr >= 7)
            {
                modNuller = nmr / 7;
                nmr = nmr - 7 * modNuller;
            }
            return (majorScale[nmr] + (modNuller *12));
        }

但这显然是错误的。

2 个答案:

答案 0 :(得分:6)

代码问题:

  • modScaling只执行rootNote % 12,因为您总是传递0和11
  • 您定义mNote但从不使用
  • i从未在for循环中使用,因此5次迭代中的每次都会打印相同的内容。

好的,让我们将您的示例翻译成实际的注释,以便更容易理解(数字可能与MIDI notes相对应):

  • rootNote = 60(C),note = 60(C) - 输出0
  • rootNote = 60(C),note = 61(C#) - 输出2
  • rootNote = 60(C),note = 62(D) - 输出4
  • rootNote = 60(C),note = 63(D#) - 输出5
  • rootNote = 61(C#),note = 60(C) - 输出0
  • rootNote = 61(C#),note = 61(C#) - 输出1
  • rootNote = 61(C#),note = 62(D) - 输出3
  • rootNote = 61(C#),note = 63(D#) - 输出5

我可能会非常密集,但恐怕我看不到那里的模式。

主要音阶当然是由音调,音调,半音,音调,音调,音调,半音调组成,但是它如何映射到你的输出?

答案 1 :(得分:1)

鉴于您的输入输出,我想我知道您在寻找什么。

  • 确定steps = note - rootNote
  • 确定interval =在rootNote和音符steps之间的半音数
  • 确定phase = rootNote - 60

此算法可提供准确的结果:

static int getINMajorScale(int note, int rootNote)
{
    if (note < rootNote) return 0;
    var scale = new[] { 2, 2, 1, 2, 2, 2, 1 };
    var phase = rootNote - 60;
    var steps = note - rootNote;
    var interval = steps == 0 
        ? 0 : Enumerable.Range(0, steps).Sum(step => scale[step % scale.Length]);
    var number = phase + interval;
    return number;
} 

收益:

static void Main(string[] args)
{
    //rootNote = 60(C), note = 60(C) - output 0
    //rootNote = 60(C), note = 61(C#) - output 2
    //rootNote = 60(C), note = 62(D) - output 4
    //rootNote = 60(C), note = 63(D#) - output 5
    //rootNote = 61(C#), note = 60 (C) - output 0
    //rootNote = 61(C#), note = 61 (C#) - output 1
    //rootNote = 61(C#), note = 62 (D) - output 3
    //rootNote = 61(C#), note = 63 (D#) - output 5

    Console.WriteLine(getINMajorScale(60, 60));  // 0
    Console.WriteLine(getINMajorScale(61, 60));  // 2
    Console.WriteLine(getINMajorScale(62, 60));  // 4
    Console.WriteLine(getINMajorScale(63, 60));  // 5
    Console.WriteLine(getINMajorScale(60, 61));  // 0
    Console.WriteLine(getINMajorScale(61, 61));  // 1
    Console.WriteLine(getINMajorScale(62, 61));  // 3
    Console.WriteLine(getINMajorScale(63, 61));  // 5

    Console.ReadKey();
}