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

Beliebte Posts aus diesem Blog

·

Es brennt.

Bye, bye Nord Stream 2!