ftp.nice.ch/pub/next/unix/audio/cmusic.bs.N.tar.gz#/src/cmusic/ug.trans.c

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

/* General Transition Generator */

#include "mm.head.h"
#include "ug.head.h"

#define	SEGNO	1
#define	SEGLEN	2
#define	PLACE	3
#define	T	4
#define	V	5
#define	A	6

transit

UGHEAD{
    UGINIT ;
    float transexp(), a, d, t, N, D, fac ;
    long SS1, SS0, SSE ;
    float dD ;

    if(VAL(SEGNO)==0.0){
	VAL(SEGNO) = 1.0 ;
	VAL(PLACE) = 0.0 ;
	SS1 = VAL(SEGNO)*3. + 4. ;
	SS0 = (VAL(SEGNO) - 1.0)*3. + 4. ;
	SSE = narg - 2 ;
	if(narg < 9 || (narg-9)%3){
	    Error++ ;
	    PROUT("TRANS: Illegal number (%d) of arguments\n", narg) ;
	    return ;
	}
	if(VAL(SSE) <= 0.)
	{
	    Error++ ;
	   PROUT("TRANS: Non-increasing time values at time %.3f\n", VAL(SS1)) ;
	    return ;
	}
	for( ; SS1<=SSE; SS1 += 3)
	 if( *(note->plist+4) * Srate * 
	   (VAL(SS1) - VAL((SS1-3))) / VAL(SSE) < 1.0) {
	    Error++ ;
	   PROUT("TRANS: Non-increasing time values at time %.3f\n", VAL(SS1)) ;
	    return ;
	 }
	SS1 = VAL(SEGNO)*3. + 4. ;
	VAL(SEGLEN) = *(note->plist+4) * Srate * 
	  (VAL(SS1) - VAL(SS0)) / VAL(SSE) ;
    }
    SS1 = VAL(SEGNO)*3. + 4. ;
    SS0 = (VAL(SEGNO) - 1.0)*3. + 4. ;
    SSE = narg - 2 ;
    a = VAL(SS0+1) ;
    d = VAL(SS1+1) - a ;
    t = VAL(SS0+2) ;
    if(t != 0.0) D = 1.0 - transexp( t ) ; else D = VAL(SEGLEN);
    D = 1.0 / D ;
    dD = d*D ;
    fac = t / VAL(SEGLEN) ;

    { register float place = VAL(PLACE)  ;
      register float seglen = VAL(SEGLEN)  ;
	UGLOOP{
	    if(place > seglen ) {
		VAL(SEGNO) += 1.0 ;
		place = 0.0 ;
		SS1 = VAL(SEGNO)*3. + 4. ;
		SS0 = (VAL(SEGNO) - 1.0)*3. + 4. ;
		SSE = narg - 2 ;
		seglen = *(note->plist+4) * Srate *
		  (VAL(SS1) - VAL(SS0)) / VAL(SSE) ;
		a = VAL(SS0+1) ;
		d = VAL(SS1+1) - a ;
		t = VAL(SS0+2) ;
		if(t != 0.0) D = 1.0 - transexp( t ) ; else D = seglen ;
		D = 1.0 / D ;
		fac = t / seglen  ;
		dD = d*D ;
	    }
	    if(t != 0.0) N = 1.0 - transexp( place*fac ) ; 
	     else N = place  ;
	    VAL(OUT)++ = a + N*dD ;
	    place += 1.0 ;

	    UGEND(1)
	}
	VAL(PLACE) = place  ;
	VAL(SEGLEN) = seglen  ;
    }
}
int	errno ;
static double	p0	= .2080384346694663001443843411e7 ;
static double	p1	= .3028697169744036299076048876e5 ;
static double	p2	= .6061485330061080841615584556e2 ;
static double	q0	= .6002720360238832528230907598e7 ;
static double	q1	= .3277251518082914423057964422e6 ;
static double	q2	= .1749287689093076403844945335e4 ;
static float	log2e	= 1.4426950408889634073599247 ;
static double	sqrt2	= 1.4142135623730950488016887 ;
static double	maxf	= 10000 ;

float transexp(arg) float arg ; {
    double fract ;
    double temp1, temp2, xsq ;
    int ent ;

    arg *= log2e ;
    ent = arg >= 0 ? arg : arg - 1. ;
    fract = (arg-ent) - 0.5 ;
    xsq = fract*fract ;
    temp1 = ((p2*xsq+p1)*xsq+p0)*fract ;
    temp2 = ((1.0*xsq+q2)*xsq+q1)*xsq + q0 ;
    return(ldexp(sqrt2*(temp2+temp1) / (temp2-temp1), ent)) ;
}

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