This is mixalter.c in view mode; [Download] [Up]
#include "../H/ugens.h"
#include "../H/sfheader.h"
#include "mix.h"
#include <stdio.h>
extern int sfd[NFILES];
extern int pointer[NFILES];
extern char peakoff[NFILES];
extern int bufsize[NFILES];
extern char *sndbuf[NFILES];
extern char *peak[NFILES];
extern char *peakloc[NFILES];
extern SFHEADER sfdesc[NFILES];
/* a cmix routine to surgically alter segments of one or more channels in
* a soundfile. Arguments are
* p[0] starting time;
* p[1] duration;
* p[2] overall amp;
* p[3] alter channel 0? 1 if yes, 0 if no;
* p[4] " " 1? " " " " " "
* p[5] " " 2? " " " " " "
* p[6] " " 3? " " " " " "
*/
extern float array[SIZE];
float tabs[2];
extern int RESET; /* times per sec to reinitialize envelope */
extern int lineset;
alter(p,n_args)
float *p;
int n_args;
{
long nsamps,i;
int chlist[4],j,counter,non,skip,unit;
float amp;
unit = 1;
if(!lineset) for(j=0;j<SIZE;j++) array[j] = 1;
nsamps = setnote(p[0],p[1],unit);
counter = 0;
skip = SR/(float)RESET;
tableset(p[1],SIZE,tabs);
for(j=0,non=0;j<sfchans(&sfdesc[unit]);j++) {
if(chlist[j] = (int)p[j+3]) non++;
if((j+3) >= n_args) chlist[j] = 0;
}
if((non == 0) || (non > sfchans(&sfdesc[unit]))) {
fprintf(stderr,"Something wrong with this card, check args\n");
return;
}
for (i=nsamps; i>0; i -= skip) {
counter = i>skip? skip : i;
amp=tablei(nsamps-i,array,tabs) * p[2];
bmultout(amp,chlist,unit,counter*sfchans(&sfdesc[unit]));
}
endnote(unit);
}
bmultout(amp,chlist,fno,size)
float amp;
int *chlist;
{
int i,j;
short *ibuf;
float *fbuf;
int todo,remains;
int nchans;
int len = bufsize[fno];
nchans = sfchans(&sfdesc[fno]);
refill: todo = ((pointer[fno] + size) > len)
? len - pointer[fno] : size;
if(sfclass(&sfdesc[fno]) == SF_SHORT) {
for(i=0,ibuf = (short *)sndbuf[fno] + pointer[fno];i<todo;
i += nchans)
for(j=0; j<nchans; j++,ibuf++)
if(chlist[j]) *ibuf *= amp;
}
else {
for(i=0,fbuf = (float *)sndbuf[fno] + pointer[fno];i<todo;
i += nchans)
for(j=0; j<nchans; j++,fbuf++)
if(chlist[j]) *fbuf *= amp;
}
pointer[fno] += todo;
if(pointer[fno] == len) {
_backup(fno);
if(!peakoff[fno])
_chkpeak(fno);
_writeit(fno);
_readit(fno);
pointer[fno] = 0;
}
if(size -= todo) goto refill;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.