use Win32::Sound; print "===================================================================\n"; # Create the object $WAV = new Win32::Sound::WaveOut(44100, 16, 2); $data = ""; $counter = 0; $increment = 440/44100; $x[1] = 0; $y[1] = 100; $n[1] = 9; $x[2] = 0; $y[2] = 100; $n[2] = 12; $x[3] = 0; $y[3] = 100; $n[3] = 15; $x[4] = 0; $y[4] = 100; $n[4] = 36; $vr = 0 ; $vi = 0 ; $k = 0.0 ; # Generate 44100 samples ( = 1 second) for $i (1..44100*10) { # Calculate the pitch # (range 0..255 for 8 bits) # $v = sin($counter/2*3.14) * 32000 + 32000; $i = 1; $v[$i] = $x[$i]+3200; $x[$i] = $x[$i] + $y[$i]/$n[$i]*(1.0-$k) + $v[4]*$k ; $y[$i] = $y[$i] - $x[$i]/$n[$i]; $i = 2; $v[$i] = $x[$i]+3200; $x[$i] = $x[$i] + $y[$i]/$n[$i]*(1.0-$k) + $v[1]*$k ; $y[$i] = $y[$i] - $x[$i]/$n[$i]; $i = 3; $v[$i] = $x[$i]+3200; $x[$i] = $x[$i] + $y[$i]/$n[$i]*(1.0-$k) + $v[2]*$k ; $y[$i] = $y[$i] - $x[$i]/$n[$i]; $i = 4; $v[$i] = $x[$i]+3200; $x[$i] = $x[$i] + $y[$i]/$n[$i]*(1.0-$k) + $v[3]*$k ; $y[$i] = $y[$i] - $x[$i]/$n[$i]; $vr = ( $v[1] + $v[2] + $v[3] + $v[4] ); # "pack" it twice for left and right $data .= pack("SS", $vr, $vr); $counter += $increment; } $WAV->Load($data); # get it $WAV->Save("sinus.wav"); # write to disk print "===================================================================\n"; $WAV->Write(); # hear it 1 until $WAV->Status(); # wait for completion # $WAV->Save("sinus.wav"); # write to disk $WAV->Unload(); # drop it