reaper-osc 0.7.0 → 0.9.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 (54) hide show
  1. package/dist/Client/Client.d.ts +73 -0
  2. package/dist/Client/Client.js +405 -0
  3. package/dist/Client/Client.js.map +1 -0
  4. package/dist/Client/Commands.d.ts +553 -0
  5. package/dist/Client/Commands.js +358 -0
  6. package/dist/Client/Commands.js.map +1 -0
  7. package/dist/Client/Events.d.ts +536 -0
  8. package/dist/Client/Events.js +197 -0
  9. package/dist/Client/Events.js.map +1 -0
  10. package/dist/Config.d.ts +33 -0
  11. package/dist/Config.js +54 -0
  12. package/dist/Config.js.map +1 -0
  13. package/dist/Device.d.ts +77 -0
  14. package/dist/Device.js +130 -0
  15. package/dist/Device.js.map +1 -0
  16. package/dist/Fx.d.ts +79 -30
  17. package/dist/Fx.js +144 -64
  18. package/dist/Fx.js.map +1 -1
  19. package/dist/Marker.d.ts +76 -0
  20. package/dist/Marker.js +151 -0
  21. package/dist/Marker.js.map +1 -0
  22. package/dist/Notify.js +2 -1
  23. package/dist/Notify.js.map +1 -1
  24. package/dist/Reaper.d.ts +36 -30
  25. package/dist/Reaper.js +123 -172
  26. package/dist/Reaper.js.map +1 -1
  27. package/dist/Receive.d.ts +84 -0
  28. package/dist/Receive.js +227 -0
  29. package/dist/Receive.js.map +1 -0
  30. package/dist/Region.d.ts +87 -0
  31. package/dist/Region.js +177 -0
  32. package/dist/Region.js.map +1 -0
  33. package/dist/SelectedTrack.d.ts +149 -0
  34. package/dist/SelectedTrack.js +383 -0
  35. package/dist/SelectedTrack.js.map +1 -0
  36. package/dist/Send.d.ts +84 -0
  37. package/dist/Send.js +227 -0
  38. package/dist/Send.js.map +1 -0
  39. package/dist/Tracks.d.ts +38 -25
  40. package/dist/Tracks.js +159 -59
  41. package/dist/Tracks.js.map +1 -1
  42. package/dist/Transport.d.ts +40 -10
  43. package/dist/Transport.js +121 -47
  44. package/dist/Transport.js.map +1 -1
  45. package/dist/ViewPort.d.ts +85 -0
  46. package/dist/ViewPort.js +92 -0
  47. package/dist/ViewPort.js.map +1 -0
  48. package/dist/index.d.ts +11 -1
  49. package/dist/index.js +11 -1
  50. package/dist/index.js.map +1 -1
  51. package/package.json +8 -4
  52. package/dist/Handlers.d.ts +0 -62
  53. package/dist/Handlers.js +0 -157
  54. package/dist/Handlers.js.map +0 -1
