Appendix B: Source Code for Bits and Pieces


Core Bits & Pieces search, download, and RealAudio conversion code:

Code to query search engines:

#!/usr/bin/perl -w

srand( time() ^ ($$ + ($$ << 15)) );

@engines = qw(
	AltaVista
	Yahoo
	Excite
	WebCrawler
	NorthernLight
);

@queries = ("music", "sound files", "wave files", "aiff", "aiff files", "music files", "wav files", "sounds", "sound samples");	

chdir "/home/peter/web/search_results/" or die "Can't cd: $!\n";
`rm -f *`;

$engine_arrsize = @engines;
$query_arrsize = @queries;
#print $engine_arrsize . "\n";
#print $query_arrsize . "\n";
$pick_engine = randchooser($engine_arrsize);
$pick_query = randchooser($query_arrsize);

print "choosing $engines[$pick_engine] search engine with $queries[$pick_query] search query.\n";
system "AutoSearch", "-n", "'sounds'", "-s", "'$queries[$pick_query]'", "-e", "$engines[$pick_engine]",
"/home/peter/web/search_results";

sub randchooser {
	my $number;
	$number = int(rand $_[0]);
	return $number;
}


Code to parse search results and download sound files:

#!/usr/bin/perl -w

# this program parses the web page created by AutoSearch and, for each
# link encountered, calls a routine to search that page for soundfile links
# and, if any are found, download and convert them to 16 bit 44k WAVE.

srand( time() ^ ($$ + ($$ << 15)) );

use strict;
use LWP 5.000;
use URI::URL;
use HTML::LinkExtor;

my %searchresults;
my %pageresults;
my @addresses;
my $address;
my $link;
my $search = "http://music.dartmouth.edu/~peter/search_results/index.html";
my $dlcount = 0;
my $getURL;
my $namelocation;
my $namecount = $dlcount + 1;
my @filename;
my @splitfilename;
my $oldfilename;
my $newfilename;
my $sfconvert_error;
my $sndinfo_error;
my $count;
my $total_arraysize;
my $arraysize;
my $arrayindex;


%searchresults = pageparser(1, $search); 
push (@addresses, keys %searchresults);

		$total_arraysize = @addresses;
