Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/app/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -165,17 +165,16 @@ export default function App() {
tuning,
setTuning,
presetMap,
presetMetaMap,
presetNames,
saveDefault,
savedExists,
savedMeta,
defaultForCount,
} = useDefaultTuning({
systemId,
strings,
DEFAULT_TUNINGS,
PRESET_TUNINGS,
PRESET_TUNING_META,
});

const [stringMeta, setStringMeta] = useState(null);
Expand Down Expand Up @@ -257,8 +256,9 @@ export default function App() {
queuePresetByName,
} = useMergedPresets({
presetMap,
presetMetaMap,
presetNames,
presetMetaSource: PRESET_TUNING_META,
savedMeta,
customTunings,
setTuning,
setStringMeta,
Expand Down
29 changes: 2 additions & 27 deletions src/hooks/useDefaultTuning.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ export function useDefaultTuning({
strings,
DEFAULT_TUNINGS,
PRESET_TUNINGS,
PRESET_TUNING_META = {},
}) {
const storeKey = keyOf(systemId, strings);

Expand Down Expand Up @@ -94,28 +93,6 @@ export function useDefaultTuning({
return m;
}, [factory, savedExists, saved, systemId, strings, PRESET_TUNINGS]);

const presetMetaMap = useMemo(() => {
const metaForGroup = PRESET_TUNING_META?.[systemId]?.[strings] || {};
const out = Object.create(null);
out["Factory default"] = null;
if (presetMap["Saved default"]) {
out["Saved default"] = savedMeta ? { ...savedMeta } : null;
}

for (const name of Object.keys(presetMap)) {
if (name === "Factory default" || name === "Saved default") continue;
out[name] = normalizePresetMeta(metaForGroup[name], {
stringMetaFormat: "array",
});
}
return out;
}, [PRESET_TUNING_META, systemId, strings, presetMap, savedMeta]);

const getPresetMeta = useCallback(
(name) => (name in presetMetaMap ? presetMetaMap[name] : null),
[presetMetaMap],
);

const saveDefault = useCallback(
(stringMeta, boardMeta) => {
const isFactory =
Expand Down Expand Up @@ -191,10 +168,9 @@ export function useDefaultTuning({
tuning,
setTuning,
presetMap,
presetMetaMap,
getPresetMeta,
presetNames: Object.keys(presetMap),
savedExists,
savedMeta,
saveDefault,
loadSavedDefault,
resetFactoryDefault,
Expand All @@ -204,9 +180,8 @@ export function useDefaultTuning({
tuning,
setTuning,
presetMap,
presetMetaMap,
getPresetMeta,
savedExists,
savedMeta,
saveDefault,
loadSavedDefault,
resetFactoryDefault,
Expand Down
56 changes: 18 additions & 38 deletions src/hooks/useMergedPresets.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
useLatest,
useMountedState,
} from "react-use";
import { normalizePresetMeta } from "@/lib/meta/meta";
import { usePresetMeta } from "@/hooks/usePresetMeta";
import { isPlainObject } from "@/utils/object";

function coerceTuningArray(strings) {
Expand Down Expand Up @@ -37,8 +37,9 @@ function coerceAnyTuning(value) {

export function useMergedPresets({
presetMap,
presetMetaMap,
presetNames,
presetMetaSource,
savedMeta,
customTunings,
setTuning,
setStringMeta,
Expand Down Expand Up @@ -94,30 +95,22 @@ export function useMergedPresets({
return out;
}, [compatibleCustoms]);

const customPresetMetaMap = useMemo(() => {
if (!compatibleCustoms.length) return {};
const out = {};
for (const pack of compatibleCustoms) {
const name = typeof pack?.name === "string" ? pack.name : null;
const meta = normalizePresetMeta(pack?.meta, { stringMetaFormat: "map" });
if (!name || !meta) continue;
out[name] = meta;
}
return out;
}, [compatibleCustoms]);

const mergedPresetMap = useMemo(
() => ({ ...presetMap, ...customPresetMap }),
[presetMap, customPresetMap],
);

const mergedPresetMetaMap = useMemo(() => {
const merged = { ...presetMetaMap };
for (const [k, v] of Object.entries(customPresetMetaMap)) {
merged[k] = v;
}
return merged;
}, [presetMetaMap, customPresetMetaMap]);
const { mergedPresetMetaMap, applyPresetMeta, resetMetaForInstrumentChange } =
usePresetMeta({
presetNames,
presetMetaSource,
savedMeta,
customTunings: compatibleCustoms,
systemId,
strings,
setStringMeta,
setBoardMeta,
});

const mergedPresetNames = useMemo(() => {
const names = new Set([
Expand Down Expand Up @@ -175,26 +168,15 @@ export function useMergedPresets({
return;
}
setTuning(coerced);
const meta =
normalizePresetMeta(mergedPresetMetaMap?.[name]) ||
normalizePresetMeta(
(compatibleCustoms.find((p) => p?.name === name) || {})?.meta,
);
if (meta?.stringMeta) setStringMeta(meta.stringMeta);
else setStringMeta(null);
if (meta?.board) setBoardMeta(meta.board);
else setBoardMeta(null);
applyPresetMeta(name);
queuedPresetRef.current = null;
},
[
isMounted,
resolveTuningByName,
mergedPresetMetaMap,
compatibleCustoms,
setTuning,
setStringMeta,
setBoardMeta,
currentStrings,
applyPresetMeta,
],
);

Expand Down Expand Up @@ -271,8 +253,7 @@ export function useMergedPresets({
const instrumentChanged =
prevSystemId !== systemId || prevStrings !== strings;
if (!instrumentChanged) return;
setStringMeta(null);
setBoardMeta(null);
resetMetaForInstrumentChange();
if (typeof onInstrumentChangeRef.current === "function") {
onInstrumentChangeRef.current({
queuePresetByName,
Expand All @@ -293,8 +274,7 @@ export function useMergedPresets({
queuePresetByName,
resetSelection,
defaultPresetName,
setStringMeta,
setBoardMeta,
resetMetaForInstrumentChange,
onInstrumentChangeRef,
]);

Expand Down
110 changes: 110 additions & 0 deletions src/hooks/usePresetMeta.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import { useCallback, useMemo } from "react";
import { normalizePresetMeta } from "@/lib/meta/meta";

function normalizeBaseMeta({
presetNames,
presetMetaSource,
savedMeta,
systemId,
strings,
}) {
const metaForGroup = presetMetaSource?.[systemId]?.[strings] || {};
const normalized = Object.create(null);

(Array.isArray(presetNames) ? presetNames : []).forEach((name) => {
if (name === "Saved default") {
const normalizedSaved = normalizePresetMeta(savedMeta, {
stringMetaFormat: "map",
});
if (normalizedSaved) normalized[name] = normalizedSaved;
return;
}

const meta = normalizePresetMeta(metaForGroup?.[name], {
stringMetaFormat: "map",
});
if (meta) normalized[name] = meta;
});

return normalized;
}

function normalizeCustomMeta(customTunings) {
if (!Array.isArray(customTunings) || !customTunings.length) return {};
const out = {};
for (const pack of customTunings) {
const name = typeof pack?.name === "string" ? pack.name : null;
if (!name) continue;
const meta = normalizePresetMeta(pack?.meta, { stringMetaFormat: "map" });
if (meta) out[name] = meta;
}
return out;
}

export function usePresetMeta({
presetNames = [],
presetMetaSource,
savedMeta,
customTunings,
systemId,
strings,
setStringMeta,
setBoardMeta,
}) {
const basePresetMetaMap = useMemo(
() =>
normalizeBaseMeta({
presetNames,
presetMetaSource,
savedMeta,
systemId,
strings,
}),
[presetNames, presetMetaSource, savedMeta, systemId, strings],
);

const customPresetMetaMap = useMemo(
() => normalizeCustomMeta(customTunings),
[customTunings],
);

const mergedPresetMetaMap = useMemo(() => {
const merged = { ...basePresetMetaMap };
for (const [name, meta] of Object.entries(customPresetMetaMap)) {
merged[name] = meta;
}
return merged;
}, [basePresetMetaMap, customPresetMetaMap]);

const getPresetMeta = useCallback(
(name) => (name in mergedPresetMetaMap ? mergedPresetMetaMap[name] : null),
[mergedPresetMetaMap],
);

const applyPresetMeta = useCallback(
(name) => {
const meta = getPresetMeta(name);
if (meta?.stringMeta) setStringMeta?.(meta.stringMeta);
else setStringMeta?.(null);
if (meta?.board) setBoardMeta?.(meta.board);
else setBoardMeta?.(null);
return meta ?? null;
},
[getPresetMeta, setStringMeta, setBoardMeta],
);

const resetMetaForInstrumentChange = useCallback(() => {
setStringMeta?.(null);
setBoardMeta?.(null);
}, [setStringMeta, setBoardMeta]);

return useMemo(
() => ({
mergedPresetMetaMap,
getPresetMeta,
applyPresetMeta,
resetMetaForInstrumentChange,
}),
[mergedPresetMetaMap, getPresetMeta, applyPresetMeta, resetMetaForInstrumentChange],
);
}
55 changes: 38 additions & 17 deletions src/hooks/useTuningIO.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
import { buildTuningPack, downloadJsonFile } from "@/lib/export/tuningIO";
import { withToastPromise } from "@/utils/toast";
import { isPlainObject } from "@/utils/object";
import { normalizePresetMeta } from "@/lib/meta/meta";

function normalizePackName(value) {
return typeof value === "string" ? value.trim() : "";
Expand Down Expand Up @@ -266,33 +267,37 @@ export function useTuningIO({ systemId, strings, TUNINGS }) {
const getCurrentTuningPack = useCallback(
(tuning, stringMeta = null, boardMeta = null) => {
const sys = TUNINGS[systemId];
const cleanStringMeta = Array.isArray(stringMeta) ? stringMeta : null;
const cleanBoardMeta =
boardMeta && typeof boardMeta === "object" && !Array.isArray(boardMeta)
? boardMeta
: null;

const normalizedMeta = normalizePresetMeta(
{ stringMeta, board: boardMeta },
{ stringMetaFormat: "map" },
);

const metaStringArray =
normalizedMeta?.stringMeta instanceof Map
? Array.from(normalizedMeta.stringMeta.values())
: Array.isArray(normalizedMeta?.stringMeta)
? normalizedMeta.stringMeta
: null;

const pack = buildTuningPack({
systemDivisions: sys.divisions,
systemId,
stringsCount: strings,
tuning,
stringMeta: cleanStringMeta ?? undefined,
stringMeta: metaStringArray ?? undefined,
});

const meta = { ...(pack.meta || {}) };
if (cleanStringMeta && cleanStringMeta.length) {
meta.stringMeta = cleanStringMeta;
}
if (cleanBoardMeta && Object.keys(cleanBoardMeta).length) {
meta.board = { ...cleanBoardMeta };
}

const hasMeta = Object.keys(meta).length > 0;
const meta = normalizedMeta
? {
...(metaStringArray?.length ? { stringMeta: metaStringArray } : {}),
...(normalizedMeta?.board ? { board: normalizedMeta.board } : {}),
}
: undefined;

return {
...pack,
...(hasMeta ? { meta } : { meta: undefined }),
...(meta ? { meta } : {}),
};
},
[systemId, strings, TUNINGS],
Expand Down Expand Up @@ -381,7 +386,23 @@ export function useTuningIO({ systemId, strings, TUNINGS }) {
const uniqueName = ensureUniqueName(label, takenNames);
const { system, ...rest } = p;
const cleanSystem = { edo: system.edo };
return { ...rest, system: cleanSystem, name: uniqueName };
const normalizedMeta = normalizePresetMeta(rest?.meta, {
stringMetaFormat: "array",
});
const meta = normalizedMeta
? {
...(normalizedMeta?.stringMeta?.length
? { stringMeta: normalizedMeta.stringMeta }
: {}),
...(normalizedMeta?.board ? { board: normalizedMeta.board } : {}),
}
: undefined;
return {
...rest,
...(meta ? { meta } : {}),
system: cleanSystem,
name: uniqueName,
};
});

const nextTunings = [...existing, ...newTunings];
Expand Down
Loading