@@ -0,0 +1,73 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * Stateless OSC client for communicating with Reaper
4
+ * @module
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ import { OscMessage } from '../Messages';
8
+ import { ReaperOscEvent } from './Events';
9
+ import { ReaperOscCommand } from './Commands';
10
+ import { ReaperConfiguration } from '../Config';
11
+ export declare function parseMessage(msg: OscMessage): ReaperOscEvent;
12
+ export interface ReaperOscClient {
13
+ on(event: 'message', listener: (event: ReaperOscEvent) => void): this;
14
+ on(event: 'rawMessage', listener: (message: OscMessage) => void): this;
15
+ once(event: 'message', listener: (event: ReaperOscEvent) => void): this;
16
+ once(event: 'rawMessage', listener: (message: OscMessage) => void): this;
17
+ off(event: 'message', listener: (event: ReaperOscEvent) => void): this;
18
+ off(event: 'rawMessage', listener: (message: OscMessage) => void): this;
19
+ emit(event: 'message', oscEvent: ReaperOscEvent): boolean;
20
+ emit(event: 'rawMessage', message: OscMessage): boolean;
21
+ }
22
+ /**
23
+ * A stateless OSC client for communicating with Reaper.
24
+ *
25
+ * Translates incoming OSC messages into strongly typed events, and accepts
26
+ * strongly typed commands for sending to Reaper. Does not maintain any state
27
+ * about track properties, transport, or FX — use {@link Reaper} for that.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const client = new ReaperOscClient();
32
+ * await client.start();
33
+ *
34
+ * // Receive typed events
35
+ * client.on('message', event => {
36
+ * switch (event.type) {
37
+ * case 'track:mute':
38
+ * console.log(`Track ${event.trackNumber} muted: ${event.muted}`);
39
+ * break;
40
+ * case 'transport:play':
41
+ * console.log(`Playing: ${event.playing}`);
42
+ * break;
43
+ * }
44
+ * });
45
+ *
46
+ * // Send typed commands
47
+ * client.send({ type: 'transport:play' });
48
+ * client.send({ type: 'track:mute', trackNumber: 3, muted: true });
49
+ * ```
50
+ */
51
+ export declare class ReaperOscClient extends EventEmitter {
52
+ private readonly _osc;
53
+ private readonly _log;
54
+ private _isReady;
55
+ constructor(config?: ReaperConfiguration);
56
+ /** Indicates whether OSC is ready to send and receive messages */
57
+ get isReady(): boolean;
58
+ /**
59
+ * Send a typed command to Reaper.
60
+ * @param command The command to send
61
+ */
62
+ send(command: ReaperOscCommand): void;
63
+ /**
64
+ * Send a raw OSC message to Reaper.
65
+ * @param message The OSC message to send
66
+ */
67
+ sendRaw(message: OscMessage): void;
68
+ /** Open the OSC port and start listening for messages */
69
+ start(): Promise<void>;
70
+ /** Stop listening for OSC messages */
71
+ stop(): Promise<void>;
72
+ private initOsc;
73
+ }
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.ReaperOscClient = exports.parseMessage = void 0;
23
+ /**
24
+ * Stateless OSC client for communicating with Reaper
25
+ * @module
26
+ */
27
+ const events_1 = require("events");
28
+ const osc = __importStar(require("osc"));
29
+ const Messages_1 = require("../Messages");
30
+ const Events_1 = require("./Events");
31
+ const Commands_1 = require("./Commands");
32
+ const Config_1 = require("../Config");
33
+ // --- Value extractors ---
34
+ function boolFrom(msg) {
35
+ var _a;
36
+ return ((_a = msg.args[0]) === null || _a === void 0 ? void 0 : _a.value) === 1;
37
+ }
38
+ function floatFrom(msg) {
39
+ var _a;
40
+ return (_a = msg.args[0]) === null || _a === void 0 ? void 0 : _a.value;
41
+ }
42
+ function intFrom(msg) {
43
+ var _a;
44
+ return (_a = msg.args[0]) === null || _a === void 0 ? void 0 : _a.value;
45
+ }
46
+ function stringFrom(msg) {
47
+ var _a;
48
+ return (_a = msg.args[0]) === null || _a === void 0 ? void 0 : _a.value;
49
+ }
50
+ // --- Exact address parsers (global + transport) ---
51
+ const EXACT_PARSERS = new Map([
52
+ // Global
53
+ ['/click', msg => Events_1.MetronomeEvent(boolFrom(msg))],
54
+ ['/autorecarm', msg => Events_1.AutoRecordArmEvent(boolFrom(msg))],
55
+ ['/anysolo', msg => Events_1.AnySoloEvent(boolFrom(msg))],
56
+ // Transport
57
+ ['/play', msg => Events_1.PlayEvent(boolFrom(msg))],
58
+ ['/stop', msg => Events_1.StopEvent(boolFrom(msg))],
59
+ ['/pause', msg => Events_1.PauseEvent(boolFrom(msg))],
60
+ ['/record', msg => Events_1.RecordEvent(boolFrom(msg))],
61
+ ['/rewind', msg => Events_1.RewindEvent(boolFrom(msg))],
62
+ ['/forward', msg => Events_1.FastForwardEvent(boolFrom(msg))],
63
+ ['/repeat', msg => Events_1.RepeatEvent(boolFrom(msg))],
64
+ ['/time', msg => Events_1.TimeChanged(floatFrom(msg))],
65
+ ['/beat/str', msg => Events_1.BeatChanged(stringFrom(msg))],
66
+ ['/frames/str', msg => Events_1.FramesChanged(stringFrom(msg))],
67
+ ['/loop/start/time', msg => Events_1.LoopStartChanged(floatFrom(msg))],
68
+ ['/loop/end/time', msg => Events_1.LoopEndChanged(floatFrom(msg))],
69
+ ['/bymarker', msg => Events_1.RewindByMarkerEvent(boolFrom(msg))],
70
+ ['/editloop', msg => Events_1.SetLoopEvent(boolFrom(msg))],
71
+ // Last marker
72
+ ['/lastmarker/name', msg => Events_1.LastMarkerNameChanged(stringFrom(msg))],
73
+ ['/lastmarker/number/str', msg => Events_1.LastMarkerNumberChanged(stringFrom(msg))],
74
+ ['/lastmarker/time', msg => Events_1.LastMarkerTimeChanged(floatFrom(msg))],
75
+ // Last region
76
+ ['/lastregion/name', msg => Events_1.LastRegionNameChanged(stringFrom(msg))],
77
+ ['/lastregion/number/str', msg => Events_1.LastRegionNumberChanged(stringFrom(msg))],
78
+ ['/lastregion/time', msg => Events_1.LastRegionTimeChanged(floatFrom(msg))],
79
+ ['/lastregion/length', msg => Events_1.LastRegionLengthChanged(floatFrom(msg))],
80
+ ]);
81
+ const TRACK_PARSERS = new Map([
82
+ ['mute', (n, m) => Events_1.TrackMuteEvent(n, boolFrom(m))],
83
+ ['solo', (n, m) => Events_1.TrackSoloEvent(n, boolFrom(m))],
84
+ ['recarm', (n, m) => Events_1.TrackRecordArmEvent(n, boolFrom(m))],
85
+ ['select', (n, m) => Events_1.TrackSelectEvent(n, boolFrom(m))],
86
+ ['name', (n, m) => Events_1.TrackNameChanged(n, stringFrom(m))],
87
+ ['pan', (n, m) => Events_1.TrackPanChanged(n, floatFrom(m))],
88
+ ['pan2', (n, m) => Events_1.TrackPan2Changed(n, floatFrom(m))],
89
+ ['panmode', (n, m) => Events_1.TrackPanModeChanged(n, stringFrom(m))],
90
+ ['volume', (n, m) => Events_1.TrackVolumeChanged(n, floatFrom(m))],
91
+ ['volume/db', (n, m) => Events_1.TrackVolumeDbChanged(n, floatFrom(m))],
92
+ ['vu', (n, m) => Events_1.TrackVuChanged(n, floatFrom(m))],
93
+ ['vu/L', (n, m) => Events_1.TrackVuLeftChanged(n, floatFrom(m))],
94
+ ['vu/R', (n, m) => Events_1.TrackVuRightChanged(n, floatFrom(m))],
95
+ ['monitor', (n, m) => Events_1.TrackMonitoringModeChanged(n, intFrom(m))],
96
+ ]);
97
+ const TRACK_FX_PARSERS = new Map([
98
+ // bypass is inverted: Reaper sends 0 when bypassed
99
+ ['name', (t, f, m) => Events_1.TrackFxNameChanged(t, f, stringFrom(m))],
100
+ ['bypass', (t, f, m) => Events_1.TrackFxBypassEvent(t, f, !boolFrom(m))],
101
+ ['openui', (t, f, m) => Events_1.TrackFxOpenUiEvent(t, f, boolFrom(m))],
102
+ ['preset', (t, f, m) => Events_1.TrackFxPresetChanged(t, f, stringFrom(m))],
103
+ ]);
104
+ const TRACK_SEND_PARSERS = new Map([
105
+ ['name', (t, s, m) => Events_1.TrackSendNameChanged(t, s, stringFrom(m))],
106
+ ['volume', (t, s, m) => Events_1.TrackSendVolumeChanged(t, s, floatFrom(m))],
107
+ ['volume/str', (t, s, m) => Events_1.TrackSendVolumeStrChanged(t, s, stringFrom(m))],
108
+ ['pan', (t, s, m) => Events_1.TrackSendPanChanged(t, s, floatFrom(m))],
109
+ ['pan/str', (t, s, m) => Events_1.TrackSendPanStrChanged(t, s, stringFrom(m))],
110
+ ]);
111
+ // --- Track receive suffix parsers (for /track/N/recv/M/suffix) ---
112
+ const TRACK_RECV_PARSERS = new Map([
113
+ ['name', (t, r, m) => Events_1.TrackReceiveNameChanged(t, r, stringFrom(m))],
114
+ ['volume', (t, r, m) => Events_1.TrackReceiveVolumeChanged(t, r, floatFrom(m))],
115
+ ['volume/str', (t, r, m) => Events_1.TrackReceiveVolumeStrChanged(t, r, stringFrom(m))],
116
+ ['pan', (t, r, m) => Events_1.TrackReceivePanChanged(t, r, floatFrom(m))],
117
+ ['pan/str', (t, r, m) => Events_1.TrackReceivePanStrChanged(t, r, stringFrom(m))],
118
+ ]);
119
+ const SELECTED_TRACK_SEND_PARSERS = new Map([
120
+ ['name', (s, m) => Events_1.SelectedTrackSendNameChanged(s, stringFrom(m))],
121
+ ['volume', (s, m) => Events_1.SelectedTrackSendVolumeChanged(s, floatFrom(m))],
122
+ ['volume/str', (s, m) => Events_1.SelectedTrackSendVolumeStrChanged(s, stringFrom(m))],
123
+ ['pan', (s, m) => Events_1.SelectedTrackSendPanChanged(s, floatFrom(m))],
124
+ ['pan/str', (s, m) => Events_1.SelectedTrackSendPanStrChanged(s, stringFrom(m))],
125
+ ]);
126
+ // --- Selected track receive suffix parsers (for /track/recv/M/suffix) ---
127
+ const SELECTED_TRACK_RECV_PARSERS = new Map([
128
+ ['name', (r, m) => Events_1.SelectedTrackReceiveNameChanged(r, stringFrom(m))],
129
+ ['volume', (r, m) => Events_1.SelectedTrackReceiveVolumeChanged(r, floatFrom(m))],
130
+ ['volume/str', (r, m) => Events_1.SelectedTrackReceiveVolumeStrChanged(r, stringFrom(m))],
131
+ ['pan', (r, m) => Events_1.SelectedTrackReceivePanChanged(r, floatFrom(m))],
132
+ ['pan/str', (r, m) => Events_1.SelectedTrackReceivePanStrChanged(r, stringFrom(m))],
133
+ ]);
134
+ const SELECTED_TRACK_PARSERS = new Map([
135
+ ['mute', m => Events_1.SelectedTrackMuteEvent(boolFrom(m))],
136
+ ['solo', m => Events_1.SelectedTrackSoloEvent(boolFrom(m))],
137
+ ['recarm', m => Events_1.SelectedTrackRecordArmEvent(boolFrom(m))],
138
+ ['select', m => Events_1.SelectedTrackSelectEvent(boolFrom(m))],
139
+ ['name', m => Events_1.SelectedTrackNameChanged(stringFrom(m))],
140
+ ['pan', m => Events_1.SelectedTrackPanChanged(floatFrom(m))],
141
+ ['pan2', m => Events_1.SelectedTrackPan2Changed(floatFrom(m))],
142
+ ['panmode', m => Events_1.SelectedTrackPanModeChanged(stringFrom(m))],
143
+ ['volume', m => Events_1.SelectedTrackVolumeChanged(floatFrom(m))],
144
+ ['volume/db', m => Events_1.SelectedTrackVolumeDbChanged(floatFrom(m))],
145
+ ['vu', m => Events_1.SelectedTrackVuChanged(floatFrom(m))],
146
+ ['vu/L', m => Events_1.SelectedTrackVuLeftChanged(floatFrom(m))],
147
+ ['vu/R', m => Events_1.SelectedTrackVuRightChanged(floatFrom(m))],
148
+ ['monitor', m => Events_1.SelectedTrackMonitoringModeChanged(intFrom(m))],
149
+ ]);
150
+ const SELECTED_TRACK_FX_PARSERS = new Map([
151
+ ['name', (f, m) => Events_1.SelectedTrackFxNameChanged(f, stringFrom(m))],
152
+ ['bypass', (f, m) => Events_1.SelectedTrackFxBypassEvent(f, !boolFrom(m))],
153
+ ['openui', (f, m) => Events_1.SelectedTrackFxOpenUiEvent(f, boolFrom(m))],
154
+ ['preset', (f, m) => Events_1.SelectedTrackFxPresetChanged(f, stringFrom(m))],
155
+ ]);
156
+ const SELECTED_FX_PARSERS = new Map([
157
+ ['name', m => Events_1.SelectedFxNameChanged(stringFrom(m))],
158
+ ['bypass', m => Events_1.SelectedFxBypassEvent(!boolFrom(m))],
159
+ ['openui', m => Events_1.SelectedFxOpenUiEvent(boolFrom(m))],
160
+ ['preset', m => Events_1.SelectedFxPresetChanged(stringFrom(m))],
161
+ ]);
162
+ const MARKER_PARSERS = new Map([
163
+ ['name', (n, m) => Events_1.MarkerNameChanged(n, stringFrom(m))],
164
+ ['number/str', (n, m) => Events_1.MarkerNumberChanged(n, stringFrom(m))],
165
+ ['time', (n, m) => Events_1.MarkerTimeChanged(n, floatFrom(m))],
166
+ ]);
167
+ const REGION_PARSERS = new Map([
168
+ ['name', (n, m) => Events_1.RegionNameChanged(n, stringFrom(m))],
169
+ ['number/str', (n, m) => Events_1.RegionNumberChanged(n, stringFrom(m))],
170
+ ['time', (n, m) => Events_1.RegionTimeChanged(n, floatFrom(m))],
171
+ ['length', (n, m) => Events_1.RegionLengthChanged(n, floatFrom(m))],
172
+ ]);
173
+ // --- Message parsing ---
174
+ function parseMarkerMessage(msg) {
175
+ const parts = msg.addressParts;
176
+ const slotIndex = parseInt(parts[1]);
177
+ if (isNaN(slotIndex))
178
+ return null;
179
+ const suffix = parts.slice(2).join('/');
180
+ const parser = MARKER_PARSERS.get(suffix);
181
+ return parser ? parser(slotIndex, msg) : null;
182
+ }
183
+ function parseRegionMessage(msg) {
184
+ const parts = msg.addressParts;
185
+ const slotIndex = parseInt(parts[1]);
186
+ if (isNaN(slotIndex))
187
+ return null;
188
+ const suffix = parts.slice(2).join('/');
189
+ const parser = REGION_PARSERS.get(suffix);
190
+ return parser ? parser(slotIndex, msg) : null;
191
+ }
192
+ function parseTrackMessage(msg) {
193
+ const parts = msg.addressParts;
194
+ const trackNumber = parseInt(parts[1]);
195
+ if (isNaN(trackNumber)) {
196
+ // Selected track sends/receives: /track/send/N/suffix, /track/recv/N/suffix
197
+ if (parts[1] === 'send' || parts[1] === 'recv') {
198
+ const sendNumber = parseInt(parts[2]);
199
+ if (isNaN(sendNumber))
200
+ return null;
201
+ const suffix = parts.slice(3).join('/');
202
+ const parsers = parts[1] === 'send' ? SELECTED_TRACK_SEND_PARSERS : SELECTED_TRACK_RECV_PARSERS;
203
+ const parser = parsers.get(suffix);
204
+ return parser ? parser(sendNumber, msg) : null;
205
+ }
206
+ // Selected track property: /track/mute, /track/name, etc.
207
+ const suffix = parts.slice(1).join('/');
208
+ const parser = SELECTED_TRACK_PARSERS.get(suffix);
209
+ return parser ? parser(msg) : null;
210
+ }
211
+ // Track FX: /track/N/fx/M/property
212
+ if (parts[2] === 'fx') {
213
+ const fxNumber = parseInt(parts[3]);
214
+ if (isNaN(fxNumber))
215
+ return null;
216
+ const suffix = parts.slice(4).join('/');
217
+ const parser = TRACK_FX_PARSERS.get(suffix);
218
+ return parser ? parser(trackNumber, fxNumber, msg) : null;
219
+ }
220
+ // Track sends/receives: /track/N/send/M/suffix, /track/N/recv/M/suffix
221
+ if (parts[2] === 'send' || parts[2] === 'recv') {
222
+ const sendNumber = parseInt(parts[3]);
223
+ if (isNaN(sendNumber))
224
+ return null;
225
+ const suffix = parts.slice(4).join('/');
226
+ const parsers = parts[2] === 'send' ? TRACK_SEND_PARSERS : TRACK_RECV_PARSERS;
227
+ const parser = parsers.get(suffix);
228
+ return parser ? parser(trackNumber, sendNumber, msg) : null;
229
+ }
230
+ // Track property: /track/N/property
231
+ const suffix = parts.slice(2).join('/');
232
+ const parser = TRACK_PARSERS.get(suffix);
233
+ return parser ? parser(trackNumber, msg) : null;
234
+ }
235
+ function parseFxMessage(msg) {
236
+ const parts = msg.addressParts;
237
+ const fxNumber = parseInt(parts[1]);
238
+ if (isNaN(fxNumber)) {
239
+ // Selected FX: /fx/name, /fx/bypass, etc.
240
+ const suffix = parts.slice(1).join('/');
241
+ const parser = SELECTED_FX_PARSERS.get(suffix);
242
+ return parser ? parser(msg) : null;
243
+ }
244
+ // Indexed FX on selected track: /fx/M/name, /fx/M/bypass, etc.
245
+ const suffix = parts.slice(2).join('/');
246
+ const parser = SELECTED_TRACK_FX_PARSERS.get(suffix);
247
+ return parser ? parser(fxNumber, msg) : null;
248
+ }
249
+ function parseMessage(msg) {
250
+ // O(1) exact match for global + transport
251
+ const exact = EXACT_PARSERS.get(msg.address);
252
+ if (exact)
253
+ return exact(msg);
254
+ // Prefix-based routing
255
+ const firstPart = msg.addressParts[0];
256
+ if (firstPart === 'track') {
257
+ const event = parseTrackMessage(msg);
258
+ if (event)
259
+ return event;
260
+ }
261
+ if (firstPart === 'fx') {
262
+ const event = parseFxMessage(msg);
263
+ if (event)
264
+ return event;
265
+ }
266
+ if (firstPart === 'marker') {
267
+ const event = parseMarkerMessage(msg);
268
+ if (event)
269
+ return event;
270
+ }
271
+ if (firstPart === 'region') {
272
+ const event = parseRegionMessage(msg);
273
+ if (event)
274
+ return event;
275
+ }
276
+ return { type: 'unknown', message: msg };
277
+ }
278
+ exports.parseMessage = parseMessage;
279
+ /**
280
+ * A stateless OSC client for communicating with Reaper.
281
+ *
282
+ * Translates incoming OSC messages into strongly typed events, and accepts
283
+ * strongly typed commands for sending to Reaper. Does not maintain any state
284
+ * about track properties, transport, or FX — use {@link Reaper} for that.
285
+ *
286
+ * @example
287
+ * ```typescript
288
+ * const client = new ReaperOscClient();
289
+ * await client.start();
290
+ *
291
+ * // Receive typed events
292
+ * client.on('message', event => {
293
+ * switch (event.type) {
294
+ * case 'track:mute':
295
+ * console.log(`Track ${event.trackNumber} muted: ${event.muted}`);
296
+ * break;
297
+ * case 'transport:play':
298
+ * console.log(`Playing: ${event.playing}`);
299
+ * break;
300
+ * }
301
+ * });
302
+ *
303
+ * // Send typed commands
304
+ * client.send({ type: 'transport:play' });
305
+ * client.send({ type: 'track:mute', trackNumber: 3, muted: true });
306
+ * ```
307
+ */
308
+ class ReaperOscClient extends events_1.EventEmitter {
309
+ constructor(config = new Config_1.ReaperConfiguration()) {
310
+ super();
311
+ this._isReady = false;
312
+ this._log = config.log;
313
+ this._osc = new osc.UDPPort({
314
+ localAddress: config.localAddress,
315
+ localPort: config.localPort,
316
+ remoteAddress: config.remoteAddress,
317
+ remotePort: config.remotePort,
318
+ broadcast: true,
319
+ metadata: true,
320
+ });
321
+ this.initOsc();
322
+ }
323
+ /** Indicates whether OSC is ready to send and receive messages */
324
+ get isReady() {
325
+ return this._isReady;
326
+ }
327
+ /**
328
+ * Send a typed command to Reaper.
329
+ * @param command The command to send
330
+ */
331
+ send(command) {
332
+ this.sendRaw(Commands_1.commandToOscMessage(command));
333
+ }
334
+ /**
335
+ * Send a raw OSC message to Reaper.
336
+ * @param message The OSC message to send
337
+ */
338
+ sendRaw(message) {
339
+ if (!this._isReady) {
340
+ throw new Error("Can't send while OSC is not ready");
341
+ }
342
+ this._osc.send(message);
343
+ this._log('debug', 'OSC Message sent', message);
344
+ }
345
+ /** Open the OSC port and start listening for messages */
346
+ async start() {
347
+ if (this._isReady) {
348
+ return;
349
+ }
350
+ let errorCallback;
351
+ let readyCallback;
352
+ const promise = new Promise((resolve, reject) => {
353
+ errorCallback = (err) => {
354
+ this._log('debug', 'Error opening OSC connection', err);
355
+ reject(err);
356
+ };
357
+ readyCallback = () => {
358
+ this._log('debug', 'OSC listener ready');
359
+ this._isReady = true;
360
+ resolve();
361
+ };
362
+ this._osc.once('ready', readyCallback);
363
+ this._osc.once('error', errorCallback);
364
+ });
365
+ const removeListeners = () => {
366
+ this._osc.removeListener('ready', readyCallback);
367
+ this._osc.removeListener('error', errorCallback);
368
+ };
369
+ this._osc.open();
370
+ try {
371
+ await promise;
372
+ }
373
+ finally {
374
+ removeListeners();
375
+ }
376
+ }
377
+ /** Stop listening for OSC messages */
378
+ async stop() {
379
+ if (!this._isReady) {
380
+ return;
381
+ }
382
+ const promise = new Promise(resolve => {
383
+ this._osc.once('close', () => {
384
+ this._log('debug', 'OSC listener stopped');
385
+ resolve();
386
+ });
387
+ });
388
+ this._isReady = false;
389
+ this._osc.close();
390
+ return promise;
391
+ }
392
+ initOsc() {
393
+ this._osc.on('error', (err) => {
394
+ this._log('error', 'OSC error received', err);
395
+ });
396
+ this._osc.on('message', (rawMessage) => {
397
+ const message = new Messages_1.OscMessage(rawMessage.address, rawMessage.args);
398
+ const event = parseMessage(message);
399
+ this.emit('message', event);
400
+ this.emit('rawMessage', message);
401
+ });
402
+ }
403
+ }
404
+ exports.ReaperOscClient = ReaperOscClient;
405
+ //# sourceMappingURL=Client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/Client/Client.ts"],"names":[],"mappings":"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"}