From taipan.waterloo.edu!sgroup-owner Wed Jun 24 16:24:38 1992
Received: from math.waterloo.edu ([129.97.140.144]) by watdragon.waterloo.edu with SMTP id <168253>; Wed, 24 Jun 1992 16:24:30 -0400
Received: from taipan.waterloo.edu by math.waterloo.edu with SMTP
	id <AA18239>; Wed, 24 Jun 92 16:24:16 -0400
Received: from ifi.uio.no ([129.240.64.2]) by taipan.uwaterloo.ca with SMTP id <31137>; Wed, 24 Jun 1992 16:18:16 -0400
Received: from gyda.ifi.uio.no by ifi.uio.no with SMTP 
	id <AAifi.uio.no14430>; Wed, 24 Jun 1992 22:17:44 +0200
From: Thomas Flemming <thomasfl@ifi.uio.no>
Received: by gyda.ifi.uio.no ; Wed, 24 Jun 1992 22:17:43 +0200
Date: Wed, 24 Jun 1992 16:17:43 -0400
Message-Id: <199206242017.AAgyda.ifi.uio.no26712@gyda.ifi.uio.no>
To: sgroup@taipan
Subject: Re: Re: Samlabel V1.01
Status: RO

> > 
> > #include <stdio.h>
> > #include "rs12.h"
>	    ^^^^^^
>
> I don't suppose this one is a standard header file for most
> C compilers  :-)
>
> gfd

Okay, okay! 

By global demand; here it is, the superb original Roland-disk headerfile.

PS! Has anyone written any program to defragmentate disks? Why not make
    a program that transform the contents into two samples in bank A and B,
    and the rest into sub-tones? It shouldn`t be that hard, but`s proabably
    a lot of work.

-Thomas :->


#ifndef RS12_H
#define RS12_H

/************************************************************************/
/* NAME									*/
/*	rs12.h								*/
/* DESCRIPTION								*/
/*	Roland 12-bit-sampler disk format for the S-550, S-330,	etc.).	*/
/* AUTHOR								*/
/*	Copyright 1992 by Gary J. Murakami <gjm@research.att.com>	*/
/*	V1.0 (4 May 1992) Freely distibutable for non-comercial use.	*/
/*	All other rights reserved.					*/
/************************************************************************/

#define	SamplesPerSegment	12288

typedef unsigned char byte;

typedef struct systemProgram
{	char	data[0176000];		/* 0xFC00 == 64512 */
} SystemProgram;

typedef struct patchParameter
{	byte	patchName[12];
	byte	bendRange;
	byte	dummy1[1];
	byte	afterTouchSense;
	byte	keyMode;
	byte	velocitySwThreshold;
	byte	toneToKey1[109];
	byte	toneToKey2[109];
	byte	copySource;
	byte	octaveShift;
	byte	outputLevel;
	byte	dummy2[1];
	byte	detune;
	byte	velocityMixRatio;
	byte	afterTouchAssign;
	byte	keyAssign;
	byte	outputAssign;
	byte	dummy3[12];
} PatchParameter;

typedef struct functionParameter
{	byte	masterTune;
	byte	dummy1[13];
	byte	audioTrig;
	byte	dummy2[1];
	byte	voiceMode;
	byte	multiMidiRxCh[8];
	byte	multiPatchNumber[8];
	byte	dummy3[9];
	byte	keyboardDisplay;
	byte	multiLevel[8];
	byte	diskLabel[60];
	byte	dummy4[4];
	byte	externalController;
	byte	dummy5[140];
} FunctionParameter;

typedef struct midiParameter
{	byte	dummy1[32];
	byte	rxChannel[8];
	byte	rxProgramChange[8];
	byte	rxBender[8];
	byte	rxModulation[8];
	byte	rxHold[8];
	byte	rxAfterTouch[8];
	byte	rxVolume[8];
	byte	rxBendRange[8];
	byte	dummy2[1];
	byte	systemExclusive;
	byte	deviceId;
	byte	dummy3[1];
	byte	rxProgramChangeNumber[32];
	byte	dummy4[124];
} MidiParameter;

