Уфф...
Очень сложная ситуация с автоматическим и в тоже время правильным выбором струн ! Поиск решений подходит к концу !
Если у кого нибудь есть предложения или идеи, с радостью приму !
Для одноголосной партии все работает великолепно ! Позиции меняются как бы (скорее всего) сыграл гитарист. Т.е. как логичнее, если хотите иначе - пожалуйста, изменить можно все в реальном времени .
С аккордами все гораздо сложнее. Никакая программа не может знать действия человека вперед.
Когда мы берем аккорд всегда есть некоторое время между нотами (даже не если это не strum)
Промежуток между первой и последней нотой назовем - time frame. Именно это время и нужно программе для того, чтобы проанализировать аккорд. Но программа должна знать это время заранее, или знать количество сыгранных нот (во втором случае есть вероятность того, что вы "зацепите" соседнюю и программа ошибётся). Так вот именно поэтому при игре аккордами мы получим небольшую задержку (оптимально 20-25 ms)/ это неприятно, но вариантов нет ! Хотя есть - включить режим дурака и играть на пианино без понимания на каких струнах !
Второй вариант аккорда, когда вы играется аккорд очень быстро но немного апреджировано. Условие - аккорд должен быть сыгран последовательно от нижней струны к верхней или наоборот. Иначе ошибка и позиции будут найдены неверно. Если у вас получилось сыграть последовательно - все будет работать прекрасно и каждая следующая нота будет находится на следующей свободной струне.
Также море вариантов, когда интервал можно сыграть на разных струнах или эти же две ноты на одной струне последовательно. Как программа может понять, что вы хотите ? Никак ! Опять только временной отрезок между нотами. Если он больше чем заданное число - звучат две ноты на одной струне последовательно.
И что же в итоге получается и как эти режимы будут переключатся ?
[HIDE="500"]
A ) Если ноты сыграны в пределах временного отрезка A, который установлен к примеру 15-50 ms (такой интервал между нотами обычно при попытке сыграть аккорд одновременно) - скрипт находит нужное положение лада, где можно сыграть все ноты в удобной позиции руки гитариста/ Если это невозможно скрипт будет искать чуть менее удобную позицию для гитариста, но тем не менее исполняемую на гитаре.
B ) Если временной интервал между нотами больше A) (и это уже слышно на слух) для игры арпеджированных аккордов (сверху вниз или внизу вверх по струнам) - интервал заранее задается вручную, так же как и в первом случае задается вручную (по умолчанию будет выставлен оптимальный).
Сценарий будет пытаться играть следующую ноту на соседней струне, даже если на одной и той же струне эта нота рядом.
Если скрипт будет искать ноту рядом, руководствуясь только правилом положения левой руки - аккорд будет терять ноты (на одной струне - одна нота, это естественно))))
C ) Временной интервал между нотами еще медленее чем B) - сценарий не будет стараться искать ноту на той же свободной струне, в первую очередь будет искать как удобнее играть гитаристу.
D ) Вариант для игры арпеждио - ручное включение аккордового режима, временной интервал не учитывается
- работает также как и и вариант B) и сценарий будет искать соседнюю ноту на другой струне[/HIDE]