pyrekordbox 0.3.2__py3-none-any.whl → 0.4.0__py3-none-any.whl
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.
- pyrekordbox/__init__.py +8 -8
- pyrekordbox/__main__.py +3 -2
- pyrekordbox/_version.py +2 -2
- pyrekordbox/anlz/__init__.py +3 -2
- pyrekordbox/anlz/file.py +4 -2
- pyrekordbox/anlz/tags.py +3 -1
- pyrekordbox/config.py +79 -23
- pyrekordbox/db6/__init__.py +2 -2
- pyrekordbox/db6/aux_files.py +3 -2
- pyrekordbox/db6/database.py +101 -111
- pyrekordbox/db6/registry.py +1 -0
- pyrekordbox/db6/smartlist.py +7 -6
- pyrekordbox/db6/tables.py +44 -16
- pyrekordbox/logger.py +0 -1
- pyrekordbox/mysettings/__init__.py +5 -4
- pyrekordbox/mysettings/file.py +3 -1
- pyrekordbox/rbxml.py +5 -3
- pyrekordbox/utils.py +4 -3
- {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/METADATA +21 -41
- pyrekordbox-0.4.0.dist-info/RECORD +25 -0
- {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/WHEEL +1 -1
- {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/top_level.txt +0 -2
- docs/Makefile +0 -20
- docs/make.bat +0 -35
- docs/source/_static/images/anlz_beat.svg +0 -53
- docs/source/_static/images/anlz_file.svg +0 -204
- docs/source/_static/images/anlz_pco2.svg +0 -138
- docs/source/_static/images/anlz_pcob.svg +0 -148
- docs/source/_static/images/anlz_pcp2.svg +0 -398
- docs/source/_static/images/anlz_pcpt.svg +0 -263
- docs/source/_static/images/anlz_ppth.svg +0 -123
- docs/source/_static/images/anlz_pqt2.svg +0 -324
- docs/source/_static/images/anlz_pqt2_2.svg +0 -253
- docs/source/_static/images/anlz_pqtz.svg +0 -140
- docs/source/_static/images/anlz_pssi.svg +0 -192
- docs/source/_static/images/anlz_pssi_entry.svg +0 -191
- docs/source/_static/images/anlz_pvbr.svg +0 -125
- docs/source/_static/images/anlz_pwav.svg +0 -130
- docs/source/_static/images/anlz_pwv3.svg +0 -139
- docs/source/_static/images/anlz_pwv4.svg +0 -139
- docs/source/_static/images/anlz_pwv5.svg +0 -139
- docs/source/_static/images/anlz_pwv5_entry.svg +0 -100
- docs/source/_static/images/anlz_pwv6.svg +0 -130
- docs/source/_static/images/anlz_pwv7.svg +0 -139
- docs/source/_static/images/anlz_pwvc.svg +0 -125
- docs/source/_static/images/anlz_tag.svg +0 -110
- docs/source/_static/images/x64dbg_rb_key.png +0 -0
- docs/source/_static/logos/dark/logo_primary.svg +0 -75
- docs/source/_static/logos/light/logo_primary.svg +0 -75
- docs/source/_static/logos/mid/logo_primary.svg +0 -75
- docs/source/_templates/apidoc/module.rst_t +0 -8
- docs/source/_templates/apidoc/package.rst_t +0 -57
- docs/source/_templates/apidoc/toc.rst_t +0 -7
- docs/source/_templates/autosummary/class.rst +0 -32
- docs/source/_templates/autosummary/module.rst +0 -55
- docs/source/api.md +0 -18
- docs/source/conf.py +0 -178
- docs/source/development/changes.md +0 -3
- docs/source/development/contributing.md +0 -3
- docs/source/formats/anlz.md +0 -634
- docs/source/formats/db6.md +0 -1233
- docs/source/formats/mysetting.md +0 -392
- docs/source/formats/xml.md +0 -376
- docs/source/index.md +0 -103
- docs/source/installation.md +0 -271
- docs/source/key.md +0 -103
- docs/source/quickstart.md +0 -189
- docs/source/requirements.txt +0 -7
- docs/source/tutorial/anlz.md +0 -7
- docs/source/tutorial/configuration.md +0 -66
- docs/source/tutorial/db6.md +0 -178
- docs/source/tutorial/index.md +0 -20
- docs/source/tutorial/mysetting.md +0 -124
- docs/source/tutorial/xml.md +0 -140
- pyrekordbox/xml.py +0 -8
- pyrekordbox-0.3.2.dist-info/RECORD +0 -84
- tests/__init__.py +0 -3
- tests/test_anlz.py +0 -206
- tests/test_config.py +0 -175
- tests/test_db6.py +0 -1193
- tests/test_mysetting.py +0 -203
- tests/test_xml.py +0 -629
- {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/LICENSE +0 -0
docs/source/formats/anlz.md
DELETED
@@ -1,634 +0,0 @@
|
|
1
|
-
# Analysis Files Format
|
2
|
-
|
3
|
-
This document explains the file format of the Rekordbox ANLZ analysis files, which come
|
4
|
-
with the extionsions `.DAT`, `.EXT` and `.2EX`.
|
5
|
-
|
6
|
-
The following information was mainly taken from the excellent reverse engineering
|
7
|
-
work [^footnote-1] of the people behind DeepSymmetry's [crate-digger].
|
8
|
-
All figures were taken or modified from there as well.
|
9
|
-
|
10
|
-
## File Header
|
11
|
-
|
12
|
-
The file starts with the four-character code PMAI that identifies its format.
|
13
|
-
This file format identifier is followed a four-byte value, len_header (at bytes 04-07)
|
14
|
-
that specifies the length of the file header in bytes. This is followed by another
|
15
|
-
four-byte value, len_file, at bytes 08-0b that specifies the length of the whole
|
16
|
-
file in bytes:
|
17
|
-
|
18
|
-
```{figure} /_static/images/anlz_file.svg
|
19
|
-
:align: center
|
20
|
-
:scale: 100
|
21
|
-
|
22
|
-
File structure.
|
23
|
-
```
|
24
|
-
|
25
|
-
The header seems to usually be 1c bytes long, though we do not yet know the purpose
|
26
|
-
of the header values that come after len_file. After the header, the file
|
27
|
-
consists of a series of tagged sections, each with their own four-character code
|
28
|
-
identifying the section type, followed by a header and the section content.
|
29
|
-
This overall structure is illustrated in the above diagram, and the structure of the
|
30
|
-
known tag types is described next.
|
31
|
-
|
32
|
-
## Tagged File Sections
|
33
|
-
|
34
|
-
The structure of each tagged section has an “envelope” that can be understood even
|
35
|
-
if the internal structure of the section is unknown, making it easy to navigate
|
36
|
-
through the file looking for the section you need. This structure is very similar
|
37
|
-
to the file itself, and is illustrated below.
|
38
|
-
|
39
|
-
```{figure} /_static/images/anlz_tag.svg
|
40
|
-
:align: center
|
41
|
-
:scale: 100
|
42
|
-
|
43
|
-
Tagged section structure.
|
44
|
-
```
|
45
|
-
|
46
|
-
Every section begins with a four-character code, fourcc, identifying its specific
|
47
|
-
structure and content, as described in the sections below. This is followed by a
|
48
|
-
four-byte value, len_header, which specifies how many bytes there are in the section
|
49
|
-
header, and another four-byte value, len_tag, which specifies the length of the entire
|
50
|
-
tagged section (including the header), in bytes. This value can be added to the address
|
51
|
-
of the start of the tag to find the start of the next tag.
|
52
|
-
|
53
|
-
The order of the tags in the corresponding files is usually something like:
|
54
|
-
|
55
|
-
- `.DAT`: PPTH, PVBR, PQTZ, PWAV, PWV2, PCOB, PCOB
|
56
|
-
- `.EXT`: PPTH, PCOB, PCOB, PCO2, PCO2, PQT2, PWV3, PWV4, PWV5, PSSI
|
57
|
-
- `.2EX`: PPTH, PWV6, PWV7, PWVC
|
58
|
-
|
59
|
-
### PQTZ: Beat Grid Tag
|
60
|
-
|
61
|
-
Seen in `.DAT` analysis files. This kind of section holds a list of all beats found
|
62
|
-
within the track, recording their bar position, the time at which they occur,
|
63
|
-
and the tempo at that point. It has the structure shown below:
|
64
|
-
|
65
|
-
```{figure} /_static/images/anlz_pqtz.svg
|
66
|
-
:align: center
|
67
|
-
:scale: 100
|
68
|
-
|
69
|
-
Beat grid tag.
|
70
|
-
```
|
71
|
-
|
72
|
-
`len_header` is 24, while `unknown2` seems to always be `0x00800000`.
|
73
|
-
`len_beats` specifies the number of entries that will be present in this section.
|
74
|
-
The beat entries each have the following structure:
|
75
|
-
|
76
|
-
```{figure} /_static/images/anlz_beat.svg
|
77
|
-
:align: center
|
78
|
-
:scale: 100
|
79
|
-
|
80
|
-
Beat grid entry.
|
81
|
-
```
|
82
|
-
|
83
|
-
`beat_number` is a two-byte number specifies where the beat falls within its measure,
|
84
|
-
so the value is always 1, 2, 3 or 4. Next comes a two-byte `tempo` value, which records
|
85
|
-
the track tempo at the point of the beat. The tempo is given in beats per minute
|
86
|
-
multiplied by 100 to allow a precision of 0.01 BPM. Finally, there is a four-byte
|
87
|
-
`time` value, which specifies the time at which this beat would occur (in milliseconds).
|
88
|
-
|
89
|
-
### PQT2: Extended (nxs2) Beat Grid Tag
|
90
|
-
|
91
|
-
Seen in `.EXT` analysis files. There isn't much documentation on the structure or
|
92
|
-
purpose of this tag, but it seems like it always contains two beat grid entries.
|
93
|
-
It has the structure shown below:
|
94
|
-
|
95
|
-
```{figure} /_static/images/anlz_pqt2_2.svg
|
96
|
-
:align: center
|
97
|
-
:scale: 100
|
98
|
-
|
99
|
-
Extended beat grid tag.
|
100
|
-
```
|
101
|
-
|
102
|
-
`len_header` is 56. The first four bytes after `len_tag` are zero.
|
103
|
-
`unknown1` seems to always be `0x01000002`. Maybe this is another hint at the following
|
104
|
-
two beat grid entries. The format of the entries is the same as described in
|
105
|
-
the previous PQTZ tag.
|
106
|
-
|
107
|
-
After the two beat grid entries there is `entry_count`, which specifies the
|
108
|
-
number of entries. This number is almost always the same as the number of
|
109
|
-
entries in the PQTZ tag. The end of the header are three unknown
|
110
|
-
values.
|
111
|
-
|
112
|
-
The main entries of the Extended Beat Grid Tag are two bytes long. The format
|
113
|
-
of the entries is not yet known, but the first byte seems to always have a value between
|
114
|
-
0 and 3, so maybe this is an index for a beat?
|
115
|
-
|
116
|
-
### PCOB: Cue List Tag
|
117
|
-
|
118
|
-
Seen in `.DAT` and `.EXT` analysis files. This kind of section holds either a
|
119
|
-
list of ordinary memory points and loops, or a list of hot cues and hot loops.
|
120
|
-
|
121
|
-
```{figure} /_static/images/anlz_pcob.svg
|
122
|
-
:align: center
|
123
|
-
:scale: 100
|
124
|
-
|
125
|
-
Cue list tag.
|
126
|
-
```
|
127
|
-
|
128
|
-
The value of `len_header` is 24. The `type` value determines whether this section
|
129
|
-
holds memory points (0) or hot cues (1). The number of cue entries present in the
|
130
|
-
section is reported in `len_cues`. The meaning of `unk` or `memory_count` is not
|
131
|
-
yet known.
|
132
|
-
|
133
|
-
The remainder of the section, from byte 18 through `len_tag`, holds the cue entries
|
134
|
-
themselves, with the following structure:
|
135
|
-
|
136
|
-
```{figure} /_static/images/anlz_pcpt.svg
|
137
|
-
:align: center
|
138
|
-
:scale: 100
|
139
|
-
|
140
|
-
Cue list entry.
|
141
|
-
```
|
142
|
-
|
143
|
-
Each cue entry is 38 bytes long. It is structured as its own miniature tag,
|
144
|
-
starting with the four-character code `PCPT`, and its own internal four-byte
|
145
|
-
`len_header` and `len_entry` values (1c and 38 respectively).
|
146
|
-
|
147
|
-
If the cue is an ordinary memory point, `hot_cue` at will be zero, otherwise it
|
148
|
-
identifies the number of the hot cue that this entry represents
|
149
|
-
(Hot Cue A is number 1, B is 2, and so on). The `status` value is an indicator of
|
150
|
-
active loops; if it is zero, the entry is a regular cue point or loop.
|
151
|
-
Active loops have the value 4 here.
|
152
|
-
|
153
|
-
The next four bytes have an unknown purpose, but seem to always have the
|
154
|
-
value `0x00100000`. They are followed by two two-byte values, which seem to be for
|
155
|
-
sorting the cues in the proper order in some strange way. `order_first` (labeled `O_first`)
|
156
|
-
has the value `ffff` for the first cue, `0000` for the second, then 2, 3 and on.
|
157
|
-
`order_last` at bytes (labeled `O_last`) has the value 1 for the first cue,
|
158
|
-
2 for the second, and so on, but ffff for the last.
|
159
|
-
It would seem that the cues could be perfectly well sorted by just one of these fields,
|
160
|
-
or indeed, by their time values.
|
161
|
-
|
162
|
-
The first “non-header” field is `type` (labeled `t`), and it specifies whether the
|
163
|
-
entry records a simple position (if it has the value 1) or a loop (if it has the value 2).
|
164
|
-
The next three bytes have an unknown purpose, but seem to always have the value `0003e8`,
|
165
|
-
or decimal 1000.
|
166
|
-
|
167
|
-
The value `time` records the position of the cue within the track, as a number
|
168
|
-
of milliseconds (representing when the cue would occur if the track is being played at
|
169
|
-
normal speed). If type is 2, meaning that this cue stores a loop, then `loop_time`
|
170
|
-
stores the track time in milliseconds at which the player should loop back to time.
|
171
|
-
|
172
|
-
### PCO2: Extended (nxs2) Cue List Tag
|
173
|
-
|
174
|
-
Seen in `.EXT` analysis files. This is a variation of the Cue List Tag just described
|
175
|
-
that was introduced with the Nexus 2 players to add support for more than three hot
|
176
|
-
cues with custom color assignments, as well as DJ-assigned comment text for each hot
|
177
|
-
cue and memory point. It also contains the information present in the standard
|
178
|
-
\[Cue List Tag\](#pcob-cue-list-tag), so you only need to read one set or the other.
|
179
|
-
|
180
|
-
Just like the older tag, this kind of section holds either a list of ordinary memory
|
181
|
-
points and loops, or a list of hot cues and hot loops:
|
182
|
-
|
183
|
-
```{figure} /_static/images/anlz_pco2.svg
|
184
|
-
:align: center
|
185
|
-
:scale: 100
|
186
|
-
|
187
|
-
Extended cue list tag.
|
188
|
-
```
|
189
|
-
|
190
|
-
The value of `len_header` is 20. The `type` value determines whether this section
|
191
|
-
holds memory points (0) or hot cues (1). The number of cue entries present in the
|
192
|
-
section is reported in `len_cues`. The meaning of the remaining two header bytes
|
193
|
-
is unknown.
|
194
|
-
|
195
|
-
The remainder of the section, from byte 14 through `len_tag`, holds the cue entries
|
196
|
-
themselves, with the following structure:
|
197
|
-
|
198
|
-
```{figure} /_static/images/anlz_pcp2.svg
|
199
|
-
:align: center
|
200
|
-
:scale: 100
|
201
|
-
|
202
|
-
Extended cue list entry.
|
203
|
-
```
|
204
|
-
|
205
|
-
### PPTH: Path Tag
|
206
|
-
|
207
|
-
Seen in all analysis files. This kind of section holds the file path of the audio file
|
208
|
-
for which the track analysis was performed:
|
209
|
-
|
210
|
-
```{figure} /_static/images/anlz_ppth.svg
|
211
|
-
:align: center
|
212
|
-
:scale: 100
|
213
|
-
|
214
|
-
Path tag.
|
215
|
-
```
|
216
|
-
|
217
|
-
`len_header` is 16. The length of the string is stored in `len_path`. The actual
|
218
|
-
string, encoded as a UTF-16 Big endian string with a trailing `NULL` (`0x0000`)
|
219
|
-
charakter, is stored in `path`.
|
220
|
-
|
221
|
-
### PVBR: VBR Tag
|
222
|
-
|
223
|
-
Seen in `.DAT` analysis files. This tag is believed to hold an index allowing rapid
|
224
|
-
seeking to particular times within variable-bit-rate tracks. What is known of the
|
225
|
-
structure is shown below:
|
226
|
-
|
227
|
-
```{figure} /_static/images/anlz_pvbr.svg
|
228
|
-
:align: center
|
229
|
-
:scale: 100
|
230
|
-
|
231
|
-
VBR tag.
|
232
|
-
```
|
233
|
-
|
234
|
-
`len_header` is 16. It appears as if `len_tag` is always 1620. The last 4 bytes of
|
235
|
-
the header are unknown. The entries of the section are unsigned 32-bit integers.
|
236
|
-
Finally, the tag ends with an unknown 4 byte value.
|
237
|
-
|
238
|
-
Since the tag length seems to always be 1620 the body of the tag consists of 400
|
239
|
-
integer values. It is believed that these values are the frame-indices of the
|
240
|
-
times within variable-bit-rate tracks. However, in most of the cases the entries
|
241
|
-
of the tag are all `0`.
|
242
|
-
|
243
|
-
### PSSI: Song Structure Tag
|
244
|
-
|
245
|
-
Seen in `.EXT` analysis files. This kind of section was originally used only in
|
246
|
-
Rekordbox Performance Mode, but starting with Rekordbox version 6 it also gets
|
247
|
-
exported to external media so CDJ-3000 players can use it to control lighting looks.
|
248
|
-
|
249
|
-
```{note}
|
250
|
-
The version that Rekordbox 6 **exports** is garbled with an XOR mask to make it
|
251
|
-
more difficult to access the data. All bytes after `len_e` are XOR-masked with a
|
252
|
-
pattern that is generated by adding the value of `len_e` to each byte of the following
|
253
|
-
base pattern:
|
254
|
-
|
255
|
-
CB E1 EE FA E5 EE AD EE E9 D2 E9 EB E1 E9 F3 E8 E9 F4 E1
|
256
|
-
```
|
257
|
-
|
258
|
-
The section has the folowwing strcture:
|
259
|
-
|
260
|
-
```{figure} /_static/images/anlz_pssi.svg
|
261
|
-
:align: center
|
262
|
-
:scale: 100
|
263
|
-
|
264
|
-
Song structure tag.
|
265
|
-
```
|
266
|
-
|
267
|
-
`len_header` is 32. `len_entry_bytes` identifies how many bytes each phrase entry takes up;
|
268
|
-
so far it always has the value 24. `len_entries` (labeled `len_e`) specifies how many
|
269
|
-
entries are present in the tag. Each entry represents one recognized phrase.
|
270
|
-
|
271
|
-
The value `mood` specifies the overall type of phrase structure that rekordbox chose to
|
272
|
-
represent the song, based on its analysis of the audio.
|
273
|
-
|
274
|
-
The value 1 is a “high” mood where the phrase types consist of “Intro”, “Up”, “Down”,
|
275
|
-
“Chorus”, and “Outro”. Other values in each phrase entry cause the intro, chorus, and
|
276
|
-
outro phrases to have their labels subdivided into styes “1” or “2”
|
277
|
-
(for example, “Intro 1”), and “up” is subdivided into style “Up 1”, “Up 2”, or “Up 3”.
|
278
|
-
See the table below for an expanded version of this description.
|
279
|
-
|
280
|
-
The value 2 is a “mid” mood where the phrase types are labeled “Intro”, “Verse 1”
|
281
|
-
through “Verse 6”, “Chorus”, “Bridge”, and “Outro”.
|
282
|
-
|
283
|
-
And value 3 is a “low” mood where the phrase types are labeled “Intro”, “Verse 1”,
|
284
|
-
“Verse 2”, “Chorus”, “Bridge”, and “Outro”. There are three different phrase type
|
285
|
-
values for each of “Verse 1” and “Verse 2”, but rekordbox makes no distinction between
|
286
|
-
them.
|
287
|
-
|
288
|
-
`end_beat` (labeled `end` in the diagram) holds the beat number at which the
|
289
|
-
last recognized phrase ends. The track may continue beyond this, but will mostly be
|
290
|
-
silence from then on.
|
291
|
-
|
292
|
-
`bank` identifies the stylistic bank which has been assigned to the track by the user
|
293
|
-
in Lighting mode. The value zero means the user has made no assignment, and this is
|
294
|
-
treated the same as if “Cool” has been chosen. The values and their meanings are
|
295
|
-
listed in the table below.
|
296
|
-
|
297
|
-
Each phrase entry has the structure shown below:
|
298
|
-
|
299
|
-
```{figure} /_static/images/anlz_pssi_entry.svg
|
300
|
-
:align: center
|
301
|
-
:scale: 100
|
302
|
-
|
303
|
-
Song structure entry.
|
304
|
-
```
|
305
|
-
|
306
|
-
The first two bytes of each song structure entry hold `index`, which numbers each phrase,
|
307
|
-
starting at one and incrementing with each entry. That is followed by beat,
|
308
|
-
a two-byte value that specifies the beat at which this phrase begins in the track.
|
309
|
-
It continues until either the beat number of the next phrase, or the beat identified
|
310
|
-
by end in the tag header if this is the last entry.
|
311
|
-
|
312
|
-
`kind` specifies what kind of phrase rekordbox has identified here.
|
313
|
-
The interpretation depends on the value of mood in the tag header, as is detailed the
|
314
|
-
table below. In the case of the “high” mood, there are numbered variations for some
|
315
|
-
of the phrases displayed in rekordbox that are not reflected in kind, but depend on the
|
316
|
-
values of three flag bytes `k1` through `k3` in a complicated way shown in its own table.
|
317
|
-
|
318
|
-
We also noticed that when `mood`, `kind` and the `k` flags indicate a phrase of type
|
319
|
-
“Up 3”, additional beat numbers (which all fall within the phrase) are present in the
|
320
|
-
entry. These may indicate points within the phrase at which lighting changes would look good;
|
321
|
-
more investigation is required to make sense of them.
|
322
|
-
The number of beats that will be listed seems to depend on the value of the flag `b`:
|
323
|
-
if this has the value 0, there will be a single beat found in `beat2`, and if `b` has
|
324
|
-
the value 1 there will be three different beat numbers present, with increasing values,
|
325
|
-
in `beat2`, `beat3` and `beat4`.
|
326
|
-
|
327
|
-
`fill` is a flag that indicates whether there are fill (non-phrase) beats at the end of
|
328
|
-
the phrase. If it is non-zero, then ``beat fill`` holds the beat number at which the
|
329
|
-
fill begins. When fill-in is present, it is indicated in rekordbox by little dots on the
|
330
|
-
full waveform. The manual says:
|
331
|
-
|
332
|
-
|
333
|
-
[Fill in] is a section that provides improvisational changes at the end of phrase.
|
334
|
-
[Fill in] is detected at the end of Intro, Up, and Chorus (up to 4 beats).
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
```{eval-rst}
|
339
|
-
.. list-table:: Phrase labels in each mood.
|
340
|
-
:header-rows: 1
|
341
|
-
|
342
|
-
* - Phrase ID
|
343
|
-
- Low Label
|
344
|
-
- Mid Label
|
345
|
-
- High Label
|
346
|
-
* - 1
|
347
|
-
- Intro
|
348
|
-
- Intro
|
349
|
-
- Intro n
|
350
|
-
* - 2
|
351
|
-
- Verse 1
|
352
|
-
- Verse 1
|
353
|
-
- Up n
|
354
|
-
* - 3
|
355
|
-
- Verse 1
|
356
|
-
- Verse 2
|
357
|
-
- Down
|
358
|
-
* - 4
|
359
|
-
- Verse 1
|
360
|
-
- Verse 3
|
361
|
-
-
|
362
|
-
* - 5
|
363
|
-
- Verse 2
|
364
|
-
- Verse 4
|
365
|
-
- Chorus n
|
366
|
-
* - 6
|
367
|
-
- Verse 2
|
368
|
-
- Verse 5
|
369
|
-
- Outro n
|
370
|
-
* - 7
|
371
|
-
- Verse 2
|
372
|
-
- Verse 6
|
373
|
-
-
|
374
|
-
* - 8
|
375
|
-
- Bridge
|
376
|
-
- Bridge
|
377
|
-
-
|
378
|
-
* - 9
|
379
|
-
- Chorus
|
380
|
-
- Chorus
|
381
|
-
-
|
382
|
-
* - 10
|
383
|
-
- Outro
|
384
|
-
- Outro
|
385
|
-
-
|
386
|
-
```
|
387
|
-
|
388
|
-
```{eval-rst}
|
389
|
-
.. list-table:: High mood phrase variants.
|
390
|
-
:header-rows: 1
|
391
|
-
|
392
|
-
* - Phrase ID
|
393
|
-
- k1
|
394
|
-
- k2
|
395
|
-
- k3
|
396
|
-
- Expanded Label
|
397
|
-
* - 1
|
398
|
-
- 1
|
399
|
-
-
|
400
|
-
-
|
401
|
-
- Intro 1
|
402
|
-
* - 1
|
403
|
-
- 0
|
404
|
-
-
|
405
|
-
-
|
406
|
-
- Intro 2
|
407
|
-
* - 2
|
408
|
-
-
|
409
|
-
- 0
|
410
|
-
- 0
|
411
|
-
- Up 1
|
412
|
-
* - 2
|
413
|
-
-
|
414
|
-
- 0
|
415
|
-
- 1
|
416
|
-
- Up 2
|
417
|
-
* - 2
|
418
|
-
-
|
419
|
-
- 1
|
420
|
-
- 0
|
421
|
-
- Up 3
|
422
|
-
* - 3
|
423
|
-
-
|
424
|
-
-
|
425
|
-
-
|
426
|
-
- Down 1
|
427
|
-
* - 5
|
428
|
-
- 1
|
429
|
-
-
|
430
|
-
-
|
431
|
-
- Chorus 2
|
432
|
-
* - 5
|
433
|
-
- 0
|
434
|
-
-
|
435
|
-
-
|
436
|
-
- Chorus 1
|
437
|
-
* - 6
|
438
|
-
- 1
|
439
|
-
-
|
440
|
-
-
|
441
|
-
- Outro 1
|
442
|
-
* - 6
|
443
|
-
- 0
|
444
|
-
-
|
445
|
-
-
|
446
|
-
- Outro 2
|
447
|
-
```
|
448
|
-
|
449
|
-
```{eval-rst}
|
450
|
-
.. list-table:: Track banks.
|
451
|
-
:header-rows: 1
|
452
|
-
|
453
|
-
* - Bank ID
|
454
|
-
- Label
|
455
|
-
* - 0
|
456
|
-
- Default (treated as Cool)
|
457
|
-
* - 1
|
458
|
-
- Cool
|
459
|
-
* - 2
|
460
|
-
- Natural
|
461
|
-
* - 3
|
462
|
-
- Hot
|
463
|
-
* - 4
|
464
|
-
- Subtle
|
465
|
-
* - 5
|
466
|
-
- Warm
|
467
|
-
* - 6
|
468
|
-
- Vivid
|
469
|
-
* - 7
|
470
|
-
- Club 1
|
471
|
-
* - 8
|
472
|
-
- Club 2
|
473
|
-
```
|
474
|
-
|
475
|
-
### PWAV: Waveform Preview Tag
|
476
|
-
|
477
|
-
Seen in `.DAT` analysis files. This kind of section holds a fixed-width monochrome
|
478
|
-
preview of the track waveform, displayed above the touch strip on original
|
479
|
-
Nexus players, providing a birds-eye view of the current playback position,
|
480
|
-
and supporting direct needle jump to specific track sections.
|
481
|
-
|
482
|
-
```{figure} /_static/images/anlz_pwav.svg
|
483
|
-
:align: center
|
484
|
-
:scale: 100
|
485
|
-
|
486
|
-
Waveform preview tag.
|
487
|
-
```
|
488
|
-
|
489
|
-
`len_header` is 20. The purpose of `unknown` is not understood, it always seems to have
|
490
|
-
the value `0x00100000`. The waveform preview data is 400 (decimal) bytes long.
|
491
|
-
Each byte encodes one vertical pixel-wide column of the waveform preview.
|
492
|
-
The height of the column is represented by the five low-order bits of the byte
|
493
|
-
(so it can range from 0 to 31 pixels high), and the whiteness of the segment is
|
494
|
-
represented by the three high-order bits. Segments with higher values in these three
|
495
|
-
bits are drawn in a less saturated (whiter) shade of blue.
|
496
|
-
|
497
|
-
### PWV2: Tiny Waveform Preview Tag
|
498
|
-
|
499
|
-
Seen in `.DAT` analysis files. This kind of section holds an even smaller fixed-width
|
500
|
-
monochrome preview of the track waveform, which seems to be displayed on the CDJ-900.
|
501
|
-
It is identified by the four-character code `PWV2` but otherwise has the same structure
|
502
|
-
as the larger waveform preview tags {ref}`PWAV <PWAV: Waveform Preview Tag>`.
|
503
|
-
|
504
|
-
### PWV3: Waveform Detail Tag
|
505
|
-
|
506
|
-
Seen in `.EXT` analysis files. This kind of section holds a variable-width and much
|
507
|
-
larger monochrome rendition of the track waveform, which scrolls along while the
|
508
|
-
track plays, giving a detailed glimpse of the neighborhood of the current playback
|
509
|
-
position:
|
510
|
-
|
511
|
-
```{figure} /_static/images/anlz_pwv3.svg
|
512
|
-
:align: center
|
513
|
-
:scale: 100
|
514
|
-
|
515
|
-
Waveform detail tag.
|
516
|
-
```
|
517
|
-
|
518
|
-
`len_header` is 24. `len_entry_bytes` identifies how many bytes each waveform detail
|
519
|
-
entry takes up; for this kind of tag it always has the value 1. `len_entries` specifies
|
520
|
-
how many entries are present in the tag. Each entry represents one half-frame of audio
|
521
|
-
data, and there are 75 frames per second, so for each second of track audio there are
|
522
|
-
150 waveform detail entries. The purpose of the header `unknown` is not known yet;
|
523
|
-
they always seem to have the value `0x00960000`. The interpretation of each byte of the
|
524
|
-
entriesis the same as for {ref}`PWAV <PWAV: Waveform Preview Tag>`.
|
525
|
-
|
526
|
-
### PWV4: Waveform Color Preview Tag
|
527
|
-
|
528
|
-
Seen in `.EXT` analysis files. This kind of section holds a fixed-width color preview
|
529
|
-
of the track waveform, displayed above the touch strip on Nexus 2 players, providing
|
530
|
-
a birds-eye view of the current playback position, and supporting direct needle jump
|
531
|
-
to specific track sections. It is also used in rekordbox itself.
|
532
|
-
|
533
|
-
```{figure} /_static/images/anlz_pwv4.svg
|
534
|
-
:align: center
|
535
|
-
:scale: 100
|
536
|
-
|
537
|
-
Waveform color preview tag.
|
538
|
-
```
|
539
|
-
|
540
|
-
`len_header` is 24. `len_entry_bytes` identifies how many bytes each waveform preview
|
541
|
-
entry takes up; for this kind of tag it always has the value 6. `len_entries` specifies
|
542
|
-
how many entries are present in the tag. The purpose of `unknown` is unknown.
|
543
|
-
The waveform color preview data is 7,200 (decimal) bytes long, representing 1,200 columns
|
544
|
-
of waveform preview information.
|
545
|
-
|
546
|
-
The color waveform preview entries are the most complex of the waveform tags.
|
547
|
-
|
548
|
-
### PWV5: Waveform Color Detail Tag
|
549
|
-
|
550
|
-
Seen in `.EXT` analysis files. This kind of section holds a variable-width and much
|
551
|
-
larger color rendition of the track waveform, introduced with the nexus 2 line
|
552
|
-
(and also used in rekordbox), which scrolls along while the track plays, giving a
|
553
|
-
detailed glimpse of the neighborhood of the current playback position.
|
554
|
-
|
555
|
-
```{figure} /_static/images/anlz_pwv5.svg
|
556
|
-
:align: center
|
557
|
-
:scale: 100
|
558
|
-
|
559
|
-
Waveform color detail tag.
|
560
|
-
```
|
561
|
-
|
562
|
-
`len_header` is 24. `len_entry_bytes` identifies how many bytes each waveform preview
|
563
|
-
entry takes up; for this kind of tag it always has the value 6. `len_entries` specifies
|
564
|
-
how many entries are present in the tag. The purpose of `unknown` is unknown, but
|
565
|
-
it always has the value 960305. Each entry represents one half-frame of audio
|
566
|
-
data, and there are 75 frames per second, so for each second of track audio there are
|
567
|
-
150 waveform detail entries.
|
568
|
-
|
569
|
-
Color detail entries are much simpler than color preview entries. They consist of
|
570
|
-
three-bit red, green, and blue components and a five-bit height component packed into
|
571
|
-
the sixteen bits of the two entry bytes:
|
572
|
-
|
573
|
-
```{figure} /_static/images/anlz_pwv5_entry.svg
|
574
|
-
:align: center
|
575
|
-
:scale: 100
|
576
|
-
|
577
|
-
Waveform color detail entry bits.
|
578
|
-
```
|
579
|
-
|
580
|
-
### PWV6
|
581
|
-
|
582
|
-
Seen in `.2EX` analysis files.
|
583
|
-
|
584
|
-
```{figure} /_static/images/anlz_pwv6.svg
|
585
|
-
:align: center
|
586
|
-
:scale: 100
|
587
|
-
|
588
|
-
Waveform 6 tag.
|
589
|
-
```
|
590
|
-
|
591
|
-
`len_header` is 20. `len_entry_bytes` identifies how many bytes each waveform preview
|
592
|
-
entry takes up; for this kind of tag it always has the value 3. `len_entries` specifies
|
593
|
-
how many entries are present in the tag.
|
594
|
-
|
595
|
-
### PWV7
|
596
|
-
|
597
|
-
Seen in `.2EX` analysis files.
|
598
|
-
|
599
|
-
```{figure} /_static/images/anlz_pwv7.svg
|
600
|
-
:align: center
|
601
|
-
:scale: 100
|
602
|
-
|
603
|
-
PWV7 tag.
|
604
|
-
```
|
605
|
-
|
606
|
-
`len_header` is 24. `len_entry_bytes` identifies how many bytes each waveform preview
|
607
|
-
entry takes up; for this kind of tag it always has the value 6. `len_entries` specifies
|
608
|
-
how many entries are present in the tag. The purpose of `unknown` is unknown, but
|
609
|
-
it always has the value 9830400 or `0x00960000`.
|
610
|
-
|
611
|
-
### PWVC
|
612
|
-
|
613
|
-
Seen in `.2EX` analysis files.
|
614
|
-
|
615
|
-
```{figure} /_static/images/anlz_pwvc.svg
|
616
|
-
:align: center
|
617
|
-
:scale: 100
|
618
|
-
|
619
|
-
PWVC tag.
|
620
|
-
```
|
621
|
-
|
622
|
-
`len_header` is 14. The remaining two bytes of the header are unknown. The enries are
|
623
|
-
not understood either, but it seems like `len_tag` is always 20, so the
|
624
|
-
6 byte long entry data could be parsed to three 2-byte integers. Are
|
625
|
-
these maybe RBG values? But for what?
|
626
|
-
|
627
|
-
## References
|
628
|
-
|
629
|
-
[^footnote-1]: Rekordbox Export Structure Analysis: Analysis Files.
|
630
|
-
<https://djl-analysis.deepsymmetry.org/rekordbox-export-analysis/anlz.html>.
|
631
|
-
|
632
|
-
[^footnote-2]: <https://github.com/Deep-Symmetry/crate-digger/issues/22>
|
633
|
-
|
634
|
-
[crate-digger]: https://github.com/Deep-Symmetry/crate-digger
|