我正在尝试创建音乐主要规模转换器。 任何人都有信息如何做到
到目前为止我已经
了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));
}
但这显然是错误的。
答案 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();
}