#!/usr/bin/perl

# (c) 2013 DL7UXA JOhannes G. Arlt
# dl7uxa@arltus.de
# No warrenty - keine Gewaehrleistung, keine Grantie, kein gar nix


use strict;
use warnings;
use List::Util 'shuffle';

my @ALPHANUM = qw(
a b c d e f g h i j k l m n o p q r s t u v w x y z
/ = . 1 2 3 4 5 6 7 8 9 0 ae oe ü ß Ĥ
);

push @ALPHANUM, ',';

my @MOST_KNOWN_AFU = qw(abt agcw agn am ant award awdh awh b4 bcnu bd bk bpm bug
cfm cl conds condx cpi cuagn cul cw dk dr dx el ere excus fb fer fr ga gb gd ge
gl gld gm gn gp gt hpe hr hw? info inpt irc lbr lw mni msg mtr my nil nite nr nw
ok om op ot pse pwr rcvd rcvr rig rprt rx rtty sae sase sigs sked sn sri stn
sure swr temp test tks tmw tnx tu trcvr trx ufb vln vy wid wpm wtts wx xcus xmas
 xmtr yxl
QRG QRL QSY QRZ QSK QSB QTH QRX QRV QRS QRQ QRO QRP QRM QRN QRT QRU QSL QSO QSY);

my @AFUAKFUE = qw(
abt ac af afsk agc agcw agn alc am ans ant atv avc award awdh awh
b4 bci bc bci bcl bcnu bd bfo bk bpm bte btr bug
cfm cl co conds condx congrats cpi cq cs cuagn cul cw
dB dc de dk dr dwn dx
el elbug eme ere es ex excus
fb fer fr ff fm fone fr frd frm fsk
ga gb gd ge gl gld gm gn gnd gp gt
ham hf hf hpe hrd hr ht hw?
i iaru if info inpt irc itu
lbr lf lis loc log lsb luf lw
mi min mni mod mri msg mtr muf my
nd net nf ng nil nite nm no nr nw
ob oc ok om op osc oscar ot output
pa pep pm pr pse pwr
r rcvd rcvr ref rf rfi rig rprt rpt rtty rx
sae sase shf sigs sked sn sri ssb  sstv stn sum sure swl swr
tbs temp test tks tmw tnx tu tvi tx trcvr trx
u ufb  uhf unlis ur usb utc
vfo vhf vl vln vy
wid wkd wl wpm wtts wx
xcus xmas xmsn xmtr xtal xyl
yday yl
);


my @QGROUPS = qw(
QRA QRB QRG QRH QRI QRK QRL QRM QRN QRO QRP QRQ QRS QRT QRU QRV QRX QRZ
QSA QSB QSD QSK QSL QSO QSP  QSS QSV QSY QSZ
QTC QTH QTR);

my @NAMES = qw(
adam alex achim andreas andy anton axel bernd bill boris chris christian
dan dieter dimitris ewgenij elio ernst frank franz fred
gerd george gerhard guenter guenther hans harald hartwig hartmut heino henry herbert holger horst
ingo jan jim jens jochen john jose julio juergen juri karin karl klaus knut
leo lutz lothar manfred martin markus nik mike misha
paul patrik phil pit peter rey ralf rene richard rudi roland rolf sabine siggi stan
thomas tom uwe werner wolfgang val vlado volker willi
);

my @DLCITIES = qw(
aachen augsburg bad bamberg berlin bielefeld braunschweig bremen burg chemnitz cottbus cuxhaven
darmstadt dortmund dresden duesseldorf eisenach erfurt erlangen essen flensburg frankfurt freiburg
gera goerlitz goettingen gotha greifswald grevesmuehlen guetersloh
hagen halle hamburg hanover jena kaiserslautern kassel kempten kiel koblenz konstanz krefeld
leipzig liebenwerder luebeck magdeburg mannheim muenchen muenster nuermberg
oldenburg osnabrueck paderborn pankow plauen potsdam rostock
saarbruecken schwante schwerin spandau stralsund stuttgart suhl ulm
wandsbeek wiesbaden wuerzburg wuppertal wurzen zitta zwickau
);

my @CITIES = qw(
basel gedansk kiev moskow salzburg wien ljubljana zuerich genf lausanne geneve biel st gallen linz wien graz klagenfurt praha liberec
plzen brno pardubice ostrava gdansk szczecin poznan lodz warszwa brest bialystok zielonagora katowice wroclaw  krakow minsk kaunas vilnius klaipeda
riga tartu tallin narva sankt-petersburg  odessa constanca sibiu oradea sofia burgas plovdiv skopje beograd szeged sarajevo zagreb budapest bratislava
wien tirane athina larisa  thessloniki korinthos patra izmir ankara istanbul haifa
);

