ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/PDL-Audio/tst
Revision: 1.1
Committed: Tue Dec 28 01:05:16 2004 UTC (19 years, 4 months ago) by root
Branch: MAIN
CVS Tags: rel-1_1, rel-1_2, HEAD
Log Message:
*** empty log message ***

File Contents

# Content
1 #!/usr/bin/perl
2
3 #use blib;
4 use PDL;
5 use PDL::Audio;
6 #use PDL::Graphics::PGPLOT;
7 use PDL::Audio::Pitches;
8 use PDL::Dbg;
9 use PDL::Complex;
10
11 $|=1;
12
13 *_dur2time = *PDL::Audio::_dur2time;
14 sub HZ (){ 22050 };
15
16 sub freqz {
17 my ($a, $b, $w) = @_;
18 $w = 512 unless defined $w;
19 $w = zeroes($w)->xlinvals(0,M_PI*($w-1)/$w) unless ref $w;
20 $w = exp i * r2C $w;
21
22 Cabs(Cdiv($a->rCpolynomial($w),$b->rCpolynomial($w)));
23 }
24
25 sub play {
26 my $pdl = shift;
27 #line $pdl;
28 $pdl->scale2short->playaudio(rate => HZ, @_);
29 }
30
31 $pdl = raudio "kongas.wav";
32
33 print describe_audio($pdl), "\n";
34
35 $pdl = $pdl->float->filter_src($pdl->rate / HZ);
36 $pdl = $pdl->filter_center;
37
38 my @stdenv = (pdl(0,0.1,0.2,0.9,1), pdl(0,1,0.6,0.6,0));
39 $env = gen_env $pdl, @stdenv;
40
41 sub tst($$) {
42 push @tests, [$_[0], $_[1]];
43 }
44
45 tst src, sub {
46 for (qw(22050 11025 8000)) {
47 print " $_"; play $pdl->filter_src(44100 / $_), rate => $_;
48 }
49 };
50
51 tst contrast_enhance, sub {
52 for (qw(0.1 0.2 0.3 0.6 1)) {
53 print " $_"; play $pdl->filter_contrast_enhance($_);
54 }
55 };
56
57 tst granulate, sub {
58 for (qw(1.5 1.3 1.1 1.0 0.8 0.6 0.5)) {
59 print " $_"; play $pdl->filter_granulate($_);
60 }
61 print " +SRC:";
62 for (qw(1.5 1.3 1.1 1.0 0.8 0.6 0.5)) {
63 print " $_"; play $pdl->filter_granulate($_)->filter_src($_), rate => 44100;
64 }
65 };
66
67 tst modulated_src, sub {
68 print " 2 hz 0.7 sine...";
69 play $pdl->filter_src(1, 5, 0.7 * gen_oscil $pdl, 2/HZ);
70 print " 5 hz 0.3 sine...";
71 play $pdl->filter_src(1, 5, 0.3 * gen_oscil $pdl, 20/HZ);
72 print " 90 hz 0.5 sine...";
73 play $pdl->filter_src(1, 5, 0.5 * gen_oscil $pdl, 90/HZ);
74 print " 300 hz 0.8 sine...";
75 play $pdl->filter_src(1, 5, 0.8 * gen_oscil $pdl, 300/HZ);
76 };
77
78 tst 'ring_modulate', sub {
79 print " ring modulated with 20 hz sine";
80 play $pdl->ring_modulate(gen_oscil $pdl, 20 / HZ);
81 print " ring modulated with 1000 hz sine";
82 play $pdl->ring_modulate(gen_oscil $pdl, 1000 / HZ);
83 };
84
85 tst 'touchtones', sub {
86 my @h = ( 697, 697, 697, 770, 770, 770, 852, 852, 852, 941, 941, 941);
87 my @v = (1209,1336,1477,1209,1336,1477,1209,1336,1477,1209,1336,1477);
88 my $dur = HZ*0.22;
89 my $env = gen_env $dur, pdl(0,1,2,9,10), pdl(0,1,0.9,0.9,0);
90 my @mix;
91 for (0..$#h) {
92 my ($h, $v) = ($h[$_], $v[$_]);
93 $h = $env * gen_oscil $dur, $h/HZ;
94 $v = $env * gen_oscil $dur, $v/HZ;
95 push @mix, ($_*$dur, $h, $_*$dur, $v);
96 };
97 play audiomix @mix;
98 };
99
100 tst noise_fm, sub {
101 my $pdl;
102 print " 100 hz";
103 $pdl = gen_rand 2*HZ, 100/HZ;
104 $pdl = gen_oscil $pdl, 880/HZ, 0, $pdl * $pdl->xlinvals(0.001,0.1);
105 play $pdl * gen_env $pdl, @stdenv;
106 print " 6000 hz";
107 $pdl = gen_rand 2*HZ, 6000/HZ;
108 $pdl = gen_oscil $pdl, 880/HZ, 0, $pdl * $pdl->xlinvals(0.001,0.1);
109 play $pdl * gen_env $pdl, @stdenv;
110 };
111
112 tst simple_fm, sub {
113 my $fm = gen_triangle $pdl, 16/HZ;
114 $fm *= $fm->xlinvals(0,0.1);
115 print " 900 hz sine + vibrato"; play $env * gen_oscil $pdl, 900/HZ, 0, $fm;
116 print " 900 hz sine + sound"; play $env * gen_oscil $pdl, 1/HZ, 0, $pdl * 0.08;
117 };
118
119 tst filters, sub {
120 print " filter_lir(<0.05s echo>)"; play $pdl->filter_lir(pdl(0),pdl(0.5), pdl(HZ*0.05), pdl(0.5));
121 print " ppolar(0.8,220)"; play $pdl->filter_ppolar(0.8,220);
122 print " zpolar(0.8,220)"; play $pdl->filter_zpolar(0.8,220);
123 };
124
125 tst 'waveshaping', sub {
126 # this is the spectrum of a cello playing as3
127 my @i = (1.01, 1.99, 2.99, 4.00, 5.00, 6.00, 6.99, 8.00, 9.00, 9.98,
128 10.99, 11.99, 13.00, 14.01, 14.99, 16.02, 17.00, 17.98, 19.00, 20.01,
129 21.02, 22.02, 22.22, 22.93, 24.05, 25.04, 25.99, 27.00, 29.03);
130
131 my @a = (.0839, .0414, .1265, .0196, .0377, .0117, .0111, .0151, .0207,
132 .0033, .0090, .0039, .0039, .0031, .0038, .0023, .0026, .0069, .0020,
133 .0017, .0007, .0006, .0002, .0001, .0003, .0002, .0003, .0003, .0003);
134
135 # add a slight vibrato
136 my $tri = gen_triangle 4*HZ, 1.5/HZ;
137 my $pdl = gen_from_partials (4*HZ, as3/HZ, \@i, \@a, 0, 16/HZ*$tri);
138
139 play $pdl * gen_env $pdl, @stdenv;
140 };
141
142 0&&tst simple_generators, sub {
143 print " 1/f noise"; play $env * gen_rand_1f $pdl;
144 print " 900 hz sine"; play $env * gen_oscil $pdl, 900/HZ;
145 print " 900 hz triangle"; play $env * gen_triangle $pdl, 900/HZ;
146 print " 900 hz asyfm"; play $env * gen_asymmetric_fm $pdl, 900/HZ;
147 print " 900 hz sine summation"; play $env * gen_sine_summation $pdl, 900/HZ, 0, 5;
148 print " 900 hz sum of cosines"; play $env * gen_sum_of_cosines $pdl, 900/HZ, 0, 5;
149 };
150
151 tst noise_filtering, sub {
152 my $pdl = gen_rand 2*HZ, 1;
153 $pdl = $pdl->filter_ppolar(0.97, 440/HZ);
154 $pdl = $pdl->filter_lir(pdl(0),pdl(0.1), pdl(HZ/440),pdl(0.99));
155 play $pdl * gen_env $pdl, @stdenv;
156 };
157
158 tst 'spectrum', sub {
159 $pdl = gen_fft_window(100, KAISER, -1.0);
160 #line spectrum $pdl, 'db';
161 #line spectrum $pdl, db', KAISER;
162 #line spectrum $pdl, 'db';
163 exit;
164 } if 0;
165
166 tst 'karplus', sub {
167 my $pdl = concat gen_rand(0.4*HZ, 1), zeroes(5.0*HZ);
168
169 my $dur = 2*HZ;
170 my $freq = 440/HZ;
171 my $damping = -0.5/HZ;
172
173 $freq *= M_2PI;
174
175 my $e = exp $damping;
176 my $c1 = 2 * $e * cos $freq;
177 my $c2 = $e * $e;
178 my $tm = atan2 ($freq, $damping) / $freq;
179 my $scale = sqrt ($damping*$damping + $freq*$freq) * exp (-$damping*$tm) * HZ / 750000;
180 print "$scale, $c1, $c2\n";
181 $pdl = $pdl->filter_lir(pdl(1), pdl($scale),
182 pdl(1, 2, int(1/$freq+6)), pdl(-$c1, $c2, -$scale*0.1));
183 line $pdl;
184 play $pdl * gen_env $pdl, @stdenv;
185
186 } if 0;
187
188 tst 'karplus2', sub {
189 my $pdl = concat gen_rand(1.*HZ, 1), zeroes(5.0*HZ);
190
191 my $dur = 2*HZ;
192 my $freq = 440/HZ;
193 my $freq2 = 88/HZ;
194 my $reson = 0.05;
195
196 $pdl = $pdl->filter_lir(
197 pdl(1, 2, 1,2),
198 pdl(-$reson*$reson, 2*$reson*cos(M_2PI*$freq),
199 -$reson*$reson, 2*$reson*cos(M_2PI*$freq2)),
200 pdl(int(1/$freq),int(1/$freq2)), pdl(0.49, 0.499));
201 line $pdl;
202 play $pdl; # * gen_env $pdl, @stdenv;
203 } if 0;
204
205 tst 'vibro', sub {
206 my $pdl;
207 $pdl = gen_oscil 2*HZ, 40/HZ;
208 #$pdl = gen_oscil 2*HZ, 40/HZ, 0, $pdl->xlinvals(0,80/HZ);
209 #$pdl = $pdl->filter_zpolar(0.9, 80/HZ);
210 #line $pdl->slice("0:30000");
211 $pdl = pdl(1,1)->partials2polynomial(1)->polynomial($pdl);
212 line $pdl;
213 play $pdl;
214 exit;
215 } if 0;
216
217 tst chorus, sub {
218 play $pdl;
219 my $lfo = $osc = 0.02 * gen_rand $pdl, 30/HZ;
220 my $dly = $pdl->filter_src(1, undef, $lfo);
221 play $dly->rshift(0.030*HZ) + $pdl;
222 };
223
224 tst phazor, sub {
225 play $pdl;
226 print "rfft...";
227 my $fft = rfft($pdl)->Cr2p;
228 my $im = im $fft; $im .= $im->rshift(-10000);
229 print "irfft...";
230 my $fft = irfft($fft->Cp2r);
231 play $fft;
232 } if 0;
233
234 tst strong, sub {
235 # as done originally by Alex Strong
236 my $pdl = zeroes HZ*5;
237 my $freq = int (HZ/220);
238 my $x = $pdl->slice("0:".($freq-1)); $x .= gen_rand $x, 1;
239
240 $pdl = $pdl->filter_lir(pdl(0),pdl(1),pdl($freq,$freq+1),pdl(0.5,0.5));
241 play $pdl;
242 };
243
244 #print "original version..."; play $pdl; print "\n";
245
246 for (reverse @tests) {
247 my ($name, $sub) = @$_;
248 print "$name...";
249 &$sub;
250 print "\n";
251 }
252
253 exit;
254
255 #$pdl2 = filter_granulate $pdl, 0.8, rate => 44100;
256 $pdl2 = filter_contrast_enhance $pdl, 0.1;
257 #$pdl->scale2short->playaudio(rate => 44100);
258 $pdl2->scale2short->playaudio(rate => 44100);
259 exit;
260
261 $pdl = zeroes(4096);
262 $pdl = sin $pdl->xlinvals(0,20) + sin $pdl->xlinvals(0,50);
263 $pz = zeroes(40960);
264 $pdl2 = filter_src ($pdl, 0.5, 80, $pz);
265 #line $pdl2;
266 $pdl2->scale2short->playaudio;
267
268
269
270