ftp.nice.ch/pub/next/unix/audio/cmix.s.tar.gz#/cmix/trans/trans.c

This is trans.c in view mode; [Download] [Up]

#include "/musr/H/ugens.h"
#include "/musr/H/sfheader.h"
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h> 
#include <math.h>
#define IWRAP(x,y) (((x)>=(y))?(x)-(y):(((x)<0)?(x)+(y):(x)))
#define SIZE 512

extern int NBYTES;           /* size of buffer to allocate */
extern float SR;

extern SFHEADER      sfdesc[NFILES];
float array[SIZE],tabs[2];	/* for lineset */
extern int lineset;

trans (p,n_args)
    float *p;
    int n_args;
{
    extern struct stat sfst[NFILES];
    double increment, counter = 0.0, frac, amp;
    double voldsig[4], oldsig[4], newsig[4], dur, interval, interp();
    float octpch(), cpsoct(), input[4], sig[4];
    register int getflag = 1, incount = 1, i, j, z;
    register long int insamps, samps,outsamps, limit,outcount = 0;
    register int nchans = sfchans(&sfdesc[0]);
    double pow();

/*  p0 = inskp  p1 = outskp  p2 = dur (tmnd)  p3 = intrvl of trnsp. p4 = amp */

/*    SR = sfsrate(&sfdesc[0]); */
    if(n_args != 6)
    {
	 fprintf(stderr, "Wrong number of args for trans!\n");
	 return;
    }
    interval = octpch(p[3]);  /* convert interval to lin octave */
    increment = cpsoct(10.0+interval)/cpsoct(10.0);  /* the samp incr. */
    increment = pow(2.,p[3]/12.);
    if (p[2] == 0.0)
	p[2] = ((float)(sfst[0].st_size - SIZEOF_BSD_HEADER)
		 /(float)sfclass(&sfdesc[0])/(float)sfchans(&sfdesc[0])
		 /sfsrate(&sfdesc[0])) - p[0];

    dur = (p[2]<0.0)? -1.0*p[2] : p[2] - p[0];       /* p2 is dur if neg. */
    insamps = setnote(p[0], dur, 0);                 /* set input file */
    outsamps = setnote(p[1], (dur/increment), 1);    /* set output file */
printf("insamps and outsamps, dur and increment = %d %d %f %f\n",insamps,outsamps,dur,increment);

    samps = insamps;  /* change logic to specify how many you will write */
    limit =  SR * p[5]/increment;
			/* show how many you can write at this tranposition */
    if(limit < samps) {  /* if you are asking for more than you CAN write */
	printf("warning: you will only get a %f second output for this note\n",(float)limit/SR);
	samps = limit;
	}

    if(!lineset) 
    {
        for(j = 0; j < SIZE; j++) array[j] = 1;
    	fprintf(stderr,"Set phrase curve to all 1's\n");
   	lineset = 1;
    }
    z = SR/100;		      /* the control rate for amp curve */
    j = 0;
    tableset((float)samps/SR, SIZE, tabs);	   /* set up table for amp */
    GETIN(input,0);
    for(i=0; i < nchans; i++) oldsig[i] = input[i];
    GETIN(input,0);
    for(i=0; i < nchans; i++) newsig[i] = input[i];

    /* the processing loop for the input signal */

    while (outcount++ < samps)
    {
        while (getflag)
	{
        	if(!GETIN(input,0)) break;         /* get input samp */ 
		for(i=0; i < nchans; i++)
	        {
		   voldsig[i] = oldsig[i];
		   oldsig[i] = newsig[i];
	  	   newsig[i] = input[i];
		}
		incount++;  
		if ((counter - (float)incount) < 0.5) getflag = 0;
	}
	frac = counter - incount + 2.0;   /* The interp value */
	while (!j--)
	{
		amp = tablei(outcount,array,tabs) * p[4];
		j = z;
	}
	for(i=0; i < nchans; i++)
		sig[i] = interp(voldsig[i], oldsig[i], newsig[i], frac)*amp;
        ADDOUT(sig, 1);
	counter += increment;          /* keeps track of interp pointer */
	if ((counter - (float)incount) >= -0.5) getflag = 1;/* Ready for samp */
    }
    endnote(1);
}

double interp(y0,y1,y2,t)
    register double t, y0, y1, y2;
{
    register double hy2, hy0, a, b, c;
    
    a = y0;
    hy0 = y0/2.0;
    hy2 =  y2/2.0;
    b = (-3.0 * hy0) + (2.0 * y1) - hy2;
    c = hy0 - y1 + hy2;

    return(a + b*t + c*t*t);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.