@beatbax/engine 0.1.0

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.
Files changed (174) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/audio/bufferedRenderer.d.ts +32 -0
  3. package/dist/audio/bufferedRenderer.d.ts.map +1 -0
  4. package/dist/audio/bufferedRenderer.js +309 -0
  5. package/dist/audio/bufferedRenderer.js.map +1 -0
  6. package/dist/audio/pcmRenderer.d.ts +25 -0
  7. package/dist/audio/pcmRenderer.d.ts.map +1 -0
  8. package/dist/audio/pcmRenderer.js +1288 -0
  9. package/dist/audio/pcmRenderer.js.map +1 -0
  10. package/dist/audio/playback.d.ts +57 -0
  11. package/dist/audio/playback.d.ts.map +1 -0
  12. package/dist/audio/playback.js +794 -0
  13. package/dist/audio/playback.js.map +1 -0
  14. package/dist/chips/gameboy/apu.d.ts +9 -0
  15. package/dist/chips/gameboy/apu.d.ts.map +1 -0
  16. package/dist/chips/gameboy/apu.js +27 -0
  17. package/dist/chips/gameboy/apu.js.map +1 -0
  18. package/dist/chips/gameboy/noise.d.ts +6 -0
  19. package/dist/chips/gameboy/noise.d.ts.map +1 -0
  20. package/dist/chips/gameboy/noise.js +155 -0
  21. package/dist/chips/gameboy/noise.js.map +1 -0
  22. package/dist/chips/gameboy/packet.d.ts +3 -0
  23. package/dist/chips/gameboy/packet.d.ts.map +1 -0
  24. package/dist/chips/gameboy/packet.js +3 -0
  25. package/dist/chips/gameboy/packet.js.map +1 -0
  26. package/dist/chips/gameboy/periodTables.d.ts +16 -0
  27. package/dist/chips/gameboy/periodTables.d.ts.map +1 -0
  28. package/dist/chips/gameboy/periodTables.js +29 -0
  29. package/dist/chips/gameboy/periodTables.js.map +1 -0
  30. package/dist/chips/gameboy/pulse.d.ts +12 -0
  31. package/dist/chips/gameboy/pulse.d.ts.map +1 -0
  32. package/dist/chips/gameboy/pulse.js +275 -0
  33. package/dist/chips/gameboy/pulse.js.map +1 -0
  34. package/dist/chips/gameboy/wave.d.ts +8 -0
  35. package/dist/chips/gameboy/wave.d.ts.map +1 -0
  36. package/dist/chips/gameboy/wave.js +146 -0
  37. package/dist/chips/gameboy/wave.js.map +1 -0
  38. package/dist/effects/index.d.ts +7 -0
  39. package/dist/effects/index.d.ts.map +1 -0
  40. package/dist/effects/index.js +1028 -0
  41. package/dist/effects/index.js.map +1 -0
  42. package/dist/effects/types.d.ts +8 -0
  43. package/dist/effects/types.d.ts.map +1 -0
  44. package/dist/effects/types.js +2 -0
  45. package/dist/effects/types.js.map +1 -0
  46. package/dist/expand/refExpander.d.ts +14 -0
  47. package/dist/expand/refExpander.d.ts.map +1 -0
  48. package/dist/expand/refExpander.js +130 -0
  49. package/dist/expand/refExpander.js.map +1 -0
  50. package/dist/export/index.d.ts +5 -0
  51. package/dist/export/index.d.ts.map +1 -0
  52. package/dist/export/index.js +5 -0
  53. package/dist/export/index.js.map +1 -0
  54. package/dist/export/jsonExport.d.ts +9 -0
  55. package/dist/export/jsonExport.d.ts.map +1 -0
  56. package/dist/export/jsonExport.js +184 -0
  57. package/dist/export/jsonExport.js.map +1 -0
  58. package/dist/export/midiExport.d.ts +9 -0
  59. package/dist/export/midiExport.d.ts.map +1 -0
  60. package/dist/export/midiExport.js +390 -0
  61. package/dist/export/midiExport.js.map +1 -0
  62. package/dist/export/ugeWriter.d.ts +33 -0
  63. package/dist/export/ugeWriter.d.ts.map +1 -0
  64. package/dist/export/ugeWriter.js +1997 -0
  65. package/dist/export/ugeWriter.js.map +1 -0
  66. package/dist/export/wavWriter.d.ts +24 -0
  67. package/dist/export/wavWriter.d.ts.map +1 -0
  68. package/dist/export/wavWriter.js +126 -0
  69. package/dist/export/wavWriter.js.map +1 -0
  70. package/dist/import/index.d.ts +5 -0
  71. package/dist/import/index.d.ts.map +1 -0
  72. package/dist/import/index.js +8 -0
  73. package/dist/import/index.js.map +1 -0
  74. package/dist/import/remoteCache.d.ts +60 -0
  75. package/dist/import/remoteCache.d.ts.map +1 -0
  76. package/dist/import/remoteCache.js +194 -0
  77. package/dist/import/remoteCache.js.map +1 -0
  78. package/dist/import/uge/uge.reader.d.ts +27 -0
  79. package/dist/import/uge/uge.reader.d.ts.map +1 -0
  80. package/dist/import/uge/uge.reader.js +545 -0
  81. package/dist/import/uge/uge.reader.js.map +1 -0
  82. package/dist/import/urlUtils.d.ts +50 -0
  83. package/dist/import/urlUtils.d.ts.map +1 -0
  84. package/dist/import/urlUtils.js +87 -0
  85. package/dist/import/urlUtils.js.map +1 -0
  86. package/dist/index.d.ts +18 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +318 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/instruments/instrumentState.d.ts +15 -0
  91. package/dist/instruments/instrumentState.d.ts.map +1 -0
  92. package/dist/instruments/instrumentState.js +24 -0
  93. package/dist/instruments/instrumentState.js.map +1 -0
  94. package/dist/parser/ast.d.ts +22 -0
  95. package/dist/parser/ast.d.ts.map +1 -0
  96. package/dist/parser/ast.js +5 -0
  97. package/dist/parser/ast.js.map +1 -0
  98. package/dist/parser/index.d.ts +14 -0
  99. package/dist/parser/index.d.ts.map +1 -0
  100. package/dist/parser/index.js +10 -0
  101. package/dist/parser/index.js.map +1 -0
  102. package/dist/parser/peggy/generated/parser.d.ts +8 -0
  103. package/dist/parser/peggy/generated/parser.d.ts.map +1 -0
  104. package/dist/parser/peggy/generated/parser.js +6269 -0
  105. package/dist/parser/peggy/generated/parser.js.map +1 -0
  106. package/dist/parser/peggy/index.d.ts +3 -0
  107. package/dist/parser/peggy/index.d.ts.map +1 -0
  108. package/dist/parser/peggy/index.js +555 -0
  109. package/dist/parser/peggy/index.js.map +1 -0
  110. package/dist/parser/structured.d.ts +16 -0
  111. package/dist/parser/structured.d.ts.map +1 -0
  112. package/dist/parser/structured.js +232 -0
  113. package/dist/parser/structured.js.map +1 -0
  114. package/dist/parser/tokenizer.d.ts +12 -0
  115. package/dist/parser/tokenizer.d.ts.map +1 -0
  116. package/dist/parser/tokenizer.js +14 -0
  117. package/dist/parser/tokenizer.js.map +1 -0
  118. package/dist/patterns/expand.d.ts +32 -0
  119. package/dist/patterns/expand.d.ts.map +1 -0
  120. package/dist/patterns/expand.js +184 -0
  121. package/dist/patterns/expand.js.map +1 -0
  122. package/dist/patterns/index.d.ts +2 -0
  123. package/dist/patterns/index.d.ts.map +1 -0
  124. package/dist/patterns/index.js +2 -0
  125. package/dist/patterns/index.js.map +1 -0
  126. package/dist/scheduler/index.d.ts +6 -0
  127. package/dist/scheduler/index.d.ts.map +1 -0
  128. package/dist/scheduler/index.js +9 -0
  129. package/dist/scheduler/index.js.map +1 -0
  130. package/dist/scheduler/tickScheduler.d.ts +27 -0
  131. package/dist/scheduler/tickScheduler.d.ts.map +1 -0
  132. package/dist/scheduler/tickScheduler.js +74 -0
  133. package/dist/scheduler/tickScheduler.js.map +1 -0
  134. package/dist/sequences/expand.d.ts +14 -0
  135. package/dist/sequences/expand.d.ts.map +1 -0
  136. package/dist/sequences/expand.js +137 -0
  137. package/dist/sequences/expand.js.map +1 -0
  138. package/dist/song/importResolver.browser.d.ts +29 -0
  139. package/dist/song/importResolver.browser.d.ts.map +1 -0
  140. package/dist/song/importResolver.browser.js +168 -0
  141. package/dist/song/importResolver.browser.js.map +1 -0
  142. package/dist/song/importResolver.d.ts +40 -0
  143. package/dist/song/importResolver.d.ts.map +1 -0
  144. package/dist/song/importResolver.js +445 -0
  145. package/dist/song/importResolver.js.map +1 -0
  146. package/dist/song/index.browser.d.ts +9 -0
  147. package/dist/song/index.browser.d.ts.map +1 -0
  148. package/dist/song/index.browser.js +7 -0
  149. package/dist/song/index.browser.js.map +1 -0
  150. package/dist/song/index.d.ts +8 -0
  151. package/dist/song/index.d.ts.map +1 -0
  152. package/dist/song/index.js +6 -0
  153. package/dist/song/index.js.map +1 -0
  154. package/dist/song/resolver.browser.d.ts +50 -0
  155. package/dist/song/resolver.browser.d.ts.map +1 -0
  156. package/dist/song/resolver.browser.js +536 -0
  157. package/dist/song/resolver.browser.js.map +1 -0
  158. package/dist/song/resolver.d.ts +20 -0
  159. package/dist/song/resolver.d.ts.map +1 -0
  160. package/dist/song/resolver.js +540 -0
  161. package/dist/song/resolver.js.map +1 -0
  162. package/dist/song/songModel.d.ts +34 -0
  163. package/dist/song/songModel.d.ts.map +1 -0
  164. package/dist/song/songModel.js +2 -0
  165. package/dist/song/songModel.js.map +1 -0
  166. package/dist/tests/refExpander.test.d.ts +2 -0
  167. package/dist/tests/refExpander.test.d.ts.map +1 -0
  168. package/dist/tests/refExpander.test.js +37 -0
  169. package/dist/tests/refExpander.test.js.map +1 -0
  170. package/dist/util/diag.d.ts +16 -0
  171. package/dist/util/diag.d.ts.map +1 -0
  172. package/dist/util/diag.js +29 -0
  173. package/dist/util/diag.js.map +1 -0
  174. package/package.json +84 -0