my @EINHUNDERT_DE = qw(
der die und in den von zu das mit sich des auf feur ist im dem nicht ein die eine
 als auch es an werden aus er hat daß sie nach wird bei einer der um am sind
 noch wie einem euber einen das so sie zum war haben nur oder aber vor zur bis
 mehr durch man sein wurde sei in prozent hatte kann gegen vom koennen schon wenn
 habe seine mark ihre dann unter wir soll ich eines es jahr zwei jahren diese
 dieser wieder keine uhr seiner worden und will zwischen im immer millionen ein
 was sagte er);

# 2 Buchstaben - Woerter DE
my @DE2 = qw(in zu im es an er um am so in es im er dm da ab so ob wo am da ja zu um je an ag du ob eu);

# 3 Buchstaben - Woerter DE
my @DE3 = qw(der die und den von das mit des auf ist dem ein die als aus hat sie
bei der wie das sie zum war nur vor zur bis man sei vom wir ich uhr und ein was
mit ihr nun bei ihm ich wir ihn ins uns als wie gut auf spd von usa gab gar was
kam wer mir mal weg cdu tag art man nie den nur pro oft aus hin mai tun wer bin
bis vor neu mal mio zum fdp tod ihr dem nun dpa amt bau lag bzw zur per mag ort
her ist csu alt sah);

# 4 Buchstaben - Woerter DE
my @DE4 = qw(sich fuer eine auch dass nach wird sind noch oder aber mehr sein
kann wenn habe mark ihre dann soll jahr zwei will gibt alle seit muss beim doch
drei neue auch nach ohne etwa weil sagt eine rund fuer aber ende zeit wenn geht
doch sehr hier ganz erst kein denn vier viel dort fast frau zwar dazu mann also
welt land zehn dies teil dass kaum denn geld wohl mich dies fall gilt bonn eher
zahl weit ging ziel darf fest haus seit tage alte dass lang acht juni dann bild
hier juli eben lage laut kurz form gute hand jede gmbh film buch paar euro noch
ihre sein bald klar dort wert werk gebe wahl hoch wort kopf erst dazu zwei beim
alle raum neun chef frei hohe fand auto zwar sohn kind nahm feld bank oben herr
welt idee mehr sieg rede luft weil);

# 5 Buchstaben - Woerter DE
my @DE5 = qw(nicht einer einem ueber einen haben durch wurde hatte gegen schon
seine unter eines diese keine immer sagte jetzt waren jahre neuen damit ihrer
heute ihren seien werde stadt sowie steht dabei wegen etwas viele alles waere
kommt denen fuenf diese leben ihrem ihnen deren sogar frage erste liegt davon
geben sieht sehen macht allen aller wenig lange gehen sechs woche alten dabei
jeder weiss statt platz damit neben haelt thema zeigt seite namen hilfe markt
leute sagen maerz nicht knapp daran grund rolle meter liess hoehe tagen zuvor
genau april ueber stark ganze trotz spiel meint ihres beide musik mitte unter
daten hiess kunst jeden recht seine jetzt schon durch titel setzt staat daher
wolle nacht krieg opfer nimmt firma hohen leben paris recht sonst stand blieb
junge sache genug weise vater preis jedem zudem blick druck viele solle neuer
augen kamen meine kampf weder heute kreis guten darin meist gross neues angst
macht folge osten hause abend trotz boden einen bevor peter jedes china warum
abend liebe neben sicht offen stets japan naehe roman koeln indem reihe darum
einst ihnen);

# 6 Buchstaben - Woerter DE
my @DE6 = qw(werden jahren dieser wieder seiner worden diesem wurden seinen
selbst ersten jedoch sollen seinem wollen berlin hatten machen lassen andere
dieses weiter beiden einmal nichts dafuer kommen diesen sollte wuerde bisher
konnte frauen stehen heisst kinder dessen haette grosse gerade laesst darauf
koenne arbeit bleibt wollte keinen muesse finden dollar wochen jahres allein
einige seines montag europa partei januar musste anfang hinter vielen damals
halten gleich nehmen solche besser system wissen kosten erfolg findet liegen
gruppe stellt sieben eigene ebenso schwer sicher kunden kleine leicht fuehrt
unsere anders august kritik umsatz welche erneut eltern beginn machte bietet
fragen seiten zeigen stueck dieser kirche rahmen zweite wasser monate mutter
letzte zwoelf obwohl spielt westen setzen teilte landes bereit bayern chance
besten stelle direkt jungen sofort zeiten schule region punkte sommer danach
gesagt bilder handel sprach firmen bringt gefahr ganzen streit sowohl meinte
hinaus keiner verein aktien london mittel mensch bonner wenige ziehen dieses
heraus anteil selbst faellt waeren banken leiter buehne gesetz gelten laeuft
bieten bremen moskau urteil kultur saison suchen zahlen gewalt stunde tragen
boerse langen zeigte begann medien vorbei helfen folgen);

