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
Kommentar veröffentlichen