ts-flp 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1102 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +1038 -40
- package/dist/index.js.map +1 -1
- package/dist/src/api/ProjectApi.d.ts.map +1 -1
- package/dist/src/io/BinaryReader.d.ts +1 -0
- package/dist/src/io/BinaryReader.d.ts.map +1 -1
- package/dist/src/parser/FlpParser.d.ts.map +1 -1
- package/package.json +6 -3
- package/dist/src/api/ProjectApi.js +0 -326
- package/dist/src/api/ProjectApi.js.map +0 -1
- package/dist/src/generated/events.generated.js +0 -257
- package/dist/src/generated/events.generated.js.map +0 -1
- package/dist/src/io/BinaryReader.js +0 -159
- package/dist/src/io/BinaryReader.js.map +0 -1
- package/dist/src/io/BinaryWriter.js +0 -124
- package/dist/src/io/BinaryWriter.js.map +0 -1
- package/dist/src/parser/FlpParser.js +0 -313
- package/dist/src/parser/FlpParser.js.map +0 -1
- package/dist/test/flparser.test.js +0 -345
- package/dist/test/flparser.test.js.map +0 -1
- package/dist/vitest.config.js +0 -10
- package/dist/vitest.config.js.map +0 -1
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auto-generated event constants from PyFLP
|
|
3
|
-
* FL Studio .flp file event IDs and types
|
|
4
|
-
*
|
|
5
|
-
* Event ID ranges:
|
|
6
|
-
* - BYTE (0-63): 1 byte data
|
|
7
|
-
* - WORD (64-127): 2 bytes data
|
|
8
|
-
* - DWORD (128-191): 4 bytes data
|
|
9
|
-
* - TEXT (192-207): Variable length strings (+ some IDs in DATA range)
|
|
10
|
-
* - DATA (208+): Variable length binary data
|
|
11
|
-
*/
|
|
12
|
-
// Base offsets for event ID ranges
|
|
13
|
-
export const BYTE = 0;
|
|
14
|
-
export const WORD = 64;
|
|
15
|
-
export const DWORD = 128;
|
|
16
|
-
export const TEXT = 192;
|
|
17
|
-
export const DATA = 208;
|
|
18
|
-
// IDs for TEXT events that use UTF-16LE in newer FL versions
|
|
19
|
-
export const NEW_TEXT_IDS = [
|
|
20
|
-
TEXT + 49, // ArrangementID.Name
|
|
21
|
-
TEXT + 39, // DisplayGroupID.Name
|
|
22
|
-
TEXT + 47, // TrackID.Name
|
|
23
|
-
];
|
|
24
|
-
/**
|
|
25
|
-
* Event IDs used by FL Studio project files
|
|
26
|
-
* Based on PyFLP's event definitions
|
|
27
|
-
*/
|
|
28
|
-
export const EVENT_ID = {
|
|
29
|
-
// === Project IDs (from project.py) ===
|
|
30
|
-
PROJECT_LOOP_ACTIVE: 9,
|
|
31
|
-
PROJECT_SHOW_INFO: 10,
|
|
32
|
-
PROJECT__VOLUME: 12,
|
|
33
|
-
PROJECT_PAN_LAW: 23,
|
|
34
|
-
PROJECT_LICENSED: 28,
|
|
35
|
-
PROJECT__TEMPO_COARSE: WORD + 2, // 66
|
|
36
|
-
PROJECT_PITCH: WORD + 16, // 80
|
|
37
|
-
PROJECT__TEMPO_FINE: WORD + 29, // 93
|
|
38
|
-
PROJECT_CUR_GROUP_ID: DWORD + 18,
|
|
39
|
-
PROJECT_TEMPO: DWORD + 28,
|
|
40
|
-
PROJECT_FL_BUILD: DWORD + 31,
|
|
41
|
-
PROJECT_TITLE: TEXT + 2, // 194
|
|
42
|
-
PROJECT_COMMENTS: TEXT + 3, // 195
|
|
43
|
-
PROJECT_URL: TEXT + 5, // 197
|
|
44
|
-
PROJECT__RTF_COMMENTS: TEXT + 6, // 198
|
|
45
|
-
PROJECT_FL_VERSION: TEXT + 7, // 199
|
|
46
|
-
PROJECT_LICENSEE: TEXT + 8, // 200
|
|
47
|
-
PROJECT_DATA_PATH: TEXT + 10, // 202
|
|
48
|
-
PROJECT_GENRE: TEXT + 14, // 206
|
|
49
|
-
PROJECT_ARTISTS: TEXT + 15, // 207
|
|
50
|
-
PROJECT_TIMESTAMP: DATA + 29, // 237
|
|
51
|
-
// === Channel IDs (from channel.py) ===
|
|
52
|
-
CHANNEL_IS_ENABLED: 0,
|
|
53
|
-
CHANNEL__VOL_BYTE: 2,
|
|
54
|
-
CHANNEL__PAN_BYTE: 3,
|
|
55
|
-
CHANNEL_ZIPPED: 15,
|
|
56
|
-
CHANNEL_PING_PONG_LOOP: 20,
|
|
57
|
-
CHANNEL_TYPE: 21,
|
|
58
|
-
CHANNEL_ROUTED_TO: 22,
|
|
59
|
-
CHANNEL_IS_LOCKED: 32,
|
|
60
|
-
CHANNEL_NEW: WORD,
|
|
61
|
-
CHANNEL_FREQ_TILT: WORD + 5, // 69
|
|
62
|
-
CHANNEL_FX_FLAGS: WORD + 6, // 70
|
|
63
|
-
CHANNEL_CUTOFF: WORD + 7, // 71
|
|
64
|
-
CHANNEL__VOL_WORD: WORD + 8, // 72
|
|
65
|
-
CHANNEL__PAN_WORD: WORD + 9, // 73
|
|
66
|
-
CHANNEL_PREAMP: WORD + 10, // 74
|
|
67
|
-
CHANNEL_FADE_OUT: WORD + 11, // 75
|
|
68
|
-
CHANNEL_FADE_IN: WORD + 12, // 76
|
|
69
|
-
CHANNEL_RESONANCE: WORD + 19, // 83
|
|
70
|
-
CHANNEL_STEREO_DELAY: WORD + 21, // 85
|
|
71
|
-
CHANNEL_POGO: WORD + 22, // 86
|
|
72
|
-
CHANNEL_TIME_SHIFT: WORD + 25, // 89
|
|
73
|
-
CHANNEL_CHILDREN: WORD + 30, // 94
|
|
74
|
-
CHANNEL_SWING: WORD + 33, // 97
|
|
75
|
-
CHANNEL_RING_MOD: DWORD + 3,
|
|
76
|
-
CHANNEL_CUT_GROUP: DWORD + 4,
|
|
77
|
-
CHANNEL_ROOT_NOTE: DWORD + 7,
|
|
78
|
-
CHANNEL_DELAY_MOD_XY: DWORD + 10,
|
|
79
|
-
CHANNEL_REVERB: DWORD + 11,
|
|
80
|
-
CHANNEL__STRETCH_TIME: DWORD + 12,
|
|
81
|
-
CHANNEL_FINE_TUNE: DWORD + 14,
|
|
82
|
-
CHANNEL_SAMPLER_FLAGS: DWORD + 15,
|
|
83
|
-
CHANNEL_LAYER_FLAGS: DWORD + 16,
|
|
84
|
-
CHANNEL_GROUP_NUM: DWORD + 17,
|
|
85
|
-
CHANNEL_AU_SAMPLE_RATE: DWORD + 25,
|
|
86
|
-
CHANNEL__NAME: TEXT,
|
|
87
|
-
CHANNEL_SAMPLE_PATH: TEXT + 4, // 196
|
|
88
|
-
CHANNEL_DELAY: DATA + 1, // 209
|
|
89
|
-
CHANNEL_PARAMETERS: DATA + 7, // 215
|
|
90
|
-
CHANNEL_ENVELOPE_LFO: DATA + 10, // 218
|
|
91
|
-
CHANNEL_LEVELS: DATA + 11, // 219
|
|
92
|
-
CHANNEL_POLYPHONY: DATA + 13, // 221
|
|
93
|
-
CHANNEL_TRACKING: DATA + 20, // 228
|
|
94
|
-
CHANNEL_LEVEL_ADJUSTS: DATA + 21, // 229
|
|
95
|
-
CHANNEL_AUTOMATION: DATA + 26, // 234
|
|
96
|
-
// === Plugin IDs (from plugin.py) ===
|
|
97
|
-
PLUGIN_COLOR: DWORD,
|
|
98
|
-
PLUGIN_ICON: DWORD + 27,
|
|
99
|
-
PLUGIN_INTERNAL_NAME: TEXT + 9, // 201
|
|
100
|
-
PLUGIN_NAME: TEXT + 11, // 203
|
|
101
|
-
PLUGIN_WRAPPER: DATA + 4, // 212
|
|
102
|
-
PLUGIN_DATA: DATA + 5, // 213
|
|
103
|
-
// === Display Group IDs ===
|
|
104
|
-
DISPLAY_GROUP_NAME: TEXT + 39, // 231
|
|
105
|
-
// === Rack IDs ===
|
|
106
|
-
RACK_SWING: 11,
|
|
107
|
-
RACK__FIT_TO_STEPS: 13,
|
|
108
|
-
RACK_WINDOW_HEIGHT: DWORD + 5,
|
|
109
|
-
// === Mixer IDs (from mixer.py) ===
|
|
110
|
-
MIXER_SLOT_INDEX: WORD + 34, // 98
|
|
111
|
-
MIXER_INSERT_ICON: WORD + 31, // 95
|
|
112
|
-
MIXER_INSERT_OUTPUT: DWORD + 19,
|
|
113
|
-
MIXER_INSERT_COLOR: DWORD + 21,
|
|
114
|
-
MIXER_INSERT_INPUT: DWORD + 26,
|
|
115
|
-
MIXER_INSERT_NAME: TEXT + 12, // 204
|
|
116
|
-
MIXER_INSERT_ROUTING: DATA + 27, // 235
|
|
117
|
-
MIXER_INSERT_FLAGS: DATA + 28, // 236
|
|
118
|
-
};
|
|
119
|
-
/**
|
|
120
|
-
* Maps event IDs to their data type
|
|
121
|
-
* Used for proper serialization/deserialization
|
|
122
|
-
*/
|
|
123
|
-
export const EVENT_KIND = {
|
|
124
|
-
// Project events
|
|
125
|
-
[EVENT_ID.PROJECT_LOOP_ACTIVE]: "u8",
|
|
126
|
-
[EVENT_ID.PROJECT_SHOW_INFO]: "u8",
|
|
127
|
-
[EVENT_ID.PROJECT__VOLUME]: "u8",
|
|
128
|
-
[EVENT_ID.PROJECT_PAN_LAW]: "u8",
|
|
129
|
-
[EVENT_ID.PROJECT_LICENSED]: "u8",
|
|
130
|
-
[EVENT_ID.PROJECT__TEMPO_COARSE]: "u16",
|
|
131
|
-
[EVENT_ID.PROJECT_PITCH]: "i16",
|
|
132
|
-
[EVENT_ID.PROJECT__TEMPO_FINE]: "u16",
|
|
133
|
-
[EVENT_ID.PROJECT_CUR_GROUP_ID]: "i32",
|
|
134
|
-
[EVENT_ID.PROJECT_TEMPO]: "u32",
|
|
135
|
-
[EVENT_ID.PROJECT_FL_BUILD]: "u32",
|
|
136
|
-
[EVENT_ID.PROJECT_TITLE]: "text",
|
|
137
|
-
[EVENT_ID.PROJECT_COMMENTS]: "text",
|
|
138
|
-
[EVENT_ID.PROJECT_URL]: "text",
|
|
139
|
-
[EVENT_ID.PROJECT__RTF_COMMENTS]: "text",
|
|
140
|
-
[EVENT_ID.PROJECT_FL_VERSION]: "text",
|
|
141
|
-
[EVENT_ID.PROJECT_LICENSEE]: "text",
|
|
142
|
-
[EVENT_ID.PROJECT_DATA_PATH]: "text",
|
|
143
|
-
[EVENT_ID.PROJECT_GENRE]: "text",
|
|
144
|
-
[EVENT_ID.PROJECT_ARTISTS]: "text",
|
|
145
|
-
[EVENT_ID.PROJECT_TIMESTAMP]: "data",
|
|
146
|
-
// Channel events
|
|
147
|
-
[EVENT_ID.CHANNEL_IS_ENABLED]: "u8",
|
|
148
|
-
[EVENT_ID.CHANNEL__VOL_BYTE]: "u8",
|
|
149
|
-
[EVENT_ID.CHANNEL__PAN_BYTE]: "u8",
|
|
150
|
-
[EVENT_ID.CHANNEL_ZIPPED]: "u8",
|
|
151
|
-
[EVENT_ID.CHANNEL_PING_PONG_LOOP]: "u8",
|
|
152
|
-
[EVENT_ID.CHANNEL_TYPE]: "u8",
|
|
153
|
-
[EVENT_ID.CHANNEL_ROUTED_TO]: "i8",
|
|
154
|
-
[EVENT_ID.CHANNEL_IS_LOCKED]: "u8",
|
|
155
|
-
[EVENT_ID.CHANNEL_NEW]: "u16",
|
|
156
|
-
[EVENT_ID.CHANNEL_FREQ_TILT]: "u16",
|
|
157
|
-
[EVENT_ID.CHANNEL_FX_FLAGS]: "u16",
|
|
158
|
-
[EVENT_ID.CHANNEL_CUTOFF]: "u16",
|
|
159
|
-
[EVENT_ID.CHANNEL__VOL_WORD]: "u16",
|
|
160
|
-
[EVENT_ID.CHANNEL__PAN_WORD]: "u16",
|
|
161
|
-
[EVENT_ID.CHANNEL_PREAMP]: "u16",
|
|
162
|
-
[EVENT_ID.CHANNEL_FADE_OUT]: "u16",
|
|
163
|
-
[EVENT_ID.CHANNEL_FADE_IN]: "u16",
|
|
164
|
-
[EVENT_ID.CHANNEL_RESONANCE]: "u16",
|
|
165
|
-
[EVENT_ID.CHANNEL_STEREO_DELAY]: "u16",
|
|
166
|
-
[EVENT_ID.CHANNEL_POGO]: "u16",
|
|
167
|
-
[EVENT_ID.CHANNEL_TIME_SHIFT]: "u16",
|
|
168
|
-
[EVENT_ID.CHANNEL_CHILDREN]: "u16",
|
|
169
|
-
[EVENT_ID.CHANNEL_SWING]: "u16",
|
|
170
|
-
[EVENT_ID.CHANNEL_RING_MOD]: "u32",
|
|
171
|
-
[EVENT_ID.CHANNEL_CUT_GROUP]: "u32",
|
|
172
|
-
[EVENT_ID.CHANNEL_ROOT_NOTE]: "u32",
|
|
173
|
-
[EVENT_ID.CHANNEL_DELAY_MOD_XY]: "u32",
|
|
174
|
-
[EVENT_ID.CHANNEL_REVERB]: "u32",
|
|
175
|
-
[EVENT_ID.CHANNEL__STRETCH_TIME]: "f32",
|
|
176
|
-
[EVENT_ID.CHANNEL_FINE_TUNE]: "i32",
|
|
177
|
-
[EVENT_ID.CHANNEL_SAMPLER_FLAGS]: "u32",
|
|
178
|
-
[EVENT_ID.CHANNEL_LAYER_FLAGS]: "u32",
|
|
179
|
-
[EVENT_ID.CHANNEL_GROUP_NUM]: "i32",
|
|
180
|
-
[EVENT_ID.CHANNEL_AU_SAMPLE_RATE]: "u32",
|
|
181
|
-
[EVENT_ID.CHANNEL__NAME]: "text",
|
|
182
|
-
[EVENT_ID.CHANNEL_SAMPLE_PATH]: "text",
|
|
183
|
-
[EVENT_ID.CHANNEL_DELAY]: "data",
|
|
184
|
-
[EVENT_ID.CHANNEL_PARAMETERS]: "data",
|
|
185
|
-
[EVENT_ID.CHANNEL_ENVELOPE_LFO]: "data",
|
|
186
|
-
[EVENT_ID.CHANNEL_LEVELS]: "data",
|
|
187
|
-
[EVENT_ID.CHANNEL_POLYPHONY]: "data",
|
|
188
|
-
[EVENT_ID.CHANNEL_TRACKING]: "data",
|
|
189
|
-
[EVENT_ID.CHANNEL_LEVEL_ADJUSTS]: "data",
|
|
190
|
-
[EVENT_ID.CHANNEL_AUTOMATION]: "data",
|
|
191
|
-
// Plugin events
|
|
192
|
-
[EVENT_ID.PLUGIN_COLOR]: "u32",
|
|
193
|
-
[EVENT_ID.PLUGIN_ICON]: "u32",
|
|
194
|
-
[EVENT_ID.PLUGIN_INTERNAL_NAME]: "text",
|
|
195
|
-
[EVENT_ID.PLUGIN_NAME]: "text",
|
|
196
|
-
[EVENT_ID.PLUGIN_WRAPPER]: "data",
|
|
197
|
-
[EVENT_ID.PLUGIN_DATA]: "data",
|
|
198
|
-
// Display Group events
|
|
199
|
-
[EVENT_ID.DISPLAY_GROUP_NAME]: "data",
|
|
200
|
-
// Rack events
|
|
201
|
-
[EVENT_ID.RACK_SWING]: "u8",
|
|
202
|
-
[EVENT_ID.RACK__FIT_TO_STEPS]: "u8",
|
|
203
|
-
[EVENT_ID.RACK_WINDOW_HEIGHT]: "u32",
|
|
204
|
-
// Mixer events
|
|
205
|
-
[EVENT_ID.MIXER_SLOT_INDEX]: "u16",
|
|
206
|
-
[EVENT_ID.MIXER_INSERT_ICON]: "i16",
|
|
207
|
-
[EVENT_ID.MIXER_INSERT_OUTPUT]: "i32",
|
|
208
|
-
[EVENT_ID.MIXER_INSERT_COLOR]: "u32",
|
|
209
|
-
[EVENT_ID.MIXER_INSERT_INPUT]: "i32",
|
|
210
|
-
[EVENT_ID.MIXER_INSERT_NAME]: "text",
|
|
211
|
-
[EVENT_ID.MIXER_INSERT_ROUTING]: "data",
|
|
212
|
-
[EVENT_ID.MIXER_INSERT_FLAGS]: "data",
|
|
213
|
-
};
|
|
214
|
-
/**
|
|
215
|
-
* Determines the event kind based on ID
|
|
216
|
-
* Falls back to range-based detection if not explicitly mapped
|
|
217
|
-
*/
|
|
218
|
-
export function getEventKind(eventId) {
|
|
219
|
-
// Check explicit mapping first
|
|
220
|
-
const mapped = EVENT_KIND[eventId];
|
|
221
|
-
if (mapped !== undefined) {
|
|
222
|
-
return mapped;
|
|
223
|
-
}
|
|
224
|
-
// Fall back to range-based detection
|
|
225
|
-
if (eventId < WORD) {
|
|
226
|
-
return "u8";
|
|
227
|
-
}
|
|
228
|
-
else if (eventId < DWORD) {
|
|
229
|
-
return "u16";
|
|
230
|
-
}
|
|
231
|
-
else if (eventId < TEXT) {
|
|
232
|
-
return "u32";
|
|
233
|
-
}
|
|
234
|
-
else if (eventId < DATA || NEW_TEXT_IDS.includes(eventId)) {
|
|
235
|
-
return "text";
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
return "data";
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Returns the fixed size for BYTE/WORD/DWORD events
|
|
243
|
-
* Returns -1 for variable-length events (TEXT/DATA)
|
|
244
|
-
*/
|
|
245
|
-
export function getEventFixedSize(eventId) {
|
|
246
|
-
if (eventId < WORD) {
|
|
247
|
-
return 1;
|
|
248
|
-
}
|
|
249
|
-
else if (eventId < DWORD) {
|
|
250
|
-
return 2;
|
|
251
|
-
}
|
|
252
|
-
else if (eventId < TEXT) {
|
|
253
|
-
return 4;
|
|
254
|
-
}
|
|
255
|
-
return -1; // Variable length
|
|
256
|
-
}
|
|
257
|
-
//# sourceMappingURL=events.generated.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events.generated.js","sourceRoot":"","sources":["../../../src/generated/events.generated.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Binary reader for FL Studio .flp files
|
|
3
|
-
* Uses smart-buffer for binary reading and protobufjs for VarInt decoding
|
|
4
|
-
*/
|
|
5
|
-
import * as protobuf from "protobufjs/minimal.js";
|
|
6
|
-
import { SmartBuffer } from "smart-buffer";
|
|
7
|
-
export class BinaryReader {
|
|
8
|
-
sb;
|
|
9
|
-
constructor(buffer) {
|
|
10
|
-
this.sb = SmartBuffer.fromBuffer(buffer);
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Returns current read position
|
|
14
|
-
*/
|
|
15
|
-
tell() {
|
|
16
|
-
return this.sb.readOffset;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Seeks to an absolute position
|
|
20
|
-
*/
|
|
21
|
-
seek(pos) {
|
|
22
|
-
this.sb.readOffset = pos;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Seeks relative to current position
|
|
26
|
-
*/
|
|
27
|
-
skip(offset) {
|
|
28
|
-
this.sb.readOffset += offset;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Returns total buffer length
|
|
32
|
-
*/
|
|
33
|
-
length() {
|
|
34
|
-
return this.sb.length;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Returns remaining bytes to read
|
|
38
|
-
*/
|
|
39
|
-
remaining() {
|
|
40
|
-
return this.sb.remaining();
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Returns true if there are more bytes to read
|
|
44
|
-
*/
|
|
45
|
-
hasMore() {
|
|
46
|
-
return this.sb.remaining() > 0;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Reads an unsigned 8-bit integer
|
|
50
|
-
*/
|
|
51
|
-
readU8() {
|
|
52
|
-
return this.sb.readUInt8();
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Reads a signed 8-bit integer
|
|
56
|
-
*/
|
|
57
|
-
readI8() {
|
|
58
|
-
return this.sb.readInt8();
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Reads an unsigned 16-bit integer (little-endian)
|
|
62
|
-
*/
|
|
63
|
-
readU16LE() {
|
|
64
|
-
return this.sb.readUInt16LE();
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Reads a signed 16-bit integer (little-endian)
|
|
68
|
-
*/
|
|
69
|
-
readI16LE() {
|
|
70
|
-
return this.sb.readInt16LE();
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Reads an unsigned 32-bit integer (little-endian)
|
|
74
|
-
*/
|
|
75
|
-
readU32LE() {
|
|
76
|
-
return this.sb.readUInt32LE();
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Reads a signed 32-bit integer (little-endian)
|
|
80
|
-
*/
|
|
81
|
-
readI32LE() {
|
|
82
|
-
return this.sb.readInt32LE();
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Reads a 32-bit float (little-endian)
|
|
86
|
-
*/
|
|
87
|
-
readF32LE() {
|
|
88
|
-
return this.sb.readFloatLE();
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Reads a 64-bit float (little-endian)
|
|
92
|
-
*/
|
|
93
|
-
readF64LE() {
|
|
94
|
-
return this.sb.readDoubleLE();
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Reads raw bytes
|
|
98
|
-
*/
|
|
99
|
-
readBytes(length) {
|
|
100
|
-
return this.sb.readBuffer(length);
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Reads a VarInt (variable-length integer) using protobufjs
|
|
104
|
-
* FL Studio uses this encoding for TEXT and DATA event sizes
|
|
105
|
-
*/
|
|
106
|
-
readVarInt() {
|
|
107
|
-
// Get remaining buffer from current position
|
|
108
|
-
const remainingBuffer = this.sb.toBuffer().subarray(this.sb.readOffset);
|
|
109
|
-
const reader = protobuf.Reader.create(remainingBuffer);
|
|
110
|
-
const value = reader.uint32();
|
|
111
|
-
// Advance our position by how many bytes protobufjs consumed
|
|
112
|
-
this.sb.readOffset += reader.pos;
|
|
113
|
-
return value;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Reads an ASCII string (null-terminated)
|
|
117
|
-
*/
|
|
118
|
-
readAsciiString(length) {
|
|
119
|
-
const str = this.sb.readString(length, "ascii");
|
|
120
|
-
// Remove null terminator if present
|
|
121
|
-
const nullPos = str.indexOf("\0");
|
|
122
|
-
return nullPos === -1 ? str : str.substring(0, nullPos);
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Reads a UTF-16LE string (null-terminated)
|
|
126
|
-
*/
|
|
127
|
-
readUtf16LEString(length) {
|
|
128
|
-
const bytes = this.sb.readBuffer(length);
|
|
129
|
-
const str = bytes.toString("utf16le");
|
|
130
|
-
// Remove null terminator if present
|
|
131
|
-
const nullPos = str.indexOf("\0");
|
|
132
|
-
return nullPos === -1 ? str : str.substring(0, nullPos);
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Peeks at bytes without advancing position
|
|
136
|
-
*/
|
|
137
|
-
peek(length) {
|
|
138
|
-
const pos = this.sb.readOffset;
|
|
139
|
-
const data = this.sb.readBuffer(length);
|
|
140
|
-
this.sb.readOffset = pos;
|
|
141
|
-
return data;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Peeks at a single byte without advancing position
|
|
145
|
-
*/
|
|
146
|
-
peekU8() {
|
|
147
|
-
const pos = this.sb.readOffset;
|
|
148
|
-
const value = this.sb.readUInt8();
|
|
149
|
-
this.sb.readOffset = pos;
|
|
150
|
-
return value;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Returns the internal buffer
|
|
154
|
-
*/
|
|
155
|
-
toBuffer() {
|
|
156
|
-
return this.sb.toBuffer();
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=BinaryReader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BinaryReader.js","sourceRoot":"","sources":["../../../src/io/BinaryReader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Binary writer for FL Studio .flp files
|
|
3
|
-
* Uses smart-buffer for binary writing and protobufjs for VarInt encoding
|
|
4
|
-
*/
|
|
5
|
-
import { SmartBuffer } from "smart-buffer";
|
|
6
|
-
import * as protobuf from "protobufjs/minimal.js";
|
|
7
|
-
export class BinaryWriter {
|
|
8
|
-
sb;
|
|
9
|
-
constructor() {
|
|
10
|
-
this.sb = new SmartBuffer();
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Returns current write position (total bytes written)
|
|
14
|
-
*/
|
|
15
|
-
tell() {
|
|
16
|
-
return this.sb.writeOffset;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Writes an unsigned 8-bit integer
|
|
20
|
-
*/
|
|
21
|
-
writeU8(value) {
|
|
22
|
-
this.sb.writeUInt8(value & 0xff);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Writes a signed 8-bit integer
|
|
26
|
-
*/
|
|
27
|
-
writeI8(value) {
|
|
28
|
-
this.sb.writeInt8(value);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Writes an unsigned 16-bit integer (little-endian)
|
|
32
|
-
*/
|
|
33
|
-
writeU16LE(value) {
|
|
34
|
-
this.sb.writeUInt16LE(value & 0xffff);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Writes a signed 16-bit integer (little-endian)
|
|
38
|
-
*/
|
|
39
|
-
writeI16LE(value) {
|
|
40
|
-
this.sb.writeInt16LE(value);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Writes an unsigned 32-bit integer (little-endian)
|
|
44
|
-
*/
|
|
45
|
-
writeU32LE(value) {
|
|
46
|
-
this.sb.writeUInt32LE(value >>> 0);
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Writes a signed 32-bit integer (little-endian)
|
|
50
|
-
*/
|
|
51
|
-
writeI32LE(value) {
|
|
52
|
-
this.sb.writeInt32LE(value);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Writes a 32-bit float (little-endian)
|
|
56
|
-
*/
|
|
57
|
-
writeF32LE(value) {
|
|
58
|
-
this.sb.writeFloatLE(value);
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Writes a 64-bit float (little-endian)
|
|
62
|
-
*/
|
|
63
|
-
writeF64LE(value) {
|
|
64
|
-
this.sb.writeDoubleLE(value);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Writes raw bytes
|
|
68
|
-
*/
|
|
69
|
-
writeBytes(data) {
|
|
70
|
-
this.sb.writeBuffer(data);
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Writes a VarInt (variable-length integer) using protobufjs
|
|
74
|
-
* FL Studio uses this encoding for TEXT and DATA event sizes
|
|
75
|
-
*/
|
|
76
|
-
writeVarInt(value) {
|
|
77
|
-
const writer = protobuf.Writer.create();
|
|
78
|
-
writer.uint32(value);
|
|
79
|
-
const encoded = writer.finish();
|
|
80
|
-
this.sb.writeBuffer(Buffer.from(encoded));
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Writes an ASCII string (null-terminated)
|
|
84
|
-
*/
|
|
85
|
-
writeAsciiString(str) {
|
|
86
|
-
this.sb.writeString(str + "\0", "ascii");
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Writes a UTF-16LE string (null-terminated)
|
|
90
|
-
*/
|
|
91
|
-
writeUtf16LEString(str) {
|
|
92
|
-
const buf = Buffer.from(str + "\0", "utf16le");
|
|
93
|
-
this.sb.writeBuffer(buf);
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Gets the final buffer
|
|
97
|
-
*/
|
|
98
|
-
toBuffer() {
|
|
99
|
-
return this.sb.toBuffer();
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Encodes a VarInt to a Buffer using protobufjs (standalone utility)
|
|
104
|
-
*/
|
|
105
|
-
export function encodeVarInt(value) {
|
|
106
|
-
const writer = protobuf.Writer.create();
|
|
107
|
-
writer.uint32(value);
|
|
108
|
-
return Buffer.from(writer.finish());
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Calculates the byte size needed for a VarInt
|
|
112
|
-
*/
|
|
113
|
-
export function varIntSize(value) {
|
|
114
|
-
if (value < 0x80)
|
|
115
|
-
return 1;
|
|
116
|
-
if (value < 0x4000)
|
|
117
|
-
return 2;
|
|
118
|
-
if (value < 0x200000)
|
|
119
|
-
return 3;
|
|
120
|
-
if (value < 0x10000000)
|
|
121
|
-
return 4;
|
|
122
|
-
return 5;
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=BinaryWriter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BinaryWriter.js","sourceRoot":"","sources":["../../../src/io/BinaryWriter.ts"],"names":[],"mappings":"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"}
|