Вот функция уважаемого Morbid'a, которую он весной предложил для смены тональности в песнях с аккордами. Но есть недоработка, к примеру есть изначальный аккорд указан с диезом, к примеру: C#m
Как можно такое исправить? Суть думаю ясна. Сам пытался, почти сделал, но видимо знаний маловато.
function alterate($chords_string, $half_tones_alt)
{
$data_half_tones = array(
0 => 'C',
2 => 'D',
4 => 'E',
5 => 'F',
7 => 'G',
9 => 'A',
10 => 'B',
11 => 'H',
);
$wrong_alts = array(
'A#' => 'B',
'B#' => 'H',
'H#' => 'C',
'E#' => 'F',
);
$data_chords = array_flip($data_half_tones);
$strlen = strlen($chords_string);
$return = '';
for($i = 0; $i < $strlen; $i++)
{
if(in_array($chords_string[$i], $data_half_tones))
{
$new_tone = $data_chords[$chords_string[$i]] + $half_tones_alt;
$new_tone = ($new_tone > 11 ? $new_tone % 12 : $new_tone);
$return .= (array_key_exists($new_tone, $data_half_tones)
? $data_half_tones[$new_tone]
: (array_key_exists($data_half_tones[$new_tone - 1].'#', $wrong_alts)
? $wrong_alts[$data_half_tones[$new_tone - 1].'#']
: $data_half_tones[$new_tone - 1].'#'
)
);
}
else
{
$return .= $chords_string[$i];
}
}
return $return;
}
echo alterate('Em H7 Em H7', +2);
//F#m C#7 F#m C#7
Понимаю, что массив нужно расширить, вот так:
$data_half_tones = array(
-11 => 'C',
-10 => 'D',
-9 => 'D#',
-8 => 'E',
-7 => 'F',
-6 => 'F#',
-5 => 'G',
-4 => 'G#',
-3 => 'A',
-2 => 'B',
-1 => 'H',
0 => 'C',
1 => 'C#',
2 => 'D',
3 => 'D#',
4 => 'E',
5 => 'F',
6 => 'F#',
7 => 'G',
8 => 'G#',
9 => 'A',
10 => 'B',
11 => 'H',
);
Но в обработке путаюсь...
С утра пытаюсь доделать функцию эту. Добавляю условия дополнительные. Не получается. Все ли так мучаются, или же это у меня так из-за не достатка опыта?
03 Дек 2010, 13:06Akdmeh, спасибо. Уже есть точка, от которой можно отходить. Но дальше нужно с условиями поиграться? Не въезжаю((
03 Дек 2010, 15:20Важное замечание - ты о бемолях забываешь.
Например, в тональности до-минор у тебя выйдет G#, а логичнее написать - Ab. Это дополнительная сложность.
Тут надо смотреть по конкретной тональности, и потом уже переводить в функциональную систему (T-S-D), а затем - назад в другую тональность. Это мне так кажется.
Akdmeh, ты сейчас имеешь какой-то заказ? Можно как-то иначе с тобой связаться? На счёт доработки этой функции?
03 Дек 2010, 17:02