Csound Csound-dev Csound-tekno Search About

Re: Csound fractal granular score generator

Date1999-01-08 09:01
FromGabriel Maldonado
SubjectRe: Csound fractal granular score generator
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