Hi,
I've posted the following message in Rosegarden-devel mailing list, and
Michael pointed me to an old thread from you about the same subject:
http://www.mail-archive.com/[EMAIL PROTECTED]/msg03322
Attached is a little program summarizing what I have found about the file
format at this moment. I would like to know if you have more information,
ideas or want to collaborate in this task.
Regards,
Pedro
On Sunday 29 August 2004 01:50, Pedro Lopez-Cabanillas wrote:
> Hi,
>
> I have many old songs, stored as Cakewalk "WRK" files, and I don't use
> Cakewalk or Sonar anymore. I'm not planning to do so in the future, 'cause
> I'm sure I will use Rosegarden. Of course.
>
> So, I need to convert my old WRK files to Rosegarden. But the WRK file is a
> closed format, and not publicly documented. It will be necessary to reverse
> engineer it, to rescue my old loved melodies along with the pile of shit.
>
> My plan is to first write a 'cake2rg' standalone utility, to start learning
> the file format and meanwhile to produce some practical results. After
> that, I hope to be able to import the files directly into Rosegarden. This
> won't happen before 1.0-final.
>
> If somebody had the same idea and has the work almost finished, please let
> me know ;-). Let's avoid duplicated work.
>
> Comments, please.
>
> Regards,
> Pedro
/*
* Cakewalk (WRK) file format test
*
* Copyright (c) 2004 Pedro Lopez-Cabanillas All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *file;
char *buffer;
char *HEADER = "CAKEWALK";
int vma, vme;
#define BUFSIZE 1024
#define TRACK_CHUNK 1
#define STREAM_CHUNK 2
#define VARS_CHUNK 3
#define METER_CHUNK 4
#define TEMPO_CHUNK 5
#define SYSEX_CHUNK 6
#define MEMRGN_CHUNK 7 // ???
#define TIMEBASE_CHUNK 0x0A // if present should be the first chunk in the file.
#define END_CHUNK 0xff
void readBuffer(long count)
{
if (count > BUFSIZE)
fseek(file, count, SEEK_CUR);
else
fread(buffer, count, 1, file);
}
void readFileVersion()
{
fgetc(file);
vme = fgetc(file);
vma = fgetc(file);
}
int readChunk()
{
int len;
int ck = fgetc(file);
if (ck != END_CHUNK) {
fread(&len, sizeof(len), 1, file); // not portable
readBuffer(len);
}
printf(" %02x", ck);
return ck;
}
void cakeTest(char *fileName)
{
int ck_id;
printf("File: %s\n", fileName);
file = fopen(fileName, "r");
if (!file) {
printf(" Error reading the file\n");
} else {
readBuffer(strlen(HEADER));
if (strcmp(buffer, HEADER)) {
printf(" Bad file format\n");
} else {
readFileVersion();
printf(" file version: %d.%d\n", vma, vme);
printf(" file chunks:");
do
ck_id = readChunk();
while (ck_id != END_CHUNK);
fgetc(file);
printf("\n");
if (!feof(file)) {
printf(" Corrupted file\n");
}
}
fclose(file);
}
}
int main(int argc, char *argv[])
{
int i;
buffer = malloc(BUFSIZE);
for (i = 1; i < argc; i++)
cakeTest(argv[i]);
return EXIT_SUCCESS;
}