| Is it possible to implemnt a C version of this program for people who don't use neither
know PERL?
Thanks
Gabriel
Hans Mikelson wrote:
>
> #!/usr/bin/perl
> #-------------------------------------------------------------------------
> # Automatic Csound Score Generation by Hans Mikelson January 1999
> #
> # This program generates a fractal csound score for use in granular
> synthesis.
> #-------------------------------------------------------------------------
> # SUBROUTINES
> #-------------------------------------------------------------------------
>
> # Mandeloop
> sub mandeloop
> {
> my $cr = $_[0];
> my $ci = $_[1];
> my $zr = 0;
> my $zi = 0;
> my $zzr = 0;
>
> $grain{$_[2]} = 0;
>
> while (($grain{$_[2]} < 200) && ($zr*$zr + $zi*$zi < 4))
> {
> # z = z^2 + c
> $zzr = $zr*$zr - $zi*$zi + $cr;
> $zi = 2*$zr*$zi + $ci;
> $zr = $zzr;
> $grain{$_[2]}++;
> }
> }
>
> # Barnsleyj1
> sub barnsleyj1
> {
> my $cr = $_[0];
> my $ci = $_[1];
> my $zzr = 0;
>
> # z(0) = pixel;
> $grain{$_[4]} = $_[2];
> $grain{$_[5]} = $_[3];
>
> # if real(z) >= 0
> # z(n+1) = (z-1)*c
> # else
> # z(n+1) = (z+1)*c
>
> if ($grain{$_[4]} >= 0)
> {
> $zzr = ($grain{$_[4]}-1)*$cr - $grain{$_[5]}*$ci;
> $grain{$_[5]} = $grain{$_[5]}*$cr + $ci*($grain{$_[4]} - 1);
> $grain{$_[4]} = $zzr;
> }
> else
> {
> $zzr = ($grain{$_[4]} + 1)*$cr - $grain{$_[5]}*$ci;
> $grain{$_[5]} = $grain{$_[5]}*$cr + $ci*($grain{$_[4]} + 1);
> $grain{$_[4]} = $zzr;
> }
> }
>
> # Henon Attractor
> sub henon
> {
> my $a = $_[0];
> my $b = $_[1];
> my $xx = 1 + $grain{$_[3]} - $a*$grain{$_[2]}*$grain{$_[2]};
> my $yy = $b*$grain{$_[2]};
> $grain{$_[2]} = $xx;
> $grain{$_[3]} = $yy;
> }
>
> sub gs1
> {
> $stao = $_[0];
> $stam = $_[1];
> $duro = $_[2];
> $durm = $_[3];
> $ampo = $_[4];
> $ampm = $_[5];
> $fqco = $_[6];
> $fqcm = $_[7];
> $iter = $_[8];
>
> $maxpan = 10;
>
> for ($i=0; $i<$iter; $i++)
> {
> $sy = int($i/sqrt($iter));
> $sx = $i % int(sqrt($iter));
>
> henon(1.4, .3, 'sta', 'dur');
> barnsleyj1(1.2, .5, -1.3+.1*$sx, .25+.1*$sy, 'amp', 'fqc');
> mandeloop(-1.5+.01*$sx, -1+.01*$sy, 'pan');
>
> if (abs($grain{'pan'})>$maxpan) {$maxpan = abs($grain{'pan'})}
>
> $sta = $stam*int($sf*abs($grain{'sta'}))/$sf + $stao;
> $dur = $durm*int($sf*abs($grain{'dur'}))/$sf + $duro;
> $amp = $ampm*int($sf*abs($grain{'amp'}))/$sf + $ampo;
> $fqc = $fqcm*int($sf*abs($grain{'fqc'}))/$sf + $fqco;
> $pan = int($sf*abs($grain{'pan'}))/$sf/$maxpan;
>
> print SCORE "i1 $sta $dur $amp $fqc $pan\n";
> }
> }
>
> sub gs2
> {
> $stao = $_[0];
> $stam = $_[1];
> $duro = $_[2];
> $durm = $_[3];
> $ampo = $_[4];
> $ampm = $_[5];
> $fqco = $_[6];
> $fqcm = $_[7];
> $iter = $_[8];
>
> $maxpan = .001;
>
> for ($i=0; $i<$iter; $i++)
> {
> henon(1.4, .3, 'sta', 'dur');
> henon(1.4, .3, 'amp', 'fqc');
> henon(1.4, .3, 'pan', 'atk');
> if (abs($grain{'pan'})>$maxpan) {$maxpan = abs($grain{'pan'})}
>
> $sta = $stam*int($sf*abs($grain{'sta'}))/$sf + $stao;
> $dur = $durm*int($sf*abs($grain{'dur'}))/$sf + $duro;
> $amp = $ampm*int($sf*abs($grain{'amp'}))/$sf + $ampo;
> $fqc = $fqcm*int($sf*abs($grain{'fqc'}))/$sf + $fqco;
> $pan = int($sf*abs($grain{'pan'}))/$sf/$maxpan;
>
> print SCORE "i1 $sta $dur $amp $fqc $pan\n";
> }
> }
>
> # Main Program begins here
>
> $scorefile = "fscore.sco";
> open (SCORE, ">$scorefile");
> print SCORE "f1 0 8192 10 1\n\n";
>
> $sf = 1000;
> # Sta Dur Amp Fqc Grains
> # Min Rng Min Rng Min Rng Min Rng #
> gs1(0, 2, .1, 4, 10, 2000, 200, 3000, 100);
> gs1(3, 1, .1, 4, 20, 4000, 400, 400, 20);
> gs1(5, 2, .3, 2, 30, 1000, 480, 1000, 30);
> gs1(6, 1, .1, 7, 40, 1000, 200, 200, 200);
> gs1(7, 2, .5, 4, 50, 2000, 200, 1000, 120);
> gs1(8, 3, .1, 4, 100, 3000, 300, 400, 20);
> gs1(9, 2, .3, .2, 200, 2000, 280, 300, 40);
> gs1(10, 2, .2, .3, 300, 3000, 100, 200, 80);
> gs1(12, 2, .1, .4, 400, 2000, 200, 100, 100);
> gs1(14, 1, .1, .8, 500, 1000, 200, 90, 20);
> gs1(15, 2, .3, 1, 700, 400, 280, 80, 30);
> gs1(16, 4, .4, 1.5, 800, 500, 300, 70, 100);
> gs1(17, 3, .5, 2, 900, 600, 330, 60, 110);
> gs1(18, 3, .6, 4, 1000, 700, 440, 50, 120);
> gs1(20, 2.5, .7, 6, 1100, 800, 580, 30, 150);
> gs1(22, 2, 1, 8, 1200, 1000, 600, 20, 180);
> ;
> gs1(26, 1, .2, 9, 500, 400, 880, 20, 100);
> gs1(30, 1, .2, 9, 600, 400, 700, 40, 100);
> gs1(34, 1, .2, 9, 700, 400, 630, 80, 100);
> gs1(38, 1, .2, 9, 800, 400, 540, 160, 100);
> gs1(42, 1, .2, 9, 900, 400, 480, 320, 100);
> gs1(46, 1, .2, 9, 1000, 400, 300, 440, 100);
> gs1(50, 1, .2, 9, 1100, 400, 280, 540, 100);
> gs1(54, 1, .2, 9, 1200, 400, 240, 640, 100);
> gs1(58, 1, .2, 9, 1300, 400, 220, 840, 100);
> gs1(62, 1, .2, 9, 1400, 400, 200, 1040, 100);
> gs1(66, 1, .2, 9, 1500, 400, 180, 1240, 100);
>
> close SCORE;
--
Gabriel Maldonado
|