Skip to content

Commit cb5badc

Browse files
refactor: トラックの変換処理を関数化 (#2739)
1 parent ab03bb8 commit cb5badc

File tree

4 files changed

+59
-68
lines changed

4 files changed

+59
-68
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { ProjectFileTrack } from "./type";
2+
import { Track } from "@/domain/project/type";
3+
import { mapToRecord, recordToMap } from "@/sing/utility";
4+
5+
export function toProjectFileTrack(track: Track): ProjectFileTrack {
6+
return {
7+
name: track.name,
8+
singer: track.singer,
9+
keyRangeAdjustment: track.keyRangeAdjustment,
10+
volumeRangeAdjustment: track.volumeRangeAdjustment,
11+
notes: track.notes,
12+
pitchEditData: track.pitchEditData,
13+
phonemeTimingEditData: mapToRecord(track.phonemeTimingEditData),
14+
solo: track.solo,
15+
mute: track.mute,
16+
gain: track.gain,
17+
pan: track.pan,
18+
};
19+
}
20+
21+
export function toEditorTrack(projectFileTrack: ProjectFileTrack): Track {
22+
return {
23+
name: projectFileTrack.name,
24+
singer: projectFileTrack.singer,
25+
keyRangeAdjustment: projectFileTrack.keyRangeAdjustment,
26+
volumeRangeAdjustment: projectFileTrack.volumeRangeAdjustment,
27+
notes: projectFileTrack.notes,
28+
pitchEditData: projectFileTrack.pitchEditData,
29+
phonemeTimingEditData: recordToMap(projectFileTrack.phonemeTimingEditData),
30+
solo: projectFileTrack.solo,
31+
mute: projectFileTrack.mute,
32+
gain: projectFileTrack.gain,
33+
pan: projectFileTrack.pan,
34+
};
35+
}

src/store/project/index.ts

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ import {
3131
showQuestionDialog,
3232
} from "@/components/Dialog/Dialog";
3333
import { uuid4 } from "@/helpers/random";
34-
import { recordToMap } from "@/sing/utility";
3534
import type { Track } from "@/domain/project/type";
3635
import { migrateProjectFileObject } from "@/infrastructures/projectFile/migration";
36+
import { toEditorTrack } from "@/infrastructures/projectFile/conversion";
3737

3838
export const projectStoreState: ProjectStoreState = {
3939
savedLastCommandIds: { talk: null, song: null },
@@ -73,25 +73,12 @@ const applySongProjectToStore = async (
7373
await actions.SET_TRACKS({
7474
tracks: new Map(
7575
trackOrder.map((trackId): [TrackId, Track] => {
76-
const track = tracks[trackId];
77-
if (!track) throw new Error("track == undefined");
78-
// TODO: トラックの変換処理を関数化する
79-
return [
80-
trackId,
81-
{
82-
name: track.name,
83-
singer: track.singer,
84-
keyRangeAdjustment: track.keyRangeAdjustment,
85-
volumeRangeAdjustment: track.volumeRangeAdjustment,
86-
notes: track.notes,
87-
pitchEditData: track.pitchEditData,
88-
phonemeTimingEditData: recordToMap(track.phonemeTimingEditData),
89-
solo: track.solo,
90-
mute: track.mute,
91-
gain: track.gain,
92-
pan: track.pan,
93-
},
94-
];
76+
const projectFileTrack = tracks[trackId];
77+
if (projectFileTrack == undefined) {
78+
throw new Error("projectFileTrack == undefined");
79+
}
80+
const track = toEditorTrack(projectFileTrack);
81+
return [trackId, track];
9582
}),
9683
),
9784
});

src/store/project/saveProjectHelper.ts

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
import { ActionContext } from "../type";
22
import { showErrorDialog } from "@/components/Dialog/Dialog";
33
import { getAppInfos } from "@/domain/appInfo";
4-
import {
5-
LatestProjectType,
6-
ProjectFileTrack,
7-
} from "@/infrastructures/projectFile/type";
4+
import { LatestProjectType } from "@/infrastructures/projectFile/type";
85
import { DisplayableError } from "@/helpers/errorHelper";
9-
import { mapToRecord } from "@/sing/utility";
106
import { ResultError } from "@/type/result";
11-
import { TrackId } from "@/type/preload";
7+
import { toProjectFileTrack } from "@/infrastructures/projectFile/conversion";
128

139
export async function promptProjectSaveFilePath(
1410
context: ActionContext,
@@ -51,27 +47,10 @@ export async function writeProjectFile(
5147
tempos,
5248
timeSignatures,
5349
tracks: Object.fromEntries(
54-
[...tracks.entries()].map(
55-
([trackId, track]): [TrackId, ProjectFileTrack] => {
56-
// TODO: トラックの変換処理を関数化する
57-
return [
58-
trackId,
59-
{
60-
name: track.name,
61-
singer: track.singer,
62-
keyRangeAdjustment: track.keyRangeAdjustment,
63-
volumeRangeAdjustment: track.volumeRangeAdjustment,
64-
notes: track.notes,
65-
pitchEditData: track.pitchEditData,
66-
phonemeTimingEditData: mapToRecord(track.phonemeTimingEditData),
67-
solo: track.solo,
68-
mute: track.mute,
69-
gain: track.gain,
70-
pan: track.pan,
71-
},
72-
];
73-
},
74-
),
50+
[...tracks.entries()].map(([trackId, track]) => {
51+
const projectFileTrack = toProjectFileTrack(track);
52+
return [trackId, projectFileTrack];
53+
}),
7554
),
7655
trackOrder,
7756
},

src/store/singing.ts

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ import {
8888
AnimationTimer,
8989
createArray,
9090
createPromiseThatResolvesWhen,
91-
recordToMap,
9291
round,
9392
} from "@/sing/utility";
9493
import { getWorkaroundKeyRangeAdjustment } from "@/sing/workaroundKeyRangeAdjustment";
@@ -130,6 +129,7 @@ import type {
130129
Track,
131130
} from "@/domain/project/type";
132131
import { noteSchema } from "@/domain/project/schema";
132+
import { toEditorTrack } from "@/infrastructures/projectFile/conversion";
133133

134134
const logger = createLogger("store/singing");
135135

@@ -3516,34 +3516,24 @@ export const singingCommandStore = transformCommandStore(
35163516
throw new Error("TPQN does not match. Must be converted.");
35173517
}
35183518

3519-
const filteredTracks = trackIndexes.map((trackIndex): Track => {
3519+
const filteredTracks = trackIndexes.map((trackIndex) => {
35203520
const importedTrack = cloneWithUnwrapProxy(
35213521
tracks[trackOrder[trackIndex]],
35223522
);
35233523
if (!importedTrack) {
35243524
throw new Error("Track not found.");
35253525
}
3526-
// TODO: トラックの変換処理を関数化する
3527-
return {
3528-
name: importedTrack.name,
3529-
singer: importedTrack.singer,
3530-
keyRangeAdjustment: importedTrack.keyRangeAdjustment,
3531-
volumeRangeAdjustment: importedTrack.volumeRangeAdjustment,
3532-
notes: importedTrack.notes.map((note) => ({
3533-
...note,
3534-
id: NoteId(uuid4()),
3535-
})),
3536-
pitchEditData: importedTrack.pitchEditData,
3537-
phonemeTimingEditData: recordToMap(
3538-
importedTrack.phonemeTimingEditData,
3539-
),
3540-
solo: importedTrack.solo,
3541-
mute: importedTrack.mute,
3542-
gain: importedTrack.gain,
3543-
pan: importedTrack.pan,
3544-
};
3526+
return toEditorTrack(importedTrack);
35453527
});
35463528

3529+
// インポートなので、ノートIDは新しく振り直す
3530+
for (const track of filteredTracks) {
3531+
track.notes = track.notes.map((note) => ({
3532+
...note,
3533+
id: NoteId(uuid4()),
3534+
}));
3535+
}
3536+
35473537
await actions.COMMAND_IMPORT_TRACKS({
35483538
tpqn,
35493539
tempos,

0 commit comments

Comments
 (0)