[linux-audio-dev] Cakewalk file format

Kevin Hremeviuc khremeviuc at yahoo.com
Mon Aug 30 23:42:09 UTC 2004


Hi Pedro,

I found a Cakewalk wrk to midi converter program put
out by cakewalk themselves that handles cakewalk
version 1 or 2 (can't remember which) files.
Unfortunately all my files are version 3. It worked on
some of them though.

Let me know if you want a copy. Maybe you can look at
the program to get some hints.

Kev


 --- Pedro Lopez-Cabanillas <plcl at telefonica.net>
wrote: 
> 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/linux-audio-dev@music.columbia.edu/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;
> }
>  


	
	
		
___________________________________________________________ALL-NEW Yahoo! Messenger - all new features - even more fun!  http://uk.messenger.yahoo.com



More information about the Linux-audio-dev mailing list