This is cmusic.c in view mode; [Download] [Up]
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <strings.h>
#include <carl/carl.h>
#include <sys/types.h>
#include <sys/times.h>
#include <sys/file.h>
#include "m.defs.h"
#include "m.globs.h"
#include "ug.defs.h"
#include "ug.globs.h"
#define ERR1(s,v)fprintf(stderr,s,v)
#define ERX1(s,v){fprintf(stderr,s,v);exit(-1);}
main(argc,argv,envp) int argc; char *argv[], **envp;{
FILE *popen();
int i;
char *clean, *merge();
long tbegin, tend, ncmproc;
struct tms *tbpt, tb;
Pi = 4.*atan(1.);
Pi2 = 8.*atan(1.);
fscanf(popen("ps | fgrep cmusic | wc -l", "r"), "%d", &ncmproc);
if(ncmproc-3 > 2)
ERX1("CMUSIC: You are now attempting to run %d cmusic jobs simultaneously\nThat's too many (try using batch)\n", ncmproc-2);
if(ncmproc-3 > 1)
ERR1("CMUSIC: You are now running %d cmusic jobs simultaneously\n", ncmproc-2);
tbegin = gettime();
tbpt = &tb;
if(argc > 1 && *argv[argc-1] != '-') {
if(freopen(argv[argc-1],"r",stdin)==NULL)
ERR1("Can't open '%s'\n",argv[argc-1]);
Infilename =
strcpy(calloc(strlen(argv[argc-1])+1, sizeof(char)), argv[argc-1]);
}
Infile = popen("/lib/cpp -traditional | cat -s","r");
for(i = 1; i < argc; i++)if(*argv[i] == '-')switch(*(++argv[i])){
case 'v': if(!vflag)Verbose = *(++argv[i])=='-'?0:1; vflag++; break;
case 't': if(!tflag)Timer = *(++argv[i])=='-'?0:1; tflag++; break;
case 'n': if(!nflag)Notify = *(++argv[i])=='-'?0:1; nflag++; break;
case 'o': if(!oflag)Nooutput = *(++argv[i])=='-'?0:1; oflag++; break;
#ifdef nextsf
case 'f': i++ ;
if ( i < argc && *argv[i] != '-' )
Outfilename =
strcpy(calloc(strlen(argv[i])+4, sizeof(char)),
argv[i]);
else
Outfilename =
strcpy(calloc(strlen("stdin")+4, sizeof(char)), "stdin");
if ( rindex( Outfilename, '.' ) )
*rindex( Outfilename, '.' ) = '\0' ;
strcat( Outfilename, ".snd" ) ;
break;
#endif
case 'q': Notify = 0; nflag++;
Timer = 0; tflag++;
Verbose = 0; vflag++;
break;
case 'R': if((Srate = expr(++argv[i])) <= 0)
ERX1("CMUSIC: Illegal sampling rate (=%d)\n", Srate);
Rflag++; break;
case 'B': if((Lblocks = expr(++argv[i])) <= 0)
ERX1("CMUSIC: Illegal blocklength (=%d)\n", Lblocks);
Bflag++; break;
case 'L': if((Lfuncs = expr(++argv[i])) <= 0)
ERX1("CMUSIC: Illegal function length (=%d)\n", Lfuncs);
Lflag++; break;
default: ERX1("CMUSIC: Unrecognized flag: '%c%\n", *argv[i]);
}
init();
while( bc = field(fld,SIGS,SBRK) ){
if(bc == EOF){
if(Mergeflag){
fclose(Infile); /* Yes, fclose() - due to merge action */
system(clean);
Infile = PInfile;
Mergeflag = 0;
if(Verbose){PROUT("endmerge;\n",bc);}
continue;
}
else {tersim(); break;}
}
if(S3("com",fld)){SEMIC; continue;}
if(S3("gen",fld)){generator(); continue;}
if(S3("ins",fld)){instrument(); continue;}
if(S3("mer",fld)){clean = merge(); continue;}
if(S3("not",fld) || S3("pla",fld)){play(); continue;}
if(S3("pri",fld)){printout(); continue;}
if(S3("sec",fld)){section(); continue;}
if(S3("set",fld)){set(); continue;}
if(S3("ter",fld)){terminate(); break;}
if(S3("var",fld)){variable(); continue;}
if(!strncmp(" ",fld,strlen(fld))){continue;}
CMD(fld);UNREC;NL;SEMIC;
}
tend = gettime();
times(tbpt);
if(argc > 1 && *argv[argc-1] != '-'){
PROUT("\ncmusic report: scorefile '%s'", argv[argc-1]);
if(Notify) ERR1("\ncmusic report: scorefile '%s'", argv[argc-1]);
}
PROUT("\nSound duration = %.2fs", Endtime);
if(Notify) ERR1("\nSound duration = %.2fs", Endtime);
PROUT(" (%d samples)\n", (long) (Endtime*Srate*Nchan));
if(Notify) ERR1(" (%d samples)\n", (long) (Endtime*Srate*Nchan));
PROUT("Realtime = %ds", tend-tbegin);
if(Notify) ERR1("Realtime = %ds", tend-tbegin);
if(Endtime>0.)PROUT(", Realtime ratio = %.1f\n", (tend-tbegin)/Endtime);
if(Notify) if(Endtime>0.)ERR1(", Realtime ratio = %.1f\n", (tend-tbegin)/Endtime);
PROUT("Compute time = %.2fs",
(tb.tms_utime+tb.tms_cutime)/60.);
if(Notify) ERR1("Compute time = %.2fs",
(tb.tms_utime+tb.tms_cutime)/60.);
if(Endtime>0.)PROUT(", Compute ratio = %.1f\n",
(tb.tms_utime+tb.tms_cutime) /(60.*Endtime));
if(Notify) if(Endtime>0.)ERR1(", Compute ratio = %.1f\n",
(tb.tms_utime+tb.tms_cutime) /(60.*Endtime));
PROUT("Maxamp = %f,",Maxamp);
if(Notify) ERR1("Maxamp = %f,",Maxamp);
PROUT(" Maxecho, = %f",Maxecho);
if(Notify) ERR1(" Maxecho, = %f",Maxecho);
PROUT(" Maxreverb = %f\n",Maxreverb);
if(Notify) ERR1(" Maxreverb = %f\n",Maxreverb);
if(Clipped)PROUT("CMUSIC: %d samples out of range\n",Clipped);
if(Notify) if(Clipped)ERR1("CMUSIC: %d samples out of range\n",Clipped);
if(Error)PROUT("\n*** CMUSIC: %d errors detected - no synthesis ***\n\n",Error);
if(Notify) if(Error)ERR1("\n*** CMUSIC: %d errors detected - no synthesis ***\n\n",Error);
#ifdef CSOUND
/* close any remaining open sound files */
sfallclose();
#endif
#ifdef nextsf /* start of stuff added by sfl */
#import <sound/sound.h>
if (Outfilename != NULL) {
SNDSoundStruct snd, *sndp;
FILE *fp;
long dtotal;
int ret;
close( ofiledes); /* leftover from sndout */
if(( fp = fopen( Outfilename, "r+" )) == NULL )
fprintf(stderr, "%s not opened for updating!\n", Outfilename);
else {
sndp = &snd;
dtotal = (long) (Endtime*Srate*Nchan) <<1; /* in bytes */
if(( ret = fread( sndp, sizeof(snd), 1, fp)) <= 0)
fprintf(stderr, "Error reading %s header - %d!\n", Outfilename, ret);
sndp->dataSize = dtotal;
rewind( fp);
if(( ret = fwrite(sndp, sizeof(snd), 1, fp)) <= 0)
fprintf(stderr, "Error updating %s header - %d!\n", Outfilename, ret);
fclose( fp);
}
}
#endif /* end of stuff added by sfl */
flushfloat();
pclose(Infile);
exit(0);
}
init(){
Now = Time = Future = 0.0;
Lout=Nchan*Lblocks;
if(Outblock){
Outblock = Outptr = (float *) realloc(Outblock, Lout*sizeof(float));
Sampout = (short *) realloc(Sampout, Lout*sizeof(short));
Grevblock = (float *) calloc(Lblocks,sizeof(float));
} else {
Outblock = Outptr = (float *) malloc(Lout*sizeof(float));
Sampout = (short *) malloc(Lout*sizeof(short));
Grevblock = (float *) calloc(Lblocks,sizeof(float));
}
if(!Vars) Vars = Vp = (float *) calloc((Vmax = Nvars)+1,sizeof(float));
if(!Params) Params = Pp = (float *) calloc((Pmax = Nparams)+1,sizeof(float));
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.