vexations in perl

control loops for serious immobility

john saylor, YAPC::NA 2005
http://or8.net/~johns/vex/

Erik Satie

photo of Erik Satie

Vexations

photo of John Cage

manuscript translations and notes

manuscript

vexations manuscript

MIDI

midi interface

requirements

quill pen

organization

waving grid

vex: beginning

zero

vex: middle 0

bell curve

vex: middle 1

bell curve

vex: end

infinity

data structures

array

ex 0: longer and quieter

    $durationExtra = 0;
    $velocity = 96;
    
    for ( $c = 0; $c < scalar @cantus; $c++ )
    {
      $duration = $durations[ $c ] * 48;
      $durationExtra += 1;
      $duration += $durationExtra;
      $velocity -= 1;

      # add to midi object
    }
  

ex 1: per set changes

    $loopVar = $loop % 5;
    if ( ! $loopVar ) {
      if ( int rand ( 7 ) ) {
        if ( int rand ( 11 ) ) {
          $randomInstrument = 0; $patch = &pickInstrument ( $loop );
        } else {
          $randomInstrument = 1; $patch = &pickInstrument ( );
        }
      }
      if ( int rand ( 5 ) ) {
        &modifyParam ( $tempoData );
        $midi→set_tempo  ( int ( 60_000_000 / $tempoData→{modified} ) );
        $tempoData→{current} = delete $tempoData→{modified};
      }
    }
  

ex 2: &modifyPitch

    # $transVal = &modifyPitch ( $startVal, $intervalOffset, $range )
    sub modifyPitch {
      my $octaveDivisions = sprintf ( "%d", 12 / $intervalOffset );
      my $rndLimit = $octaveDivisions * $range;
      my $rnd = int rand ( $rndLimit );
      my $offset = $rnd - ( int ( $rndLimit / 2 ) );
      
      # back to half steps
      $offset *= sprintf ( "%d", 12 / $octaveDivisions );
      my $transVal = $startVal + $offset;
      return $transVal % 128;
    }
  

ex 3: &modifyParam

    # $hr = &modifyParam ( $hr )
    sub modifyParam {
      my $rndLimit = sprintf ( "%d", $hr→{current} * $hr→{range} );
      my $offset = int rand ( $rndLimit );
      if ( $hr→{direction} < 0 ) { $offset *= -1; }
      my $modified = $hr→{current} + $offset;
      if ( $modified < $hr→{min} ) {
        $modified = $hr→{min}; $hr→{direction} = 1;
      } elsif ( $modified > $hr→{max} ) {
        $modified = $hr→{max}; $hr→{direction} = -1;
      }
      $hr→{modified} = $modified;
      return $modified;
    }
  

aesthetic issues

golden section construction

auxillary material

portrait

Creative Commons License