Wie kann ich meinen Viterbi -Algorithmus für die Akkorderkennung optimieren?JavaScript

Javascript-Forum
Anonymous
 Wie kann ich meinen Viterbi -Algorithmus für die Akkorderkennung optimieren?

Post by Anonymous »

Ich baue eine digitale Audio -Workstation in FL Studio und habe einen Akkorderkennungsalgorithmus. Es funktioniert so wie es ist, ist aber äußerst ineffizient, für die ich optimieren muss.[
['C', 'E'],
['E', 'G'],
['G']
]
< /code>
BeachtenG --------
E --------------
C ---------
< /code>
Der alogrithmus, den ich ausgewählt habe// 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>
Dann gehen wir den Viterbi -Algorithmus durch, testen jeden Akkord vor (72) mit jedem Akkord nach (72), berechnen Sie das Beste und wählen Sie das als Akkordinterpretation: < /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>
Wie Sie auch mit nur 6 Akkorden sehen können, sind es für jede Berechnung bereits> 5000 (72x72) Vorgänge, und obwohl ich die Arrays als globales Objekt verwalte, wenn sich eine Notiz an einer Position ändert, müssen alle Positionen nach ihren Werten aktualisiert werden. Dies bedeutet, dass in einem Projekt mit 1000 Eimer-Eingaben, wenn sich die Bucket-Nummer 15 ändert, die Eimer 15-1000 aktualisiert werden muss, was zu kostspielig ist. Dies funktioniert nicht, da wir mit jeder Notizen die Interpretation jedes Notizens testen müssen. In ['C', 'e'] könnte das 'c' der 1 des Akkords, der 2 des Akkords usw. sein. Ich werde dies nicht tun, weil es mir nicht klang ist. Ich habe darüber nachgedacht, nach einem Transformatoransatz zu suchen, aber ich weiß nicht, wo ich einen ausgebildeten und Open Source finden kann.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post