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 |
|