							/*	UGRW1.H	
							 */

/*
 *	Unit generators by Robin Whittle 		6 January 1996
 *	Header file containing data structures for UGRW1.C.
 *	
 */

				/* TABLEW data structure used by all the
				 * tablew subroutines.
				 */	
typedef struct {

				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;

				/* Seven pointers to input arguments. 
				 *
				 * xsig		Input value to write to table.
				 * 
				 * xndx  	Index into the table
				 *		where we want to write.
				 * 
				 * xfn		Number of table we are
				 * 		writing to.
				 *
				 * ixmode	Index mode (optional parm).
				 * 		0 --> Use raw xfn and ixoff.
				 *		1 --> Use these with a range of
				 *		      0 to 1 for the entire 
				 *    		      range of the table.
				 *
				 * ixoff	Offset (optional parm). 
				 *		Fixed value to add to ndx.
				 *
				 * iwgmode	Wrap and guard point mode 
				 *		(optional parm).
				 *
				 * 		0 --> Limit mode. 
				 *		      Limit indx to between 0 	
				 * 		      and length of table.		      
				 *
				 *		1 --> Wrap mode.
				 *		      Index wraps around modulo
				 * 		      length.
				 *
				 *		2 --> Guardpoint mode.
				 * 		      Write with 0.5 step 
				 * 		      offset, and write both
				 *		      location 0 and the 
				 *		      guardpoint with the 
				 *		      same data.
				 */

	float	*xsig, *xndx, *xfn;

	float	*ixmode, *ixoff, *iwgmode;


				/* Internal variable for previous state
				 * of xfn.
				 */
	long	pfn;

				/* Internal variable for what to multiply 
				 * the ndx and ixoff by. Set to 1 or table 
				 * length by tblwset() depending on ixmode.
				 */
	long   	xbmul;

				/* Internal variable for iwrap and igmode.
				 */
	long	iwgm;


				/* Internal variable for offset.
				 */
	float	offset;
	
				/* Pointer to data structure used to access 
				 * function table. See CS.H.  
				 * tblwset() writes this, based on the value 
				 * of xfn.
				 */
	FUNC	*ftp;
				

} TABLEW;
				/*-------------------------------------------*/

				/* TABLENG data structure used by function
				 * tableng to return the length of the table.
				 *
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointer to arguments. 
				 *
				 * kout		Output pointer.
				 *
				 * xfn		Points to input parameter -
				 *		the number of the table.
				 */
	float	*kout, *xfn;

} TABLENG;
				/*-------------------------------------------*/

				/* TABLEGPW data structure used by function
				 * tablegpw to write the guard point of a 
				 * specified table.
				 *
				 * No output arguments.
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointer to input argument. 
				 *
				 * xfn		Points to number of table.
				 */
	float	*xfn;

} TABLEGPW;


				/*-------------------------------------------*/

				/* TABLEMIX data structure used by function
				 * tablemix.
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointer to nine input arguments. 
				 *
				 * See doco in ugrw2.c - too many to list 	
				 * here.
				 */

	float	*dft, *doff, *len, *s1ft, *s1off, *s1g, *s2ft, *s2off, *s2g;

				/* Storage to remember what the table numbers
				 * were from a previous k cycle, and to 
				 * store pointers to their FUNC data 
				 * structures.
				 *
				 * Ints:
				 *
				 * pdft		Previous destination and
				 * ps1ft ps2ft	source function table numbers.
				 *
				 * Pointers to FUNC data structures:
 				 *
				 * funcd	 Destination.
				 * funcs1 funcs2 Source.	
				 */

	int	pdft, ps1ft, ps2ft;

	FUNC	*funcd, *funcs1, *funcs2;

} TABLEMIX;

				/*-------------------------------------------*/

				/* TABLECOPY data structure used by function
				 * tablecopy.
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointers to two input arguments. 
				 *
				 * dft	Destination function table number.
				 *
				 * sft	Source function table number.
				 */
	float	*dft, *sft;

				/* Storage to remember what the table numbers
				 * were from a previous k cycle, and to 
				 * store pointers to their FUNC data 
				 * structures.
				 *
				 * Ints:
				 *
				 * pdft		Previous destination and
				 * psft		source function table numbers.
				 *
				 * Pointers to FUNC data structures:
 				 *
				 * funcd	Destination.
				 * funcs	Source.	
				 */
	int	pdft, psft;

	FUNC	*funcd, *funcs;

} TABLECOPY;

				/*-------------------------------------------*/

				/* TABLERA data structure used by tablera
				 * subroutine.
				 */	