# 7 Buchstaben - Woerter DE
my @DE7 = qw(prozent koennen bereits muessen sondern anderen koennte haetten
letzten grossen wuerden zurueck gewesen gestern polizei eigenen weitere angaben
weniger spaeter deshalb gemacht dagegen bleiben derzeit sollten freitag sonntag
einfach gehoert meisten politik zweiten samstag monaten kleinen bringen bekannt
gruenen schnell scheint zukunft maenner oktober gegeben stunden bereich familie
stellen hamburg fuehren mehrere konnten laender voellig bislang minuten duerfen
jeweils einigen spielen nachdem problem laengst besteht buerger trainer februar
moechte zuletzt haelfte strasse gericht wollten bericht beginnt spricht frueher
ansicht endlich solchen einsatz richtig unserer duerfte einzige angebot projekt
niemand schritt zufolge sprache stellte anderer handelt aufgabe dennoch deshalb
dadurch gesehen spieler meinung wenigen loesung mussten braucht richter geplant
italien grosser dritten gesetzt ausland stellen kindern rechnen vorjahr theater
aendern staaten tochter fordert stimmen waehlen anderes drittel betonte konzept
gesamte auftrag genannt haeufig chancen ohnehin wichtig);

# 8 Buchstaben - Woerter DE
my @DE8 = qw(zwischen menschen waehrend muenchen deutsche berliner moeglich
koennten zusammen erhalten deutlich geworden darueber erklaert mittwoch dienstag
ergebnis kuenftig naemlich probleme waehrend laendern erwartet programm offenbar
weiteren dezember bekommen wirklich gekommen november erreicht muessten gebracht
sprecher deutsche gehoeren erstmals gestellt gefunden versucht mehrheit arbeiten
verloren groesste schaffen russland internet richtung personen gefuehrt durchaus
genommen gleichen soldaten kollegen maedchen zugleich erzaehlt parteien darunter
forderte beispiel publikum verletzt weltweit sprechen freilich bedeutet aufgrund
heutigen experten erwarten gewinnen schueler funktion hingegen fuehrung besucher
immerhin position staerker verkauft minister gesamten);


# 9 Buchstaben - Woerter DE
my @DE9 = qw(millionen vor allem deutschen nicht nur regierung naechsten erklaerte
besonders deutschen zunaechst insgesamt ebenfalls frankfurt stuttgart september
ausserdem kommenden innerhalb muenchner ausserdem groessten lediglich weiterhin
situation berichtet zumindest interesse erreichen einzelnen kilometer gemeinsam
bedeutung politiker verfahren gespraech hamburger vergleich koalition frueheren
vertreter parlament industrie verlassen geschaeft jaehrlich zuschauer ehemalige
studenten geplanten verwendet behoerden);

# mehr als 9 Buchstaben - Woerter DE
my @DE_MORE = qw(deutschland unternehmen allerdings vergangenen milliarden
gegenueber geschichte entwicklung praesident inzwischen schliesslich mitarbeiter
gesellschaft donnerstag entscheidung politischen ueberhaupt eigentlich vielleicht
informationen frankreich wirtschaft natuerlich politische immer wieder beispielsweise
verfuegung europaeischen mindestens frankfurter bundesregierung unter anderem mitglieder
wochenende internationalen moeglichkeit amerikanischen bevoelkerung ehemaligen allerdings
mannschaft ausstellung tatsaechlich hauptstadt zusammenarbeit universitaet verschiedenen
buergermeister sicherheit entwickelt diskussion vergangenheit verhandlungen jedenfalls
franzoesischen praesidenten produktion zusammenhang gleichzeitig sogenannten oeffentlichen
unterstuetzung bundesrepublik arbeitsplaetze ministerpraesident berichtete Öeffentlichkeit
stuttgarter insbesondere entschieden angesichts russischen vorsitzende schliesslich
mittlerweile entscheiden uebernehmen verhindern amerikanische bezeichnet);









