-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtypes.ts
More file actions
117 lines (101 loc) · 2.89 KB
/
types.ts
File metadata and controls
117 lines (101 loc) · 2.89 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
export type ChannelId = 'A' | 'B' | 'C' | 'D';
export type TriggerMode = 'GATE' | 'ONE_SHOT' | 'LOOP';
export interface Envelope {
attack: number; // seconds
decay: number; // seconds
sustain: number; // 0-1
release: number; // seconds
}
export interface SampleMetadata {
name: string;
bank: string;
url: string;
id: string; // unique string for browser
waveform?: number[]; // Array of peaks for visualization
}
export interface Sample {
id: string; // Internal ID (e.g., 'pad-A-0')
name: string;
url?: string;
loaded: boolean;
duration: number;
buffer?: AudioBuffer;
}
export interface Pad {
id: string; // 'pad-0' to 'pad-15' (visual index)
channelId: ChannelId;
sampleId: string | null;
name?: string;
// Parameters
volume: number; // 0-2
pitch: number; // playbackRate (0.1 - 4.0)
pan: number; // -1 to 1
cutoff: number; // Hz (Displayed as kHz in UI)
resonance: number; // 0-20 (Q)
start: number; // 0-1
end: number; // 0-1
envelope: Envelope;
triggerMode: TriggerMode;
// View/Zoom state
viewStart: number; // 0-1 (for waveform zoom persistence)
viewEnd: number; // 0-1 (for waveform zoom persistence)
color: string;
buffer?: AudioBuffer;
// Transient trigger data for UI feedback
lastTriggerTime?: number;
lastTriggerDuration?: number;
lastStopTime?: number; // Scheduled stop time (for GATE/LOOP modes)
isHeld?: boolean; // Track if the pad is currently pressed/held
mute?: boolean;
solo?: boolean;
}
export interface StepData {
active: boolean;
velocity: number; // 0-127
pitch: number; // semitones relative to pad pitch (-24 to +24)
length: number; // duration factor (0.1 to 4.0)
}
export interface Pattern {
id: string; // e.g., 'ptn-0', 'ptn-1'
name: string; // Display name
tracks: Record<string, StepData[]>; // Key: "Channel-PadIndex"
stepCount: number;
}
export interface SongItem {
id: string; // Unique ID for the playlist item
patternId: string; // Reference to the Pattern
}
export interface DigItem {
id: string;
type: 'video' | 'audio';
thumbnail: string;
title: string;
duration: string;
audioUrl: string;
waveform?: number[];
}
export enum AppMode {
PERFORM = 'PERFORM',
SEQUENCE = 'SEQUENCE',
SAMPLE = 'SAMPLE', // Renamed from DIG
EDIT = 'EDIT',
SONG = 'SONG'
}
export interface ProjectData {
version: number;
date: number;
pads: Record<string, Omit<Pad, 'buffer' | 'isHeld' | 'lastTriggerTime' | 'lastTriggerDuration'>>;
samples: Record<string, { name: string, dataBase64: string, waveform: number[] }>;
patterns: Record<string, Pattern>;
song: SongItem[];
patterns_legacy?: Record<string, StepData[]>; // For migration support if needed
stepCount?: number;
bpm: number;
}
export interface SamplePack {
id: string;
name: string;
url: string;
isDefault?: boolean;
isFavorite?: boolean;
}