typedef struct toneParameter
{	byte	toneName[8];
	byte	outputAssign;
	byte	sourceTone;
	byte	orgSubTone;
	byte	samplingFrequency;
	byte	origKeyNumber;
	byte	waveBank;
	byte	waveSegmentTop;
	byte	waveSegmentLength;
	byte	startPoint[3];
	byte	endPoint[3];
	byte	loopPoint[3];
	byte	loopMode;
	byte	tvaLfoDepth;
	byte	dummy1[1];
	byte	lfoRate;
	byte	lfoSync;
	byte	lfoDelay;
	byte	dummy2[1];
	byte	lfoMode;
	byte	oscLfoDepth;
	byte	lfoPolarity;
	byte	lfoOffset;
	byte	transpose;
	byte	fineTune;
	byte	tvfCutOff;
	byte	tvfResonance;
	byte	tvfKeyFollow;
	byte	dummy3[1];
	byte	tvfLfoDepth;
	byte	tvfEgDepth;
	byte	tvfEgPolarity;
	byte	tvfLevelCurve;
	byte	tvfKeyRateFollow;
	byte	tvfVelocityRateFollow;
	byte	dummy4[1];
	byte	tvfSwitch;
	byte	benderSwitch;
	byte	tvaEnvSustainPoint;
	byte	tvaEnvEndPoint;
	byte	tvaEnvLevel1;
	byte	tvaEnvRate1;
	byte	tvaEnvLevel2;
	byte	tvaEnvRate2;
	byte	tvaEnvLevel3;
	byte	tvaEnvRate3;
	byte	tvaEnvLevel4;
	byte	tvaEnvRate4;
	byte	tvaEnvLevel5;
	byte	tvaEnvRate5;
	byte	tvaEnvLevel6;
	byte	tvaEnvRate6;
	byte	tvaEnvLevel7;
	byte	tvaEnvRate7;
	byte	tvaEnvLevel8;
	byte	tvaEnvRate8;
	byte	dummy5[1];
	byte	tvaEnvKeyRate;
	byte	level;
	byte	envVelRate;
	byte	recThreshold;
	byte	recPreTrigger;
	byte	recSamplingFrequency;
	byte	recStartPoint[3];
	byte	recEndPoint[3];
	byte	recLoopPoint[3];
	byte	zoomT;
	byte	zoomL;
	byte	copySource;
	byte	loopTune;
	byte	tvaLevelCurve;
	byte	dummy6[12];
	byte	loopLength[3];
	byte	pitchFollow;
	byte	envZoom;
	byte	tvfEnvSustainPoint;
	byte	tvfEnvEndPoint;
 	byte	tvfEnvLevel1;
	byte	tvfEnvRate1;
	byte	tvfEnvLevel2;
	byte	tvfEnvRate2;
	byte	tvfEnvLevel3;
	byte	tvfEnvRate3;
	byte	tvfEnvLevel4;
	byte	tvfEnvRate4;
	byte	tvfEnvLevel5;
	byte	tvfEnvRate5;
	byte	tvfEnvLevel6;
	byte	tvfEnvRate6;
	byte	tvfEnvLevel7;
	byte	tvfEnvRate7;
	byte	tvfEnvLevel8;
	byte	tvfEnvRate8;
	byte	afterTouchSwitch;
	byte	dummy7[2];
} ToneParameter;

typedef struct toneList
{	byte	toneName[8];
	byte	unknown[8];
} ToneList;

typedef struct waveData
{	byte	data[SamplesPerSegment*3/2];
} WaveData;

typedef struct disk
{	SystemProgram		systemProgram;		/* 0000000 */
	PatchParameter		patchParameter[16];	/* 0176000 */
	FunctionParameter	functionParameter;	/* 0206000 */
	MidiParameter		midiParameter;		/* 0206400 */
	ToneParameter		toneParameter[32];	/* 0207000 */
	ToneList		toneList[32];		/* 0217000 */
	WaveData		waveDataA[18];		/* 0220000 */
	WaveData		waveDataB[18];
} Disk;

#endif


