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

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.