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;
}

Reply via email to