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.
Files changed (83) hide show
  1. pyrekordbox/__init__.py +8 -8
  2. pyrekordbox/__main__.py +3 -2
  3. pyrekordbox/_version.py +2 -2
  4. pyrekordbox/anlz/__init__.py +3 -2
  5. pyrekordbox/anlz/file.py +4 -2
  6. pyrekordbox/anlz/tags.py +3 -1
  7. pyrekordbox/config.py +79 -23
  8. pyrekordbox/db6/__init__.py +2 -2
  9. pyrekordbox/db6/aux_files.py +3 -2
  10. pyrekordbox/db6/database.py +101 -111
  11. pyrekordbox/db6/registry.py +1 -0
  12. pyrekordbox/db6/smartlist.py +7 -6
  13. pyrekordbox/db6/tables.py +44 -16
  14. pyrekordbox/logger.py +0 -1
  15. pyrekordbox/mysettings/__init__.py +5 -4
  16. pyrekordbox/mysettings/file.py +3 -1
  17. pyrekordbox/rbxml.py +5 -3
  18. pyrekordbox/utils.py +4 -3
  19. {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/METADATA +21 -41
  20. pyrekordbox-0.4.0.dist-info/RECORD +25 -0
  21. {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/WHEEL +1 -1
  22. {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/top_level.txt +0 -2
  23. docs/Makefile +0 -20
  24. docs/make.bat +0 -35
  25. docs/source/_static/images/anlz_beat.svg +0 -53
  26. docs/source/_static/images/anlz_file.svg +0 -204
  27. docs/source/_static/images/anlz_pco2.svg +0 -138
  28. docs/source/_static/images/anlz_pcob.svg +0 -148
  29. docs/source/_static/images/anlz_pcp2.svg +0 -398
  30. docs/source/_static/images/anlz_pcpt.svg +0 -263
  31. docs/source/_static/images/anlz_ppth.svg +0 -123
  32. docs/source/_static/images/anlz_pqt2.svg +0 -324
  33. docs/source/_static/images/anlz_pqt2_2.svg +0 -253
  34. docs/source/_static/images/anlz_pqtz.svg +0 -140
  35. docs/source/_static/images/anlz_pssi.svg +0 -192
  36. docs/source/_static/images/anlz_pssi_entry.svg +0 -191
  37. docs/source/_static/images/anlz_pvbr.svg +0 -125
  38. docs/source/_static/images/anlz_pwav.svg +0 -130
  39. docs/source/_static/images/anlz_pwv3.svg +0 -139
  40. docs/source/_static/images/anlz_pwv4.svg +0 -139
  41. docs/source/_static/images/anlz_pwv5.svg +0 -139
  42. docs/source/_static/images/anlz_pwv5_entry.svg +0 -100
  43. docs/source/_static/images/anlz_pwv6.svg +0 -130
  44. docs/source/_static/images/anlz_pwv7.svg +0 -139
  45. docs/source/_static/images/anlz_pwvc.svg +0 -125
  46. docs/source/_static/images/anlz_tag.svg +0 -110
  47. docs/source/_static/images/x64dbg_rb_key.png +0 -0
  48. docs/source/_static/logos/dark/logo_primary.svg +0 -75
  49. docs/source/_static/logos/light/logo_primary.svg +0 -75
  50. docs/source/_static/logos/mid/logo_primary.svg +0 -75
  51. docs/source/_templates/apidoc/module.rst_t +0 -8
  52. docs/source/_templates/apidoc/package.rst_t +0 -57
  53. docs/source/_templates/apidoc/toc.rst_t +0 -7
  54. docs/source/_templates/autosummary/class.rst +0 -32
  55. docs/source/_templates/autosummary/module.rst +0 -55
  56. docs/source/api.md +0 -18
  57. docs/source/conf.py +0 -178
  58. docs/source/development/changes.md +0 -3
  59. docs/source/development/contributing.md +0 -3
  60. docs/source/formats/anlz.md +0 -634
  61. docs/source/formats/db6.md +0 -1233
  62. docs/source/formats/mysetting.md +0 -392
  63. docs/source/formats/xml.md +0 -376
  64. docs/source/index.md +0 -103
  65. docs/source/installation.md +0 -271
  66. docs/source/key.md +0 -103
  67. docs/source/quickstart.md +0 -189
  68. docs/source/requirements.txt +0 -7
  69. docs/source/tutorial/anlz.md +0 -7
  70. docs/source/tutorial/configuration.md +0 -66
  71. docs/source/tutorial/db6.md +0 -178
  72. docs/source/tutorial/index.md +0 -20
  73. docs/source/tutorial/mysetting.md +0 -124
  74. docs/source/tutorial/xml.md +0 -140
  75. pyrekordbox/xml.py +0 -8
  76. pyrekordbox-0.3.2.dist-info/RECORD +0 -84
  77. tests/__init__.py +0 -3
  78. tests/test_anlz.py +0 -206
  79. tests/test_config.py +0 -175
  80. tests/test_db6.py +0 -1193
  81. tests/test_mysetting.py +0 -203
  82. tests/test_xml.py +0 -629
  83. {pyrekordbox-0.3.2.dist-info → pyrekordbox-0.4.0.dist-info}/LICENSE +0 -0
@@ -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