This is slider.c in view mode; [Download] [Up]
#include "../H/ugens.h"
#include "../H/sfheader.h"
#include "../macros/macros.h"
#include <stdio.h>
#include <sys/file.h>
#include <sys/types.h>
#define AMPTABLE 8192
extern SFHEADER sfdesc[NFILES];
char *analysis;
float tablevals[3],amptablevals[3];
float amparray[AMPTABLE],pitchamparray[AMPTABLE];
float glissarray[AMPTABLE];
int fd,tablesize,pcurve;
float bot_freq,top_freq;
double slider(p,n_args)
float *p;
{
/* p0=start, p1=dur, p2=pitch1, p3=pitch2 */
int i,nsamps,len,risef,j,kontrol,wave,chans;
int ipan,igliss,iwave,iamp;
float one=1.0;
float out[2],dur,psi,gsi,asi,si,*fwave,*fgliss,*famp,*fpan,pctlft,sig;
float wtabs[4],gtabs[4],atabs[4],ptabs[4];
float lo_pitch,hi_pitch,pitch,jpitch;
float apitch,gpitch,ppitch;
float lo_amp,hi_amp,amp;
int wavelen,glisslen,amplen,panlen;
float wphase,gphase,aphase,pphase,transp,thresh,pchanalamp;
int output=1;
j= out[1] = out[0] =wphase = gphase = aphase = pphase = 0;
dur=p[1];
tableset(p[1],tablesize,tablevals);
tableset(p[1],AMPTABLE,amptablevals);
if((p[2] < 20) && !pcurve) lo_pitch = octpch(p[2]);
else if(pcurve) {
if(p[2] <= 4.) lo_pitch = bot_freq * p[2];
else lo_pitch=p[2];
}
else lo_pitch = p[2];
if((p[3] < 20) && !pcurve) hi_pitch = octpch(p[3]);
else if(pcurve) {
if(p[3] <= 4.) hi_pitch = top_freq * p[3];
else hi_pitch=p[3];
}
else hi_pitch = p[3];
iwave=1;
kontrol = SR/200;
chans=sfchans(&sfdesc[output]);
if(chans != 1) {
printf("We want a MONO output file!\n");
exit(-1);
}
fwave = floc(iwave);
wavelen = fsize(iwave);
gsi=kontrol*gpitch*glisslen/(SR*dur);
nsamps = setnote(p[0],dur,output);
transp = octpch(p[4]);
thresh = p[5];
for (i = 0; i < nsamps; i++) {
while(!j--) {
jpitch = tablei(i,glissarray,tablevals);
pitch=lo_pitch + jpitch*(hi_pitch-lo_pitch);
if(pcurve) {
pitch=ABS((jpitch-bot_freq)/(top_freq-bot_freq)
* (hi_pitch - lo_pitch) + lo_pitch);
pitch = cpsoct(octcps(pitch)+transp);
}
if((p[2] < 20) && !pcurve) pitch = cpsoct(pitch);
si = pitch*wavelen/SR;
amp = tablei(i,amparray,amptablevals);
if(pcurve) {
pchanalamp = tablei(i,pitchamparray,tablevals);
if(pchanalamp > thresh) amp *= pchanalamp;
else amp=0;
}
j=kontrol;
}
sig = oscili(amp,si,fwave,wavelen,&wphase);
out[0] = sig;
ADDOUT(out,output);
}
endnote(output);
}
double wave(p,n_args)
float *p;
{
float array[256];
int i;
/* wave form will be gen array 1 */
array[0] = 1;
array[1] = 10;
array[2] = 4096;
for(i=3; i<256; i++) {
if((i-3) == n_args) break;
array[i] = p[i-3];
}
makegen(array,n_args+3);
}
double envelope(p,n_args)
float *p;
{
int i;
setline(p,n_args,AMPTABLE,amparray);
}
double glissform(p,n_args)
float *p;
{
int i;
tablesize = AMPTABLE;
pcurve = 0;
setline(p,n_args,AMPTABLE,glissarray);
}
double pitch_dataset(p,n_args)
float *p;
{
int ii;
ii = (int) p[0];
analysis = (char *) ii;
fd = fopen(analysis,"r");
if(fd <= 0) {
printf("cant open pitch analysis\n");
closesf();
}
}
double pitch_curve(p,n_args)
float *p;
{
int frame1,frame2,i,j,error;
frame1 = p[0]; frame2 = p[1];
error = fseek(fd,(frame1)*8,0);
if(error < 0) {
printf("bad seek on pitchdataset\n");
closesf();
}
error = fread(glissarray,sizeof(float),(frame2-frame1+1)*2,fd);
if(error < 0) {
printf("bad read on pitchdataset\n");
closesf();
}
bot_freq=999999; top_freq=-1;
for(j=i=0; j<(frame2-frame1+1); i += 2,j++) {
glissarray[j] = glissarray[i];
if(glissarray[j] >= top_freq) top_freq=glissarray[j];
if(glissarray[j] <= bot_freq) bot_freq=glissarray[j];
pitchamparray[j] = glissarray[i+1];
}
tablesize = frame2-frame1+1;
pcurve = 1;
printf("bottom pitch = %f; top pitch = %f\n",bot_freq,top_freq);
}
int NBYTES = 32768;
profile()
{
UG_INTRO("slider",slider);
UG_INTRO("wave",wave);
UG_INTRO("envelope",envelope);
UG_INTRO("glissform",glissform);
UG_INTRO("play_frames",pitch_curve);
UG_INTRO("pitch_dataset",pitch_dataset);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.