@@ -0,0 +1,27 @@
1
+ export declare function parseUGE(data: Buffer): any;
2
+ export declare function readUGEFile(path: string): any;
3
+ export declare function midiNoteToUGE(midi: number): number;
4
+ export declare function ugeNoteToString(uge: number): string;
5
+ export declare function getUGESummary(song: any): string;
6
+ export declare enum InstrumentType {
7
+ DUTY = 0,
8
+ WAVE = 1,
9
+ NOISE = 2
10
+ }
11
+ export declare enum ChannelType {
12
+ PULSE1 = 0,
13
+ PULSE2 = 1,
14
+ WAVE = 2,
15
+ NOISE = 3
16
+ }
17
+ export type SubPatternCell = any;
18
+ export type DutyInstrument = any;
19
+ export type WaveInstrument = any;
20
+ export type NoiseInstrument = any;
21
+ export type Instrument = any;
22
+ export type PatternCell = any;
23
+ export type Pattern = any;
24
+ export type UGESong = any;
25
+ declare const _default: {};
26
+ export default _default;
27
+ //# sourceMappingURL=uge.reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uge.reader.d.ts","sourceRoot":"","sources":["../../../src/import/uge/uge.reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,545 @@
1
+ /**
2
+ * UGE Reader - Parses hUGETracker .uge files (v5/v6)
3
+ *
4
+ * Based on the hUGETracker UGE format specification.
5
+ * Supports versions 5 and 6 of the UGE format.
6
+ *
7
+ * Usage:
8
+ * import { readUGEFile, parseUGE } from './uge.reader.js';
9
+ * const song = readUGEFile('path/to/song.uge');
10
+ * // or
11
+ * const buffer = readFileSync('song.uge');
12
+ * const song = parseUGE(buffer);
13
+ */
14
+ import { readFileSync } from 'fs';
15
+ // ============================================================================
16
+ // Type Definitions
17
+ // ============================================================================
18
+ export var InstrumentType;
19
+ (function (InstrumentType) {
20
+ InstrumentType[InstrumentType["DUTY"] = 0] = "DUTY";
21
+ InstrumentType[InstrumentType["WAVE"] = 1] = "WAVE";
22
+ InstrumentType[InstrumentType["NOISE"] = 2] = "NOISE";
23
+ })(InstrumentType || (InstrumentType = {}));
24
+ export var ChannelType;
25
+ (function (ChannelType) {
26
+ ChannelType[ChannelType["PULSE1"] = 0] = "PULSE1";
27
+ ChannelType[ChannelType["PULSE2"] = 1] = "PULSE2";
28
+ ChannelType[ChannelType["WAVE"] = 2] = "WAVE";
29
+ ChannelType[ChannelType["NOISE"] = 3] = "NOISE";
30
+ })(ChannelType || (ChannelType = {}));
31
+ // ============================================================================
32
+ // Binary Reading Helpers
33
+ // ============================================================================
34
+ class BinaryReader {
35
+ buffer;
36
+ offset = 0;
37
+ constructor(buffer) {
38
+ this.buffer = buffer;
39
+ }
40
+ getOffset() {
41
+ return this.offset;
42
+ }
43
+ readU8(ctx = 'u8') {
44
+ if (this.offset + 1 > this.buffer.length) {
45
+ throw new Error(`EOF: Need 1 byte for ${ctx} at offset ${this.offset}`);
46
+ }
47
+ const val = this.buffer.readUInt8(this.offset);
48
+ this.offset += 1;
49
+ return val;
50
+ }
51
+ readU32(ctx = 'u32') {
52
+ if (this.offset + 4 > this.buffer.length) {
53
+ throw new Error(`EOF: Need 4 bytes for ${ctx} at offset ${this.offset}`);
54
+ }
55
+ const val = this.buffer.readUInt32LE(this.offset);
56
+ this.offset += 4;
57
+ return val;
58
+ }
59
+ readBool(ctx = 'bool') {
60
+ return this.readU8(ctx) !== 0;
61
+ }
62
+ readShortString(ctx = 'shortstring') {
63
+ const len = this.readU8(`${ctx}.length`);
64
+ if (this.offset + 255 > this.buffer.length) {
65
+ throw new Error(`EOF: Need 255 bytes for ${ctx} at offset ${this.offset}`);
66
+ }
67
+ const str = this.buffer.toString('utf8', this.offset, this.offset + len);
68
+ this.offset += 255; // Always skip 255 bytes regardless of actual length
69
+ return str;
70
+ }
71
+ readString(ctx = 'string') {
72
+ const len = this.readU32(`${ctx}.length`);
73
+ if (this.offset + len > this.buffer.length) {
74
+ throw new Error(`EOF: Need ${len} bytes for ${ctx} at offset ${this.offset}`);
75
+ }
76
+ const str = this.buffer.toString('utf8', this.offset, this.offset + len);
77
+ this.offset += len;
78
+ // No null terminator in beatbax writer output
79
+ return str;
80
+ }
81
+ skip(bytes) {
82
+ this.offset += bytes;
83
+ }
84
+ }
85
+ // ============================================================================
86
+ // Parsing Functions
87
+ // ============================================================================
88
+ function parseSubPatternRows(reader, version, ctx) {
89
+ const rows = [];
90
+ for (let r = 0; r < 64; r++) {
91
+ const note = reader.readU32(`${ctx}.row[${r}].note`);
92
+ const unused = reader.readU32(`${ctx}.row[${r}].unused`);
93
+ const jump = reader.readU32(`${ctx}.row[${r}].jump`);
94
+ const effectCode = reader.readU32(`${ctx}.row[${r}].effectCode`);
95
+ const effectParam = reader.readU8(`${ctx}.row[${r}].effectParam`);
96
+ rows.push({ note, jump, effectCode, effectParam });
97
+ }
98
+ // v4-v5 have 6 additional unused bytes after rows
99
+ if (version >= 4 && version < 6) {
100
+ reader.skip(6);
101
+ }
102
+ return rows;
103
+ }
104
+ function parseDutyInstrument(reader, version, idx) {
105
+ const baseOffset = reader.getOffset();
106
+ const instType = reader.readU32(`duty[${idx}].type`);
107
+ if (instType !== 0) {
108
+ throw new Error(`Expected duty instrument type 0 at offset ${baseOffset}, got ${instType}`);
109
+ }
110
+ const name = reader.readShortString(`duty[${idx}].name`);
111
+ const length = reader.readU32(`duty[${idx}].length`);
112
+ const lengthEnabled = reader.readBool(`duty[${idx}].lengthEnabled`);
113
+ const initialVolume = reader.readU8(`duty[${idx}].initialVolume`);
114
+ const volumeSweepDir = reader.readU32(`duty[${idx}].volumeSweepDir`);
115
+ const volumeSweepChange = reader.readU8(`duty[${idx}].volumeSweepChange`);
116
+ const freqSweepTime = reader.readU32(`duty[${idx}].freqSweepTime`);
117
+ const sweepEnabled = reader.readU32(`duty[${idx}].sweepEnabled`);
118
+ const freqSweepShift = reader.readU32(`duty[${idx}].freqSweepShift`);
119
+ const dutyCycle = reader.readU8(`duty[${idx}].dutyCycle`);
120
+ // Three unused u32s
121
+ reader.readU32(`duty[${idx}].unused_a`);
122
+ reader.readU32(`duty[${idx}].unused_b`);
123
+ reader.readU32(`duty[${idx}].counter_step`);
124
+ let subpatternEnabled;
125
+ let rows;
126
+ if (version < 6) {
127
+ // v5 has additional unused fields and always includes rows
128
+ rows = parseSubPatternRows(reader, version, `duty[${idx}]`);
129
+ }
130
+ else {
131
+ // v6: subpattern flag, then 64 rows × 17 bytes (always present in binary)
132
+ subpatternEnabled = reader.readBool(`duty[${idx}].subpatternEnabled`);
133
+ // Always skip 64 rows × 17 bytes = 1088 bytes (they're always written)
134
+ reader.skip(64 * 17);
135
+ }
136
+ return {
137
+ type: InstrumentType.DUTY,
138
+ name,
139
+ length,
140
+ lengthEnabled,
141
+ initialVolume,
142
+ volumeSweepDir,
143
+ volumeSweepChange,
144
+ freqSweepTime,
145
+ sweepEnabled,
146
+ freqSweepShift,
147
+ dutyCycle,
148
+ subpatternEnabled,
149
+ rows
150
+ };
151
+ }
152
+ function parseWaveInstrument(reader, version, idx) {
153
+ const baseOffset = reader.getOffset();
154
+ const instType = reader.readU32(`wave[${idx}].type`);
155
+ if (instType !== 1) {
156
+ throw new Error(`Expected wave instrument type 1 at offset ${baseOffset}, got ${instType}`);
157
+ }
158
+ const name = reader.readShortString(`wave[${idx}].name`);
159
+ const length = reader.readU32(`wave[${idx}].length`);
160
+ const lengthEnabled = reader.readBool(`wave[${idx}].lengthEnabled`);
161
+ // Skip unused fields
162
+ reader.readU8(`wave[${idx}].unused1_u8`);
163
+ reader.readU32(`wave[${idx}].unused2_u32`);
164
+ reader.readU8(`wave[${idx}].unused3_u8`);
165
+ reader.readU32(`wave[${idx}].unused4_u32`);
166
+ reader.readU32(`wave[${idx}].unused5_u32`);
167
+ reader.readU32(`wave[${idx}].unused6_u32`);
168
+ reader.readU8(`wave[${idx}].unused7_u8`);
169
+ const volume = reader.readU32(`wave[${idx}].volume`);
170
+ const waveIndex = reader.readU32(`wave[${idx}].waveIndex`);
171
+ reader.readU32(`wave[${idx}].counter_step`);
172
+ let subpatternEnabled;
173
+ let rows;
174
+ if (version < 6) {
175
+ // v5 has additional unused fields and always includes rows
176
+ rows = parseSubPatternRows(reader, version, `wave[${idx}]`);
177
+ }
178
+ else {
179
+ // v6: subpattern flag, then 64 rows × 17 bytes (always present in binary)
180
+ subpatternEnabled = reader.readBool(`wave[${idx}].subpatternEnabled`);
181
+ // Always skip 64 rows × 17 bytes = 1088 bytes (they're always written)
182
+ reader.skip(64 * 17);
183
+ }
184
+ return {
185
+ type: InstrumentType.WAVE,
186
+ name,
187
+ length,
188
+ lengthEnabled,
189
+ volume,
190
+ waveIndex,
191
+ subpatternEnabled,
192
+ rows
193
+ };
194
+ }
195
+ function parseNoiseInstrument(reader, version, idx) {
196
+ const baseOffset = reader.getOffset();
197
+ const instType = reader.readU32(`noise[${idx}].type`);
198
+ if (instType !== 2) {
199
+ throw new Error(`Expected noise instrument type 2 at offset ${baseOffset}, got ${instType}`);
200
+ }
201
+ const name = reader.readShortString(`noise[${idx}].name`);
202
+ const length = reader.readU32(`noise[${idx}].length`);
203
+ const lengthEnabled = reader.readBool(`noise[${idx}].lengthEnabled`);
204
+ const initialVolume = reader.readU8(`noise[${idx}].initialVolume`);
205
+ const volumeSweepDir = reader.readU32(`noise[${idx}].volumeSweepDir`);
206
+ const volumeSweepChange = reader.readU8(`noise[${idx}].volumeSweepChange`);
207
+ // Skip unused fields
208
+ reader.readU32(`noise[${idx}].unused_a`);
209
+ reader.readU32(`noise[${idx}].unused_b`);
210
+ reader.readU32(`noise[${idx}].unused_c`);
211
+ reader.readU8(`noise[${idx}].unused_d`);
212
+ reader.readU32(`noise[${idx}].unused_e`);
213
+ reader.readU32(`noise[${idx}].unused_f`);
214
+ reader.readU32(`noise[${idx}].noise_mode`);
215
+ let noiseMode;
216
+ let subpatternEnabled;
217
+ let rows;
218
+ if (version < 6) {
219
+ // v5 has additional unused fields and always includes rows
220
+ rows = parseSubPatternRows(reader, version, `noise[${idx}]`);
221
+ }
222
+ else {
223
+ // v6: subpattern flag, then 64 rows × 17 bytes (always present in binary)
224
+ subpatternEnabled = reader.readBool(`noise[${idx}].subpatternEnabled`);
225
+ // Always skip 64 rows × 17 bytes = 1088 bytes (they're always written)
226
+ reader.skip(64 * 17);
227
+ }
228
+ return {
229
+ type: InstrumentType.NOISE,
230
+ name,
231
+ length,
232
+ lengthEnabled,
233
+ initialVolume,
234
+ volumeSweepDir,
235
+ volumeSweepChange,
236
+ noiseMode,
237
+ subpatternEnabled,
238
+ rows
239
+ };
240
+ }
241
+ function parseWavetables(reader, version) {
242
+ const waves = [];
243
+ for (let w = 0; w < 16; w++) {
244
+ const nibbles = [];
245
+ for (let i = 0; i < 32; i++) {
246
+ nibbles.push(reader.readU8(`wavetable[${w}].nibble[${i}]`));
247
+ }
248
+ waves.push(nibbles);
249
+ }
250
+ // v<3 has an off-by-one filler byte
251
+ if (version < 3) {
252
+ reader.readU8('wavetable.off_by_one_filler');
253
+ }
254
+ return waves;
255
+ }
256
+ function parsePatterns(reader, version) {
257
+ const initialTicksPerRow = reader.readU32('patterns.initialTicksPerRow');
258
+ let timerTempoEnabled;
259
+ let timerTempoDivider;
260
+ if (version >= 6) {
261
+ timerTempoEnabled = reader.readBool('patterns.timerTempoEnabled');
262
+ timerTempoDivider = reader.readU32('patterns.timerTempoDivider');
263
+ }
264
+ const numPatterns = reader.readU32('patterns.numPatterns');
265
+ const patterns = [];
266
+ for (let p = 0; p < numPatterns; p++) {
267
+ const index = reader.readU32(`pattern[${p}].index`);
268
+ const rows = [];
269
+ for (let r = 0; r < 64; r++) {
270
+ const note = reader.readU32(`pattern[${p}].row[${r}].note`);
271
+ const instrument = reader.readU32(`pattern[${p}].row[${r}].instrument`);
272
+ // v6 has an unused u32 field
273
+ if (version >= 6) {
274
+ reader.readU32(`pattern[${p}].row[${r}].unused_v6`);
275
+ }
276
+ const effectCode = reader.readU32(`pattern[${p}].row[${r}].effectCode`);
277
+ const effectParam = reader.readU8(`pattern[${p}].row[${r}].effectParam`);
278
+ rows.push({ note, instrument, effectCode, effectParam });
279
+ }
280
+ patterns.push({ index, rows });
281
+ }
282
+ return { initialTicksPerRow, timerTempoEnabled, timerTempoDivider, patterns };
283
+ }
284
+ function parseOrders(reader) {
285
+ const channels = [];
286
+ const channelNames = ['Duty1', 'Duty2', 'Wave', 'Noise'];
287
+ for (let c = 0; c < 4; c++) {
288
+ const orderLenPlusOne = reader.readU32(`orders[${channelNames[c]}].lengthPlusOne`);
289
+ const orderLen = Math.max(0, orderLenPlusOne - 1);
290
+ const indices = [];
291
+ for (let i = 0; i < orderLen; i++) {
292
+ const idx = reader.readU32(`orders[${channelNames[c]}].index[${i}]`);
293
+ const filler = reader.readU32(`orders[${channelNames[c]}].filler[${i}]`);
294
+ indices.push(idx);
295
+ }
296
+ channels.push(indices);
297
+ }
298
+ return {
299
+ duty1: channels[0],
300
+ duty2: channels[1],
301
+ wave: channels[2],
302
+ noise: channels[3]
303
+ };
304
+ }
305
+ function parseRoutines(reader) {
306
+ const routines = [];
307
+ for (let i = 0; i < 16; i++) {
308
+ const code = reader.readString(`routine[${i}]`);
309
+ routines.push(code);
310
+ }
311
+ return routines;
312
+ }
313
+ // ============================================================================
314
+ // Main Parsing Functions
315
+ // ============================================================================
316
+ /**
317
+ * Parse a UGE file from a Buffer
318
+ */
319
+ export function parseUGE(data) {
320
+ const reader = new BinaryReader(data);
321
+ // Read header
322
+ const version = reader.readU32('header.version');
323
+ // Validate version
324
+ if (version < 5 || version > 6) {
325
+ throw new Error(`Unsupported UGE version ${version}. This parser supports only v5 or v6 files.`);
326
+ }
327
+ const name = reader.readShortString('header.name');
328
+ const artist = reader.readShortString('header.artist');
329
+ const comment = reader.readShortString('header.comment');
330
+ // Parse instruments
331
+ const dutyInstruments = [];
332
+ for (let i = 0; i < 15; i++) {
333
+ dutyInstruments.push(parseDutyInstrument(reader, version, i));
334
+ }
335
+ const waveInstruments = [];
336
+ for (let i = 0; i < 15; i++) {
337
+ waveInstruments.push(parseWaveInstrument(reader, version, i));
338
+ }
339
+ const noiseInstruments = [];
340
+ for (let i = 0; i < 15; i++) {
341
+ noiseInstruments.push(parseNoiseInstrument(reader, version, i));
342
+ }
343
+ // Parse wavetables
344
+ const wavetables = parseWavetables(reader, version);
345
+ // Parse patterns
346
+ const { initialTicksPerRow, timerTempoEnabled, timerTempoDivider, patterns } = parsePatterns(reader, version);
347
+ // Parse orders
348
+ const orders = parseOrders(reader);
349
+ // Parse routines
350
+ const routines = parseRoutines(reader);
351
+ return {
352
+ version,
353
+ name,
354
+ artist,
355
+ comment,
356
+ dutyInstruments,
357
+ waveInstruments,
358
+ noiseInstruments,
359
+ wavetables,
360
+ initialTicksPerRow,
361
+ timerTempoEnabled,
362
+ timerTempoDivider,
363
+ patterns,
364
+ orders,
365
+ routines
366
+ };
367
+ }
368
+ /**
369
+ * Read and parse a UGE file from disk
370
+ */
371
+ export function readUGEFile(path) {
372
+ const buffer = readFileSync(path);
373
+ return parseUGE(buffer);
374
+ }
375
+ /**
376
+ * Convert MIDI note number to hUGETracker note index
377
+ * hUGETracker uses indices 0-72 where 0 = C-3, 12 = C-4, 24 = C-5, etc.
378
+ */
379
+ export function midiNoteToUGE(midi) {
380
+ return midi - 36; // Offset by 3 octaves (MIDI note 36 = C2 = UGE C-3)
381
+ }
382
+ /**
383
+ * Convert hUGETracker note index to note name string
384
+ */
385
+ export function ugeNoteToString(uge) {
386
+ if (uge === 90)
387
+ return '...'; // Empty note
388
+ if (uge < 0 || uge > 72)
389
+ return '???';
390
+ const noteNames = ['C-', 'C#', 'D-', 'D#', 'E-', 'F-', 'F#', 'G-', 'G#', 'A-', 'A#', 'B-'];
391
+ const octave = Math.floor(uge / 12) + 3;
392
+ const note = noteNames[uge % 12];
393
+ return `${note}${octave}`;
394
+ }
395
+ /**
396
+ * Get a summary string of the UGE song
397
+ */
398
+ export function getUGESummary(song) {
399
+ const lines = [];
400
+ lines.push(`=== UGE v${song.version} ===`);
401
+ lines.push(`Title: ${song.name}`);
402
+ lines.push(`Artist: ${song.artist}`);
403
+ if (song.comment)
404
+ lines.push(`Comment: ${song.comment}`);
405
+ lines.push(`Ticks/Row: ${song.initialTicksPerRow} (≈${Math.round(896 / song.initialTicksPerRow)} BPM)`);
406
+ lines.push(`Patterns: ${song.patterns.length}`);
407
+ lines.push(`Orders: D1=${song.orders.duty1.length}, D2=${song.orders.duty2.length}, W=${song.orders.wave.length}, N=${song.orders.noise.length}`);
408
+ // Count used instruments
409
+ const usedDuty = song.dutyInstruments.filter(i => i.name && i.name.trim()).length;
410
+ const usedWave = song.waveInstruments.filter(i => i.name && i.name.trim()).length;
411
+ const usedNoise = song.noiseInstruments.filter(i => i.name && i.name.trim()).length;
412
+ lines.push(`Instruments: ${usedDuty} duty, ${usedWave} wave, ${usedNoise} noise`);
413
+ return lines.join('\n');
414
+ }
415
+ /**
416
+ * Convert UGE song to a detailed JSON representation
417
+ * This provides a comprehensive breakdown similar to .bax file inspection
418
+ */
419
+ export function getUGEDetailedJSON(song) {
420
+ // Convert patterns to human-readable format with note names
421
+ const patternsDetailed = song.patterns.map(pattern => ({
422
+ index: pattern.index,
423
+ rows: pattern.rows.map(row => ({
424
+ note: row.note === 90 ? '...' : ugeNoteToString(row.note),
425
+ noteIndex: row.note,
426
+ instrument: row.instrument,
427
+ effectCode: row.effectCode,
428
+ effectParam: row.effectParam,
429
+ effectDisplay: row.effectCode === 0 ? '...' :
430
+ `${row.effectCode.toString(16).toUpperCase()}${row.effectParam.toString(16).toUpperCase().padStart(2, '0')}`
431
+ }))
432
+ }));
433
+ // Filter instruments to show only those with names
434
+ const dutyInstrumentsFiltered = song.dutyInstruments
435
+ .map((inst, idx) => ({ ...inst, index: idx }))
436
+ .filter(inst => inst.name && inst.name.trim());
437
+ const waveInstrumentsFiltered = song.waveInstruments
438
+ .map((inst, idx) => ({ ...inst, index: idx }))
439
+ .filter(inst => inst.name && inst.name.trim());
440
+ const noiseInstrumentsFiltered = song.noiseInstruments
441
+ .map((inst, idx) => ({ ...inst, index: idx }))
442
+ .filter(inst => inst.name && inst.name.trim());
443
+ // Format wavetables as hex strings for readability
444
+ const wavetablesFormatted = song.wavetables.map((wave, idx) => ({
445
+ index: idx,
446
+ nibbles: wave,
447
+ hex: wave.map(n => n.toString(16).toUpperCase()).join(' ')
448
+ }));
449
+ const detailed = {
450
+ version: song.version,
451
+ metadata: {
452
+ name: song.name,
453
+ artist: song.artist,
454
+ comment: song.comment
455
+ },
456
+ tempo: {
457
+ ticksPerRow: song.initialTicksPerRow,
458
+ approximateBPM: Math.round(896 / song.initialTicksPerRow),
459
+ timerTempoEnabled: song.timerTempoEnabled,
460
+ timerTempoDivider: song.timerTempoDivider
461
+ },
462
+ instruments: {
463
+ duty: dutyInstrumentsFiltered.map(inst => ({
464
+ index: inst.index,
465
+ name: inst.name,
466
+ type: 'duty',
467
+ length: inst.length,
468
+ lengthEnabled: inst.lengthEnabled,
469
+ initialVolume: inst.initialVolume,
470
+ volumeSweep: {
471
+ direction: inst.volumeSweepDir === 0 ? 'increase' : 'decrease',
472
+ change: inst.volumeSweepChange
473
+ },
474
+ frequencySweep: {
475
+ time: inst.freqSweepTime,
476
+ enabled: inst.sweepEnabled === 1,
477
+ shift: inst.freqSweepShift
478
+ },
479
+ dutyCycle: inst.dutyCycle,
480
+ dutyCyclePercent: [12.5, 25, 50, 75][inst.dutyCycle] || 50,
481
+ subpatternEnabled: inst.subpatternEnabled,
482
+ hasSubpatternRows: inst.rows && inst.rows.length > 0
483
+ })),
484
+ wave: waveInstrumentsFiltered.map(inst => ({
485
+ index: inst.index,
486
+ name: inst.name,
487
+ type: 'wave',
488
+ length: inst.length,
489
+ lengthEnabled: inst.lengthEnabled,
490
+ volume: inst.volume,
491
+ volumePercent: [0, 100, 50, 25][inst.volume] || 100,
492
+ waveIndex: inst.waveIndex,
493
+ subpatternEnabled: inst.subpatternEnabled,
494
+ hasSubpatternRows: inst.rows && inst.rows.length > 0
495
+ })),
496
+ noise: noiseInstrumentsFiltered.map(inst => ({
497
+ index: inst.index,
498
+ name: inst.name,
499
+ type: 'noise',
500
+ length: inst.length,
501
+ lengthEnabled: inst.lengthEnabled,
502
+ initialVolume: inst.initialVolume,
503
+ volumeSweep: {
504
+ direction: inst.volumeSweepDir === 0 ? 'increase' : 'decrease',
505
+ change: inst.volumeSweepChange
506
+ },
507
+ noiseMode: inst.noiseMode,
508
+ noiseModeDescription: inst.noiseMode === 0 ? '15-bit' : inst.noiseMode === 1 ? '7-bit' : 'unknown',
509
+ subpatternEnabled: inst.subpatternEnabled,
510
+ hasSubpatternRows: inst.rows && inst.rows.length > 0
511
+ }))
512
+ },
513
+ wavetables: wavetablesFormatted,
514
+ patterns: patternsDetailed,
515
+ orders: {
516
+ duty1: song.orders.duty1,
517
+ duty2: song.orders.duty2,
518
+ wave: song.orders.wave,
519
+ noise: song.orders.noise,
520
+ maxLength: Math.max(song.orders.duty1.length, song.orders.duty2.length, song.orders.wave.length, song.orders.noise.length)
521
+ },
522
+ routines: song.routines.map((code, idx) => ({
523
+ index: idx,
524
+ code: code,
525
+ hasCode: code && code.length > 0
526
+ })).filter(r => r.hasCode),
527
+ statistics: {
528
+ totalPatterns: song.patterns.length,
529
+ totalInstruments: dutyInstrumentsFiltered.length + waveInstrumentsFiltered.length + noiseInstrumentsFiltered.length,
530
+ dutyInstruments: dutyInstrumentsFiltered.length,
531
+ waveInstruments: waveInstrumentsFiltered.length,
532
+ noiseInstruments: noiseInstrumentsFiltered.length,
533
+ wavetablesUsed: song.wavetables.filter((w, idx) => waveInstrumentsFiltered.some(inst => inst.waveIndex === idx)).length,
534
+ songLength: {
535
+ duty1: song.orders.duty1.length,
536
+ duty2: song.orders.duty2.length,
537
+ wave: song.orders.wave.length,
538
+ noise: song.orders.noise.length
539
+ }
540
+ }
541
+ };
542
+ return JSON.stringify(detailed, null, 2);
543
+ }
544
+ export default { parseUGE, readUGEFile, midiNoteToUGE, ugeNoteToString, getUGESummary, getUGEDetailedJSON };
545
+ //# sourceMappingURL=uge.reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uge.reader.js","sourceRoot":"","sources":["../../../src/import/uge/uge.reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * URL utilities for remote instrument imports.
3
+ * Handles URL detection, GitHub shorthand expansion, and validation.
4
+ */
5
+ /**
6
+ * Check if an import source is a remote URL.
7
+ */
8
+ export declare function isRemoteImport(source: string): boolean;
9
+ /**
10
+ * Check if an import source is a local file import.
11
+ */
12
+ export declare function isLocalImport(source: string): boolean;
13
+ /**
14
+ * Extract the file path from a local import.
15
+ * @example
16
+ * extractLocalPath('local:lib/common.ins') => 'lib/common.ins'
17
+ */
18
+ export declare function extractLocalPath(source: string): string;
19
+ /**
20
+ * Expand GitHub shorthand syntax to a full raw.githubusercontent.com URL.
21
+ * @example
22
+ * expandGitHubShorthand('github:user/repo/main/file.ins')
23
+ * => 'https://raw.githubusercontent.com/user/repo/main/file.ins'
24
+ */
25
+ export declare function expandGitHubShorthand(source: string): string;
26
+ /**
27
+ * Normalize a remote import URL.
28
+ * - Expands GitHub shorthand
29
+ * - Validates protocol
30
+ * - Returns the canonical URL
31
+ */
32
+ export declare function normalizeRemoteUrl(source: string): string;
33
+ /**
34
+ * Security options for remote imports.
35
+ */
36
+ export interface RemoteImportSecurityOptions {
37
+ /** Only allow HTTPS URLs (recommended for production) */
38
+ httpsOnly?: boolean;
39
+ /** Maximum file size in bytes (default: 1MB) */
40
+ maxFileSize?: number;
41
+ /** Request timeout in milliseconds (default: 10000ms) */
42
+ timeout?: number;
43
+ /** Allowed domains (empty array = all domains allowed) */
44
+ allowedDomains?: string[];
45
+ }
46
+ /**
47
+ * Validate a remote URL against security constraints.
48
+ */
49
+ export declare function validateRemoteUrl(url: string, options?: RemoteImportSecurityOptions): void;
50
+ //# sourceMappingURL=urlUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlUtils.d.ts","sourceRoot":"","sources":["../../src/import/urlUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAMtD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAazD;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,2BAAgC,GACxC,IAAI,CA+BN"}