Fortschrittchen

Melodie-Harmonie-Studien

 
Sollen jetzt auch nebenher laufen. Hiermit begonnen:

 
Die ersten zaghaften Auslotungen, um ein Gefühl dafür zu kriegen, was sich wo wie ändern oder was wo wie gleichbleiben muß, wenn sich etwas wie wo ändert oder es gleichbleibt. Der Bass soll immer den Grundton der jeweiligen Harmonie (-stufe) darstellen, die Stimmen der vollständigen Harmonie ( von 3- bis n-stimmig) verteilen sich auf die anderen Instrumente, die Violine 1 soll aber monophon immer die oberste Melodielinie spielen. Bis auf Weiteres sei das mal so festgesetzt - ich muß das von Grund auf lernen und weiß natürlich noch nicht genau, was noch alles an Möglichkeiten auf mich zukommt. Zum Beispiel habe ich bei der ersten Ausführung erkannt, was in der Violine 2 passieren muß, wenn ich in der Bratsche eine enge monophone Melodieführung der Art, wie ich sie dort versucht habe, vorher festlege. Und die Melodieführung der ersten Ausführung könnte ja auch wie folgt beginnen: ccch..., cach..., caah... ... mer schaue mal, ganz slowly und mit nach-&-nach-Gründlichkeit ...

 

Das zugehörige MP3




 

Die nächste Produktlinie des Hydrogen-Drum-Pattern-Creators steht noch mehr & fester in den Startlöchern

 

Code

 
#!/usr/bin/perl

# hydrogen-pattern-writer_4.minus1.pl

use strict;
use warnings;


# Variablen

## Soundbank-Name => (Instrumentenanzahl,Instrumentengruppen-Hash of Arrays, z.B. "Kicks", "Snares"..],..)

my %soundbanks = (
    "Forzee Stereo Drumkit Gain 0,5" => [26,
                                            {"kicks" => [0],
                                             "toms"=>[1,2,3],
                                             "snares"=>[4,5,6,7],
                                             "rims sticks"=>[8,26],
                                             "hihats closed"=>[9],
                                             "hihats open"=>[10,11,12],
                                             "rides"=>[13,14,15,16],
                                             "crashs"=>[17,18,19,20,21],
                                             "tambourines"=>[22,23],
                                             "agogos"=>[24,25]}
                                                                ] );



# Programm

## Auswahl der Soundbank

my @soundbanks = keys %soundbanks;
my $soundbank_choice = int rand(scalar @soundbanks);
my $soundbank = $soundbanks[$soundbank_choice];

print "\nFolgende Soundbank wurde ausgewählt: $soundbank\n\n";

### Instrumentenanzahl & Instrumentengruppen

my $inst_count = $soundbanks{$soundbank}[0];

print "Sie enthält $inst_count Instrumente.\n\n";

my $soundbank_array_ref = $soundbanks{$soundbank};
my $inst_groups_hash_ref = $$soundbank_array_ref[1];
my %inst_groups = %$inst_groups_hash_ref;


#### Ausdruck der Instrumentengruppenauswahl

foreach ( keys %inst_groups ) {
    my $group_name = $_;
    my $insts_array_ref = $inst_groups{$group_name};
    my @insts = @$insts_array_ref;
    print "Gruppenname: $_, Instrumente: ", join (",", map { $_ } @insts), "\n"
}
print "\n";


## Patternerstellung

for ( my $pattnr = 1; $pattnr < 21; $pattnr++ ) {
    print "\nEs wird Pattern $pattnr erstellt!\n";
    my $groups_count = scalar keys %inst_groups;
    print "Es gibt $groups_count Instrumentengruppen.\n";   
    my @groups;
    # Entscheidung, ob Gruppen per Zufall zusammengestellt oder aus Vorgabe übernommen werden
    my $group_choice = int rand(2);
    ## Falls $group_choice == 1, dann Zufallszusammenstellung
    if ( $group_choice == 1 ) {
        foreach ( keys %inst_groups ) {
            my $bit = int rand(2);
            if ( $bit == 1 ) { push @groups, $_ }
        }
    }
    ## Falls $group_choice == 0, dann Zusammenstellung aus Vorgabe (Subroutine groups)
    elsif ( $group_choice == 0 ) {
        my $groups_ref = groups();
        @groups = @$groups_ref
    }
    print "Folgende Gruppen wurden für Pattern $pattnr zusammengestellt:\n";
    print map { $_, "\n" } @groups;
    # Für jede Gruppe
    foreach ( @groups ) {
        my $group = $_;
        print "\nGruppe $group wird bearbeitet!\n";
        my $groupsub = $group;
        $groupsub =~ s/ /_/;
        my $grouppattern;
        # Prüfen, ob Subroutine dieses Namens existiert
        ## http://www.perl-community.de/bat/poard/thread/6226
        if ( my $sub = main->can($groupsub) ) {
            print "Subroutine existiert!\n";
            $grouppattern = $sub->();
            print "Ausgewähltes Gruppen-Pattern:\n";
            print $grouppattern, "\n";
            my $noten = notes($group,$grouppattern);
            print "Ausgegebene Noten:\n";
            print $noten, "\n";
        }
        else {
            print "Subroutine existiert nicht!\n";
            print "Kein Gruppen-Pattern auswählbar!\n";
        }
        # Prüfen, ob $grouppattern mit Array-Referenz belegt wurde
        ## https://www.perlmonks.org/?node_id=118961
        if ( ref($grouppattern) eq 'ARRAY' ) {
            print map { $_, "\n" } @$grouppattern
        }
   
    }
}