# ein paar Konstanten die man aendern kann
my $DEFAULT_SPEED_EFF       = 18;       # eff Geschwindigkeit in WPM (Farnsworth)
my $DEFAULT_SPEED           = 30;       # Geschwindigkeit in WPM
my $DEFAULT_DELTA_SPEED     = 5;        # Zufallsdelta Speed
my $DEFAULT_DELTA_SPEED_EFF = 8;        # Zufallsdelta eff. Speed
my $DEFAULT_CENTER_FRQU     = 600;      # mittlere Tonhoehe in Hz
my $DEFAULT_DELTA_FRQU      = 200;      # delta mittlere Tonhoehe in Hz
my $ANZAHL_WDH              = 3;        # jedes Wort / Silbe so oft wiederholen
my $AS_TEXT                 = 1;        # Soll der Inhalt auch als Textdatei ausgegeben werden?
my $ANZAHL_DATEIEN          = 10;       # Wieviele Dateien eines Typs erzeugen?
my $DEFAULT_WORD_SPACE      = 2;        # Wortzwischenraum
my $SPACE_IN_GROUP          = '  ';     # Wieviel Space nach jeder Gruppe? Leerzeichen oder auch ein Gruppentrenner







#gen_mp3file($con, 18, 30, 'abc_18_30-', 'Alphabeth 18/30');
sub gen_mp3file {

    #
    my $content = shift;

    # diese 4 zusaetzlichen Parameter kann man, muss man aber nicht eubergeben.
    my $eff = shift || $DEFAULT_SPEED_EFF;
    my $word = shift || $DEFAULT_SPEED;
    my $outfile_name = shift || 'cw';
    my $title = shift || 'NoTitle';

    my $wspace = $DEFAULT_WORD_SPACE;

    # zufaellige Frequenz +/- $DEFAULT_DELTA_FRQU + $DEFAULT_CENTER_FRQU !!
    my $freq = int (rand() * $DEFAULT_DELTA_FRQU) + $DEFAULT_CENTER_FRQU - $DEFAULT_DELTA_FRQU / 2;

    print "\n\n\tFrequenz: $freq\n\n";

    my $cwout = ' vvv  '; # Start mit 3x v
    my @out = split / /, $content;
    for my $word (@out) {
        for (my $cz=0; $cz < $ANZAHL_WDH; $cz++) {
            $cwout .= "$word ";
        }
        $cwout .= $SPACE_IN_GROUP;
    }

    my	$PIPE_CMD = "/usr/bin/ebook2cw -u -o $outfile_name -W $wspace -e $eff -w $word -f $freq -t '" . $title . "'"; # pipe command
    open (my $PIPE, '|'. $PIPE_CMD) or die("$0 : failed to open  pipe > $PIPE_CMD < : $!");
    print $PIPE $cwout;
    close ($PIPE) or die("$0 : failed to close pipe > $PIPE_CMD < : $!");

    # jetzt ggf. noch die Textdatei
    if ($AS_TEXT) {
        out_as_txt($content, $outfile_name . '0000.txt');
    }
}


# Ausgabe als TXT
sub out_as_txt {
    my ($content, $dateiname) = @_;

    my  $OUTFILE_NAME = $dateiname; # output file name
    open (my $OUTFILE, '>', $OUTFILE_NAME) or croak("$0 : failed to open  output file $OUTFILE_NAME : $!");
    print $OUTFILE $content;
    close ($OUTFILE) or croak("$0 : failed to close output file $OUTFILE_NAME : $!");

}

# nimmt das Array, weurfelt es durcheinander und gibt es als String zureuck.
sub gen_content_from_array {
    my @source = @_;
    my @content = shuffle @source;
    return join ' ', @content;

}


my @goups;
for (my $z=0; $z < $ANZAHL_DATEIEN; $z++) {

################################################################################################
    # hier gewuenschtes Gruppe einsetzen,
    # siehe oben im Script feur verfeugbare Gruppen oder selber neue machen.
    # mehere Guppen mit push @goups, @DE2, @DE4 usw. Kommansepariert und mit Semicolon abschliessen
    push @goups, @AFUAKFUE;

    # das ist dann Teil des Dateinamens
    my $goupname = 'afu_abkuezungen';
################################################################################################

    my $content  = gen_content_from_array(@goups);
    my $wpm = int (rand() * $DEFAULT_DELTA_SPEED) + $DEFAULT_SPEED;
    my $eff = int (rand() * $DEFAULT_DELTA_SPEED_EFF) + $DEFAULT_SPEED_EFF;

    my $count = sprintf("%02d",$z);
    my $dateiname = $count."_${goupname}_".$eff.'_'.$wpm.'-';
    my $title = $count.' einhundert_de '.$eff.'/'.$wpm;
    gen_mp3file($content, $eff, $wpm, $dateiname, $title);
}





