This is tempo.c in view mode; [Download] [Up]
#include <math.h> #define TLEN 20 /* maximum number of time/tempo pairs */ #define TLENP 21 #define TWO 2. float time[TLENP],temp[TLENP],rtime[TLENP],accel[TLENP],BASIS = 60.; short tset = 0,npts; tbase(p,n_args) float *p; { BASIS = p[0]; } tempo(p,n_args) float *p; { short m; float dur,prvbt; if(!n_args) { printf("n_args = %d\n",n_args); printf("Tempo changes cleared out\n"); tset = 0; return; } tset = 1; for(m=0;m<TLEN;m++) time[m]=temp[m]=rtime[m]=accel[m]=0; for(m=0,npts=1; m<TLEN; m += 2, npts++) { if((m) && (m >= n_args)) break; time[npts] = p[m]; temp[npts] = p[m+1]/BASIS; } rtime[npts] = time[npts] = .999999e+10; temp[npts] = temp[npts-1]; temp[0] = temp[1]; time[0] = rtime[0] = accel[0] = prvbt = 0.; for(m=0; m<npts; m++) { dur = time[m+1] - time[m]; if(!dur) { accel[m] = 0; rtime[m+1] = rtime[m]; } else { accel[m] = (float)(pow((double)temp[m+1],TWO) - pow((double)temp[m],TWO))/ (2.*dur); if(!accel[m]) rtime[m+1] = dur/temp[m]+prvbt; else rtime[m+1] = (float) (sqrt(pow((double)temp[m],TWO)+ (double)(TWO* accel[m]*dur))-temp[m])/ accel[m] + prvbt; } prvbt = rtime[m+1]; } /* for(m=0; m<=npts; m++) printf("%d %f %f %f %f\n",m,temp[m],accel[m],rtime[m],time[m]); */ } float time_beat(timein) float timein; { int m = 0; float durp = 0; if(!tset) return(timein); if(timein) for(m=0; m<=npts; m++) { if(timein > time[m] && timein <= time[m+1]) { durp = timein-time[m]; break; } } if(!accel[m]) return(durp/temp[m] + rtime[m]); return(((float)sqrt(pow((double)temp[m],TWO)+ (double)(TWO * accel[m] * durp)) - temp[m])/ accel[m] + rtime[m]); } float beat_time(beatin) /* returns beats from times */ float beatin; { int m=0; if(!tset) return(beatin); if(beatin) for(m=0; m<=npts; m++) if(beatin > rtime[m] && beatin <= rtime[m+1]) break; if(!accel[m]) return((beatin-rtime[m])*temp[m] + time[m]); return(((float)pow((double)((beatin-rtime[m]) * accel[m]+temp[m]),TWO) -(float)pow((double)temp[m],TWO))/(TWO * accel[m]) + time[m]); } t(p,n_args) float *p; { float time_beat(),x,y; x = time_beat(p[0]); y = beat_time(p[0]); printf("%f %f %f\n",p[0],x,y); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.