use strict;
use warnings;
use Win32::Sound;

# WaveOut-Objekt anlegen Saplingrate: 44100, 8 Bit, 2 Kanaele
my $wavsound = new Win32::Sound::WaveOut(44100, 8, 2);

# halbvoll aufdrehen
$wavsound->Volume('50%');

# 880-Hz-Ton, 1 s Dauer "bauen"
my $dat = tone(880,1);
$wavsound->Load($dat);           # Rohdaten --> wav
$wavsound->Write();              # anhoeren
1 while(! $wavsound->Status());  # warten, bis fertig
$wavsound->Save("sinus.wav");    # in Datei schreiben
$wavsound->Unload();             # wegwerfen

# Jingle
$dat = tone(1244,0.2);
$dat .= tone(1244,0.2);
$dat .= tone(1244,0.2);
$dat .= tone(1760,0.2);
$dat .= tone(1244,0.2);
$wavsound->Load($dat);           # Rohdaten --> wav
$wavsound->Write();              # anhoeren
1 while(! $wavsound->Status());  # warten, bis fertig
$wavsound->Unload();             # wegwerfen

print "Moment bitte ...\n";
# 200 Hz - 4000 Hz ansteigender Ton
$dat = '';
my $k;
for ($k = 200; $k <= 4000; $k += 20)
  {
  $dat .= tone($k,0.4);
  }
$wavsound->Load($dat);           # Rohdaten --> wav
$wavsound->Write();              # anhoeren
1 while(! $wavsound->Status());  # warten, bis fertig
$wavsound->Unload();             # wegwerfen


sub tone # ($frequency, $duration)
  {
  my ($freq, $duration)= @_;
  my $pi = 3.14159265358979;  
  my $data = "";               # Speicher fuer die Sounddaten
  my $value = 0;               # aktueller Wert                
  my $step = $freq/44100;      # Increment = Frequenz/Samplingrate

  # 44100 Samples/s generieren
  for my $i (1 .. $duration*44100) 
    {
    # Sinuskurve berechnen, Wertebereich 0-255 fuer 8 Bit
    # Nullinie bei 128
    my $v = int(sin($value/2.0*$pi)*128 + 128);
    # zweimal packen fuer linken und rechten Kanal
    $data .= pack("CC", $v & 255, $v & 255);
    $value += $step;
    }
  return($data);
  }
