-
Notifications
You must be signed in to change notification settings - Fork 2
/
types.ts
85 lines (71 loc) · 1.67 KB
/
types.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import z from "zod";
export const zInstrument = z.enum([
"bombardino",
"clarinete",
"flauta",
"sax alto",
"sax soprano",
"sax tenor",
"trombone",
"trombone pirata",
"trompete",
"trompete pirata",
"tuba",
]);
export type Instrument = z.infer<typeof zInstrument>;
export const zPart = z.object({
name: z.string(),
instrument: zInstrument,
svg: z.string(),
midi: z.string(),
});
export type Part = z.infer<typeof zPart>;
export const zScore = z.object({
id: z.string(),
title: z.string(),
composer: z.string(),
sub: z.string(),
mscz: z.string(),
metajson: z.string(),
midi: z.string(),
parts: z.array(zPart),
tags: z.array(z.string()),
projectTitle: z.string(),
});
export type Score = z.infer<typeof zScore>;
export interface Project {
title: string;
scores: Score[];
}
export const zCollection = z.object({
projects: z.array(z.object({ title: z.string(), scores: z.array(zScore) })),
scrapedAt: z.string().transform((s) => new Date(s)),
version: z.literal(2),
});
export type Collection = z.infer<typeof zCollection>;
export type PlayingPart = {
score: Score;
part: Part;
};
export type SongBookScore = {
type: "score";
score: Score;
};
export type SongBookSection = {
type: "section";
title: string;
};
export type SongBookItem = SongBookScore | SongBookSection;
export type SongBook = {
items: SongBookItem[];
};
export const isSongBookSection = (row: SongBookItem): row is SongBookSection =>
row.type === "section";
export const songBookScore = (score: Score): SongBookScore => ({
type: "score",
score: score,
});
export const songBookSection = (title: string): SongBookSection => ({
type: "section",
title,
});