Ein kleiner Modus-Checker
Neuer Zwischenstand
Code
#!/usr/bin/perl
# modefinder-1.0.pl
use strict;
use warnings;
# Variablen
my %chordtypes = (
"Maj7sus2" => ["Maj7sus2", "0", "2", "7", "11"],
"Maj7sus4" => ["Maj7sus4", "0", "5", "7", "11"],
"7sus2" => ["7sus2", "0", "2", "7", "10"],
"7sus4" => ["7sus4", "0", "5", "7", "10"],
"Dur" => ["Dur", "0", "4", "7", "12"],
"Dursus2" => ["Dursus2", "0", "2", "4", "7"],
"Durb5" => ["Durb5", "0", "4", "6", "12"],
"Durb5sus2" => ["Durb5sus2", "0", "2", "4", "6"],
"Dur#5" => ["Dur#5", "0", "4", "8", "12"],
"Dur#5sus2" => ["Dur#5sus2", "0", "2", "4", "8"],
"DurMaj7" => ["DurMaj7", "0", "4", "7", "11"],
"DurMaj7b5" => ["DurMaj7b5", "0", "4", "6", "11"],
"DurMaj7#5" => ["DurMaj7#5", "0", "4", "8", "11"],
"Dur7" => ["Dur7", "0", "4", "7", "10"],
"Dur7b5" => ["Dur7b5", "0", "4", "6", "10"],
"Dur7add9" => ["Dur7add9", "0", "5", "10", "14"],
"Dur6" => ["Dur6", "0", "4", "9", "12"],
"Dur6sus2" => ["Dur6sus2", "0", "2", "4", "9"],
"Dur6b5" => ["Dur6b5", "0", "4", "6", "9"],
"Moll" => ["Moll", "0", "3", "7", "12"],
"Mollsus2" => ["Mollsus2", "0", "2", "3", "7"],
"Mollsus4" => ["Mollsus4", "0", "3", "5", "7"],
"Mollb5" => ["Mollb5", "0", "3", "6", "12"],
"Mollb5sus2" => ["Mollb5sus2", "0", "2", "3", "6"],
"Moll#5" => ["Moll#5", "0", "3", "8", "12"],
"Moll#5sus2" => ["Moll#5sus2", "0", "2", "3", "8"],
"MollMaj7" => ["MollMaj7", "0", "3", "7", "11"],
"MollMaj7b5" => ["MollMaj7b5", "0", "3", "6", "11"],
"MollMaj7#5" => ["MollMaj7#5", "0", "3", "8", "11"],
"Moll7" => ["Moll7", "0", "3", "7", "10"],
"Moll7b5" => ["Moll7b5", "0", "3", "6", "10"],
"Moll6" => ["Moll6", "0", "3", "7", "12"],
"Moll6sus2" => ["Moll6sus2", "0", "2", "3", "7"],
"Moll65" => ["Moll65", "0", "3", "7", "9"],
"dim1" => ["dim1", "0", "1", "2", "3"],
"dim2" => ["dim2", "0", "2", "4", "6"],
"Dim7" => ["Dim7", "0", "3", "6", "9"]
);
my %chroma = (
"C-" => 0,
"C" => 1,
"D-" => 2,
"D" => 3,
"E-" => 4,
"E" => 5,
"F-" => 5,
"F" => 6,
"G-" => 7,
"G" => 8,
"A-" => 9,
"A" => 10,
"B-" => 11,
"B" => 12 );
my %chroma_inv = (
"0" => "C-",
"1" => "C",
"2" => "D-",
"3" => "D",
"4" => "E-",
"5" => "E",
"6" => "F",
"7" => "G-",
"8" => "G",
"9" => "A-",
"10" => "A",
"11" => "B-",
"12" => "B" );
my %modes = (
Ionisch => ['0', '2', '4', '5', '7', '9', '11'],
Dorisch => ['0', '2', '3', '5', '7', '9', '10'],
Phrygisch => ['0', '1', '3', '5', '7', '8', '10'],
Lydisch => ['0', '2', '4', '6', '7', '9', '11'],
Mixolydisch => ['0', '2', '4', '5', '7', '9', '10'],
Aeolisch => ['0', '2', '3', '5', '7', '8', '10'],
Lokrisch => ['0', '1', '3', '5', '6', '8', '10'] );
### Kontrollausdruck der Modes auf Grundton A
foreach ( sort { $a cmp $b } keys %modes ) {
my $mode_temp = $_;
print "\nMein aktueller Modus: $mode_temp\n\n";
my $control_ref = $modes{$_};
my @control = @$control_ref;
my $notevalue_ctrl = '10';
foreach ( @control ) {
my $notevalue_temp = $notevalue_ctrl + $_;
if ( $notevalue_temp > 12 ) { $notevalue_temp = $notevalue_temp - 12 }
my $note_temp = $chroma_inv{$notevalue_temp};
print "Mein aktueller Ton: $note_temp\n";
}
}
# Programm
## Zufallsauswahl eines Akkords
my $grundton_value = int rand (12) + 1;
my $grundton = $chroma_inv{$grundton_value};
print "\nDer ausgewählte Grundton-Wert ist: $grundton_value\n";
print "Der ausgewählte Grundton ist: $grundton\n\n";
my @chordtypes = map { $_ } keys %chordtypes;
my $akkord = int rand (scalar @chordtypes);
$akkord = $chordtypes[$akkord];
print "Der ausgewählte Akkord ist: $akkord\n\n";
## Ermittlung der Intervalle + Töne, die im Akkord vorkommen
my %chordnotes;
my $intervalle_ref = $chordtypes{$akkord};
my @intervalle = @$intervalle_ref;
foreach ( @intervalle ) {
if ( $_ eq $intervalle[0] ) { next }
my $notevalue_temp = $grundton_value + $_;
if ( $notevalue_temp > 12 ) { $notevalue_temp = $notevalue_temp - 12 }
my $note_temp = $chroma_inv{$notevalue_temp};
if ( not exists $chordnotes{$note_temp} ) { $chordnotes{$note_temp} = 1 }
}
print "Array der Intervalle:\n\n";
print join (" :: ", map { $_ } @intervalle);
print "\n\n";
print "Array der Töne:\n\n";
print join (" :: ", map { $_ } keys %chordnotes);
print "\n\n";
## Ermitteln des Tonstrings aus dem Akkord
my $notestring = "";
map { $notestring = $notestring.$_ } sort { $a cmp $b } keys %chordnotes;
print "Der ermittelte Tonstring ist: $notestring\n\n";
## Ermitteln der Tonstrings aus den Modes
my %modenotesstrings;
foreach ( sort { $a <=> $b } keys %chroma_inv ) {
my $grundtonvalue_temp = $_;
print "\n\nMein temporärer Grundton-Wert: $grundtonvalue_temp\n";
my $grundton_temp = $chroma_inv{$grundtonvalue_temp};
print "Mein temporärer Grundton: $grundton_temp\n\n";
foreach ( sort { $a cmp $b } keys %modes ) {
my %modenotes_temp;
my $mode_temp = $_;
print "\nMein aktueller Modus: \"$grundton_temp\"-$mode_temp\n\n";
my $modenotesstring = "";
my $intervalle_temp_ref = $modes{$_};
my @intervalle = @$intervalle_temp_ref;
foreach ( @intervalle ) {
my $notevalue_temp = $grundtonvalue_temp + $_;
if ( $notevalue_temp > 12 ) { $notevalue_temp = $notevalue_temp - 12 }
my $note_temp = $chroma_inv{$notevalue_temp};
print "Mein aktueller Ton: $note_temp\n";
if ( not exists $modenotes_temp{$note_temp} ) { $modenotes_temp{$note_temp} = 1 }
}
map { $modenotesstring = $modenotesstring.$_ } sort { $a cmp $b } keys %modenotes_temp;
print "\nMein erzeugter Tonstring zu \"$grundton_temp\"-$mode_temp:\n$modenotesstring\n\n";
if ( not exists $modenotesstrings{$grundton_temp.'-'.$mode_temp} ) {
$modenotesstrings{'"'.$grundton_temp.'"-'.$mode_temp} = $modenotesstring }
}
}
## Korrektur des Bug-1111 ( "C-" = "B" & vice versa )
foreach ( keys %modenotesstrings ) {
my $string_temp = $_;
if ( $string_temp =~ m/^"C-"/ ) { delete $modenotesstrings{$string_temp} }
}
### Kontrolldruck der Modalton-Strings
print "\nMeine ", scalar keys %modenotesstrings, " Modalton-Strings:\n\n";
print join ("\n", map { $_." = ".$modenotesstrings{$_} } sort { $a cmp $b } keys %modenotesstrings);
print "\n\n";
## Vergleich des Akkordstrings mit den Modalton-Strings
my @matchmode;
my $string2compare_regex = $notestring;
$string2compare_regex =~ s/([ABCDEFGA][-]*)/$1,.*/g;
$string2compare_regex =~ s/(.*)/.*$1/;
print "\nMein zu vergleichender Regex-Ton-String: $string2compare_regex\n\n";
foreach ( keys %modenotesstrings ) {
my $string_temp = $modenotesstrings{$_};
$string_temp =~ s/([ABCDEFGA][-]*)/$1,/g;
my $mode_temp = $_;
if ( $string_temp =~ m/$string2compare_regex/ ) {
print "Hiphip-hooray! ";
print "$mode_temp ist möglich!\n";
print "Modal-Ton-String: $string_temp\n";
print "Ton-String: $notestring\n\n";
push @matchmode, $mode_temp;
}
}
## Ausgabe der Möglichkeiten
my $grundton_readable = $grundton;
$grundton_readable =~ s/-/b/;
print "\nEs gibt ", scalar @matchmode, " Modus-Möglichkeiten für \"$grundton_readable\"-$akkord!\n\n";
print "Davon sind ...\n\nAeolisch:\n";
foreach ( @matchmode ) {
my $mode_temp = $_;
$mode_temp =~ s/-"-/b"-/;
if ( $mode_temp =~ m/Aeolisch/ ) {
print $mode_temp, "\n"
}
}
print "\nIonisch:\n";
foreach ( @matchmode ) {
my $mode_temp = $_;
$mode_temp =~ s/-"-/b"-/;
if ( $mode_temp =~ m/Ionisch/ ) {
print $mode_temp, "\n"
}
}
print "\nDorisch:\n";
foreach ( @matchmode ) {
my $mode_temp = $_;
$mode_temp =~ s/-"-/b"-/;
if ( $mode_temp =~ m/Dorisch/ ) {
print $mode_temp, "\n"
}
}
print "\nMixolydisch:\n";
foreach ( @matchmode ) {
my $mode_temp = $_;
$mode_temp =~ s/-"-/b"-/;
if ( $mode_temp =~ m/Mixolydisch/ ) {
print $mode_temp, "\n"
}
}
print "\n";
Output-Samples
Es gibt 14 Modus-Möglichkeiten für "F"-Maj7sus2!
Davon sind ...
Aeolisch:
"A"-Aeolisch
"D"-Aeolisch
Ionisch:
"C"-Ionisch
"F"-Ionisch
Dorisch:
"G"-Dorisch
"D"-Dorisch
Mixolydisch:
"G"-Mixolydisch
"C"-Mixolydisch
Es gibt 21 Modus-Möglichkeiten für "Eb"-Dursus2!
Davon sind ...
Aeolisch:
"C"-Aeolisch
"G"-Aeolisch
"F"-Aeolisch
Ionisch:
"Bb"-Ionisch
"Ab"-Ionisch
"Eb"-Ionisch
Dorisch:
"F"-Dorisch
"C"-Dorisch
"Bb"-Dorisch
Mixolydisch:
"Bb"-Mixolydisch
"F"-Mixolydisch
"Eb"-Mixolydisch
Es gibt 7 Modus-Möglichkeiten für "Gb"-Dur6b5!
Davon sind ...
Aeolisch:
"Bb"-Aeolisch
Ionisch:
"Db"-Ionisch
Dorisch:
"Eb"-Dorisch
Mixolydisch:
"Ab"-Mixolydisch
Es gibt 0 Modus-Möglichkeiten für "D"-Dur#5!
Davon sind ...
Aeolisch:
Ionisch:
Dorisch:
Mixolydisch:
Es gibt 14 Modus-Möglichkeiten für "Bb"-DurMaj7!
Davon sind ...
Aeolisch:
"G"-Aeolisch
"D"-Aeolisch
Ionisch:
"Bb"-Ionisch
"F"-Ionisch
Dorisch:
"G"-Dorisch
"C"-Dorisch
Mixolydisch:
"F"-Mixolydisch
"C"-Mixolydisch
...
Mein zu vergleichender Regex-Ton-String: .*B,.*C,.*E,.*G-,.*
Hiphip-hooray! "A"-Dorisch ist möglich!
Modal-Ton-String: A,B,C,D,E,G,G-,
Ton-String: BCEG-
Hiphip-hooray! "G-"-Lokrisch ist möglich!
Modal-Ton-String: A,B,C,D,E,G,G-,
Ton-String: BCEG-
Hiphip-hooray! "E"-Aeolisch ist möglich!
Modal-Ton-String: A,B,C,D,E,G,G-,
Ton-String: BCEG-
Hiphip-hooray! "C"-Lydisch ist möglich!
Modal-Ton-String: A,B,C,D,E,G,G-,
Ton-String: BCEG-
Hiphip-hooray! "D"-Mixolydisch ist möglich!
Modal-Ton-String: A,B,C,D,E,G,G-,
Ton-String: BCEG-
Hiphip-hooray! "G"-Ionisch ist möglich!
Modal-Ton-String: A,B,C,D,E,G,G-,
Ton-String: BCEG-
Hiphip-hooray! "B"-Phrygisch ist möglich!
Modal-Ton-String: A,B,C,D,E,G,G-,
Ton-String: BCEG-
Es gibt 7 Modus-Möglichkeiten für "C"-DurMaj7b5!
Davon sind ...
Aeolisch:
"E"-Aeolisch
Ionisch:
"G"-Ionisch
Dorisch:
"A"-Dorisch
Mixolydisch:
"D"-Mixolydisch
Es fehlen noch ein paar Modes, die werden gleich eingepflegt.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zwei wichtige Modes habe ich noch dazugenommen. Das soll erstmal reichen.
my %modes = (
Ionisch => ['0', '2', '4', '5', '7', '9', '11'],
Dorisch => ['0', '2', '3', '5', '7', '9', '10'],
Phrygisch => ['0', '1', '3', '5', '7', '8', '10'],
Lydisch => ['0', '2', '4', '6', '7', '9', '11'],
Mixolydisch => ['0', '2', '4', '5', '7', '9', '10'],
Aeolisch => ['0', '2', '3', '5', '7', '8', '10'],
Lokrisch => ['0', '1', '3', '5', '6', '8', '10'],
Vermindert => ['0', '2', '3', '5', '6', '8', '9','11'],
Alteriert => ['0', '1', '3', '4', '6', '8', '10'] );
Output-Beispiele
Es gibt 13 Modus-Möglichkeiten für "C"-Moll65!
Davon sind ...
Aeolisch:
"G"-Aeolisch
Ionisch:
"Bb"-Ionisch
Dorisch:
"C"-Dorisch
Mixolydisch:
"F"-Mixolydisch
Vermindert:
"Db"-Vermindert
"Bb"-Vermindert
"E"-Vermindert
"G"-Vermindert
Alteriert:
"B"-Alteriert
"A"-Alteriert
Es gibt 13 Modus-Möglichkeiten für "C"-Dur7!
Davon sind ...
Aeolisch:
"D"-Aeolisch
Ionisch:
"F"-Ionisch
Dorisch:
"G"-Dorisch
Mixolydisch:
"C"-Mixolydisch
Vermindert:
"G"-Vermindert
"Db"-Vermindert
"Bb"-Vermindert
"E"-Vermindert
Alteriert:
"E"-Alteriert
"Gb"-Alteriert
Es gibt 4 Modus-Möglichkeiten für "C"-MollMaj7#5!
Davon sind ...
Aeolisch:
Ionisch:
Dorisch:
Mixolydisch:
Vermindert:
"Gb"-Vermindert
"A"-Vermindert
"C"-Vermindert
"Eb"-Vermindert
Alteriert:
Es gibt 26 Modus-Möglichkeiten für "C"-Dur65!
Davon sind ...
Aeolisch:
"D"-Aeolisch
"A"-Aeolisch
"E"-Aeolisch
Ionisch:
"G"-Ionisch
"F"-Ionisch
"C"-Ionisch
Dorisch:
"G"-Dorisch
"D"-Dorisch
"A"-Dorisch
Mixolydisch:
"G"-Mixolydisch
"C"-Mixolydisch
"D"-Mixolydisch
Vermindert:
"E"-Vermindert
"Db"-Vermindert
"G"-Vermindert
"Bb"-Vermindert
Alteriert:
"Gb"-Alteriert
Es gibt 30 Modus-Möglichkeiten für "C"-7sus4!
Davon sind ...
Aeolisch:
"G"-Aeolisch
"F"-Aeolisch
"D"-Aeolisch
"C"-Aeolisch
Ionisch:
"Bb"-Ionisch
"F"-Ionisch
"Eb"-Ionisch
"Ab"-Ionisch
Dorisch:
"G"-Dorisch
"F"-Dorisch
"C"-Dorisch
"Bb"-Dorisch
Mixolydisch:
"Eb"-Mixolydisch
"F"-Mixolydisch
"C"-Mixolydisch
"Bb"-Mixolydisch
Vermindert:
Alteriert:
"E"-Alteriert
"A"-Alteriert
Kommentare
Kommentar veröffentlichen