OUTTER:	   for ($count=0; $count<$total_arraysize; $count++) { # the following 5 lines 
  		$arraysize = @addresses;		   	   # randomly pick from 
		print "address array size is $arraysize\n";	   # the array of 
		$arrayindex = randchooser($arraysize);	   # addresses	
		$link = splice(@addresses, $arrayindex, 1);
	
		print "printing results for $link\n";
		%pageresults = pageparser(2, $link);
		chdir "/django/people/peter/downloads" or die "can't cd: $!\n";

####### TAKE AN ADDRESS, FIND OLD FILENAME, MAKE NEW FILENAME ##################



	INNER: 	foreach $address (sort keys %pageresults) {

			$getURL = "$address";
			@filename = split(/\//, $address); # split http address to into 
     # array.
			$namelocation = @filename - 1;     # index into array to find 
     # filename.
			$oldfilename = "$filename[$namelocation]";  # this finds the 
      								      #filename at the end 
      # of  the array.
			@splitfilename = split(/\./, $oldfilename); # split oldfilename
			print STDERR "saving $getURL\n";
			print "the old filename is $oldfilename\n";
			$newfilename = "soundfile_" . $namecount . ".wav";
			print "the new filename is $newfilename\n";	

################# DOWNLOAD, TRANSLATE, ERRORCHECK, AND MOVE TO SOUNDBIN #############

			system "/django/people/peter/bin/lwp-download2", "$getURL"; 
# uses modified downloader
	
open(STDERR, ">sfconvert_error"); 	#create a STDERR file to #check for file errors
			system "/django/people/peter/bin/translate", "$oldfilename", "$newfilename";
			close(STDERR);

			
			open(SNDINFO_OUT, "/django/people/peter/bin/infoparse $newfilename|");
			open(SNDINFOERRORFILE, ">sndinfo_error");			
			while (<SNDINFO_OUT>) {
				print SNDINFOERRORFILE $_;
			}
			close(SNDINFOERRORFILE);
			close(SNDINFO_OUT);

open(CONVERTERROR, "sfconvert_error"); 	# open errorfile 
  	# for reading
			open(SNDINFOERRORFILE, "sndinfo_error");
			$sfconvert_error = <CONVERTERRPR>;
			$sndinfo_error = <SNDINFOERRORFILE>;
			if ($sfconvert_error =~ /\w/) {	# if error, erase both 
# files
				unlink($oldfilename);
				unlink($newfilename);
				print "$sfconvert_error\n";
				print "SFCONVERT NO LIKE! BAD FILES REMOVED!\n\n";
				close(CONVERTERROR);
				close(SNDINFOERRORFILE);
				next INNER;	
	
			} elsif ($sndinfo_error =~ /\d/) {
				print "$sndinfo_error\n";
				rename("$newfilename", "/django/people/peter/soundbin/$newfilename");
				print "FILE IS OK! moved to soundbin.\n";
				close(CONVERTERROR);
				close(SNDINFOERRORFILE);

			} else {
				unlink($oldfilename);
				unlink($newfilename);
				print "$sndinfo_error\n";
				print "SNDINFO NO LIKE! BAD FILES REMOVED!\n\n";	
				close(CONVERTERROR);
				close(SNDINFOERRORFILE);
				next INNER;
			}
			$dlcount++;
			print "successful d-load number " . $dlcount . "\n\n";
			$namecount = $dlcount + 1;
			if ($dlcount >= 25) {
				last OUTTER;
			}
		}
}	
chdir "/django/people/peter/downloads/" or die "Can't cd to d-loads: $!\n";
`rm -f *`;  #clean out d-loads directory when done.





################################### FUNCTIONS #########################


# FUNCTION TO PARSE HTML
sub pageparser {
	my($url, $browser, $time, %saw);
	$time = 10;
	$browser = LWP::UserAgent->new(); #make fake browser
	$browser->timeout($time);
	
	foreach $url ($_[1]) {
		# fetch doc via fake browser
		my $webdoc = $browser->request(HTTP::Request->new(GET => $url));
   	 	next unless $webdoc->is_success;  		   
next unless $webdoc->content_type eq 'text/html'; #can't parse gifs
 	 		my $base = $webdoc->base;

		#now extract all links of type <A ...>
		foreach(HTML::LinkExtor->new->parse($webdoc->content)->eof->links) {
	 	my($tag, %links) = @$_;
 		my $link; 
		next unless $tag eq "a";
			if ($_[0] =~ /1/) {
		 		foreach $link (values %links) {
			 	 	$saw{ url($link, $base)->abs->as_string }++;
	  			}  
			} else {
				foreach $link (values %links) {
 					if ($link =~ /.*\.wav\b/) {
	 	  			$saw{ url($link, $base)->abs->as_string }++;
 					} elsif ($link =~ /.*\.aiff\b/) { 	
	 				$saw{ url($link, $base)->abs->as_string }++; 
	 				}
	 			}	
			}

		}
	}
return %saw;
}

#FUNCTION TO PICK RANDOM NUMBER BETWEEN 0 AND UPPER LIMIT GIVEN AS FUNC. ARGUMENT
sub randchooser {
	my $number;
	$number = int(rand $_[0]);
	return $number;
}


Code to convert soundfiles to 44.1kHz, 16-bit, stereo WAVE files:

#!/usr/bin/perl -w
#system "sfconvert", "$ARGV[0]", "$ARGV[1]", "format aiff", "srate 44100";
`sfconvert $ARGV[0] $ARGV[1] format wave rate 44100 int 16 2 channels 2`;


Code to retrieve number of sample frames from sndinfo header:

#!/usr/bin/perl -w

# this process outputs the number of frames in the soundfile given
# in the command line.

#system "sndinfo", "$ARGV[0]";
foreach $_ (`/django/musr/bin/sndinfo $ARGV[0]`) {
chomp;
	if ($_ =~ /\(\d* sample frames\)/) {
		#$output = /\(\d* sample frames\)/;
		#($frames) = (split /\(\d* sample frames\)/) [1];
		($match) = (split /\(/) [1];
		($frames) = split(/\s/, $match);
		print $frames;
	}	
}


Code for choosing sound generating process, converting to RealAudio, and updating .ram files:

#!/usr/bin/perl -w

#PROCESS CHOOSER PICKS WHICH PROCESS TO RUN FOR THE CURRENT PIECE

open(NUMBER, "tracker");

while (<NUMBER>) {
 chomp;
 $number = $_;
}
close(NUMBER); 

$number++;
#print "the file number is $number\n";

($number = 1) if ($number > 20);

$name_isdn = "BandP_ISDN_" . "$number" . ".rm";
$name_28 = "BandP_28_" . "$number" . ".rm";

ramnamer($number);

#srand( time() ^ ($$ + ($$ << 15)) );
srand;

my $timestamp = `date '+%r %Z %D'`;

my $choose = randchooser(5);

if ($choose == 1) {
	`/django/people/peter/bin/newscrew`;
} elsif ($choose == 2) {
	`/django/people/peter/bin/3graincomber`;
} elsif ($choose == 3) {
	`/django/people/peter/bin/newmonkey`;
} elsif ($choose == 4) {
	`/django/people/peter/bin/chunkymonkey`;
} elsif ($choose == 5) {
	`/django/people/peter/bin/layers`;
}


`rmenc -I BandP.wav -O $name_28 -T "bits & pieces - $timestamp" -U "peter m traub" -C "1999" -A 6`;
`rmenc -I BandP.wav -O $name_isdn -T "bits & pieces - $timestamp" -U "peter m traub" -C "1999" -A 11`;

`/django/people/peter/bin/ftpput server $name_28 $name_isdn`;
print "file succesfully sent to raven.\n";
`/django/people/peter/bin/ftpput ramfile BandP_ISDN.ram BandP_28.ram`;
`rm -f tracker $name_28 $name_isdn`; #clean up a bit
open(NUMBER, ">tracker");
print NUMBER "$number\n";
close(NUMBER);

################# FUNCTIONS ##########################

sub randchooser {
	my $number;
	$number = int(rand $_[0]) + 1;
	return $number;
}

sub ramnamer {

	my $number = $_[0];
	
	open(ISDN, ">BandP_ISDN.ram");
	open(SLOW, ">BandP_28.ram");	

	for($count=1;$count<=10;$count++) {
		
		($number = 20) if ($number < 1);
		print ISDN "pnm://raven.dartmouth.edu/peter/BandP_ISDN_" . "$number" . ".rm\n";
		print SLOW "pnm://raven.dartmouth.edu/peter/BandP_28_" . "$number" . ".rm\n";
		$number--;
	}
	close(ISDN);
	close(SLOW);
}


Example of generated .ram file:

pnm://raven.dartmouth.edu/peter/BandP_ISDN_5.rm
pnm://raven.dartmouth.edu/peter/BandP_ISDN_4.rm
pnm://raven.dartmouth.edu/peter/BandP_ISDN_3.rm
pnm://raven.dartmouth.edu/peter/BandP_ISDN_2.rm
pnm://raven.dartmouth.edu/peter/BandP_ISDN_1.rm
pnm://raven.dartmouth.edu/peter/BandP_ISDN_20.rm
pnm://raven.dartmouth.edu/peter/BandP_ISDN_19.rm
pnm://raven.dartmouth.edu/peter/BandP_ISDN_18.rm
pnm://raven.dartmouth.edu/peter/BandP_ISDN_17.rm
pnm://raven.dartmouth.edu/peter/BandP_ISDN_16.rm


Code to FTP finished RealAudio files to server:

#!/usr/bin/perl -w

# this script takes a WAVE file and puts it in a directory on Raven

use Net::FTP;

$ftp = Net::FTP->new("raven.dartmouth.edu");
$ftp->login("peter","my_password");

if ($ARGV[0] eq "ramfile") {
	$ftp->cwd("/home/peter/web/ramfiles/"); #for putting ram files on Raven
} elsif ($ARGV[0] eq "server") {
	$ftp->cwd("/usr/local/pnserver/content/peter/"); #put .rm file on Raven
}
$ftp->binary;
$ftp->put("$ARGV[1]"); # name of RM file to put on raven
$ftp->put("$ARGV[2]"); #
#if ($ftp->is_success) {
#print "successful ftp\n";
#} else {
#print "ftp failed\n";
#}

$ftp->quit;


Current PERL/Csound sound generating processes (subject to change):

Process 1:

#!/usr/bin/perl -w
open(TIME, ">timecheck");
my $date = `date`;
print TIME "$date\n";

#srand( time() ^ ($$ + ($$ << 15)) );
srand;

$soundnumber1 = randchooser(25);
SOUNDPICK1: $soundnumber2 = randchooser(25);
next SOUNDPICK1 if ($soundnumber2 == $soundnumber1); 
SOUNDPICK2: $soundnumber3 = randchooser(25);
next SOUNDPICK2 if (($soundnumber3 == $soundnumber1) || ($soundnumber3 == $soundnumber2));

$soundname1 = "soundfile_" . $soundnumber1 . ".wav";
$soundname2 = "soundfile_" . $soundnumber2 . ".wav";
$soundname3 = "soundfile_" . $soundnumber3 . ".wav";

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname1|");
$frames1 = <INFOPROC> - 1;
close(INFOPROC);

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname2|");
$frames2 = <INFOPROC> - 1;
close(INFOPROC);

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname3|");
$frames3 = <INFOPROC> - 1;
close(INFOPROC);

#$soundlength1 = $frames1/44100; #dur variables for orc score
#$soundlength2 = $frames2/44100; #dur variables for orc score
#$soundlength3 = $frames3/44100; #dur variables for orc score

open(ORC, ">3graincomber.orc") || die "can't open 3graincomber.orc: $!";
print ORC <<EOF;
sr = 44100
kr = 44100
ksmps = 1
nchnls = 2


instr 1
gkread	line	0, p3, 1
endin

instr 2

kamp	=	ampdb(p6)
ipit1	=	p4
kpan	=	p19

;;;;;;;;;;; SAMPLE 1 ;;;;;;;;;;;;;;;;;;;

ilen1	=	$frames1
isam1	=	44100*p3*ipit1
istart1	=	i(gkread)*$frames1

aindex1	line	istart1, p3, istart1 + isam1
a1	tablei	aindex1, 1
a2	tablei	aindex1, 2

;;;;;;;;;;; SAMPLE 2 ;;;;;;;;;;;;;;;;;;;

ilen2	=	$frames2
isam2	=	44100*p3*ipit1
istart2	=	i(gkread)*$frames2

aindex2	line	istart2, p3, istart2 + isam2
a3	tablei	aindex2, 3
a4	tablei	aindex2, 4

;;;;;;;;;;; SAMPLE 3 ;;;;;;;;;;;;;;;;;;;

ilen3	=	$frames3
isam3	=	44100*p3*ipit1
istart3	=	i(gkread)*$frames3

aindex3	line	istart3, p3, istart3 + isam3
a5	tablei	aindex3, 5
a6	tablei	aindex3, 6

if p21 == 1 goto OUT1
if p21 == 2 goto OUT2
if p21 == 3 goto OUT3

OUT1:

adryoutl1	butterhp	a1*kamp, 20
adryoutr1	butterhp	a2*kamp, 20

adryoutl	butterlp	adryoutl1, 22000
adryoutr	butterlp	adryoutr1, 22000

goto DELAY

OUT2:

adryoutl2	butterhp	a3*kamp, 20
adryoutr2	butterhp	a4*kamp, 20

adryoutl	butterlp	adryoutl2, 22000
adryoutr	butterlp	adryoutr2, 22000

goto DELAY

OUT3:

adryoutl3	butterhp	a5*kamp, 20
adryoutr3	butterhp	a6*kamp, 20

adryoutl	butterlp	adryoutl3, 22000
adryoutr	butterlp	adryoutr3, 22000

goto DELAY

DELAY:

adelaysig = (adryoutl+adryoutr)/2

;delay unit

kdelay1	=	p7
kdelay2 =	p8
kdelay3	=	p9
kdelay4 =	p10
kdelay5 =	p11

kdelay1lvl =	p12
kdelay2lvl =	p13
kdelay3lvl =	p14
kdelay4lvl =	p15
kdelay5lvl =	p16

kfeedback = 	p17
ktotalvol = 	p18

adumm1	delayr	2 
	adel1	deltapi	kdelay1+1/kr
		delayw	adelaysig +	(adel1*kfeedback*.01) 

adumm2	delayr	2 
	adel2	deltapi	kdelay2+1/kr
		delayw	adelaysig +	(adel2*kfeedback*.01) 

adumm3	delayr	2 
	adel3	deltapi	kdelay3+1/kr
		delayw	adelaysig +	(adel3*kfeedback*.01) 

adumm4	delayr	2 
	adel4	deltapi	kdelay4+1/kr
		delayw	adelaysig +	(adel4*kfeedback*.01) 

adumm5	delayr	2 
	adel5	deltapi	kdelay5+1/kr
		delayw	adelaysig +	(adel5*kfeedback*.01) 

a1	= adel1*(kdelay1lvl*.01)
a2	= adel2*(kdelay2lvl*.01)
a3	= adel3*(kdelay3lvl*.01)
a4	= adel4*(kdelay4lvl*.01)
a5	= adel5*(kdelay5lvl*.01)

acomboutl	=	((a1 + a2 + a3 + a4 + a5)/5)*(ktotalvol*.01) 
acomboutr	=	((a1 + a2 + a3 + a4 + a5)/5)*(ktotalvol*.01)

acomboutl	butterhp	acomboutl, 20
acomboutr	butterhp	acomboutr, 20

kcrossfade	=	p5
kdeclick	oscil1i	0, 1, 2*p3, p20

;adeclick	linseg 	0, p3*.3, 1, p3*.4, 1, p3*.3, 0

aoutl	=	kpan*kdeclick*((adryoutl*(1-kcrossfade))+(acomboutl*kcrossfade))
aoutr	=	(1-kpan)*kdeclick*((adryoutr*(1-kcrossfade))+(acomboutr*kcrossfade))


;aoutl	butterhp	aoutl, 30
;aoutr	butterhp	aoutr, 30



outs aoutl, aoutr

endin

EOF
close(ORC);


$pow2_1 = 2;
while( $pow2_1 < $frames1 ){
	$pow2_1 *= 2;
}
$pow2_2 = 2;
while( $pow2_2 < $frames2 ){
	$pow2_2 *= 2;
}
$pow2_3 = 2;
while( $pow2_3 < $frames3 ){
	$pow2_3 *= 2;
}

open(SCO, ">3graincomber.sco") || die "can't open 3graincomber.sco: $!";

print SCO "f1 0 $pow2_1 1 \"/django/people/peter/soundbin/$soundname1\" 0 4 1\n";
print SCO "f2 0 $pow2_1 1 \"/django/people/peter/soundbin/$soundname1\" 0 4 2\n";
print SCO "f3 0 $pow2_2 1 \"/django/people/peter/soundbin/$soundname2\" 0 4 1\n";
print SCO "f4 0 $pow2_2 1 \"/django/people/peter/soundbin/$soundname2\" 0 4 2\n";
print SCO "f5 0 $pow2_3 1 \"/django/people/peter/soundbin/$soundname3\" 0 4 1\n";
print SCO "f6 0 $pow2_3 1 \"/django/people/peter/soundbin/$soundname3\" 0 4 2\n";

print SCO "f7 0 1024 10 1\n";

#print SCO "f4 0 2048 5 .0001 300 1 1748 .0001\n"; # bell envelope
#print SCO "f5 0 2048 5 .0001 1748 1 300 .0001\n"; # reverse bell
#print SCO "f6 0 2048 7 0 682 1 684 1 682 0\n"; # equal time adr 

my($starttime, $dur, $pit_offset, $space, $samplenumber, $combval1, $combval2, $combval4, $combval4, $combval5, $crossfade, $jitter, $pan_var, $pan_spread, $total_time) = 0;

########### SET STARTING VARIABLES ########

my $durset      = 50;       # set starting grain duration in ms
my $spaceset    = 50;       # set starting intergrain space in ms
my $pitch_var   = 50;       # set starting pitch variation
my $pancenter   = .5;       # set panning center (0 = left, 1 = right)
my $amp         = 83;       # set grain amplitude;
my $pulse	= .125;      # set start time pulse in ms
my $grainmin	= .1;        # minimum grain size
#$total_time = $soundlength1*50;           # set total length of file
$total_time = 180;
print SCO "i1 0 $total_time\n";

#	$space	    = .5;
#	$dur        = .3;
for( ;$starttime<=$total_time; ) {
$dur        = .01*(randchooser($durset)) + $grainmin;  #set grain duration 
   # between 10 - 40ms
	$space      = .01*(randchooser($spaceset)) + $pulse;   #set intergrain space 
   # 10 - 40ms	
	$sign       = randchooser(2);
       	if ($sign == 2) {                                      #block to determine pan 
   #spread
	    $pan_var = (-.01*randchooser($pan_spread)) + $pancenter;
	} else {
	    $pan_var = .01*randchooser($pan_spread) + $pancenter;
	}
        
	$pit_offset = .001*randchooser($pitch_var); #pitch offset above original pitch
	$sign = randchooser(2);
        if ($sign == 2) {
		if (1+(-1*$pit_offset) < 0.2){
			$pit_offset = 1 - (-1*$pit_offset);
		} else {
                	$pit_offset = 1 + (-1*$pit_offset);
		}
        } else {
                $pit_offset = 1 + $pit_offset;
        }          
	#print "$pit_offset\n";

	if ($crossfade < 1.0){				   #set crossfade jitter				
		$jitter = (.01*randchooser(10)-.05);
		if (($crossfade+$jitter) > 1.0) {
			$crossfade = $crossfade - $jitter;
		} elsif (($crossfade + $jitter) < 0.0) {
			$crossfade = $crossfade - $jitter;
		} else {
			$crossfade = $crossfade + $jitter;
		}
	}
	$combval1 = .0001*randchooser(100);
	$combval2 = .00001*randchooser(200);
	$combval3 = .00001*randchooser(500);
	$combval4 = .00001*randchooser(200);
	$combval5 = .0001*randchooser(100);

#	$envtable = randchooser(3) + 3;			   #choose envelope for 
   #grain
	$envtable = 7;
	$samplenumber = randchooser(3);
	printf SCO "i2  %8.5f %8.5f %8.5f %8.5f %2s %8.5f %8.5f %8.5f %8.5f %8.5f 100 100 100 100 100 99.4 75 %8.5f %2s %2s\n", $starttime, $dur, $pit_offset, $crossfade, $amp, $combval1, $combval2, $combval3, $combval4, $combval5, $pan_var, $envtable, $samplenumber;

################ INCREMENT LOOP VARIABLES ###############

	$starttime   += $space;
	if ($starttime/$total_time <= .5) {
		($durset     -= .2) if ($durset > 0);
		($durset     = 0) if ($durset < 0);
		($spaceset   -= .2) if ($spaceset > 0);
		($spaceset = 0) if ($spaceset < 0);
	} else {
		($durset     += .1);
		($spaceset   += .1);
	}
	$pitch_var   += 10;
	$pan_spread  = ($starttime/$total_time) * 50;
	$crossfade   = ($starttime/$total_time);#*($starttime/$total_time);
}
print SCO "e\n";
close(SCO);

system "/django/people/peter/cs/csound_irix5.3", "-g", "-o", "BandP.wav", "-W", "3graincomber.orc", "3graincomber.sco";
$date = `date`;
print TIME "$date\n";
close(TIME);
################# FUNCTIONS ##########################

sub randchooser {
	my $number;
	$number = int(rand $_[0]) + 1;
	return $number;
}


Process 2:

#!/usr/bin/perl -w

#srand( time() ^ ($$ + ($$ << 15)) );
srand;
$soundnumber1 = randchooser(25);
SOUNDPICK1: $soundnumber2 = randchooser(25);
next SOUNDPICK1 if ($soundnumber2 == $soundnumber1); 
SOUNDPICK2: $soundnumber3 = randchooser(25);
next SOUNDPICK2 if (($soundnumber3 == $soundnumber1) || ($soundnumber3 == $soundnumber2));

$soundname1 = "soundfile_" . $soundnumber1 . ".wav";
$soundname2 = "soundfile_" . $soundnumber2 . ".wav";
$soundname3 = "soundfile_" . $soundnumber3 . ".wav";

#$soundname1 = "cymbalbow.wav";

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname1|");
$frames1 = <INFOPROC> - 1;
close(INFOPROC);

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname2|");
$frames2 = <INFOPROC> - 1;
close(INFOPROC);

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname3|");
$frames3 = <INFOPROC> - 1;
close(INFOPROC);

#$soundlength1 = $frames1/44100; #dur variables for orc score
#$soundlength2 = $frames2/44100; #dur variables for orc score
#$soundlength3 = $frames3/44100; #dur variables for orc score

open(ORC, ">chunkymonkey.orc") || die "can't open chunkymonkey.orc: $!";
print ORC <<EOF;
sr = 44100
kr = 4410
ksmps = 10
nchnls = 2


instr 1
gkread	line	0, p3, 1
endin

instr 2

kamp	=	ampdb(p5)
ipit1	=	p4
ipan	=	p6

;;;;;;;;;;; SAMPLE 1 ;;;;;;;;;;;;;;;;;;;

ilen1	=	$frames1
isam1	=	44100*p3*ipit1
istart1	=	i(gkread)*$frames1

aindex1	line	istart1, p3, istart1 + isam1
a1	tablei	aindex1, 1
a2	tablei	aindex1, 2

;;;;;;;;;;; SAMPLE 2 ;;;;;;;;;;;;;;;;;;;

ilen2	=	$frames2
isam2	=	44100*p3*ipit1
istart2	=	i(gkread)*$frames2

aindex2	line	istart2, p3, istart2 + isam2
a3	tablei	aindex2, 3
a4	tablei	aindex2, 4

;;;;;;;;;;; SAMPLE 3 ;;;;;;;;;;;;;;;;;;;

ilen3	=	$frames3
isam3	=	44100*p3*ipit1
istart3	=	i(gkread)*$frames3

aindex3	line	istart3, p3, istart3 + isam3
a5	tablei	aindex3, 5
a6	tablei	aindex3, 6

if p8 == 1 goto OUT1
if p8 == 2 goto OUT2
if p8 == 3 goto OUT3

OUT1:

adryoutl1	butterhp	a1*kamp, 20
adryoutr1	butterhp	a2*kamp, 20

adryoutl	butterlp	adryoutl1, 22000
adryoutr	butterlp	adryoutr1, 22000

goto OUTPUT

OUT2:

adryoutl2	butterhp	a3*kamp, 20
adryoutr2	butterhp	a4*kamp, 20

adryoutl	butterlp	adryoutl2, 22000
adryoutr	butterlp	adryoutr2, 22000

goto OUTPUT

OUT3:

adryoutl3	butterhp	a5*kamp, 20
adryoutr3	butterhp	a6*kamp, 20

adryoutl	butterlp	adryoutl3, 22000
adryoutr	butterlp	adryoutr3, 22000

goto OUTPUT

OUTPUT:

kdeclick	oscil1i	0, 1, p3, p7

;adeclick	linseg 	0, p3*.3, 1, p3*.4, 1, p3*.3, 0

aoutl	=	adryoutl*kdeclick*(ipan)
aoutr	=	adryoutr*kdeclick*(1-ipan)

outs aoutl, aoutr

endin

EOF
close(ORC);


$pow2_1 = 2;
while( $pow2_1 > $frames1 ){
	$pow2_1 *= 2;
}
$pow2_2 = 2;
while( $pow2_2 < $frames2 ){
	$pow2_2 *= 2;
}
$pow2_3 = 2;
while( $pow2_3 < $frames3 ){
	$pow2_3 *= 2;
}

open(SCO, ">chunkymonkey.sco") || die "can't open chunkymonkey.sco: $!";

print SCO "f1 0 $pow2_1 1 \"/django/people/peter/soundbin/$soundname1\" 0 4 1\n";
print SCO "f2 0 $pow2_1 1 \"/django/people/peter/soundbin/$soundname1\" 0 4 2\n";
print SCO "f3 0 $pow2_2 1 \"/django/people/peter/soundbin/$soundname2\" 0 4 1\n";
print SCO "f4 0 $pow2_2 1 \"/django/people/peter/soundbin/$soundname2\" 0 4 2\n";
print SCO "f5 0 $pow2_3 1 \"/django/people/peter/soundbin/$soundname3\" 0 4 1\n";
print SCO "f6 0 $pow2_3 1 \"/django/people/peter/soundbin/$soundname3\" 0 4 2\n";

print SCO "f7 0 1024 10 1\n";

print SCO "f8 0 2048 5 .0001 300 1 1748 .0001\n"; # bell envelope
print SCO "f9 0 2048 5 .0001 1748 1 300 .0001\n"; # reverse bell
print SCO "f10 0 2048 7 0 682 1 684 1 682 0\n"; # equal time adr 

my($starttime, $dur, $pit_offset, $space, $samplenumber, $pan_var, $pan_spread, $total_time) = 0;

########### SET STARTING VARIABLES ########

my $durset      = 50;       # set starting grain duration in ms
my $spaceset    = 10;       # set starting intergrain space in ms
my $pitch_var   = 50;       # set starting pitch variation
my $pancenter   = .5;       # set panning center (0 = left, 1 = right)
my $amp         = 85;       # set grain amplitude;
my $pulse	= .2;       # set start time pulse in ms
my $grainmin	= .5;       # minimum grain size
#$total_time = $soundlength1*50;           # set total length of file
$total_time = 120;
print SCO "i1 0 $total_time\n";

for( ;$starttime<=$total_time; ) {
	$dur        = .01*(randchooser($durset)) + $grainmin;  #set grain duration 
	$space      = .01*(randchooser($spaceset)) + $pulse;   #set intergrain	
	$sign       = randchooser(2);
       	if ($sign == 2) {                                      #block to determine pan 
   #spread
	    $pan_var = (-.01*randchooser($pan_spread)) + $pancenter;
	} else {
	    $pan_var = .01*randchooser($pan_spread) + $pancenter;
	}
        
	$pit_offset = .001*randchooser($pitch_var); 	          #pitch offset above 
   #original pitch
	$sign = randchooser(2);
        if ($sign == 2) {
		if (1+(-1*$pit_offset) < 0.2){
			$pit_offset = 1 - (-1*$pit_offset);
		} else {
                	$pit_offset = 1 + (-1*$pit_offset);
		}
        } else {
                $pit_offset = 1 + $pit_offset;
        }          


	$envtable = randchooser(3) + 7;			   #choose envelope for 
   #grain
	$samplenumber = randchooser(3);

	printf SCO "i2 %8.5f %8.5f %8.5f %2s %8.5f %2s %2s\n", $starttime, $dur, $pit_offset, $amp, $pan_var, $envtable, $samplenumber;

################ INCREMENT LOOP VARIABLES ###############

	$starttime   += $space;
	if ($starttime/$total_time <= .8) {
		($durset     -= .1) if ($durset > 0);
		($durset     = 0) if ($durset < 0);
		($spaceset   -= .5) if ($spaceset > 0);
		($spaceset = 0) if ($spaceset < 0);
	} else {
		($durset     += .1);
		($spaceset   += .1);
	}
	$pitch_var   += 10;
	$pan_spread  = ($starttime/$total_time) * 50;
}

print SCO "e\n";
close(SCO);

system "/django/people/peter/cs/csound_irix5.3", "-g", "-o", "BandP.wav", "-W", "chunkymonkey.orc", "chunkymonkey.sco";

################# FUNCTIONS ##########################

sub randchooser {
	my $number;
	$number = int(rand $_[0]) + 1;
	return $number;
}


Process 3:

#!/usr/bin/perl -w
#srand( time() ^ ($$ + ($$ << 15)) ); srand; open(ORC, ">layers.orc") || die "can't open newscrew.orc: $!"; print ORC <<EOF; sr=44100 kr=4410 ksmps=10 nchnls=2 instr 1 kamp = ampdb(75) kenv linseg 0, .05, 1, p3 - .1, 1, .05, 0 a1, a2 diskin p4, 1 a1 = kamp*(kenv*(a1/32768)) a2 = kamp*(kenv*(a2/32768)) outs a1, a2 endin EOF close(ORC); close(ORC); open(SCO, ">layers.sco") || die "can't open newscrew.sco: $!"; $total_time = 120; $starttime = 0; $randvar = 2; for (;$starttime <= $total_time;) { $soundname = "soundfile_" . randchooser(25) . ".wav"; open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname|"); $frames = <INFOPROC> - 1; close(INFOPROC); $soundlength = $frames/44100; #dur variables for orc score redo if ($soundlength + $starttime) > ($total_time + 20); print SCO "i1 $starttime $soundlength \"/django/people/peter/soundbin/$soundname\"\n"; last if ($starttime + $soundlength) > $total_time; $starttime += (.1*randchooser($randvar)); $randvar += 1; } close(SCO); system "/django/people/peter/cs/csound_irix5.3", "-g", "-o", "BandP.wav", "-W", "layers.orc", "layers.sco"; #system "/django/people/peter/cs/csound_irix5.3", "-g", "-o", "devaudio", "newscrew.orc", "newscrew.sco"; ################# FUNCTIONS ########################## sub randchooser { my $number; $number = int(rand $_[0]) + 1; return $number; } sub randfloat { $number = rand $_[0]; }


Process 4:

#!/usr/bin/perl -w

#srand( time() ^ ($$ + ($$ << 15)) );
srand;

$soundnumber1 = randchooser(25);
SOUNDPICK1: $soundnumber2 = randchooser(25);
next SOUNDPICK1 if ($soundnumber2 == $soundnumber1); 
SOUNDPICK2: $soundnumber3 = randchooser(25);
next SOUNDPICK2 if (($soundnumber3 == $soundnumber1) || ($soundnumber3 == $soundnumber2));

$soundname1 = "soundfile_" . "$soundnumber1" . ".wav";
$soundname2 = "soundfile_" . "$soundnumber2" . ".wav";
$soundname3 = "soundfile_" . "$soundnumber3" . ".wav";

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname1|");
$frames1 = <INFOPROC> - 1;
close(INFOPROC);

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname2|");
$frames2 = <INFOPROC> - 1;
close(INFOPROC);

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname3|");
$frames3 = <INFOPROC> - 1;
close(INFOPROC);

open(ORC, ">newmonkey.orc") || die "can't open newmonkey.orc: $!";
print ORC <<EOF;
sr = 44100
kr = 4410
ksmps = 10
nchnls = 2


instr 1
gkread	line	0, p3, 1
endin


instr 2 

kamp	=	ampdb(p5)
ipit1	=	p4
ipan	=	p6

;;;;;;;;;;; SAMPLE 1 ;;;;;;;;;;;;;;;;;;;

ilen1	=	$frames1
isam1	=	44100*p3*ipit1
istart1	=	i(gkread)*$frames1

aindex1	line	istart1, p3, istart1 + isam1
a1	tablei	aindex1, 1
a2	tablei	aindex1, 2

;;;;;;;;;;; SAMPLE 2 ;;;;;;;;;;;;;;;;;;;


ilen2	=	$frames2
isam2	=	44100*p3*ipit1
istart2	=	i(gkread)*$frames2

aindex2	line	istart2, p3, istart2 + isam2
a3	tablei	aindex2, 3
a4	tablei	aindex2, 4

;;;;;;;;;;; SAMPLE 3 ;;;;;;;;;;;;;;;;;;;

ilen3	=	$frames3
isam3	=	44100*p3*ipit1
istart3	=	i(gkread)*$frames3

aindex3	line	istart3, p3, istart3 + isam3
a5	tablei	aindex3, 5
a6	tablei	aindex3, 6



if p8 == 1 goto OUT1
if p8 == 2 goto OUT2
if p8 == 3 goto OUT3

OUT1:

adryoutl1	butterhp	a1*kamp, 20
adryoutr1	butterhp	a2*kamp, 20

adryoutl	butterlp	adryoutl1, 22000
adryoutr	butterlp	adryoutr1, 22000

goto OUTPUT

OUT2:

adryoutl2	butterhp	a3*kamp, 20
adryoutr2	butterhp	a4*kamp, 20

adryoutl	butterlp	adryoutl2, 22000
adryoutr	butterlp	adryoutr2, 22000

goto OUTPUT

OUT3:

adryoutl3	butterhp	a5*kamp, 20
adryoutr3	butterhp	a6*kamp, 20

adryoutl	butterlp	adryoutl3, 22000
adryoutr	butterlp	adryoutr3, 22000

goto OUTPUT

OUTPUT:

kdeclick	oscil1i	0, 1, p3*2, p7

;adeclick	linseg 	0, p3*.3, 1, p3*.4, 1, p3*.3, 0

aoutl	=	adryoutl*kdeclick*(ipan)
aoutr	=	adryoutr*kdeclick*(1-ipan)

outs aoutl, aoutr

endin

EOF
close(ORC);

$pow2_1 = 2;
while( $pow2_1 < $frames1 ){
	$pow2_1 *= 2;
}
$pow2_2 = 2;
while( $pow2_2 < $frames2 ){
	$pow2_2 *= 2;
}
$pow2_3 = 2;
while( $pow2_3 < $frames3 ){
	$pow2_3 *= 2;
}

close(ORC);
open(SCO, ">newmonkey.sco") || die "can't open newmonkey.sco: $!";

print SCO "f1 0 $pow2_1 1 \"/django/people/peter/soundbin/$soundname1\" 0 4 1\n";
print SCO "f2 0 $pow2_1 1 \"/django/people/peter/soundbin/$soundname1\" 0 4 2\n";
print SCO "f3 0 $pow2_2 1 \"/django/people/peter/soundbin/$soundname2\" 0 4 1\n";
print SCO "f4 0 $pow2_2 1 \"/django/people/peter/soundbin/$soundname2\" 0 4 2\n";
print SCO "f5 0 $pow2_3 1 \"/django/people/peter/soundbin/$soundname3\" 0 4 1\n";
print SCO "f6 0 $pow2_3 1 \"/django/people/peter/soundbin/$soundname3\" 0 4 2\n";
print SCO "f7 0 4096 10 1\n";

print SCO "f8 0 2048 5 .0001 300 1 1748 .0001\n"; # bell envelope
print SCO "f9 0 2048 5 .0001 1748 1 300 .0001\n"; # reverse bell
print SCO "f10 0 2048 7 0 682 1 684 1 682 0\n"; # equal time adr 

my($starttime, $dur, $pit_offset, $space, $samplenumber, $pan_var, $pan_spread, $total_time) = 0;

########### SET STARTING VARIABLES ########

my $durset      = 50;      # set starting grain duration in ms
my $spaceset    = 50;      # set starting intergrain space in ms
my $pitch_var   = 0;       # set starting pitch variation
my $pancenter   = .5;      # set panning center (0 = left, 1 = right)
my $amp         = 84;      # set grain amplitude;
my $pulse	= .2;       # set start time pulse in ms
my $grainmin	= .3;       # minimum grain size
my $prob        = 0;
my $crossover   = .7;
$total_time = 180;  # set total length of file
print SCO "i1 0 $total_time\n";

for( ;$starttime<=$total_time; ) {
	$dur        = .01*(randchooser($durset)) + $grainmin;  #set grain duration 
	$space      = .01*(randchooser($spaceset)) + $pulse;   #set intergrain	
	$sign       = randchooser(2);
       	if ($sign == 2) {                                      #block to determine pan 
   #spread
	    $pan_var = (-.01*randchooser($pan_spread)) + $pancenter;
	} else {
	    $pan_var = .01*randchooser($pan_spread) + $pancenter;
	}
        
	$pit_offset = .001*randchooser($pitch_var); 	       #pitch offset above 
#original pitch
	$sign = randchooser(2);
        if ($sign == 2) {
		if (1+(-1*$pit_offset) < 0.2){
			$pit_offset = 1 - (-1*$pit_offset);
		} else {
                	$pit_offset = 1 + (-1*$pit_offset);
		}
        } else {
                $pit_offset = 1 + $pit_offset;
        }          


	#$envtable = randchooser(3) + 7;			   #choose envelope for 
   #grain
	$envtable = 7;

	$samplenumber = randfloat($crossover);
	$sign = randchooser(2);
	if ($sign == 2) {
	    $samplenumber = -1*$samplenumber;
	}
	$samplenumber = $prob + $samplenumber;
	if ($samplenumber < 0) {
	    $samplenumber = -1 * $samplenumber;
	} elsif ($samplenumber > 3) {
	    $samplenumber = 3 - ($samplenumber - 3);
	}
	if (($samplenumber >= 0) && ($samplenumber <=1)) {
	    $samplenumber = 1;
	} elsif (($samplenumber > 1) && ($samplenumber <= 2)) {
	    $samplenumber = 2;
	} else {
	    $samplenumber = 3;
	}


#	print $samplenumber . "\n";



	printf SCO "i2 %8.5f %8.5f %8.5f %2s %8.5f %2s %2s\n", $starttime, $dur, $pit_offset, $amp, $pan_var, $envtable, $samplenumber;

################ INCREMENT LOOP VARIABLES ###############
#$startold = $starttime;
	$starttime   += $space;
	if ($starttime/$total_time <= 1) {
		($durset     -= .05) if ($durset > 0);
		($durset     = 0) if ($durset < 0);
		($spaceset   -= .1) if ($spaceset > 0);
		($spaceset = 0) if ($spaceset < 0);
	} else {
		($durset     += .1);
		($spaceset   += .1);
	}
	$pitch_var   += 1;
	$prob        = ($starttime/$total_time)*3;
	$pan_spread  = ($starttime/$total_time) * 50;
#$startnew = $starttime;
#printf "%8.4f %8.4f %8.4f\n", $startnew - $startold, $starttime, $dur;
}

print SCO "e\n";
close(SCO);

system "/django/people/peter/cs/csound_irix5.3", "-g", "-o", "BandP.wav", "-W", "newmonkey.orc", "newmonkey.sco";
#system "/django/people/peter/cs/csound_irix5.3", "-g", "-o", "devaudio", "newmonkey.orc", "newmonkey.sco";
################# FUNCTIONS ##########################

sub randchooser {
	my $number;
	$number = int(rand $_[0]) + 1;
	return $number;
}

sub randfloat {
    $number = rand $_[0];
}




Process 5:

#!/usr/bin/perl -w

#srand( time() ^ ($$ + ($$ << 15)) );
srand;

open(ORC, ">newscrew.orc") || die "can't open newscrew.orc: $!";
print ORC <<EOF;

sr=44100
kr=4410
ksmps=10
nchnls=2

instr 1

kamp = ampdb(82)

kenv    linseg  0, .05, 1, p3 - .1, 1, .05, 0
a1, a2	diskin  p4, 1

a1 = kamp*(kenv*(a1/32768))
a2 = kamp*(kenv*(a2/32768))


outs a1, a2

endin
EOF
close(ORC);


close(ORC);
open(SCO, ">newscrew.sco") || die "can't open newscrew.sco: $!";

$total_time = 140;
$starttime = 0;

for (;$starttime <= $total_time;) {

$soundname = "soundfile_" . randchooser(25) . ".wav";

open(INFOPROC, "/django/people/peter/bin/infoparse /django/people/peter/soundbin/$soundname|");
$frames = <INFOPROC> - 1;
close(INFOPROC);
$soundlength = $frames/44100; #dur variables for orc score
redo if ($soundlength + $starttime) > ($total_time + 20);

print SCO "i1 $starttime $soundlength \"/django/people/peter/soundbin/$soundname\"\n";
last if ($starttime + $soundlength) > $total_time;
$starttime += (randfloat(1)*$soundlength);

}
close(SCO);

system "/django/people/peter/cs/csound_irix5.3", "-g", "-o", "BandP.wav", "-W", "newscrew.orc", "newscrew.sco";
#system "/django/people/peter/cs/csound_irix5.3", "-g", "-o", "devaudio", "newscrew.orc", "newscrew.sco";



################# FUNCTIONS ##########################

sub randchooser {
	my $number;
	$number = int(rand $_[0]) + 1;
	return $number;
}

sub randfloat {
    $number = rand $_[0];
}