| 1 |
#!/usr/bin/perl |
| 2 |
|
| 3 |
use PDL; |
| 4 |
use PDL::Audio; |
| 5 |
use PDL::Graphics::PGPLOT; |
| 6 |
|
| 7 |
#sub line {} |
| 8 |
|
| 9 |
$|=1; |
| 10 |
|
| 11 |
$birds = do 'bird-def.pl'; |
| 12 |
|
| 13 |
sub hz(){ 44100 } |
| 14 |
|
| 15 |
sub bird { |
| 16 |
my ($dur, $freq, $skew, $amp, $freqenv, $ampenv, $partials) = @_; |
| 17 |
$freqenv = gen_env $dur, @$freqenv; |
| 18 |
$ampenv = gen_env $dur, @$ampenv; |
| 19 |
my $os = gen_oscil $dur, $freq, 0, $freqenv*$skew;#*PDL::Audio::PI2; |
| 20 |
$os = pdl($partials)->partials2polynomial(1)->polynomial($os) if defined $partials; |
| 21 |
$os*$ampenv; |
| 22 |
} |
| 23 |
|
| 24 |
sub shuffle($) { # (x y x y ... => ((x y) (x y) ... |
| 25 |
my $xy = pdl $_[0]; [$xy->slice("1:-1:2"), $xy->slice("0:-1:2")]; |
| 26 |
} |
| 27 |
|
| 28 |
sub gen_bird { |
| 29 |
my @mix; |
| 30 |
for (@{+shift}) { |
| 31 |
my ($beg, $dur, $freq, $skew, $amp, $freqenv, $ampenv, $partials) = @$_; |
| 32 |
$partials = pdl($partials)->slice("1:-1:2") if $partials; |
| 33 |
push @mix, ($beg*hz, bird(hz*$dur, $freq/hz, $skew/hz, $amp, shuffle $freqenv, shuffle $ampenv, $partials)); |
| 34 |
line $mix[-1]; |
| 35 |
} |
| 36 |
audiomix @mix; |
| 37 |
} |
| 38 |
|
| 39 |
for (keys %$birds) { |
| 40 |
print $_; |
| 41 |
$chirp = (gen_bird $birds->{$_})->cut_leading_silence(0); |
| 42 |
line $chirp; |
| 43 |
print "\n"; |
| 44 |
scale2short($chirp)->playaudio(rate => hz); |
| 45 |
} |
| 46 |
|
| 47 |
|