Я строю цифровую аудио рабочую станцию в таких, как FL Studio, и имею алгоритм обнаружения аккордов. Это работает так, как есть, но чрезвычайно неэффективно, что мне нужно для оптимизации.[
['C', 'E'],
['E', 'G'],
['G']
]
< /code>
Обратите внимание, что они в порядке, и что для демонстраций саке, первые два E и G являются одинаковой нотой, потому что при каждом изменении примечания мы добавляем элемент в список: < /p>
G --------
E --------------
C ---------
< /code>
Alogrithm, который я выбрал, является алгоритмом Viterbi, в котором у меня есть базовые шаблоны аккордов, которые я затем комбинирую с каждым из 12 заметок в этом случае, это 72 шаблона: < /p>
// Base chords; example after combination: Cmaj, Cmin .... BMaj, Bmin
const chordList: ChordInformation[] = [
{ label: 'maj', keys: [0,4,7], bias: -0.2 },
{ label: 'min', keys: [0,3,7], bias: -0.2 },
{ label: 'dim', keys: [0,3,6], bias: 0.0 },
{ label: 'maj7', keys: [0,4,7,11], bias: -0.1 },
{ label: '7', keys: [0,4,7,10], bias: 0.0 },
{ label: 'm7', keys: [0,3,7,10], bias: 0.0 },
];
< /code>
Затем мы просматриваем алгоритм Viterbi, тестируя каждый аккорд до (72) с каждым аккордом после (72), вычислить лучший и выберите это в качестве интерпретации аккорда: < /p>
// N === templates.length
for (let newSpace = 0; newSpace < N; newSpace++) {
let bestScore = Infinity, prevSpaceOfBest = -1;
for (let prevSpace = 0; prevSpace < N; prevSpace++) {
const candidate = this.chordPath[prevX][prevSpace].bestScore
+ (prevSpace === newSpace ? 0 : this.params.switchCost)
+ this.chordScores[x][newSpace];
if (candidate < bestScore) {
bestScore = candidate;
prevSpaceOfBest = prevSpace;
}
}
this.chordPath[x][newSpace] = {bestScore: bestScore, prevSpace: prevSpaceOfBest};
}
< /code>
Как вы можете видеть даже с 6 аккордами, его уже> 5000 (72x72) операции для каждого расчета, и хотя я поддерживаю массивы в качестве глобального объекта, когда нота изменяется в одной позиции, все позиции после того, как должны обновить свои значения. Это означает, что в проекте с 1000 вводами ведра, если ведро номер 15 изменяется, то должны быть обновлены ведра 15-1000, что является слишком дорогостоящим. < /P>
Еще то, что я пытался: < /p>
Расчет Just Acord Satrates и сочетать с заметками. Это не работает, так как нам нужно проверить интерпретацию каждого ведра примечаний с каждыми примечаниями. В ['c', 'e'] «C» может быть 1 из аккорда, 2 аккорда и т. Д. Я не собираюсь делать это, потому что музыкально не звучит < /li>
< /ol>
Мне кажется, что с этим алгоритмом нет пути. Я подумал о поиске трансформаторного подхода, но я не знаю, где я мог бы найти один обученный и открытый исходный код.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -detection
Как я могу оптимизировать свой алгоритм Viterbi для обнаружения аккордов? ⇐ Javascript
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу оптимизировать свой алгоритм Viterbi для обнаружения аккордов?
Anonymous » » в форуме Javascript - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-