开发者

Music major scale converter

开发者 https://www.devze.com 2022-12-14 01:17 出处:网络
i am trying to create music major scale converter. Dose anyone have info how do to it so far i have rootNote is scale base note like cMajor or gMajor

i am trying to create music major scale converter. Dose anyone have info how do to it

so far i have

rootNote is scale base note like cMajor or gMajor note is note that i want to convert into major scale 0-126 if i insert rootNote 60 and note 60 the right return would be 0, if i insert rootNote 60 and note 61 the right return would be 2, if i insert rootNote 60 and note 62 the right return would be 4, if i insert rootNote 60 and note 63 the right return would be 5,

if i insert rootNote 61 and note 60 the right return would be 0, if i insert rootNote 61 and note 61 the right return would be 1, if i insert rootNote 61 and note 62 the right return would be 3, if i insert rootNote 61 and note 63 the right return would be 5,

ok i have this other one and it seems to work i want to map my sequence out put in major scale but is there some kind of formula what can i use?

.

public int getINMajorScale(int note, int rootNote)
    {

            List<int> majorScale = new List<int>();
            //int bNo开发者_C百科te = (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));
        }

but it's obviously faulty.


Problems with the code as it stands:

  • modScaling does nothing more than rootNote % 12 as you always pass in 0 and 11
  • You define mNote but never use it
  • i is never used in the for loop and so each of the 5 iterations prints the same thing.

OK, lets translate your examples into actual notes to make it easier to understand (numbers presumably correspond to MIDI notes):

  • 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

I might be being really dense but I'm afraid I can't see the pattern there.

A Major scale is of course made up of the sequence Tone, Tone, Semi-tone, Tone, Tone, Tone, Semi-tone, but how does that map to your outputs?


Given your input-outputs, I think I know what you are looking for.

  • determine steps = note - rootNote
  • determine interval = number of semi-tones between rootNote and the note steps up the scale
  • determine phase = rootNote - 60

This algorithm provides accurate results:

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;
} 

yielding:

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();
}
0

精彩评论

暂无评论...
验证码 换一张
取 消