;;;;This file is a simple port of the libsndfile regaining example.
;;;;ie sfprocess.c
(defpackage warm (:export transform *left* *right*) )
;;;;BUFFER_LEN = 8192
;;;;CHANNELS = 2
;;;;So the transforms each act upon an 4096 length list.
if (! (infile = sf_open(infilename, SFM_READ, &sfinfo))) {
printf(\"Not able to open input file %s.\\n\", infilename);
puts(sf_strerror(NULL));
@(return)=1;
}
if (sfinfo.channels > MAX_CHANNELS) {
printf(\"Too many channels\\n\");
@(return)=1;
}
if (! (outfile = sf_open(outfilename, SFM_WRITE, &sfinfo))) {
printf(\"Not able to open output file %s.\\n\", outfilename);
puts(sf_strerror(NULL));
@(return)=1;
}
int i;
while ((readcount = sf_read_float(infile, data, BUFFER_LEN))) {
//Send both channels to lisp-land
for (i=0;i<readcount/2;i++) pusher(data[2*i],data[2*i+1]);
//transform
transformer();
//receive each channel back, store in data
for (i=0;i<readcount/2;i++) {
data[2*i]=popleft();
data[2*i+1]=popright();
}
//Write to outfile
sf_write_float(outfile, data, readcount);
}
sf_close (infile) ;
sf_close (outfile) ;
@(return)=0;
")))
(defun transform (inpath outpath left-lambda right-lambda) "
(defun transform (inpath outpath left-lambda right-lambda) )
paths are strings
lambdas are like (lambda (list) (values list))
The list was made by pushing, so it's backwards.
Applied on each stride, hardcoded l 8192 :
4096 elements in each list,
or less in the last list.
Otherwise your function can be arbitrary.
*left* *right* lists are also exported,
if you must.
"
(setf *left-transformation* left-lambda
*right-transformation* right-lambda)
(transformin inpath outpath))