This is mm.ins.c in view mode; [Download] [Up]
#include "mm.head.h"
#include "ug.head.h"
instrument(){
int Bextend = 0, Vextend = 0, Pextend = 0, Sextend = 0;
float *nptr;
BARE0("ins ");
field(fld,SIGS,SBRK); *(Params+2) = Time = getp2(fld);
if(Time < Now)SEQ(INS);
if(Time > Now)synthesize();
field(fld,SIGS,SBRK);
BARE1("%s ;\n",fld);
FORLIST(ins, next_ins, inslist)
if(!strcmp(fld,ins->ins_name)){
Error++;
print("Instruments may not be redefined.\n"); SKIP;
}
LINK(ins, next_ins, inslist, ins_struct);
ins->ins_name = STORE(fld);
for(field(fld,SIGS,SBRK); strcmp(fld,"end"); field(fld,SIGS,SBRK)){
BARE1("%s ",fld);
LINK(ug, next_ug, ins->ugp, ug_list);
ins->Nug++;
for(up=ug_vec; up->ug_name; up++)
if(!strcmp(fld,up->ug_name))break;
if(!up->ug_name){UNREC;UG(fld);NL;SKIP;}
sp = up->ug_arglist;
ug->arg_c = up->ug_call;
while(bc = field(fld,SIGS,SBRK)){
LINK(uarg, next_uarg, ug->arg_list, ug_adesc);
if(sfield(&sp,sfld,SIGS,"[")==NULL){
UG(up->ug_name);EXCESS;SFLD(fld);NL;break;
}
sfield(&sp,sfld,SIGS,"]");
if(*sp == '*')while(*sp-- != '[');
ug->n_arg++;
if ( isdigit( fld[1] ) )
uarg->a_index = atoi(&fld[1]) ;
else if ( fld[1] == '[' ) {
*rindex(fld, ']' ) = ' ' ;
uarg->a_index = expr( &fld[2] ) ;
}
switch(uarg->a_type = fld[0]){
case 'b': ins->Nb++;
BARE1("%s ",fld);
if(uarg->a_index > ins->bmax) ins->bmax=uarg->a_index;
if(ins->bmax > Bmax){Bmax = ins->bmax; Bextend = 1;}
SFINC(b); break;
case 'v': ins->Nv++;
BARE1("%s ",fld);
if(uarg->a_index > ins->vmax) ins->vmax=uarg->a_index;
if(ins->vmax > Vmax){Vmax = ins->vmax; Vextend = 1;}
SFINC(v); break;
case 'd': ins->Nd++;
BARE1("%s ",fld);
if(!strcmp(fld,"d")) uarg->a_index = ++ins->dmax;
if(uarg->a_index > ins->dmax) ins->dmax=uarg->a_index;
SFINC(d); break;
case 'p': ins->Np++;
BARE1("%s ",fld);
if(uarg->a_index > ins->pmax) ins->pmax=uarg->a_index;
if(ins->pmax > Pmax){Pmax = ins->pmax; Pextend = 1;}
SFINC(p); break;
case 's': ins->Ns++;
BARE1("%s ",fld);
if(uarg->a_index > ins->smax) ins->smax=uarg->a_index;
if(ins->smax > Strmax){Strmax = ins->smax; Sextend = 1;}
SFINC(s); break;
case 'f': ins->Nf++;
BARE1("%s ",fld);
if(uarg->a_index > ins->fmax) ins->fmax=uarg->a_index;
SFINC(f); break;
case 'c': ins->Nc++;
BARE1("%s ",fld);
SFINC(c); break;
default: /* anything else had better be an expression */
ins->Nn++;
EXTEND(nptr, ins->n_list, ins->Nn+1, float);
if( index(fld,'b') || index(fld,'p') ){
Error++;
PROUT("Illegal expr in ug field: '%s' ",fld);
}
*nptr = expr(fld);
uarg->a_type = 'n';
uarg->a_index = ins->Nn;
SFINC(n);
}
if(bc == ';')break;
} /* ug argument loop */
BARE0(";\n");
if(!strcmp(up->ug_name, "out") && ug->n_arg != Nchan){
Error++;
print(sprintf(Junk,"%d channels but %d inputs to 'out'\n",
Nchan, ug->n_arg));
}
} /* unit generator loop */
if(Bextend){
EXTEND(Bp, Blocks, (Bmax+1)*Lblocks, float);
}
if(Vextend){
EXTEND(Vp, Vars, Vmax+1, float);
}
if(Pextend){
EXTEND(Pp, Params, Pmax+1, float);
}
if(Sextend){
if(Strvars) Strvars =
(char **) realloc(Strvars,(Strmax+1)*sizeof(char **));
else
Strvars =
(char **) malloc((Strmax+1)*sizeof(char **));
Strp = (Strvars+Strmax);
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.