stagelinq 1.0.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.
- package/.gitattributes +2 -0
- package/.prettierignore +7 -0
- package/.prettierrc.js +10 -0
- package/.vscode/launch.json +40 -0
- package/.vscode/tasks.json +24 -0
- package/Databases/Databases.ts +69 -0
- package/Databases/DbConnection.ts +42 -0
- package/Databases/index.ts +2 -0
- package/LICENSE +674 -0
- package/LogEmitter/index.ts +51 -0
- package/README.md +83 -0
- package/StageLinq/index.ts +58 -0
- package/TODO.md +5 -0
- package/albumArt/index.ts +2 -0
- package/albumArt/maybeDownloadFiles.ts +34 -0
- package/cli/index.ts +142 -0
- package/devices/Player.ts +182 -0
- package/devices/PlayerMessageQueue.ts +62 -0
- package/index.ts +5 -0
- package/network/NetworkDevice.ts +287 -0
- package/network/StageLinqDevices.ts +215 -0
- package/network/StageLinqListener.ts +50 -0
- package/network/announce.ts +133 -0
- package/network/index.ts +4 -0
- package/package.json +31 -0
- package/services/FileTransfer.ts +298 -0
- package/services/Service.ts +144 -0
- package/services/StateMap.ts +170 -0
- package/services/index.ts +3 -0
- package/stagelinq.code-workspace +16 -0
- package/tsconfig.json +13 -0
- package/types/common.ts +240 -0
- package/types/database.ts +50 -0
- package/types/index.ts +53 -0
- package/types/player.ts +41 -0
- package/types/tokens.ts +39 -0
- package/utils/Context.ts +45 -0
- package/utils/ReadContext.ts +114 -0
- package/utils/WriteContext.ts +105 -0
- package/utils/getTempFilePath.ts +23 -0
- package/utils/hex.ts +62 -0
- package/utils/index.ts +6 -0
- package/utils/log.ts +0 -0
- package/utils/sleep.ts +3 -0
- package/utils/tcp.ts +17 -0
package/types/common.ts
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
export const ANNOUNCEMENT_INTERVAL = 1000; // in ms
|
|
2
|
+
export const LISTEN_PORT = 51337;
|
|
3
|
+
export const LISTEN_TIMEOUT = 5000; // in ms
|
|
4
|
+
export const MESSAGE_TIMEOUT = 3000; // in ms
|
|
5
|
+
export const CONNECT_TIMEOUT = 5000; // in ms
|
|
6
|
+
export const DOWNLOAD_TIMEOUT = 60000; // in ms
|
|
7
|
+
export const DISCOVERY_MESSAGE_MARKER = 'airD';
|
|
8
|
+
|
|
9
|
+
export enum Action {
|
|
10
|
+
Login = 'DISCOVERER_HOWDY_',
|
|
11
|
+
Logout = 'DISCOVERER_EXIT_',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export enum MessageId {
|
|
15
|
+
ServicesAnnouncement = 0x0,
|
|
16
|
+
TimeStamp = 0x1,
|
|
17
|
+
ServicesRequest = 0x2,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export enum StageLinqValue {
|
|
21
|
+
ClientLibrarianDevicesControllerCurrentDevice = '/Client/Librarian/DevicesController/CurrentDevice',
|
|
22
|
+
ClientLibrarianDevicesControllerHasSDCardConnected = '/Client/Librarian/DevicesController/HasSDCardConnected',
|
|
23
|
+
ClientLibrarianDevicesControllerHasUsbDeviceConnected = '/Client/Librarian/DevicesController/HasUsbDeviceConnected',
|
|
24
|
+
ClientPreferencesLayerB = '/Client/Preferences/LayerB',
|
|
25
|
+
ClientPreferencesPlayer = '/Client/Preferences/Player',
|
|
26
|
+
ClientPreferencesProfileApplicationPlayerColor1 = '/Client/Preferences/Profile/Application/PlayerColor1',
|
|
27
|
+
ClientPreferencesProfileApplicationPlayerColor1A = '/Client/Preferences/Profile/Application/PlayerColor1A',
|
|
28
|
+
ClientPreferencesProfileApplicationPlayerColor1B = '/Client/Preferences/Profile/Application/PlayerColor1B',
|
|
29
|
+
ClientPreferencesProfileApplicationPlayerColor2 = '/Client/Preferences/Profile/Application/PlayerColor2',
|
|
30
|
+
ClientPreferencesProfileApplicationPlayerColor2A = '/Client/Preferences/Profile/Application/PlayerColor2A',
|
|
31
|
+
ClientPreferencesProfileApplicationPlayerColor2B = '/Client/Preferences/Profile/Application/PlayerColor2B',
|
|
32
|
+
ClientPreferencesProfileApplicationPlayerColor3 = '/Client/Preferences/Profile/Application/PlayerColor3',
|
|
33
|
+
ClientPreferencesProfileApplicationPlayerColor3A = '/Client/Preferences/Profile/Application/PlayerColor3A',
|
|
34
|
+
ClientPreferencesProfileApplicationPlayerColor3B = '/Client/Preferences/Profile/Application/PlayerColor3B',
|
|
35
|
+
ClientPreferencesProfileApplicationPlayerColor4 = '/Client/Preferences/Profile/Application/PlayerColor4',
|
|
36
|
+
ClientPreferencesProfileApplicationPlayerColor4A = '/Client/Preferences/Profile/Application/PlayerColor4A',
|
|
37
|
+
ClientPreferencesProfileApplicationPlayerColor4B = '/Client/Preferences/Profile/Application/PlayerColor4B',
|
|
38
|
+
ClientPreferencesProfileApplicationSyncMode = '/Client/Preferences/Profile/Application/SyncMode',
|
|
39
|
+
EngineDeck1CurrentBPM = '/Engine/Deck1/CurrentBPM',
|
|
40
|
+
EngineDeck1ExternalMixerVolume = '/Engine/Deck1/ExternalMixerVolume',
|
|
41
|
+
EngineDeck1ExternalScratchWheelTouch = '/Engine/Deck1/ExternalScratchWheelTouch',
|
|
42
|
+
EngineDeck1PadsView = '/Engine/Deck1/Pads/View',
|
|
43
|
+
EngineDeck1Play = '/Engine/Deck1/Play',
|
|
44
|
+
EngineDeck1PlayState = '/Engine/Deck1/PlayState',
|
|
45
|
+
EngineDeck1PlayStatePath = '/Engine/Deck1/PlayStatePath',
|
|
46
|
+
EngineDeck1Speed = '/Engine/Deck1/Speed',
|
|
47
|
+
EngineDeck1SpeedNeutral = '/Engine/Deck1/SpeedNeutral',
|
|
48
|
+
EngineDeck1SpeedOffsetDown = '/Engine/Deck1/SpeedOffsetDown',
|
|
49
|
+
EngineDeck1SpeedOffsetUp = '/Engine/Deck1/SpeedOffsetUp',
|
|
50
|
+
EngineDeck1SpeedRange = '/Engine/Deck1/SpeedRange',
|
|
51
|
+
EngineDeck1SpeedState = '/Engine/Deck1/SpeedState',
|
|
52
|
+
EngineDeck1SyncMode = '/Engine/Deck1/SyncMode',
|
|
53
|
+
EngineDeck1TrackArtistName = '/Engine/Deck1/Track/ArtistName',
|
|
54
|
+
EngineDeck1TrackBleep = '/Engine/Deck1/Track/Bleep',
|
|
55
|
+
EngineDeck1TrackCuePosition = '/Engine/Deck1/Track/CuePosition',
|
|
56
|
+
EngineDeck1TrackCurrentBPM = '/Engine/Deck1/Track/CurrentBPM',
|
|
57
|
+
EngineDeck1TrackCurrentKeyIndex = '/Engine/Deck1/Track/CurrentKeyIndex',
|
|
58
|
+
EngineDeck1TrackCurrentLoopInPosition = '/Engine/Deck1/Track/CurrentLoopInPosition',
|
|
59
|
+
EngineDeck1TrackCurrentLoopOutPosition = '/Engine/Deck1/Track/CurrentLoopOutPosition',
|
|
60
|
+
EngineDeck1TrackCurrentLoopSizeInBeats = '/Engine/Deck1/Track/CurrentLoopSizeInBeats',
|
|
61
|
+
EngineDeck1TrackKeyLock = '/Engine/Deck1/Track/KeyLock',
|
|
62
|
+
EngineDeck1TrackLoopEnableState = '/Engine/Deck1/Track/LoopEnableState',
|
|
63
|
+
EngineDeck1TrackLoopQuickLoop1 = '/Engine/Deck1/Track/Loop/QuickLoop1',
|
|
64
|
+
EngineDeck1TrackLoopQuickLoop2 = '/Engine/Deck1/Track/Loop/QuickLoop2',
|
|
65
|
+
EngineDeck1TrackLoopQuickLoop3 = '/Engine/Deck1/Track/Loop/QuickLoop3',
|
|
66
|
+
EngineDeck1TrackLoopQuickLoop4 = '/Engine/Deck1/Track/Loop/QuickLoop4',
|
|
67
|
+
EngineDeck1TrackLoopQuickLoop5 = '/Engine/Deck1/Track/Loop/QuickLoop5',
|
|
68
|
+
EngineDeck1TrackLoopQuickLoop6 = '/Engine/Deck1/Track/Loop/QuickLoop6',
|
|
69
|
+
EngineDeck1TrackLoopQuickLoop7 = '/Engine/Deck1/Track/Loop/QuickLoop7',
|
|
70
|
+
EngineDeck1TrackLoopQuickLoop8 = '/Engine/Deck1/Track/Loop/QuickLoop8',
|
|
71
|
+
EngineDeck1TrackPlayPauseLEDState = '/Engine/Deck1/Track/PlayPauseLEDState',
|
|
72
|
+
EngineDeck1TrackSampleRate = '/Engine/Deck1/Track/SampleRate',
|
|
73
|
+
EngineDeck1TrackSongAnalyzed = '/Engine/Deck1/Track/SongAnalyzed',
|
|
74
|
+
EngineDeck1TrackSongLoaded = '/Engine/Deck1/Track/SongLoaded',
|
|
75
|
+
EngineDeck1TrackSongName = '/Engine/Deck1/Track/SongName',
|
|
76
|
+
EngineDeck1TrackSoundSwitchGUID = '/Engine/Deck1/Track/SoundSwitchGuid',
|
|
77
|
+
EngineDeck1TrackTrackBytes = '/Engine/Deck1/Track/TrackBytes',
|
|
78
|
+
EngineDeck1TrackTrackData = '/Engine/Deck1/Track/TrackData',
|
|
79
|
+
EngineDeck1TrackTrackLength = '/Engine/Deck1/Track/TrackLength',
|
|
80
|
+
EngineDeck1TrackTrackName = '/Engine/Deck1/Track/TrackName',
|
|
81
|
+
EngineDeck1TrackTrackNetworkPath = '/Engine/Deck1/Track/TrackNetworkPath',
|
|
82
|
+
EngineDeck1TrackTrackURI = '/Engine/Deck1/Track/TrackUri',
|
|
83
|
+
EngineDeck1TrackTrackWasPlayed = '/Engine/Deck1/Track/TrackWasPlayed',
|
|
84
|
+
EngineDeck2CurrentBPM = '/Engine/Deck2/CurrentBPM',
|
|
85
|
+
EngineDeck2ExternalMixerVolume = '/Engine/Deck2/ExternalMixerVolume',
|
|
86
|
+
EngineDeck2ExternalScratchWheelTouch = '/Engine/Deck2/ExternalScratchWheelTouch',
|
|
87
|
+
EngineDeck2PadsView = '/Engine/Deck2/Pads/View',
|
|
88
|
+
EngineDeck2Play = '/Engine/Deck2/Play',
|
|
89
|
+
EngineDeck2PlayState = '/Engine/Deck2/PlayState',
|
|
90
|
+
EngineDeck2PlayStatePath = '/Engine/Deck2/PlayStatePath',
|
|
91
|
+
EngineDeck2Speed = '/Engine/Deck2/Speed',
|
|
92
|
+
EngineDeck2SpeedNeutral = '/Engine/Deck2/SpeedNeutral',
|
|
93
|
+
EngineDeck2SpeedOffsetDown = '/Engine/Deck2/SpeedOffsetDown',
|
|
94
|
+
EngineDeck2SpeedOffsetUp = '/Engine/Deck2/SpeedOffsetUp',
|
|
95
|
+
EngineDeck2SpeedRange = '/Engine/Deck2/SpeedRange',
|
|
96
|
+
EngineDeck2SpeedState = '/Engine/Deck2/SpeedState',
|
|
97
|
+
EngineDeck2SyncMode = '/Engine/Deck2/SyncMode',
|
|
98
|
+
EngineDeck2TrackArtistName = '/Engine/Deck2/Track/ArtistName',
|
|
99
|
+
EngineDeck2TrackBleep = '/Engine/Deck2/Track/Bleep',
|
|
100
|
+
EngineDeck2TrackCuePosition = '/Engine/Deck2/Track/CuePosition',
|
|
101
|
+
EngineDeck2TrackCurrentBPM = '/Engine/Deck2/Track/CurrentBPM',
|
|
102
|
+
EngineDeck2TrackCurrentKeyIndex = '/Engine/Deck2/Track/CurrentKeyIndex',
|
|
103
|
+
EngineDeck2TrackCurrentLoopInPosition = '/Engine/Deck2/Track/CurrentLoopInPosition',
|
|
104
|
+
EngineDeck2TrackCurrentLoopOutPosition = '/Engine/Deck2/Track/CurrentLoopOutPosition',
|
|
105
|
+
EngineDeck2TrackCurrentLoopSizeInBeats = '/Engine/Deck2/Track/CurrentLoopSizeInBeats',
|
|
106
|
+
EngineDeck2TrackKeyLock = '/Engine/Deck2/Track/KeyLock',
|
|
107
|
+
EngineDeck2TrackLoopEnableState = '/Engine/Deck2/Track/LoopEnableState',
|
|
108
|
+
EngineDeck2TrackLoopQuickLoop1 = '/Engine/Deck2/Track/Loop/QuickLoop1',
|
|
109
|
+
EngineDeck2TrackLoopQuickLoop2 = '/Engine/Deck2/Track/Loop/QuickLoop2',
|
|
110
|
+
EngineDeck2TrackLoopQuickLoop3 = '/Engine/Deck2/Track/Loop/QuickLoop3',
|
|
111
|
+
EngineDeck2TrackLoopQuickLoop4 = '/Engine/Deck2/Track/Loop/QuickLoop4',
|
|
112
|
+
EngineDeck2TrackLoopQuickLoop5 = '/Engine/Deck2/Track/Loop/QuickLoop5',
|
|
113
|
+
EngineDeck2TrackLoopQuickLoop6 = '/Engine/Deck2/Track/Loop/QuickLoop6',
|
|
114
|
+
EngineDeck2TrackLoopQuickLoop7 = '/Engine/Deck2/Track/Loop/QuickLoop7',
|
|
115
|
+
EngineDeck2TrackLoopQuickLoop8 = '/Engine/Deck2/Track/Loop/QuickLoop8',
|
|
116
|
+
EngineDeck2TrackPlayPauseLEDState = '/Engine/Deck2/Track/PlayPauseLEDState',
|
|
117
|
+
EngineDeck2TrackSampleRate = '/Engine/Deck2/Track/SampleRate',
|
|
118
|
+
EngineDeck2TrackSongAnalyzed = '/Engine/Deck2/Track/SongAnalyzed',
|
|
119
|
+
EngineDeck2TrackSongLoaded = '/Engine/Deck2/Track/SongLoaded',
|
|
120
|
+
EngineDeck2TrackSongName = '/Engine/Deck2/Track/SongName',
|
|
121
|
+
EngineDeck2TrackSoundSwitchGUID = '/Engine/Deck2/Track/SoundSwitchGuid',
|
|
122
|
+
EngineDeck2TrackTrackBytes = '/Engine/Deck2/Track/TrackBytes',
|
|
123
|
+
EngineDeck2TrackTrackData = '/Engine/Deck2/Track/TrackData',
|
|
124
|
+
EngineDeck2TrackTrackLength = '/Engine/Deck2/Track/TrackLength',
|
|
125
|
+
EngineDeck2TrackTrackName = '/Engine/Deck2/Track/TrackName',
|
|
126
|
+
EngineDeck2TrackTrackNetworkPath = '/Engine/Deck2/Track/TrackNetworkPath',
|
|
127
|
+
EngineDeck2TrackTrackURI = '/Engine/Deck2/Track/TrackUri',
|
|
128
|
+
EngineDeck2TrackTrackWasPlayed = '/Engine/Deck2/Track/TrackWasPlayed',
|
|
129
|
+
EngineDeck3CurrentBPM = '/Engine/Deck3/CurrentBPM',
|
|
130
|
+
EngineDeck3ExternalMixerVolume = '/Engine/Deck3/ExternalMixerVolume',
|
|
131
|
+
EngineDeck3ExternalScratchWheelTouch = '/Engine/Deck3/ExternalScratchWheelTouch',
|
|
132
|
+
EngineDeck3PadsView = '/Engine/Deck3/Pads/View',
|
|
133
|
+
EngineDeck3Play = '/Engine/Deck3/Play',
|
|
134
|
+
EngineDeck3PlayState = '/Engine/Deck3/PlayState',
|
|
135
|
+
EngineDeck3PlayStatePath = '/Engine/Deck3/PlayStatePath',
|
|
136
|
+
EngineDeck3Speed = '/Engine/Deck3/Speed',
|
|
137
|
+
EngineDeck3SpeedNeutral = '/Engine/Deck3/SpeedNeutral',
|
|
138
|
+
EngineDeck3SpeedOffsetDown = '/Engine/Deck3/SpeedOffsetDown',
|
|
139
|
+
EngineDeck3SpeedOffsetUp = '/Engine/Deck3/SpeedOffsetUp',
|
|
140
|
+
EngineDeck3SpeedRange = '/Engine/Deck3/SpeedRange',
|
|
141
|
+
EngineDeck3SpeedState = '/Engine/Deck3/SpeedState',
|
|
142
|
+
EngineDeck3SyncMode = '/Engine/Deck3/SyncMode',
|
|
143
|
+
EngineDeck3TrackArtistName = '/Engine/Deck3/Track/ArtistName',
|
|
144
|
+
EngineDeck3TrackBleep = '/Engine/Deck3/Track/Bleep',
|
|
145
|
+
EngineDeck3TrackCuePosition = '/Engine/Deck3/Track/CuePosition',
|
|
146
|
+
EngineDeck3TrackCurrentBPM = '/Engine/Deck3/Track/CurrentBPM',
|
|
147
|
+
EngineDeck3TrackCurrentKeyIndex = '/Engine/Deck3/Track/CurrentKeyIndex',
|
|
148
|
+
EngineDeck3TrackCurrentLoopInPosition = '/Engine/Deck3/Track/CurrentLoopInPosition',
|
|
149
|
+
EngineDeck3TrackCurrentLoopOutPosition = '/Engine/Deck3/Track/CurrentLoopOutPosition',
|
|
150
|
+
EngineDeck3TrackCurrentLoopSizeInBeats = '/Engine/Deck3/Track/CurrentLoopSizeInBeats',
|
|
151
|
+
EngineDeck3TrackKeyLock = '/Engine/Deck3/Track/KeyLock',
|
|
152
|
+
EngineDeck3TrackLoopEnableState = '/Engine/Deck3/Track/LoopEnableState',
|
|
153
|
+
EngineDeck3TrackLoopQuickLoop1 = '/Engine/Deck3/Track/Loop/QuickLoop1',
|
|
154
|
+
EngineDeck3TrackLoopQuickLoop2 = '/Engine/Deck3/Track/Loop/QuickLoop2',
|
|
155
|
+
EngineDeck3TrackLoopQuickLoop3 = '/Engine/Deck3/Track/Loop/QuickLoop3',
|
|
156
|
+
EngineDeck3TrackLoopQuickLoop4 = '/Engine/Deck3/Track/Loop/QuickLoop4',
|
|
157
|
+
EngineDeck3TrackLoopQuickLoop5 = '/Engine/Deck3/Track/Loop/QuickLoop5',
|
|
158
|
+
EngineDeck3TrackLoopQuickLoop6 = '/Engine/Deck3/Track/Loop/QuickLoop6',
|
|
159
|
+
EngineDeck3TrackLoopQuickLoop7 = '/Engine/Deck3/Track/Loop/QuickLoop7',
|
|
160
|
+
EngineDeck3TrackLoopQuickLoop8 = '/Engine/Deck3/Track/Loop/QuickLoop8',
|
|
161
|
+
EngineDeck3TrackPlayPauseLEDState = '/Engine/Deck3/Track/PlayPauseLEDState',
|
|
162
|
+
EngineDeck3TrackSampleRate = '/Engine/Deck3/Track/SampleRate',
|
|
163
|
+
EngineDeck3TrackSongAnalyzed = '/Engine/Deck3/Track/SongAnalyzed',
|
|
164
|
+
EngineDeck3TrackSongLoaded = '/Engine/Deck3/Track/SongLoaded',
|
|
165
|
+
EngineDeck3TrackSongName = '/Engine/Deck3/Track/SongName',
|
|
166
|
+
EngineDeck3TrackSoundSwitchGUID = '/Engine/Deck3/Track/SoundSwitchGuid',
|
|
167
|
+
EngineDeck3TrackTrackBytes = '/Engine/Deck3/Track/TrackBytes',
|
|
168
|
+
EngineDeck3TrackTrackData = '/Engine/Deck3/Track/TrackData',
|
|
169
|
+
EngineDeck3TrackTrackLength = '/Engine/Deck3/Track/TrackLength',
|
|
170
|
+
EngineDeck3TrackTrackName = '/Engine/Deck3/Track/TrackName',
|
|
171
|
+
EngineDeck3TrackTrackNetworkPath = '/Engine/Deck3/Track/TrackNetworkPath',
|
|
172
|
+
EngineDeck3TrackTrackURI = '/Engine/Deck3/Track/TrackUri',
|
|
173
|
+
EngineDeck3TrackTrackWasPlayed = '/Engine/Deck3/Track/TrackWasPlayed',
|
|
174
|
+
EngineDeck4CurrentBPM = '/Engine/Deck4/CurrentBPM',
|
|
175
|
+
EngineDeck4ExternalMixerVolume = '/Engine/Deck4/ExternalMixerVolume',
|
|
176
|
+
EngineDeck4ExternalScratchWheelTouch = '/Engine/Deck4/ExternalScratchWheelTouch',
|
|
177
|
+
EngineDeck4PadsView = '/Engine/Deck4/Pads/View',
|
|
178
|
+
EngineDeck4Play = '/Engine/Deck4/Play',
|
|
179
|
+
EngineDeck4PlayState = '/Engine/Deck4/PlayState',
|
|
180
|
+
EngineDeck4PlayStatePath = '/Engine/Deck4/PlayStatePath',
|
|
181
|
+
EngineDeck4Speed = '/Engine/Deck4/Speed',
|
|
182
|
+
EngineDeck4SpeedNeutral = '/Engine/Deck4/SpeedNeutral',
|
|
183
|
+
EngineDeck4SpeedOffsetDown = '/Engine/Deck4/SpeedOffsetDown',
|
|
184
|
+
EngineDeck4SpeedOffsetUp = '/Engine/Deck4/SpeedOffsetUp',
|
|
185
|
+
EngineDeck4SpeedRange = '/Engine/Deck4/SpeedRange',
|
|
186
|
+
EngineDeck4SpeedState = '/Engine/Deck4/SpeedState',
|
|
187
|
+
EngineDeck4SyncMode = '/Engine/Deck4/SyncMode',
|
|
188
|
+
EngineDeck4TrackArtistName = '/Engine/Deck4/Track/ArtistName',
|
|
189
|
+
EngineDeck4TrackBleep = '/Engine/Deck4/Track/Bleep',
|
|
190
|
+
EngineDeck4TrackCuePosition = '/Engine/Deck4/Track/CuePosition',
|
|
191
|
+
EngineDeck4TrackCurrentBPM = '/Engine/Deck4/Track/CurrentBPM',
|
|
192
|
+
EngineDeck4TrackCurrentKeyIndex = '/Engine/Deck4/Track/CurrentKeyIndex',
|
|
193
|
+
EngineDeck4TrackCurrentLoopInPosition = '/Engine/Deck4/Track/CurrentLoopInPosition',
|
|
194
|
+
EngineDeck4TrackCurrentLoopOutPosition = '/Engine/Deck4/Track/CurrentLoopOutPosition',
|
|
195
|
+
EngineDeck4TrackCurrentLoopSizeInBeats = '/Engine/Deck4/Track/CurrentLoopSizeInBeats',
|
|
196
|
+
EngineDeck4TrackKeyLock = '/Engine/Deck4/Track/KeyLock',
|
|
197
|
+
EngineDeck4TrackLoopEnableState = '/Engine/Deck4/Track/LoopEnableState',
|
|
198
|
+
EngineDeck4TrackLoopQuickLoop1 = '/Engine/Deck4/Track/Loop/QuickLoop1',
|
|
199
|
+
EngineDeck4TrackLoopQuickLoop2 = '/Engine/Deck4/Track/Loop/QuickLoop2',
|
|
200
|
+
EngineDeck4TrackLoopQuickLoop3 = '/Engine/Deck4/Track/Loop/QuickLoop3',
|
|
201
|
+
EngineDeck4TrackLoopQuickLoop4 = '/Engine/Deck4/Track/Loop/QuickLoop4',
|
|
202
|
+
EngineDeck4TrackLoopQuickLoop5 = '/Engine/Deck4/Track/Loop/QuickLoop5',
|
|
203
|
+
EngineDeck4TrackLoopQuickLoop6 = '/Engine/Deck4/Track/Loop/QuickLoop6',
|
|
204
|
+
EngineDeck4TrackLoopQuickLoop7 = '/Engine/Deck4/Track/Loop/QuickLoop7',
|
|
205
|
+
EngineDeck4TrackLoopQuickLoop8 = '/Engine/Deck4/Track/Loop/QuickLoop8',
|
|
206
|
+
EngineDeck4TrackPlayPauseLEDState = '/Engine/Deck4/Track/PlayPauseLEDState',
|
|
207
|
+
EngineDeck4TrackSampleRate = '/Engine/Deck4/Track/SampleRate',
|
|
208
|
+
EngineDeck4TrackSongAnalyzed = '/Engine/Deck4/Track/SongAnalyzed',
|
|
209
|
+
EngineDeck4TrackSongLoaded = '/Engine/Deck4/Track/SongLoaded',
|
|
210
|
+
EngineDeck4TrackSongName = '/Engine/Deck4/Track/SongName',
|
|
211
|
+
EngineDeck4TrackSoundSwitchGUID = '/Engine/Deck4/Track/SoundSwitchGuid',
|
|
212
|
+
EngineDeck4TrackTrackBytes = '/Engine/Deck4/Track/TrackBytes',
|
|
213
|
+
EngineDeck4TrackTrackData = '/Engine/Deck4/Track/TrackData',
|
|
214
|
+
EngineDeck4TrackTrackLength = '/Engine/Deck4/Track/TrackLength',
|
|
215
|
+
EngineDeck4TrackTrackName = '/Engine/Deck4/Track/TrackName',
|
|
216
|
+
EngineDeck4TrackTrackNetworkPath = '/Engine/Deck4/Track/TrackNetworkPath',
|
|
217
|
+
EngineDeck4TrackTrackURI = '/Engine/Deck4/Track/TrackUri',
|
|
218
|
+
EngineDeck4TrackTrackWasPlayed = '/Engine/Deck4/Track/TrackWasPlayed',
|
|
219
|
+
EngineDeckCount = '/Engine/DeckCount',
|
|
220
|
+
GUIDecksDeckActiveDeck = '/GUI/Decks/Deck/ActiveDeck',
|
|
221
|
+
GUIViewLayerLayerB = '/GUI/ViewLayer/LayerB',
|
|
222
|
+
MixerCH1faderPosition = '/Mixer/CH1faderPosition',
|
|
223
|
+
MixerCH2faderPosition = '/Mixer/CH2faderPosition',
|
|
224
|
+
MixerCH3faderPosition = '/Mixer/CH3faderPosition',
|
|
225
|
+
MixerCH4faderPosition = '/Mixer/CH4faderPosition',
|
|
226
|
+
MixerCrossfaderPosition = '/Mixer/CrossfaderPosition',
|
|
227
|
+
|
|
228
|
+
MixerNumberOfChannels = '/Mixer/NumberOfChannels',
|
|
229
|
+
ClientPreferencesPlayerJogColorA = '/Client/Preferences/PlayerJogColorA',
|
|
230
|
+
ClientPreferencesPlayerJogColorB = '/Client/Preferences/PlayerJogColorB',
|
|
231
|
+
EngineDeck1DeckIsMaster = '/Client/Deck1/DeckIsMaster',
|
|
232
|
+
EngineDeck2DeckIsMaster = '/Client/Deck2/DeckIsMaster',
|
|
233
|
+
ClientPreferencesLayerA = '/Client/Preferences/LayerA',
|
|
234
|
+
EngineSyncNetworkMasterStatus = '/Engine/Sync/Network/MasterStatus',
|
|
235
|
+
EngineMasterMasterTempo = '/Engine/Master/MasterTempo',
|
|
236
|
+
MixerChannelAssignment1 = '/Mixer/ChannelAssignment1',
|
|
237
|
+
MixerChannelAssignment2 = '/Mixer/ChannelAssignment2',
|
|
238
|
+
MixerChannelAssignment3 = '/Mixer/ChannelAssignment3',
|
|
239
|
+
MixerChannelAssignment4 = '/Mixer/ChannelAssignment4',
|
|
240
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface Track {
|
|
2
|
+
id: number,
|
|
3
|
+
playOrder: number,
|
|
4
|
+
length: number,
|
|
5
|
+
bpm: number,
|
|
6
|
+
year: number,
|
|
7
|
+
path: string,
|
|
8
|
+
filename: string,
|
|
9
|
+
bitrate: number,
|
|
10
|
+
bpmAnalyzed: number,
|
|
11
|
+
albumArtId: number,
|
|
12
|
+
fileBytes: number,
|
|
13
|
+
title: string,
|
|
14
|
+
artist: string,
|
|
15
|
+
album: string,
|
|
16
|
+
genre: string,
|
|
17
|
+
comment: string,
|
|
18
|
+
label: string,
|
|
19
|
+
composer: string,
|
|
20
|
+
remixer: string,
|
|
21
|
+
key: number,
|
|
22
|
+
rating: number,
|
|
23
|
+
albumArt: string,
|
|
24
|
+
timeLastPlayed: string,
|
|
25
|
+
isPlayed: boolean,
|
|
26
|
+
fileType: string,
|
|
27
|
+
isAnalyzed: boolean,
|
|
28
|
+
dateCreated: string,
|
|
29
|
+
dateAdded: string,
|
|
30
|
+
isAvailable: boolean,
|
|
31
|
+
isMetadataOfPackedTrackChanged: boolean,
|
|
32
|
+
isPerfomanceDataOfPackedTrackChanged: boolean,
|
|
33
|
+
playedIndicator: number,
|
|
34
|
+
isMetadataImported: boolean,
|
|
35
|
+
pdbImportKey: number,
|
|
36
|
+
streamingSource: string,
|
|
37
|
+
uri: string,
|
|
38
|
+
isBeatGridLocked: boolean,
|
|
39
|
+
originDatabaseUuid: string,
|
|
40
|
+
originTrackId: number,
|
|
41
|
+
trackData: Buffer,
|
|
42
|
+
overviewWaveFormData: Buffer,
|
|
43
|
+
beatData: Buffer,
|
|
44
|
+
quickCues: Buffer,
|
|
45
|
+
loops: Buffer,
|
|
46
|
+
thirdPartySourceId: number,
|
|
47
|
+
streamingFlags: number,
|
|
48
|
+
explicitLyrics: boolean,
|
|
49
|
+
activeOnLoadLoops: number
|
|
50
|
+
}
|
package/types/index.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DiscoveryMessageOptions } from '../network';
|
|
2
|
+
|
|
3
|
+
export * from './common';
|
|
4
|
+
export * from './database';
|
|
5
|
+
export * from './player';
|
|
6
|
+
export * from './tokens';
|
|
7
|
+
|
|
8
|
+
export interface DiscoveryMessage {
|
|
9
|
+
token: Uint8Array;
|
|
10
|
+
source: string;
|
|
11
|
+
action: string;
|
|
12
|
+
software: {
|
|
13
|
+
name: string;
|
|
14
|
+
version: string;
|
|
15
|
+
};
|
|
16
|
+
port: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ServicePorts {
|
|
20
|
+
[key: string]: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ServiceMessage<T> {
|
|
24
|
+
id: number;
|
|
25
|
+
message: T;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface Source {
|
|
29
|
+
name: string;
|
|
30
|
+
database: {
|
|
31
|
+
location: string;
|
|
32
|
+
size: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface FileTransferInfo {
|
|
37
|
+
txid: number;
|
|
38
|
+
size: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// TODO: Maybe some kind of validation?
|
|
42
|
+
export type IpAddress = string;
|
|
43
|
+
|
|
44
|
+
export interface ConnectionInfo extends DiscoveryMessage {
|
|
45
|
+
address: IpAddress;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
export interface StageLinqOptions {
|
|
50
|
+
maxRetries?: number;
|
|
51
|
+
actingAs?: DiscoveryMessageOptions;
|
|
52
|
+
downloadDbSources?: boolean;
|
|
53
|
+
}
|
package/types/player.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
|
|
2
|
+
export interface PlayerStatus {
|
|
3
|
+
address: string;
|
|
4
|
+
artist: string;
|
|
5
|
+
currentBpm: number
|
|
6
|
+
deck: string;
|
|
7
|
+
externalMixerVolume: number;
|
|
8
|
+
fileLocation: string;
|
|
9
|
+
hasTrackData: boolean;
|
|
10
|
+
jogColor: string;
|
|
11
|
+
layer: string;
|
|
12
|
+
masterStatus: boolean;
|
|
13
|
+
masterTempo: number;
|
|
14
|
+
play: boolean;
|
|
15
|
+
player: number;
|
|
16
|
+
playState: boolean;
|
|
17
|
+
port: number;
|
|
18
|
+
songLoaded: boolean;
|
|
19
|
+
title: string;
|
|
20
|
+
trackNetworkPath: string;
|
|
21
|
+
|
|
22
|
+
source: string;
|
|
23
|
+
dbSourceName: string;
|
|
24
|
+
trackPath: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface PlayerLayerState {
|
|
28
|
+
layer: string;
|
|
29
|
+
artist?: string;
|
|
30
|
+
currentBpm?: number;
|
|
31
|
+
externalMixerVolume?: number;
|
|
32
|
+
fileLocation?: string;
|
|
33
|
+
hasTrackData?: boolean;
|
|
34
|
+
jogColor?: string;
|
|
35
|
+
play?: boolean;
|
|
36
|
+
player?: string;
|
|
37
|
+
playState?: boolean;
|
|
38
|
+
songLoaded?: boolean;
|
|
39
|
+
title?: string;
|
|
40
|
+
trackNetworkPath?: string;
|
|
41
|
+
}
|
package/types/tokens.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { DiscoveryMessageOptions } from '../network';
|
|
2
|
+
|
|
3
|
+
export const Tokens = {
|
|
4
|
+
SoundSwitch: new Uint8Array([82, 253, 252, 7, 33, 130, 101, 79, 22, 63, 95, 15, 154, 98, 29, 114]),
|
|
5
|
+
Sc6000_1: new Uint8Array([ 130, 139, 235, 2, 218, 31, 78, 104, 166, 175, 176, 177, 103, 234, 240, 162 ]),
|
|
6
|
+
Sc6000_2: new Uint8Array([ 38, 210, 56, 103, 28, 214, 78, 63, 128, 161, 17, 130, 106, 196, 17, 32 ]),
|
|
7
|
+
Resolume: new Uint8Array([ 136, 250, 32, 153, 172, 122, 79, 63, 188, 22, 169, 149, 219, 218, 42, 66 ])
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const ActingAsDevice: {[name: string]: DiscoveryMessageOptions} = {
|
|
11
|
+
NowPlaying: {
|
|
12
|
+
name: 'nowplaying',
|
|
13
|
+
version: '2.2.0',
|
|
14
|
+
source: 'np2',
|
|
15
|
+
token: Tokens.SoundSwitch
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
Sc6000_1: {
|
|
19
|
+
name: 'sc6000',
|
|
20
|
+
version: '2.3.1',
|
|
21
|
+
source: 'JP13',
|
|
22
|
+
token: Tokens.Sc6000_1
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
Sc6000_2: {
|
|
26
|
+
name: 'sc6000',
|
|
27
|
+
version: '2.3.1',
|
|
28
|
+
source: 'JP13',
|
|
29
|
+
token: Tokens.Sc6000_2
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
Resolume: {
|
|
33
|
+
name: 'resolume',
|
|
34
|
+
version: '10.0.0',
|
|
35
|
+
source: 'res',
|
|
36
|
+
token: Tokens.Resolume
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
}
|
package/utils/Context.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { strict as assert } from 'assert';
|
|
2
|
+
|
|
3
|
+
export class Context {
|
|
4
|
+
protected buffer: ArrayBuffer;
|
|
5
|
+
protected pos: number;
|
|
6
|
+
protected readonly littleEndian: boolean;
|
|
7
|
+
|
|
8
|
+
constructor(p_buffer: ArrayBuffer, p_littleEndian?: boolean) {
|
|
9
|
+
this.buffer = p_buffer;
|
|
10
|
+
this.pos = 0;
|
|
11
|
+
this.littleEndian = p_littleEndian === undefined || !!p_littleEndian;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
sizeLeft() {
|
|
15
|
+
return this.buffer.byteLength - this.pos;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
tell() {
|
|
19
|
+
return this.pos;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
seek(p_bytes: number) {
|
|
23
|
+
assert(this.pos + p_bytes >= 0);
|
|
24
|
+
assert(this.pos + p_bytes <= this.buffer.byteLength);
|
|
25
|
+
|
|
26
|
+
this.pos += p_bytes;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
set(p_offset: number) {
|
|
30
|
+
assert(p_offset >= 0 && p_offset <= this.buffer.byteLength);
|
|
31
|
+
this.pos = p_offset;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
isEOF() {
|
|
35
|
+
return this.pos >= this.buffer.byteLength;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
isLittleEndian() {
|
|
39
|
+
return this.littleEndian;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
rewind() {
|
|
43
|
+
this.pos = 0;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { strict as assert } from 'assert';
|
|
2
|
+
import { Context } from './Context';
|
|
3
|
+
|
|
4
|
+
function fromCString(p_buffer: Uint8Array): string {
|
|
5
|
+
const arr = String.fromCharCode.apply(null, p_buffer).split('\0');
|
|
6
|
+
assert(arr.length > 0);
|
|
7
|
+
return arr[0];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class ReadContext extends Context {
|
|
11
|
+
constructor(p_buffer: ArrayBuffer, p_littleEndian = false) {
|
|
12
|
+
super(p_buffer, p_littleEndian);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
read(p_bytes: number): Uint8Array {
|
|
16
|
+
const bytesToRead = Math.min(this.sizeLeft(), p_bytes);
|
|
17
|
+
if (bytesToRead <= 0) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const view = new Uint8Array(this.buffer, this.pos, bytesToRead);
|
|
22
|
+
this.pos += bytesToRead;
|
|
23
|
+
assert(view.byteLength === bytesToRead);
|
|
24
|
+
return view;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
readRemaining(): Uint8Array {
|
|
28
|
+
return this.read(this.sizeLeft());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
readRemainingAsNewBuffer(): Buffer {
|
|
32
|
+
const view = this.readRemaining();
|
|
33
|
+
const newArrayBuffer = view.buffer.slice(view.byteOffset, view.byteOffset + view.length);
|
|
34
|
+
return Buffer.from(newArrayBuffer);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
getString(p_bytes: number): string {
|
|
38
|
+
const buf = this.read(p_bytes);
|
|
39
|
+
return fromCString(buf);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
readNetworkStringUTF16(): string {
|
|
43
|
+
// node.js only supports little endian of UTF16, and we need big endian, so read one by one
|
|
44
|
+
const bytes = this.readUInt32();
|
|
45
|
+
assert(bytes <= this.sizeLeft());
|
|
46
|
+
assert(bytes % 2 === 0); // Should be 2 bytes per character; otherwise assert
|
|
47
|
+
|
|
48
|
+
let result = '';
|
|
49
|
+
for (let i = 0; i < bytes / 2; ++i) {
|
|
50
|
+
result += String.fromCharCode(this.readUInt16());
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
readUInt64(): bigint {
|
|
56
|
+
const offset = this.pos;
|
|
57
|
+
if (offset + 8 <= this.buffer.byteLength) {
|
|
58
|
+
const value = new DataView(this.buffer).getBigUint64(this.pos, this.littleEndian);
|
|
59
|
+
this.pos += 8;
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
assert.fail(`Read outside buffer`);
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
readUInt32(): number {
|
|
68
|
+
const offset = this.pos;
|
|
69
|
+
if (offset + 4 <= this.buffer.byteLength) {
|
|
70
|
+
const value = new DataView(this.buffer).getUint32(this.pos, this.littleEndian);
|
|
71
|
+
this.pos += 4;
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
assert.fail(`Read outside buffer`);
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
readInt32(): number {
|
|
80
|
+
const offset = this.pos;
|
|
81
|
+
if (offset + 4 <= this.buffer.byteLength) {
|
|
82
|
+
const value = new DataView(this.buffer).getInt32(this.pos, this.littleEndian);
|
|
83
|
+
this.pos += 4;
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
assert.fail(`Read outside buffer`);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
readUInt16(): number {
|
|
92
|
+
const offset = this.pos;
|
|
93
|
+
if (offset + 2 <= this.buffer.byteLength) {
|
|
94
|
+
const value = new DataView(this.buffer).getUint16(this.pos, this.littleEndian);
|
|
95
|
+
this.pos += 2;
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
assert.fail(`Read outside buffer`);
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
readUInt8(): number {
|
|
104
|
+
const offset = this.pos;
|
|
105
|
+
if (offset + 1 <= this.buffer.byteLength) {
|
|
106
|
+
const value = new DataView(this.buffer).getUint8(this.pos);
|
|
107
|
+
this.pos += 1;
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
assert.fail(`Read outside buffer`);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|