Я строю цифровую аудио рабочую станцию в таких, как 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 и сочетать с заметками. Первоначально это работает, мы изначально вычислили каждую оценку Emit с всеми 12 смещениями, делающими его O (n) и сохраняем лучшее смещение напоследствии, затем chordpath масштабируется с гораздо меньшей длиной chordlist в этом случае 6, SO 6x6 для каждой интерпретации. Этот перерыв, когда два аккорда имеют одинаковую расчетную оценку. Здесь может быть решение с возвратом, но я не мог его найти. Алгоритм 72x72 работает там, где он терпит неудачу, потому что он всегда рассчитывает каждый путь до конца, тогда как 6x6 должен разрешать только один в каждой части. Этот галстук часто случается, например, ведро с ['C'] будет набирать то же самое для FMAJ, CMAJ, F#DIM и т. Д. Я не собираюсь делать это, потому что музыкально не звучит < /li>
< /ol>
Мне кажется, что с этим алгоритмом нет пути. Я подумал о поиске трансформаторного подхода, но я не знаю, где я мог бы найти один обученный и открытый исходный код.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -detection
Как я могу оптимизировать свой алгоритм Viterbi для обнаружения аккордов? ⇐ Javascript
Форум по Javascript
1755643913
Anonymous
Я строю цифровую аудио рабочую станцию в таких, как 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 и сочетать с заметками. Первоначально это работает, мы изначально вычислили каждую оценку Emit с всеми 12 смещениями, делающими его O (n) и сохраняем лучшее смещение напоследствии, затем chordpath масштабируется с гораздо меньшей длиной chordlist в этом случае 6, SO 6x6 для каждой интерпретации. Этот перерыв, когда два аккорда имеют одинаковую расчетную оценку. Здесь может быть решение с возвратом, но я не мог его найти. Алгоритм 72x72 работает там, где он терпит неудачу, потому что он всегда рассчитывает каждый путь до конца, тогда как 6x6 должен разрешать только один в каждой части. Этот галстук часто случается, например, ведро с ['C'] будет набирать то же самое для FMAJ, CMAJ, F#DIM и т. Д. Я не собираюсь делать это, потому что музыкально не звучит < /li>
< /ol>
Мне кажется, что с этим алгоритмом нет пути. Я подумал о поиске трансформаторного подхода, но я не знаю, где я мог бы найти один обученный и открытый исходный код.
Подробнее здесь: [url]https://stackoverflow.com/questions/79739182/how-can-i-optimize-my-viterbi-algorithm-for-chord-detection[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия