feat: update compound calculation

feat: add "will my compound break" page
This commit is contained in:
2025-07-29 16:40:54 +02:00
parent f2a18cafe8
commit 9ca30f412e
2 changed files with 69 additions and 0 deletions

View File

@@ -69,5 +69,8 @@ export function hashChord(actions: number[]) {
for (let i = 0; i < 16; i++) {
hash = Math.imul(hash ^ view.getUint8(i), 16777619);
}
if ((hash & 0xff) === 0xff) {
hash ^= 0xff;
}
return hash & 0x3fff_ffff;
}

View File

@@ -0,0 +1,66 @@
<script lang="ts">
import { serializeActions } from "$lib/serial/chord";
import { chords } from "$lib/undo-redo";
import ChordEdit from "../ChordEdit.svelte";
export function hashChord(actions: number[]) {
const chord = new Uint8Array(16);
const view = new DataView(chord.buffer);
const serialized = serializeActions(actions);
view.setBigUint64(0, serialized & 0xffff_ffff_ffff_ffffn, true);
view.setBigUint64(8, serialized >> 64n, true);
let hash = 2166136261;
for (let i = 0; i < 16; i++) {
hash = Math.imul(hash ^ view.getUint8(i), 16777619);
}
return hash & 0x3fff_ffff;
}
const broken = $derived(
$chords.filter((it) => (hashChord(it.actions) & 0xff) === 0xff),
);
</script>
<h1>Will my compound break</h1>
<p>
Pre-2.2.0 there was a bug where creating a compound with specific chords as a
base could corrupt your library.
</p>
{#if broken.length > 0}
<p class="warning">Chords have been detected.</p>
<p>
If you have ever tried to create a compound chord with <b class="warning"
>any of these as a base</b
>, your library might have been corrupted.
</p>
{#each broken as chord}
<ChordEdit {chord} onduplicate={() => {}} />
{/each}
{:else}
<p>No problematic chords found</p>
{/if}
<style lang="scss">
.warning {
color: var(--md-sys-color-error);
font-weight: bold;
}
.chord {
display: flex;
gap: 0.5rem;
margin-bottom: 0.5rem;
}
.compound {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin-bottom: 1rem;
}
p {
max-width: 600px;
}
</style>