#################################################################################
##################### SUBROUTINEN ######################
#################################################################################

# Subroutine groups ( Vorgabe-Zusammenstellungen für Instrumentengruppen )

sub groups {
    print "\nVorgabezusammenstellungs-Subroutine wurde aufgerufen!\n";
    my @groups = ( ["kicks","snares","hihats closed"],
                   ["kicks","snares","rims sticks"] );
    my $groups_count = scalar @groups;
    print "Es existieren $groups_count Vorgabezusammenstellungen von Instrumentengruppen!\n";
    my $group_choice = int rand($groups_count);
    my $group_ref = $groups[$group_choice];
    my @group = @$group_ref;
    print "Es wurde Zusammenstellung $group_choice ausgelost!\n";
    return \@group
}
   
# Subroutine notes ( Notenermittlung, abhängig von Instrumentengruppe )

sub notes {
    my $group = shift;
    my $pattern = shift;
    my $notes = "";
    my $insts;
    # Noten für ein Instrument oder verteilt auf mehrere
    if ( $group eq "agogos" ) { $insts = 2 }
    elsif ( $group ne "agogos" ) { $insts = 1 }
    # ...
    # Noten zu Hydrogen-XML-Format transformieren
    foreach ( @$pattern ) {
        my $note = $_;
        $note = "Note: ".$note." ist willkommen! ;-) \n";
        $notes = $notes.$note;
    }
    # Rückgabe des erzeugten Noten-Strings
    return $notes
}

# Subroutinen für Instrumentengruppen

## sub kicks

sub kicks {
    my @patterns_viertel = (
        ["0", "48", "96", "144"],
        ["-", "48", "96", "144"],
        ["0", "-", "96", "144"],
        ["0", "48", "-", "144"],
        ["0", "48", "96", "-"],
        ["-", "-", "96", "144"],
        ["-", "48", "-", "144"],
        ["-", "48", "96", "-"],
        ["0", "-", "-", "144"],
        ["0", "-", "96", "-"],
        ["0", "48", "-", "-"],
        ["-", "48", "-", "144"] );
    my @patterns = ( @patterns_viertel );
    my $patterns_count = scalar @patterns;
    print "Es existieren $patterns_count Pattern für Instrumentengruppe \"kicks\"!\n";
    my $pattern_choice = int rand($patterns_count);
    my $pattern_ref = $patterns[$pattern_choice];
    my @pattern = @$pattern_ref;
    print "Es wurde Pattern $pattern_choice ausgelost!\n";
    return \@pattern
}   
           

 

Output

 
...
Es wird Pattern 17 erstellt!
Es gibt 10 Instrumentengruppen.

Vorgabezusammenstellungs-Subroutine wurde aufgerufen!
Es existieren 2 Vorgabezusammenstellungen von Instrumentengruppen!
Es wurde Zusammenstellung 1 ausgelost!
Folgende Gruppen wurden für Pattern 17 zusammengestellt:
kicks
snares
rims sticks

Gruppe kicks wird bearbeitet!
Subroutine existiert!
Es existieren 12 Pattern für Instrumentengruppe "kicks"!
Es wurde Pattern 9 ausgelost!
Ausgewähltes Gruppen-Pattern:
ARRAY(0x9eb7e94)
Ausgegebene Noten:
Note: 0 ist willkommen! ;-)
Note: - ist willkommen! ;-)
Note: 96 ist willkommen! ;-)
Note: - ist willkommen! ;-)

0
-
96
-

Gruppe snares wird bearbeitet!
Subroutine existiert nicht!
Kein Gruppen-Pattern auswählbar!

Gruppe rims sticks wird bearbeitet!
Subroutine existiert nicht!
Kein Gruppen-Pattern auswählbar!

Es wird Pattern 18 erstellt!
Es gibt 10 Instrumentengruppen.
Folgende Gruppen wurden für Pattern 18 zusammengestellt:
kicks
rides
agogos
toms
crashs
hihats closed

Gruppe kicks wird bearbeitet!
Subroutine existiert!
Es existieren 12 Pattern für Instrumentengruppe "kicks"!
Es wurde Pattern 5 ausgelost!
Ausgewähltes Gruppen-Pattern:
ARRAY(0x9eb7ed0)
Ausgegebene Noten:
Note: - ist willkommen! ;-)
Note: - ist willkommen! ;-)
Note: 96 ist willkommen! ;-)
Note: 144 ist willkommen! ;-)

-
-
96
144

Gruppe rides wird bearbeitet!
Subroutine existiert nicht!
Kein Gruppen-Pattern auswählbar!
...

 
Morje oder übermorje geht's weida.

Kommentare

Beliebte Posts aus diesem Blog

·

Es brennt.

Bye, bye Nord Stream 2!