typedef struct {

				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointer to output argument:
				 *
				 * adest	A rate destination for the 
				 *		ksmps floats read from the 	
				 * 		table.
				 *
				 * Pointers to input arguments. 
				 *
				 * kfn		Number of table we are
				 * 		reading from.
				 *
				 * kstart	Index mode within table from
				 *		which we start reading.
				 *
				 * koff		Offset to add to table 
				 *		index.
				 */

	float	*adest, *kfn, *kstart, *koff;

				/* Internal variable for previous state
				 * of xfn.
				 */
	long	pfn;
	
				/* Pointer to data structure used to access 
				 * function table. See CS.H.  
				 */
	FUNC	*ftp;
				

} TABLERA;

				/*-------------------------------------------*/

				/* TABLEWA data structure used by tablewa
				 * subroutine.
				 */	
typedef struct {

				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointer to output argument:
				 *
				 * kstart	Index mode within table from
				 *		which we start reading.
				 *
				 *		Note this is also an input
				 *		argument.  First we read it
				 *		to determine where we should
				 *		start writing the a rate
				 *		samples. When we have finished
				 *		we write to it the number of
				 *		the next location which should
				 *		be written.
				 *
				 * Pointers to input arguments. 
				 *
				 * kfn		Number of table we are
				 * 		reading from.
				 *
				 * asig		a rate input signal.
				 *
				 * koff		Offset to add to table 
				 *		index.
				 */

	float	*kstart, *kfn, *asig, *koff;

				/* Internal variable for previous state
				 * of xfn.
				 */
	long	pfn;
	
				/* Pointer to data structure used to access 
				 * function table. See CS.H.  
				 */
	FUNC	*ftp;
				

} TABLEWA;




/*****************************************************************************/

				/* Data structures for the zak family of 
				 * ugens for patching data at i, k or a rates.
				 *
				 * See also four global variables declared in
				 * the C code.
				 */


				/* ZAKINIT data structure for zakinit().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Two pointers to input arguments. 
				 *
				 * isizea  	Number of a locations, each an
				 *		array of ksmps long, to 
				 *		to reserve for a rate patching.
				 *	
				 * isizek	Number of locations for i or k
				 *		rate variables.
				 * 
				 */

	float	*isizea, *isizek;

} ZAKINIT;

				/* ZKR data structure for zir() and zkr().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointers to floats. 
				 *
				 * rslt		Where to write the value which
				 *		we read from the zk location.
				 *
				 * ndx		Input argument: 
				 *		Location in zk space to read.
				 */

	float	*rslt, *ndx;

} ZKR;


				/* ZKW data structure for ziw() and zkw().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Two pointers to float input arguments. 
				 *
				 * sig		Value to write.
				 *
				 * ndx		Locations to read.
				 */

	float	*sig, *ndx;

} ZKW;

				/* ZKWM data structure for ziwm() and zkwm().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Three pointers to float input arguments. 
				 *
				 * sig		Value to write.
				 *
				 * ndx		Locations to read.
				 *
				 * mix		0 for write directly,
				 *		!0 for mix - add to the 
				 *		current value in the variable.
				 */

	float	*sig, *ndx, *mix;

} ZKWM;

				/* ZKMOD data structure for zkmod().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;

				/* Pointers to floats:
				 *
				 * rslt		Points to where to write
				 *		output.  
				 * 
				 * Two pointers to float input arguments. 
				 *
				 * sig		Value to modulate.
				 *
 				 * zkmod	Which zk variable to use
				 *		to modulate sig.
				 */

	float	*rslt, *sig, *zkmod;

} ZKMOD;

				/* ZKCL data structure for zkcl().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Two pointers to float input arguments. 
				 *
				 * first	First variable to clear.
				 *
				 * last		Final variable to clear.
				 */

	float	*first, *last;

} ZKCL;



				/* ZAR data structure for zar().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointers to floats. 
				 *
				 * rslt		Where to write the value which
				 *		we read from the zk location.
				 *
				 * ndx		Input argument: 
				 *		Location in za space to read.
				 *		
				 *		These both point to arrays
				 *		of a rate variables - arrays
				 *		ksmps long.
				 */

	float	*rslt, *ndx;

} ZAR;


				/* ZARG data structure for zarg().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointers to floats. 
				 *
				 * rslt		Where to write the value which
				 *		we read from the zk location.
				 *
				 * ndx		Input argument: 
				 *		Location in za space to read.
				 *		
				 *		These both point to arrays
				 *		of a rate variables - arrays
				 *		ksmps long.
				 *
				 * kgain	What to multiply the a rate 
				 *		signal by as we read it.
				 */

	float	*rslt, *ndx, *kgain;

} ZARG;


				/* ZAW data structure for zaw().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Two pointers to float input arguments. 
				 *
				 * sig		Value to write.
				 *
				 * ndx		Locations to read.
				 *
				 *		These both point to arrays
				 *		of a rate variables - arrays
				 *		ksmps long.
				 */
	float	*sig, *ndx;

} ZAW;


				/* ZAWM data structure for zawm().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Two pointers to float input arguments. 
				 *
				 * sig		Value to write.
				 *
				 * ndx		Locations to read.
				 *
				 *		These both point to arrays
				 *		of a rate variables - arrays
				 *		ksmps long.
				 *
				 * mix		0 for write directly,
				 *		!0 for mix - add to the 
				 *		current values in the variable.
				 */

	float	*sig, *ndx, *mix;

} ZAWM;

				/* ZAWOD data structure for zamod().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;

				/* Pointers to floats:
				 *
				 * rslt		Points to where to write
				 *		output.  
				 * 
				 * Two pointers to float input arguments. 
				 *
				 * sig		Value to modulate.
				 *
 				 * zamod	Which za variable to use
				 *		to modulate sig.
				 */

	float	*rslt, *sig, *zamod;

} ZAMOD;

				/* ZACL data structure for zacl().
				 */	
typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Two pointers to float input arguments. 
				 *
				 * first	First variable to clear.
				 *
				 * last		Final variable to clear.
				 */

	float	*first, *last;

} ZACL;


/*****************************************************************************/
				
				/* RDTIME data structure for timek(), times(),
				 * instimset(), instimek() and instimes().
				 */

typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;

				/* Only one I/O variable - a pointer to 
				 * where to put the result.
 				 */
	float 	*rslt;

				/* One local variables for the instime srs.
				 *	
				 * instartk	Int to remember what the 
				 *		k counter was when this 
				 *		instance of the instrument
				 *		was initialised.		
				 */
	long	instartk;

} RDTIME;


/*****************************************************************************/
				
				/* PRINTK data structure for printk() and 
				 * printkset().
				 */

typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;

				/* No output variables.
				 *
				 * Three input variables:
				 *
				 * ptime	How much time to 
				 *		leave between each
				 *		print - we generally do
				 *		not want it printing on 
				 *		every k cycle, but make it
				 *		0 if we do.	
				 *	
				 *		Time is in seconds, referenced
				 *		to the absolute time and 
				 *		starting on the k cycle when 
				 *		this ugen is initialised.
				 *
				 * val		Value to print.
				 *
				 * space	Spaces to insert before 
				 *		printing it so that it is 
				 *		easier to see variables
				 *		from different kprint
				 *		instances when looking
				 *		at the screen.
 				 */

	float 	*ptime, *val, *space;

				/* Local variables:
				 * 
				 * initime	Time when this instance was
				 *		initialised.
				 *		
				 * ctime	Cycle time - positive copy of
				 *		*ptime above.	
				 */
	float	initime, ctime;

				/* pspace	How many spaces to print before
				 *		the value.
				 *
				 * cysofar	Number of print cycles so far 
				 *		- where the first one is 0.
				 */
	long	pspace, cysofar;

} PRINTK;


				/* PRINTKS data structure for printks() and 
				 * printksset().
				 */

typedef struct {
				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;

				/* No output variables.
				 * Pointers to four input variables:
				 *
				 * ifilcod	Contains magic number
				 *		sstrcod = SSTRCOD = 0xFFFFFF
				 *		if a string is in quotes for
				 *		the first parameter.  
				 *
				 *		The string itself is pointed
				 * 		to by something more abstruse
				 *		see printks().
				 *
				 * ptime	How much time to 
				 *		leave between each
				 *		print - see notes for PRINTK
				 *
				 * kval1-4	K rate values to print.
 				 */

	float 	*ifilcod, *ptime, *kval1, *kval2, *kval3, *kval4;

				/* Local variables:
				 * 
				 * initime	Time when this instance was
				 *		initialised.
				 *		
				 * ctime	Cycle time - positive copy of
				 *		*ptime above.	
				 */
	float	initime, ctime;

				/* cysofar	Number of print cycles so far 
				 *		- where the first one is 0.
				 */
	long	cysofar;

				/*	
				 * txtsting[]	Place to store the string
				 *		which will be printed.
				 *		printks() writes this.
			 	 * 		Make it nice and long!	
				 */
	char	txtstring[260];	


} PRINTKS;

/*****************************************************************************/


				/* PEAK data structure for peakk() and peaka().
				 */	
typedef struct {

				/* Opcode data structure - see CS.H.
				 */
	OPDS	h;
				/* Pointer to the output variable.
				 */
	float 	*kpeakout;

				/* Pointer to k or a rate input variable.
				 */

	float 	*xsigin;
				/* Pointer to k rate input variable which, 
				 * if set to no zero, causes the ugen to 
				 * clear the accumulator.
				 */
	
} PEAK;
