Pioneers Rekordbox软件是DJ的音乐管理工具。其功能之一是音乐文件的BPM检测。不幸的是,它没有将此信息写入文件ID3标记的BPM框架,而是将检测到的BPM保留在其自己的数据库文件中。我的音乐,也是我想要做的事情之一,就是从rekordbox数据库中提取每首歌曲的BPM数据。两个ANLZ文件。相反,它似乎存储在Rekordbox的“ database.edb”文件中。我在此处上传了一个示例edb文件[1],其中包含一个带BPM'170'的曲目。 />

经过更多研究,它似乎是一个专有的高性能SQL数据库,旨在用于嵌入式应用程序。 (经过更多研究后,该数据库称为“ DeviceSQL”。请阅读原始作者Quora的相关文章)。看起来好像不太容易逆向操作:(

对于任何其他希望从其rekordbox库中提取BPM信息的人:事实证明,可以使用XML导出。虽然不像读取数据库文件那样自动化,但它是一种很好的标准格式!


老问题: (数据库只是这些文件的目录树)。这是示例轨道[4]的一对文件。该轨道的BPM被检测为170,尽管我怀疑它将其存储为浮点或可以像“ 169.96”这样的数字检测到其他轨道的两倍。尽管寻找双精度和浮点十六进制表示形式对我来说没有任何匹配。我看到文件的标题看起来像,例如“ PPTH”,后跟文件路径。和“ PQTZ”,用于Rekordbox量化功能。但是我对文件格式不太熟悉,因此无法确定它是否使用标准文件类型。或更专有的东西。

如果有人有兴趣查看文件并为我指出正确的方向,将不胜感激!现在,我只是想弄清楚BPM的存储方式。


由于我的信誉不够,我最多只能提供一个链接:(以上括号中的参考链接:https://gist.github.com/EvanPurkhiser/72b37edd4a6ea26fbe73

#1 楼

精确的BPM实际上位于数据文件(文件名).DAT中(可能整个BPM位于edb中。但是我无法确认) >
file.DAT
--------
/numbers are all big endian/
[tag]   - 4 byte string
4byte   - tag header size 
4byte   - segment size (including tag header)
(in multibit fields, msb-to-lsb (left-to-right) is the general direction)
//////////////////////////////

PMAI    - main file descriptor
4byte   - head size (28)
4byte   - total file size
4byte   - ??? (1)
4byte   - ??? (65536)
4byte   - ??? (65536)
4byte   - ??? (0)

PPTH    - file path
4byte   - head size (16)
4byte   - tag size
4byte   - data length
data_bytes - file path in UTF16 (big endian) q4312078q terminated

PVBR    - VBR seek table
4byte   - head size (16)
4byte   - tag size (1620) (4*400+4)
4byte   - 0
  >entries>
    4byte   - file pos
  >last_entry>
    4byte   - ???

PQTZ    - Quantized time zones
4byte   - head size (24)
4byte   - tag size
4byte   - 0
4byte   - ??? (524288=0x80000)
4byte   - number of entries
  >entries>
    2byte   - beat phase (1-2-3-4)
    2byte   - bpm*100
    4byte   - time index (msec)

PWAV    - Low resolution Wave display data (5+3bit)
4byte   - head size (20)
4byte   - tag size (420)
4byte   - data size (400)
4byte   - ??? (65536)
  >entries>
     3bit   - color index
     5bit   - height

PWV2    - Lowest resolution Wave display data (4bit)
4byte   - head size (20)
4byte   - tag size (120)
4byte   - data size (100)
4byte   - ??? (65536)
  >entries>
      4bit  - 0
      4bit  - height

PCOB    - CUE Object    ///first PCOB for hot cues, second PCOB for memory
                        ///only generated for USB storage, 
                        ///otherwise contains only dummy data and actual cue data stored in the edb 
4byte   - head size (24)
4byte   - tag size
4byte   - hotCUE? (1=hot cue, 0=memory)
4byte   - number of cue points
4byte   - memories (-1= hot cue)
  >entry tags>
    PCPT    - CUE Point
    4byte   - head size (28)
    4byte   - tag size (56)
    4byte   - hot cue no#, 0 otherwise
    4byte   - active (0=inactive / 4=active)
    4byte   - (65536)
    4byte   - ???? -----point type: 0xffff ffff = hot cue ////  memory first: 0xffff xxxxx ----- memory last: 0x xxxx ffff
      >datas>
        1byte   - cue type 1 = single / 2 = loop
        1byte   - 0
        2byte   - ??? (1000)
        4byte   - start time (msec)
        4byte   - loop end (-1 if not used)
        16byte  - 0



file.EXT
--------
PMAI    - main file descriptor
4byte   - head size (28)
4byte   - total file size
4byte   - ??? (1)
4byte   - ??? (65536)
4byte   - ??? (65536)
4byte   - ??? (0)

PPTH    - file path
4byte   - head size (16)
4byte   - tag size
4byte   - data length
data_bytes - file path in UTF16 (big endian) q4312078q terminated

PWV3    - High resolution Wave display data
4byte   - head size (24)
4byte   - tag size
4byte   - ??? (1)
4byte   - data size
4byte   - ??? (0x0096 0000)
  >entries>
      3bit  - color 
      5bit  - height


当我倒车时,文件中没有PKEY,所以我不知道它的用途(并且PC上似乎只有0)

因此BPM值存储在PQTZ标签中(在动态模式下,同一首歌曲中您可以具有不同的BPM,因此很有意义)

#2 楼

如您所知,文件格式似乎由带有标签的标头组成。这些标头中的每一个似乎都是16+字节,其中4个字节是标签,4个字节是标头的长度,4个字节是标头+数据的大小,另外4个我不确定。不幸的是,这些长度字节是big endian,这使我认为bpm也可以存储在big endian IEEE float中,这可能是您找不到任何东西的原因。 PMAI。似乎是某种信封(它的长度字段是文件本身的大小),其余头似乎是各种形式的数据内容。

我写了一个小程序来转储该节名称和长度(请不要以它为例来说明样式!):
    #include <stdio.h>
    #include <arpa/inet.h>

    int main(int argc, char **argv) {
            analyze(argv[1]);
    }

    int analyze(char *filename) {
            FILE *fp;
            struct {
                    char tag[4];
                    int  x0;
                    int  x1;
                    int  x2;
            }  header;
            int length;

            if ((fp=fopen(filename, "rb"))==NULL) {
                    perror(filename); return;
            }
            while (fread(&header, sizeof header, 1, fp)) {
                    header.x0=ntohl(header.x0);
                    header.x1=ntohl(header.x1);
                    header.x2=ntohl(header.x2);
                    printf("%04x %4.4s: %08x (%06d) | %08x (%06d) | %08x (%06d)\n",
                            ftell(fp)-sizeof(header),
                            header.tag,
                            header.x0, header.x0,
                            header.x1, header.x1,
                            header.x2, header.x2
                    );
                    if (!memcmp(header.tag, "PMAI", 4)) {   // outer container
                            length=header.x0;               // just skip header
                    } else if (!memcmp(header.tag, "PPTH", 4)) {
                            int i;
                            for (i=0; i<header.x2; i+=2) {
                                    getc(fp);
                                    putchar(getc(fp));
                            }
                            putchar('\n');
                            continue;
                    } else {
                            length=header.x1;               // else skip data
                    }
                    fseek(fp, length-sizeof(header), 1);
            }
    }


因此,PMAI是容器。 PPTH是MP3文件的名称。 PVBR可能是有关可变比特率,PQTZ量化以及PWAV,PWV2和PWV3各种波形的信息。这仅使PCOB和PKEY可能包含比特率。不幸的是,如果您看一下以下内容的十六进制转储:这些都不是170。

本文说“如果rekordbox在启动时崩溃,请将database.backup.edb重命名为database.edb,如果仍然崩溃,请删除所有数据文件” 。由于BPM似乎没有存储在ANLZ。*文件中-您也有database.edb吗? BPM可以存储在这里吗?

评论


谢谢!我觉得没有意识到它可以存储在其他地方有些愚蠢。该软件可让您设置存储分析数据的路径,但始终将其edb文件粘贴在用户AppData中。无论如何,edb文件看起来绝对是包含BPM的文件,正如我所看到的(看起来像字段定义)名为“ BPM”。这是edb文件。做一些研究,似乎扩展名通常用于MS Outlooks“ Exchange Databse”文件,但这似乎很愚蠢。

–埃文·普赫塞(Evan Purkhiser)
2014年5月11日21:53

因此,edb文件不是开放格式。

–埃文·普赫塞(Evan Purkhiser)
2014年5月11日在22:04

哇,埃文(Evan),自您提出这个问题以来,我们已经走了很长一段路(当我初次听到您的声音时,我才意识到是您提出了这个问题-在开始导致痢疾的研究时就曾见过) )。我们已经很好地弄清楚了有线协议,可以直接从网络上的先锋硬件收集这些数据。有关详细信息,请参见github.com/brunchboy/dysentery/blob/master/doc/Analysis.pdf,但我仍然希望能够对拇指驱动器上的文件进行离线分析。我们需要的是有人找出元数据的edb文件。有希望吗

–詹姆斯·埃利奥特(James Elliott)
2015年6月9日14:17

嗨,詹姆斯,我想提供帮助,因为我已经开始进行一些倒车,但由于时间和动力不足而放弃了。如您所知,EDB是一种数据库格式(deviceSQL),可以在很久以前尝试使用,但是以后没有了(在任何地方都找不到程序)。如上所述,大多数元数据都在file.DAT和file.EXT中。我的所有研究都完全是黑盒,因此完全合法(AFAIK)。

– CodeKiller
17年6月27日在16:10

那太好了!目前,正在运行的节目要使用元数据和全套CDJ的人们需要在DJ将相同的媒体装载到所有CDJ之前,通过网络从CDJ缓慢收集所有元数据。可以在演出前直接从记忆棒中读取它,这将是巨大的帮助。

–詹姆斯·埃利奥特(James Elliott)
17年7月7日在16:07

#3 楼

Microsoft的可扩展存储引擎(ESE)使用EDB格式为许多应用程序和服务(Exchange,Active Directory,桌面搜索,Windows Live Mail等)提供存储后端。

尽管EDB格式本身未记录,但Windows API很好地支持了该格式。您想要做的是以人类可读的方式浏览EDB文件的内容,EseDbViewer工具非常好。

评论


嗨-我知道这个答案如果5岁,所以我不希望很多信息仍然有用。我只想对OP进行类似的操作,但我想破解Rekordbox中的播放列表数据。您是否对哪个文件有此想法以及最佳的读取方式有什么想法?

–叶夫根尼·辛金(Yevgeny Simkin)
9月1日下午3:56