Perl-Composer M3T-Progressions Version 1.034
Code
#!/usr/bin/perl
# composer_200618.plx
use strict;
use warnings;
use 5.010;
# Variablen
my @zwoelftoene = ( "c", "c+", "d", "d+", "e", "f", "f+", "g", "g+", "a", "a+", "b",
"c'", "c+'", "d'", "d+'", "e'", "f'", "f+'", "g'", "g+'", "a'", "a+'", "b'", "c''", "c+''" );
my @startchord = ( 0, 4, 7, 11 );
my @folgechord;
my @m3t4tchords;
my %m3t4tchords;
# Variablenbelegung
@m3t4tchords = ( [ 4,3,4,"Xmaj7" ], [ 4,3,3,"X7" ], [ 3,4,4,"xmaj7" ], [ 3,4,3,"x7" ], [ 3,3,3,"X0" ],
[ 5,2,5,"Xsus4" ], [ 5,2,4,"Xsus4maj7" ], [ 5,2,3,"Xsus47" ], [ 4,3,5,"X" ],
[ 3,4,5,"x" ], [ 4,3,7,"Xsus2" ], [ 3,4,7,"xsus2" ] );
# Akkordschlange
my @akkordschlange;
my @akkordschlangentyp;
$akkordschlange[0] = join ( ",", map { $_ } @startchord );
$akkordschlangentyp[0] = "Schau'n mer mal. ;-)";
# Schleife
for ( 1 .. 111 )
{
# Zufallsauswahl
# Welcher Ton aus dem Startchord?
my $startton = $startchord[int(rand(scalar @startchord))];
print "\n\nStartton: $startton\n\n";
# Welcher Akkord? Welcher Akkordtyp?
my $rndchord = $m3t4tchords[int(rand(scalar @m3t4tchords))];
print "\n\nRandomchord: $rndchord\n";
my @rndchord = @$rndchord;
print "Randomchord und -typ: @rndchord\n\n";
my $akkordtyp = pop @rndchord;
print "Akkordtyp: $akkordtyp\n\n";
print "Randomchord: @rndchord\n\n";
#sleep 5;
$akkordschlangentyp[$_] = " Typ: $akkordtyp";
# Hash aus Zufallsauswahl erstellen
# Ton 1 - Möglichkeiten
my $i = 1;
my $tmpton = $startton;
print "\nTempton $i: $tmpton\n";
$m3t4tchords{$i} = $startton;
foreach ( @rndchord )
{
$i = $i + 1;
$tmpton = $tmpton + $_;
print "\nTempton $i: $tmpton\n";
$m3t4tchords{$i} = $tmpton;
}
print "\n\n", map { $_, " :> ", $m3t4tchords{$_}, "\n" } sort {$a <=> $b } keys %m3t4tchords;
@startchord = split ( ",", join ( ",", map { $m3t4tchords{$_} } sort {$a <=> $b } keys %m3t4tchords ) );
# Startchord ggf. ändern
print "\nStartchord jetzt: ", map { $_, " " } @startchord, "\n";
#sleep 2;
my $versatzpos = int(rand(@startchord));
print "\nMeine Versatzposition: ", $versatzpos, "\n";
my $versatz = $startchord[$versatzpos] - $startchord[0];
print "\nMein Versatz: ", $versatz, "\n";
#sleep 2;
my @tmpstartchord;
foreach ( @startchord )
{
push @tmpstartchord, $_ - $versatz
}
@startchord = @tmpstartchord;
undef @tmpstartchord;
print "\nStartchord nach (ggf.) Änderung: ", map { $_, " " } @startchord, "\n";
#sleep 2;
if ( $startchord[0] < 0 )
{
foreach ( @startchord ) { push @tmpstartchord, $_ + 12 }
@startchord = @tmpstartchord;
}
print "\nStartchord nach (ggf.) Korrektur: ", map { $_, " " } @startchord, "\n";
#sleep 2;
undef @tmpstartchord;
if ( $startchord[0] > 12 )
{
foreach ( @startchord ) { push @tmpstartchord, $_ - 12 }
@startchord = @tmpstartchord;
}
print "\nStartchord nach (ggf.) 2. Korrektur: ", map { $_, " " } @startchord, "\n";
#sleep 2;
# Akkordschlangenbildung
$akkordschlange[$_] = join ( ",", map { $_ } @startchord );
}
# Akkordschlange ausdrucken
print "\n\n", map { $_, "\n" } @akkordschlange;
# Akkordschlange mit Noten
my $i = 0;
my $grundton_lc;
my $grundton_uc;
my $akkord;
foreach ( @akkordschlange )
{
chomp $_;
my @tmparray = split ( ",", $_ );
print map { $_, " : ", $zwoelftoene[$_], " || " } @tmparray;
#print @akkordschlangentyp[$i];
#print " Grundton: $zwoelftoene[$tmparray[0]]";
$grundton_lc = $zwoelftoene[$tmparray[0]];
$grundton_uc = uc $grundton_lc;
$akkord = @akkordschlangentyp[$i];
$akkord =~ s/Typ: //;
$akkord =~ s/x/$grundton_lc/;
$akkord =~ s/X/$grundton_uc/;
print " Akkord: $akkord";
print "\n";
$i++;
}
Output (Ausschnitt)
"Schau'n mer mal" = Cmaj7...
0 : c || 4 : e || 7 : g || 11 : b || Akkord: Schau'n mer mal. ;-)
4 : e || 7 : g || 11 : b || 14 : d' || Akkord: e7
0 : c || 4 : e || 7 : g || 11 : b || Akkord: Cmaj7
4 : e || 7 : g || 11 : b || 15 : d+' || Akkord: emaj7
4 : e || 8 : g+ || 11 : b || 16 : e' || Akkord: E
0 : c || 4 : e || 7 : g || 11 : b || Akkord: Cmaj7
7 : g || 11 : b || 14 : d' || 17 : f' || Akkord: G7
2 : d || 5 : f || 8 : g+ || 11 : b || Akkord: D0
1 : c+ || 5 : f || 8 : g+ || 13 : c+' || Akkord: C+
1 : c+ || 4 : e || 8 : g+ || 13 : c+' || Akkord: c+
1 : c+ || 4 : e || 8 : g+ || 15 : d+' || Akkord: c+sus2
4 : e || 8 : g+ || 11 : b || 15 : d+' || Akkord: Emaj7
11 : b || 15 : d+' || 18 : f+' || 22 : a+' || Akkord: Bmaj7
6 : f+ || 9 : a || 13 : c+' || 20 : g+' || Akkord: f+sus2
6 : f+ || 10 : a+ || 13 : c+' || 20 : g+' || Akkord: F+sus2
4 : e || 8 : g+ || 11 : b || 15 : d+' || Akkord: Emaj7
9 : a || 12 : c' || 16 : e' || 20 : g+' || Akkord: amaj7
9 : a || 12 : c' || 16 : e' || 21 : a' || Akkord: a
6 : f+ || 9 : a || 13 : c+' || 16 : e' || Akkord: f+7
6 : f+ || 10 : a+ || 13 : c+' || 16 : e' || Akkord: F+7
2 : d || 5 : f || 9 : a || 16 : e' || Akkord: dsus2
8 : g+ || 11 : b || 14 : d' || 17 : f' || Akkord: G+0
8 : g+ || 11 : b || 15 : d+' || 20 : g+' || Akkord: g+
4 : e || 7 : g || 11 : b || 14 : d' || Akkord: e7
9 : a || 13 : c+' || 16 : e' || 19 : g' || Akkord: A7
9 : a || 13 : c+' || 16 : e' || 23 : b' || Akkord: Asus2
4 : e || 7 : g || 11 : b || 16 : e' || Akkord: e
5 : f || 8 : g+ || 11 : b || 14 : d' || Akkord: F0
10 : a+ || 15 : d+' || 17 : f' || 22 : a+' || Akkord: A+sus4
3 : d+ || 6 : f+ || 10 : a+ || 13 : c+' || Akkord: d+7
11 : b || 15 : d+' || 18 : f+' || 22 : a+' || Akkord: Bmaj7
4 : e || 8 : g+ || 11 : b || 16 : e' || Akkord: E
8 : g+ || 12 : c' || 15 : d+' || 22 : a+' || Akkord: G+sus2
8 : g+ || 11 : b || 15 : d+' || 18 : f+' || Akkord: g+7
10 : a+ || 15 : d+' || 17 : f' || 21 : a' || Akkord: A+sus4maj7
1 : c+ || 5 : f || 8 : g+ || 12 : c' || Akkord: C+maj7
8 : g+ || 12 : c' || 15 : d+' || 18 : f+' || Akkord: G+7
6 : f+ || 9 : a || 13 : c+' || 17 : f' || Akkord: f+maj7
6 : f+ || 10 : a+ || 13 : c+' || 17 : f' || Akkord: F+maj7
8 : g+ || 11 : b || 15 : d+' || 22 : a+' || Akkord: g+sus2
5 : f || 10 : a+ || 12 : c' || 17 : f' || Akkord: Fsus4
12 : c' || 17 : f' || 19 : g' || 24 : c'' || Akkord: C'sus4
...
Taugt recht gut zum Lernen/Üben.
Kommentare
Kommentar veröffentlichen