private List<Fmotiv> DivideSameDurationNotes(Fmotiv fmotivBuff)
{
// создаем копию входного объекта
var fmotivBuffer = (Fmotiv)fmotivBuff.Clone();
// выходной список фмотивов
var result = new List<Fmotiv>();
// проверка на случай когда в аругменте метода количество собранных нот (из пауз/лиг) меньше двух
if (ExtractNoteList(fmotivBuffer).Count < 2)
{
throw new Exception("LibiadaMusic DivideSameDurationNotes: notes < 2");
}
if (ExtractNoteList(fmotivBuffer).Count % 2 == 0)
{
// то начинаем анализ из расчета : по две ноты в фмотиве
// сохраняем количество раз, так как потом меняется
int count = ExtractNoteList(fmotivBuffer).Count / 2;
for (int i = 0; i < count; i++)
{
if (ThirdTempComparator(fmotivBuffer))
{
// приоритет первой ноты выше приоритета второй ноты (собранные ноты)
// ПМТ и записываем все что входит в цепочку нот - в эти две собранные ноты, в очередной фмотив
// собираем в цикле, пока не кончатся ноты в буфере 2 полноценные ноты в зависимостиот того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, "ПМТ", 2));
}
else
{
// приоритет первой ноты ниже приоритета второй ноты (метрически слабее)
// ЧМТ и записываем все что входит в первую собранную ноту в очередной фмотив,
// и вызываем для оставшихся нот повторный анализ цепочки равнодлительных звуков
// потому что количество равндлительных звуков поменялось, и алгоритм анализа может поменяться
// собираем в цикле, пока не кончатся ноты в буфере 1 полноценную ноту в зависимостиот того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, "ЧМТ", 1));
// если осталась одна нота то заносим ее в фмотив ЧМТ
SecondTempMethod(fmotivBuffer, result);
return result;
}
}
// прошли все ПМТ без ЧМТ, то вернуть результат
return result;
}
if (ExtractNoteList(fmotivBuffer).Count % 3 == 0)
{
// то начинаем анализ из расчета : по три ноты в фмотиве
// сохраняем количество раз, так как потом меняется
int count = ExtractNoteList(fmotivBuffer).Count / 3;
for (int i = 0; i < count; i++)
{
if (ThirdTempComparator(fmotivBuffer))
{
// приоритет первой ноты выше приоритета второй ноты (собранные ноты)
if (SecondTempComparator(fmotivBuffer))
{
// приоритет первой ноты выше приоритета третьей ноты (собранные ноты)
// ПМТ и записываем все что входит в цепочку нот - в эти три собранные ноты, в очередной фмотив
// собираем в цикле, пока не кончатся ноты в буфере 3 полноценные ноты в зависимости от того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, "ПМТ", 3));
}
else
{
// приоритет первой ноты ниже или равен приоритету третьей ноты (собранные ноты)
// ПМТ и записываем все что входит в цепочку нот - в эти две собранные ноты, в очередной фмотив
// (ЧМТ - если есть знак триоли хотя бы у одной ноты)
string typeF = "ПМТ"; // тип ПМТ если не триоль
if (TempComparator(fmotivBuffer))
{
typeF = "ЧМТ"; // если есть хотя б один знак триоли
}
// собираем в цикле, пока не кончатся ноты в буфере 2 полноценные ноты в зависимости от того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, typeF, 2));
// если осталась одна нота то заносим ее в фмотив ЧМТ
SecondTempMethod(fmotivBuffer, result);
return result;
}
}
else
{
// приоритет первой ноты ниже или равен приоритету второй ноты (метрически слабее или равен)
// ЧМТ и записываем все что входит в первую собранную ноту в очередной фмотив,
// и вызываем для оставшихся нот повторный анализ цепочки равнодлительных звуков
// потому что количество равнодлительных звуков поменялось, и алгоритм анализа может поменяться
// собираем в цикле, пока не кончатся ноты в буфере 1 полноценная нота в зависимости от того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, "ЧМТ", 1));
// если осталась одна нота то заносим ее в фмотив ЧМТ
SecondTempMethod(fmotivBuffer, result);
return result;
}
}
// прошли все ПМТ без ЧМТ, то вернуть результат
return result;
}
else
{
// то начинаем анализ из расчета : по две ноты в фмотиве (к-3)/2 раза, а в последнем 3 ноты
// сохраняем количество раз, так как потом меняется
int count = (ExtractNoteList(fmotivBuffer).Count - 3) / 2;
for (int i = 0; i < count; i++)
{
if (ThirdTempComparator(fmotivBuffer))
{
// приоритет первой ноты выше приоритета второй ноты (собранные ноты)
// ПМТ и записываем все что входит в цепочку нот - в эти две собранные ноты, в очередной фмотив
// собираем в цикле, пока не кончатся ноты в буфере 2 полноценные ноты в зависимости от того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, "ПМТ", 2));
}
else
{
// приоритет первой ноты ниже приоритета второй ноты (метрически слабее)
// ЧМТ и записываем все что входит в первую собранную ноту в очередной фмотив,
// и вызываем для оставшихся нот повторный анализ цепочки равнодлительных звуков
// потому что количество равндлительных звуков поменялось, и алгоритм анализа может поменяться
// собираем в цикле, пока не кончатся ноты в буфере 1 полноценную ноту в зависимости от того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, "ЧМТ", 1));
// вызываем рекурсию на оставшиеся ноты
// отправляем последовательность равнодлительных звуков на анализ, получаем цепочку фмотивов и заносим их в выходную последовательность
List<Fmotiv> dividedSameDuration = DivideSameDurationNotes(fmotivBuffer);
foreach (Fmotiv fmotiv in dividedSameDuration)
{
// заносим очередной фмотив
result.Add((Fmotiv)fmotiv.Clone());
}
return result;
}
}
// анализируем оставшиеся 3 ноты
if (ThirdTempComparator(fmotivBuffer))
{
// приоритет первой ноты выше приоритета второй ноты (собранные ноты) !!!!!!!!!!!!!!!!!!! сравнение на саомо деле происход первой и третьей, разве нет? 08.04.2012
if (SecondTempComparator(fmotivBuffer))
{
// приоритет первой ноты выше приоритета третьей ноты (собранные ноты)
// ПМТ и записываем все что входит в цепочку нот - в эти три собранные ноты, в очередной фмотив
// собираем в цикле, пока не кончатся ноты в буфере 3 полноценные ноты в зависимости от того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, "ПМТ", 3));
}
else
{
// приоритет первой ноты ниже или равен приоритету третьей ноты (собранные ноты)
// ПМТ и записываем все что входит в цепочку нот - в эти две собранные ноты, в очередной фмотив
// (ЧМТ - если есть знак триоли хотя бы у одной ноты)
string typeF = "ПМТ"; // тип ПМТ если не триоль
if (TempComparator(fmotivBuffer))
{
typeF = "ЧМТ"; // если есть хотя б один знак триоли
}
// собираем в цикле, пока не кончатся ноты в буфере 3 полноценные ноты в зависимости от того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, typeF, 2));
// если осталась одна нота то заносим ее в фмотив ЧМТ
SecondTempMethod(fmotivBuffer, result);
return result;
}
}
else
{
// приоритет первой ноты ниже или равен приоритету второй ноты (метрически слабее или равен)
// ЧМТ и записываем все что входит в первую собранную ноту в очередной фмотив,
// и вызываем для оставшихся нот повторный анализ цепочки равнодлительных звуков
// потому что количество равнодлительных звуков поменялось, и алгоритм анализа может поменяться
// собираем в цикле, пока не кончатся ноты в буфере 3 полноценные ноты в зависимости от того, чем мы считаем паузу
// (когда звуковой след, надо добавить в след идущие паузы за последним звуком)
result.Add(ThirdTempMethod(fmotivBuffer, "ЧМТ", 1));
// если осталась одна нота то заносим ее в фмотив ЧМТ
SecondTempMethod(fmotivBuffer, result);
return result;
}
// если все собрали, то возвращаем выходную цепочку
return result;
}
}