Xwab
Форумыnavigate_nextПрограммирование на PHP

Функция смены тональности песен с аккордамы
Сообщения
JESOD

Вот функция уважаемого 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

02 Дек 2010, 23:13
JESOD

Понимаю, что массив нужно расширить, вот так:
$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, 7:25
JESOD

С утра пытаюсь доделать функцию эту. Добавляю условия дополнительные. Не получается. Все ли так мучаются, или же это у меня так из-за не достатка опыта?

03 Дек 2010, 13:06
Fashion

Akdmeh вроде похожим вопросом задавался

03 Дек 2010, 13:59
Akdmeh

2, ты на правильном пути.

03 Дек 2010, 14:48
JESOD

Akdmeh, спасибо. Уже есть точка, от которой можно отходить. Но дальше нужно с условиями поиграться? Не въезжаю((

03 Дек 2010, 15:20
Akdmeh

Важное замечание - ты о бемолях забываешь.
Например, в тональности до-минор у тебя выйдет G#, а логичнее написать - Ab. Это дополнительная сложность.
Тут надо смотреть по конкретной тональности, и потом уже переводить в функциональную систему (T-S-D), а затем - назад в другую тональность. Это мне так кажется.

03 Дек 2010, 16:50
Istsam

влбще ничего не пойму

03 Дек 2010, 16:59
JESOD

Akdmeh, ты сейчас имеешь какой-то заказ? Можно как-то иначе с тобой связаться? На счёт доработки этой функции?

03 Дек 2010, 17:02
Akdmeh

9, увы, нет. Я вряд ли доработаю это, ума не хватит.

03 Дек 2010, 17:30
Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.