=head1 NAME write_wav =head1 SYNOPSYS perl write_wav =head1 DESCRIPTION This routine writes a test .wav file and prints out the waveform so that it can be played with the sound player. This creates an 8 bit sound file. =cut $note= "sininvx"; open (WAV, ">$note.wav"); open (GRAPH, ">graph.out"); print WAV "RIFF"; print WAV pack("C*", (52,62,0,0)); print WAV "WAVEfmt "; print WAV pack("C*", (16,0,0,0)); #length of fmt chunk print WAV pack("C*", (1,0)); # Format number print WAV pack("C*", (1,0)); # Number of channels print WAV pack("C*", (34,86,0,0)); #22050 samples per sec print WAV pack("C*", (34,86,0,0)); #22050 bytes per sec print WAV pack("C*", (1,0)); # Block size print WAV pack("C*", (8,0)); # Garbage print WAV "fact"; print WAV pack("C*", (4,0,0,0,4,62,0,0)); # ? print WAV "data"; print WAV pack("C*", (4,62,0,0)); # ? $pi2= atan2(1,1)*8; if ($note eq "sin") { $freq=300; $tscale=1/22050; $om= $pi2*$freq*$tscale; for ($i=0; $i<15876; $i++) { $k=int(sin($i*$om)*100+128); if ($k > 255){$k=255;} if ($k < 0) {$k=0; } print WAV pack("C", $k); print GRAPH $i." ".$k."\n"; } } elsif ($note eq "sininvx") { $om= .0001; for ($i=0; $i<15876; $i++) { $k=int(sin(1000/($i*$om+1))*100+128); if ($k > 255){$k=255;} if ($k < 0) {$k=0; } print WAV pack("C", $k); print GRAPH $i." ".$k."\n"; } } elsif ($note eq "ramp") { # Need to look at the old FORTRAN DSP solution for the # phase through a frequency sweep. $pi2= atan2(1,1)*8; $freq1=1000; $freq2=2000; $tscale=1/22050; $om1= $pi2*$freq1*$tscale; $om2= $pi2*$freq2*$tscale; for ($i=0; $i<15876; $i++) { $k=int(sin($i*$i*$om1/$om2)*50+128); if ($k > 255){$k=255;} if ($k < 0) {$k=0; } print WAV pack("C", $k); print GRAPH $i." ".$k."\n"; } } elsif ($note eq "noise") { for ($i=0; $i<15876; $i++) { $k=int((rand(1)-0.5)*100+128); if ($k > 255){$k=255;} if ($k < 0) {$k=0; } print WAV pack("C", $k); print GRAPH $i." ".$k."\n"; } } elsif ($note eq "pops") { for ($i=0; $i<15876; $i++) { $m= $i % 3000; if ($m < 100) { $j=$m * $m / 100 ; } elsif ($m < 200) { $j=(200 - $m)*(200 - $m)/100; } else { $j=0 ; } $k=int($j+128); if ($k > 255){$k=255;} if ($k < 0) {$k=0; } print WAV pack("C", $k); print GRAPH $i." ".$k."\n"; } } elsif ($note eq "tan") { $freq=300; $tscale=1/22050; $om= $pi2*$freq*$tscale; for ($i=0; $i<15876; $i++) { $j= &lim_tan($i*$om); $k= int($j*10+128); if ($k > 255){$k=255;} if ($k < 0) {$k=0; } print WAV pack("C", $k); print GRAPH $i." ".$k."\n"; } } elsif ($note eq "square") { $freq= 300; $tsamp= 22050; $hperiod= $tsamp/(2*$freq); $phase_flip_point= $hperiod; $ampl=1; for ($i=0; $i<15876; $i++) { if ($i > $phase_flip_point) { $phase_flip_point= $phase_flip_point + $hperiod; $ampl= -$ampl; } $k= int($ampl * 100 + 128); if ($k > 255){$k=255;} if ($k < 0) {$k=0; } print WAV pack("C", $k); print GRAPH $i." ".$k."\n"; } } elsif ($note eq "saw") { $freq= 300; $tsamp= 22050; $ampl_env= 100; $hperiod= $tsamp/(2*$freq); $phase_flip_point= $hperiod; $slew= $ampl_env/$hperiod; $ampl= -100; for ($i=0; $i<15876; $i++) { if ($i > $phase_flip_point) { $phase_flip_point= $phase_flip_point + $hperiod; if ($slew > 0) { $ampl= $ampl_env; } else { $ampl= -$ampl_env; } $slew= -$slew; } else { $ampl=$ampl + $slew; } $k= int($ampl + 128); if ($k > 255){$k=255;} if ($k < 0) {$k=0; } print WAV pack("C", $k); print GRAPH $i." ".$k."\n"; } } elsif ($note eq "tri") { $freq= 300; $tsamp= 22050; $ampl_env= 100; $hperiod= $tsamp/(2*$freq); $phase_flip_point= $hperiod; $slew= 2 * $ampl_env/$hperiod; $ampl= -100; for ($i=0; $i<15876; $i++) { if ($i > $phase_flip_point) { $phase_flip_point= $phase_flip_point + $hperiod; if ($slew > 0) { $ampl= $ampl_env; } else { $ampl= -$ampl_env; } $slew= -$slew; } else { $ampl=$ampl + $slew; } $k= int($ampl + 128); if ($k > 255){$k=255;} if ($k < 0) {$k=0; } print WAV pack("C", $k); print GRAPH $i." ".$k."\n"; } } close WAV; close GRAPH; system("c:\\windows\\mplayer.exe /play /close $note.wav"); # unlink("$note.wav"); sub lim_tan() { my $arg= shift; my $tan; my $cos= cos($arg); if ($cos != 0) { $tan= sin($arg)/$cos; } else { $tan=10; } if ($tan > 10) {$tan=10;} if ($tan < -10) {$tan=-10;} $tan; }