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

This is mm.synth.c in view mode; [Download] [Up]

#include "mm.head.h"
#include "ug.head.h"
#include "test.defs.h"

synthesize(){
 union arg_ptr ugargs[100]; float uglens[100]; long ugincs[100];
 char ugtypes[100]; long *ugflags; int ugnumber;
 int i;

    while(Now < Time){
	if(!notelist){
	 register float *Outptr; register long i;

	    Lout = Lblocks*Nchan;
	    if(Spacewason)
	     for(Outptr=Grevblock,i=0; i<Lblocks; i++) *Outptr++ = 0.0;
	    for(Outptr=Outblock,i=0; i<Lout; i++) *Outptr++ = 0.0;

	    for(Nsamp=(Time-Now)*Srate; Nsamp>0; Nsamp -= Ngen){
		Ngen = Nsamp<Lblocks ? Nsamp : Lblocks;
		if(Spacewason){
		    Lout = Ngen*Nchan;
		    for(Outptr=Outblock,i=0; i<Lout; i++) *Outptr++ = 0.0;
		}
		if(!Error) sndout();
	    }
	    Now = Time;
	}
	else {
	   register float *Outptr;
	   register struct note_struct *temp;
	   register struct ug_list *ug;
	   register struct ug_adesc *uarg;
	   int deferednotes = 0 ;

	    First = Time;
	    FORLIST(note, next_note, notelist)
	     if(note->n_end < First)First = note->n_end;

	    for(Nsamp=(First-Now)*Srate; Nsamp>0; Nsamp -= Ngen){
	     register float *Outptr; register long i;

		Ngen = Nsamp<Lblocks ? Nsamp : Lblocks;
		if(Spacewason)
		 for(Outptr=Grevblock,i=0; i<Ngen; i++) *Outptr++ = 0.0;
		Lout = Ngen*Nchan;
		for(Outptr=Outblock,i=0; i<Lout; i++) *Outptr++ = 0.0;

		FORLIST(note, next_note, notelist){
		    if(note->n_flags & DEFERFLAG){
			deferednotes++ ;
			continue ;
		    }
		    if(Error || (note->n_flags & TERM) )continue;
		    FORLIST(ins, next_ins, inslist)
		     if(!strcmp(ins->ins_name, note->n_ins))break;
		    ugnumber = 0;

		    FORLIST(ug, next_ug, ins->ugp){
		     register long j = 0;
		     register struct func_struct *fp;

		     ugnumber++;
			FORLIST(uarg, next_uarg, ug->arg_list){

			    switch(uarg->a_type){
			     case 'b': 
				ugtypes[j] = 'b';
				ugargs[j].v = Blocks + uarg->a_index*Lblocks;
				uglens[j] = Lblocks; ugincs[j] = 1; j++; break;
			     case 'v': 
				ugtypes[j] = 'v';
				ugargs[j].v = Vars + uarg->a_index;
				uglens[j] = 1.0; ugincs[j] = 0; j++; break;
			     case 'p': 
				ugtypes[j] = 'p';
				ugargs[j].v = note->plist + uarg->a_index;
				uglens[j] = 1.0; ugincs[j] = 0; j++; break;
			     case 's': 
				ugtypes[j] = 's';
				if( (ugargs[j].s = *(Strvars + uarg->a_index)) 
				    == NULL) {
					fprintf(stderr, 
					"\nString s%d undefined at time %.3f\n",
					uarg->a_index, Now);
					exit(-1);
				}
				uglens[j] = 1.0; ugincs[j] = 0; j++; break;
			     case 'd':
				ugtypes[j] = 'd';
				ugargs[j].v = note->dlist + uarg->a_index;
				uglens[j] = 1.0; ugincs[j] = 0; j++; break;
			     case 'n':
				ugtypes[j] = 'n';
				ugargs[j].v = note->nlist + uarg->a_index;
				*(note->nlist + uarg->a_index) = 
				    *(ins->n_list + uarg->a_index);
				uglens[j] = 1.0; ugincs[j] = 0; j++; break;
			     case 'f':
				ugtypes[j] = 'f';
				FORLIST(fp, next_fp, fplist)
				 if(uarg->a_index == fp->f_index)break;
				if(!fp)print(sprintf(Junk,"%c%d undefined.\n",
				 uarg->a_type, uarg->a_index));
				ugargs[j].v = fp->f_vals;
				uglens[j] = fp->f_len; ugincs[j] = 0; j++;break;
			     default: UNREC;FTYPE(uarg->a_type);NL;
			    }
			}
			ugflags = note->ug_flags + ugnumber;
			*ugflags &= ~(ENDFLAG); 
   			if(Ngen == Nsamp && First == note->n_end)
			    *ugflags |= ENDFLAG;
		   (*ug->arg_c)(ug->n_arg,ugargs,uglens,ugincs,ugtypes,ugflags);
		    }
		}
		if(deferednotes){
		    FORLIST(note, next_note, notelist){
			if((note->n_flags & DEFERFLAG) == 0) continue ;
			if(Error || (note->n_flags & TERM) )continue;
			FORLIST(ins, next_ins, inslist)
			 if(!strcmp(ins->ins_name, note->n_ins))break;
			ugnumber = 0;

			FORLIST(ug, next_ug, ins->ugp){
			 register long j = 0;
			 register struct func_struct *fp;

			 ugnumber++;
			    FORLIST(uarg, next_uarg, ug->arg_list){

				switch(uarg->a_type){
				 case 'b': 
				    ugtypes[j] = 'b';
				    ugargs[j].v = Blocks + uarg->a_index*Lblocks;
				    uglens[j] = Lblocks; ugincs[j] = 1; j++; break;
				 case 'v': 
				    ugtypes[j] = 'v';
				    ugargs[j].v = Vars + uarg->a_index;
				    uglens[j] = 1.0; ugincs[j] = 0; j++; break;
				 case 'p': 
				    ugtypes[j] = 'p';
				    ugargs[j].v = note->plist + uarg->a_index;
				    uglens[j] = 1.0; ugincs[j] = 0; j++; break;
				 case 's': 
				    ugtypes[j] = 's';
				    if( (ugargs[j].s = *(Strvars + uarg->a_index)) 
					== NULL) {
					    fprintf(stderr, 
					    "\nString s%d undefined at time %.3f\n",
					    uarg->a_index, Now);
					    exit(-1);
				    }
				    uglens[j] = 1.0; ugincs[j] = 0; j++; break;
				 case 'd':
				    ugtypes[j] = 'd';
				    ugargs[j].v = note->dlist + uarg->a_index;
				    uglens[j] = 1.0; ugincs[j] = 0; j++; break;
				 case 'n':
				    ugtypes[j] = 'n';
				    ugargs[j].v = note->nlist + uarg->a_index;
				    *(note->nlist + uarg->a_index) = 
					*(ins->n_list + uarg->a_index);
				    uglens[j] = 1.0; ugincs[j] = 0; j++; break;
				 case 'f':
				    ugtypes[j] = 'f';
				    FORLIST(fp, next_fp, fplist)
				     if(uarg->a_index == fp->f_index)break;
				    if(!fp)print(sprintf(Junk,"%c%d undefined.\n",
				     uarg->a_type, uarg->a_index));
				    ugargs[j].v = fp->f_vals;
				    uglens[j] = fp->f_len; ugincs[j] = 0; j++;break;
				 default: UNREC;FTYPE(uarg->a_type);NL;
				}
			    }
			    ugflags = note->ug_flags + ugnumber;
			    *ugflags &= ~(ENDFLAG); 
			    if(Ngen == Nsamp && First == note->n_end)
				*ugflags |= ENDFLAG;
		       (*ug->arg_c)(ug->n_arg,ugargs,uglens,ugincs,ugtypes,ugflags);
			}
		    }
		    }
		    if(!Error)sndout();
		}
		Now = First;

    /* The following section of this program deletes spent notes from the
       note list, reclaiming storage as it goes.
    */
		FORLIST(note, next_note, notelist) if(note->n_end <= Now){
		    UNLINK(note, next_note, notelist, temp);
		    if(note->plist) free(note->plist);
		    if(note->dlist) free(note->dlist);
		    if(note->ug_flags) free(note->ug_flags);
		    if(note->nlist) free(note->nlist);
		    if(note) free(note);
		}
	    }
	}
    }

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.