Audio-NoiseGen

 view release on metacpan or  search on metacpan

lib/Audio/NoiseGen.pm  view on Meta::CPAN

  white_noise
  triangle
  square
  envelope
  combine
  split
  sequence
  note
  rest
  segment
  formula
  hardlimit
  amp
  oneshot
  lowpass
  highpass
  generalize
);

our %EXPORT_TAGS = (
  all => [ @EXPORT_OK ]

lib/Audio/NoiseGen.pm  view on Meta::CPAN

          sustain => $l,
          release => 0.01
        );
      }
    }
    $last_sample = $cur_gen->();
    return $last_sample || 0;
  }
}

=head2 formula( formula => sub { $_*(42&$_>>10) } )

Plays a formula. Takes 'formula', 'bits', and 'sample_rate'. 'bits' defaults to 8, 'sample_rate' defaults to 8000.

Formula uses C<< $_ >> instead of 't', but is otherwise similar to what is described at L<http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html>.

=cut

sub formula {
  my %params = generalize(
    bits        => 8,
    sample_rate => 8000,
    @_
  );
  my $formula = $params{formula};
  my $formula_increment = $params{sample_rate}->() / $sample_rate;
  my $max = 2 ** $params{bits}->();
  my $t = 0;
  return sub {
    $t += $formula_increment;
    local $_ = int $t;
    return (((
      $formula->(int $t)
    ) % $max - ($max/2))/($max/2))
  }
}

 # Return RC low-pass filter output samples, given input samples,
 # time interval dt, and time constant RC
 # function lowpass(real[0..n] x, real dt, real RC)
   # var real[0..n] y
   # var real α = dt / (RC + dt)
   # y[0] := x[0]

lib/Audio/NoiseGen.pm  view on Meta::CPAN

  '""' => sub { },
;

sub new {
  my $class = shift;
  my $gen = shift;
  if(!ref $gen) {
    print STDERR "segement '$gen'\n";
    $gen = segment($gen);
  # } elsif(ref $gen eq 'CODE') {
    # $gen = formula($gen);
  }
  my $self = {
    gen => $gen,
  };
  bless $self, $class;
  return $self;
}

sub m_seq {
  my ($self, $other, $swap) = @_;



( run in 0.250 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )