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.275 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )