#!/usr/bin/perl use PDL; use PDL::Audio; use PDL::Graphics::PGPLOT; #sub line {} $|=1; $birds = do 'bird-def.pl'; sub hz(){ 44100 } sub bird { my ($dur, $freq, $skew, $amp, $freqenv, $ampenv, $partials) = @_; $freqenv = gen_env $dur, @$freqenv; $ampenv = gen_env $dur, @$ampenv; my $os = gen_oscil $dur, $freq, 0, $freqenv*$skew;#*PDL::Audio::PI2; $os = pdl($partials)->partials2polynomial(1)->polynomial($os) if defined $partials; $os*$ampenv; } sub shuffle($) { # (x y x y ... => ((x y) (x y) ... my $xy = pdl $_[0]; [$xy->slice("1:-1:2"), $xy->slice("0:-1:2")]; } sub gen_bird { my @mix; for (@{+shift}) { my ($beg, $dur, $freq, $skew, $amp, $freqenv, $ampenv, $partials) = @$_; $partials = pdl($partials)->slice("1:-1:2") if $partials; push @mix, ($beg*hz, bird(hz*$dur, $freq/hz, $skew/hz, $amp, shuffle $freqenv, shuffle $ampenv, $partials)); line $mix[-1]; } audiomix @mix; } for (keys %$birds) { print $_; $chirp = (gen_bird $birds->{$_})->cut_leading_silence(0); line $chirp; print "\n"; scale2short($chirp)->playaudio(rate => hz); }