Hydrogen-Xplorations
Heute widme ich mich mal (u.A.) der Beatproduktion.
Begonnen
habe ich mit einem kleinen Programm, was mir (halb-) zufällige
Drumpattern erstellt, die ich in Hydrogen importieren kann.
#!/usr/bin/perl
# hydrogen-pattern-writer.pl
use strict;
use warnings;
use DBI;
use ZugangsDaten_postgresql qw($DB_USER $DB_PASSWD);
use Encode qw(is_utf8 decode encode);
use Storable qw(store retrieve);
# Variablen
my $head = '<?xml version="1.0" encoding="UTF-8"?>
<drumkit_pattern>
<pattern_for_drumkit>GMkit</pattern_for_drumkit>
<author>Zarko Maroli</author>
<license>omx(Hembelz)-Lizenz</license>
<pattern>
<pattern_name>random-pattern-11.1</pattern_name>
<info></info>
<category>No category</category>
<size>192</size>
<noteList>'."\n";
my $tail = ' </noteList>
</pattern>
</drumkit_pattern>';
my $pos_var;
my $note_var_1 = " <note>
<position>";
my $note_var_2 = "</position>
<leadlag>0</leadlag>
<velocity>0.8</velocity>
<pan_L>0.5</pan_L>
<pan_R>0.5</pan_R>
<pitch>0</pitch>
<key>C0</key>
<length>-1</length>
<instrument>";
my $note_var_3 = "</instrument>
</note>\n";
my $kick = "0";
my $stick = "1";
my $clhh = "6";
my $notes_kick = "";
my $notes_stick = "";
my $notes_clhh = "";
my @positions_4 = ("0", "48", "96", "144");
my @positions_8 = ("0", "24", "48", "72", "96", "120", "144", "168");
my @positions_16 = ("0", "12", "24", "36", "48", "60", "72", "84", "96", "108", "120", "132", "144", "156", "168", "180");
# Program
foreach ( @positions_4 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_kick = $notes_kick.$note_var_1.$pos_var.$note_var_2.$kick.$note_var_3
} else { next }
}
foreach ( @positions_8 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_stick = $notes_stick.$note_var_1.$pos_var.$note_var_2.$stick.$note_var_3
} else { next }
}
foreach ( @positions_16 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_clhh = $notes_clhh.$note_var_1.$pos_var.$note_var_2.$clhh.$note_var_3
}
}
# Pattern speichern
my $pattern_new = $head.$notes_kick.$notes_stick.$notes_clhh.$tail;
open ( my $fh, '>/home/zarko/.hydrogen/data/patterns/randompatterns/hydropattern.h2pattern' );
print $fh $pattern_new;
close $fh;
Mein Code kreiert mir dann solche genialen Pattern wie diese:
;-)
Logo,
damit kann fim noch nicht viel mit anfangen. Aber es braucht - glaube
ich - nicht allzuviel Phantasie, um sich ausmalen zu können, wie sich
das im Sinne meiner "Kleinen Aufbauwissenschaft" sinnig erweitern lassen
kann. Oder?
Kleine Anschubshilfe:
Es
lassen sich mit ein paar Vorgaben auf diese Art einige
Basis-Variationen erstellen, die dann als Ausgangsbasen verwendet werden
können, um wieder per Random-Funktion Percussionlinien hinzuzufügen
oder die Variationen zu verfremden/-zerren. Undsoweiterundsofort ...
Auch
hier macht's die Dosis: Der Anteil der bestimmten zum Anteil der
unbestimmten Muster im klugen (oder (halb-) zufälligen) Mix-Verhältnis.
("im klugen MixVerhältnis", "Verhältnis-Mix"? Ich hab's heut' nicht so mit den Worten, sorry!)
("im klugen MixVerhältnis", "Verhältnis-Mix"? Ich hab's heut' nicht so mit den Worten, sorry!)
Es sei außerdem noch erwähnt, daß auch noch mit den Velocity- und Pan-Werten gearbeitet (gespielt) werden kann - und sollte!
Das
Programm erspart das lästige Dot-für-Dot-Ausfüllen mit der Maus.
Stattdessen verwendet fim die nur für Anpassungen - so, daß und bis es
den Ohren zuträglich klingend gerät.
...
Die
iwi über eine oder mehrere Stufen erzeugten Zufallsbeats lassen sich
dann zum Unterlegen von Recordings (am besten kleinere (Rythmus-)
Einheiten onda (Sample-) Loops) in Muse oder Rosegarden verwenden. Das
Ohr kann dann in aller Ruhe entscheiden, was gut bzw. iwi interessant
(=fantasieanregend) wirkt. Daran lässt sich dann weiterwerkeln.
...
Bis hierher, und nicht weiter! (für heute)
Und jetzt arbeite ich mich erstmal mit Anleitung richtig in datt Dingen ein:
Ohne mir Mühe zu geben:*
Die
drei ersten Zufallsbeats, verwurstet mit einem Schnippsel eines
kostenlosen Technosamples aus dem I-Net, genauer gesagt von hier:
So, aus diesem Teil habe ich ein 2-taktiges Stück ausgeschnippelt, was ich wiederum neu hier eingesetzt habe:
Dem werde ich nun 4 weitere Zufallspattern mit einem anderen Instrument hinzufügen:
Und das klingt nun so:
Tja,
und dafür, daß noch keinerlei musische Reflexion vonnöten war, klingt
es doch schon verhältnismäßig groovy (stampf, stampf, bumm-diddi-wumm
... lol).
Selbstverständlich genügt es noch lange nicht unseren hohen Ansprüchen hier. Es geht ja auch weiter.
Lassen
wir mal die Sache mit dem Loop sein. Iwi komme ich mit dem
Schneidwerkzeug noch nicht so richtig zurecht. Genauer gesagt, ich bin
Besseres (Ensoniq, ASR-10) von früher gewohnt, aber mal schau'n, vlt.
lässt sich auch damit arbeiten ...
Ich kreiere mal ein ganz primitives Grundpattern:
Das
wird als "Baustein 2" eingesetzt. Und zu diesem Baustein werden nun
vier Zufallspattern erzeugt, allerdings mit 'einer' Parameteränderung im
Programm:
my $kick = "3";
my $stick = "5";
my $clhh = "9";
und noch 'einer':
my $kick = "4";
my $stick = "6";
my $clhh = "11";
und noch 'einer':
my $kick = "7";
my $stick = "8";
my $clhh = "14";
und 'einer' letzten:
my $kick = "12";
my $stick = "23";
my $clhh = "19";
Das sieht dann so aus:
Und es klingt so:
Es sei an dieser Stelle bemerkt: Das ist alleine*** des Computers und des Zufalls Werk!
So klingt es auch, fürwahr! ;-)
Irre, nicht?
...
Zurück
zum Ernst. Wenn fim diese Möglichkeiten mit Verstand einsetzt, lässt
sich damit schon was wirklich Kreatives anstellen. Das muß ich an dieser
Stelle nicht beweisen. Ich bastel lieber noch ein bisschen weiter ...
...
Mir
sind viele Ideen durch den Kopf gegangen. Z.B. ließe sich per Zufall
ein Grundrhythmus (ein bewährter, klassischer oder etwas in der Art)
vorab auswählen, der entweder die dann zufällig ausgewählten "hits"
(Schläge) bedingt oder zu dem die zufällig ausgewählten Muster passen
müssen (sprich, solange per Zufall zusammengepuzzelt werden, bis
bestimmte Bedingungen erfüllt sind (u.A. auch Velocity, Betonung etc.,
einzeln onda im Mix) ... naja, lässt sich beliebig ausbauen.
Ich
habe aber als nächsten Schritt bloß meinen Code ein bisschen erweitert,
die erwähnten Finessen versuche ich ein anderes Mal einzubauen.
#!/usr/bin/perl
# hydrogen-pattern-writer.pl
use strict;
use warnings;
use DBI;
use ZugangsDaten_postgresql qw($DB_USER $DB_PASSWD);
use Encode qw(is_utf8 decode encode);
use Storable qw(store retrieve);
# Variablen
my $head = '<?xml version="1.0" encoding="UTF-8"?>
<drumkit_pattern>
<pattern_for_drumkit>GMkit</pattern_for_drumkit>
<author>Zarko Maroli</author>
<license>omx(Hembelz)-Lizenz</license>
<pattern>
<pattern_name>random-pattern-11.1</pattern_name>
<info></info>
<category>No category</category>
<size>192</size>
<noteList>'."\n";
my $tail = ' </noteList>
</pattern>
</drumkit_pattern>';
my $pos_var;
my $note_var_1 = " <note>
<position>";
my $note_var_2 = "</position>
<leadlag>0</leadlag>
<velocity>0.8</velocity>
<pan_L>0.5</pan_L>
<pan_R>0.5</pan_R>
<pitch>0</pitch>
<key>C0</key>
<length>-1</length>
<instrument>";
my $note_var_3 = "</instrument>
</note>\n";
my $kick = "0";
my $stick = "1";
my $snare = "2";
my $clhh = "6";
my $ophh = "10";
my $cowbell = "11";
my $notes_kick = "";
my $notes_stick = "";
my $notes_snare = "";
my $notes_clhh = "";
my $notes_ophh = "";
my $notes_cowbell = "";
my @positions_1 = ("0");
my @positions_4 = ("0", "48", "96", "144");
my @positions_8 = ("0", "24", "48", "72", "96", "120", "144", "168");
my @positions_16 = ("0", "12", "24", "36", "48", "60", "72", "84", "96", "108", "120", "132", "144", "156", "168", "180");
# Program
foreach ( @positions_1 ) {
$pos_var = $_;
$notes_cowbell = $notes_kick.$note_var_1.$pos_var.$note_var_2.$cowbell.$note_var_3
}
foreach ( @positions_4 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_kick = $notes_kick.$note_var_1.$pos_var.$note_var_2.$kick.$note_var_3
} else { next }
}
foreach ( @positions_8 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_stick = $notes_stick.$note_var_1.$pos_var.$note_var_2.$stick.$note_var_3
} else { next }
}
foreach ( @positions_8 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_snare = $notes_snare.$note_var_1.$pos_var.$note_var_2.$snare.$note_var_3
} else { next }
}
foreach ( @positions_16 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_clhh = $notes_clhh.$note_var_1.$pos_var.$note_var_2.$clhh.$note_var_3
}
}
foreach ( @positions_16 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_ophh = $notes_ophh.$note_var_1.$pos_var.$note_var_2.$ophh.$note_var_3
}
}
# Pattern speichern
my $pattern_new = $head.$notes_cowbell.$notes_kick.$notes_stick.$notes_snare.$notes_clhh.$notes_ophh.$tail;
open ( my $fh, '>/home/zarko/.hydrogen/data/patterns/randompatterns/hydropattern.h2pattern' );
print $fh $pattern_new;
close $fh;
So sieht's jetzt aus:
Und so klingt's:
Oder es sieht so aus:
Und klingt so:
Und zu allem Überfluss lässt sich das alles ja auch noch zusammenmixen:
Und:
Da kloppt die Maschine sich einen zusammen, mamamia!
Ein' hamma noch, dann is abba jenuch füa hoid, woll?
Den neuen Track (7) habe ich Silly genannt, mir war danach.
Hier nochmal fast einzeln/allein:
Dafür habe ich meinen Code nochmal ein kleines bisschen erweitert (kommt gut! :-) ):
#!/usr/bin/perl
# hydrogen-pattern-writer.pl
use strict;
use warnings;
use DBI;
use ZugangsDaten_postgresql qw($DB_USER $DB_PASSWD);
use Encode qw(is_utf8 decode encode);
use Storable qw(store retrieve);
# Variablen
my $head = '<?xml version="1.0" encoding="UTF-8"?>
<drumkit_pattern>
<pattern_for_drumkit>GMkit</pattern_for_drumkit>
<author>Zarko Maroli</author>
<license>omx(Hembelz)-Lizenz</license>
<pattern>
<pattern_name>random-pattern-11.1</pattern_name>
<info></info>
<category>No category</category>
<size>192</size>
<noteList>'."\n";
my $tail = ' </noteList>
</pattern>
</drumkit_pattern>';
my $pos_var;
my $note_var_1 = " <note>
<position>";
my $note_var_2 = "</position>
<leadlag>0</leadlag>
<velocity>0.8</velocity>
<pan_L>0.5</pan_L>
<pan_R>0.5</pan_R>
<pitch>0</pitch>
<key>C0</key>
<length>-1</length>
<instrument>";
my $note_var_3 = "</instrument>
</note>\n";
my $kick = "0";
my $stick = "1";
my $snare = "2";
my $clhh = "6";
my $ophh = "10";
my $cowbell = "11";
my $silly = "19";
my $notes_kick = "";
my $notes_stick = "";
my $notes_snare = "";
my $notes_clhh = "";
my $notes_ophh = "";
my $notes_cowbell = "";
my $notes_silly = "";
my @positions_1 = ("0");
my @positions_4 = ("0", "48", "96", "144");
my @positions_8 = ("0", "24", "48", "72", "96", "120", "144", "168");
my @positions_16 = ("0", "12", "24", "36", "48", "60", "72", "84", "96", "108", "120", "132", "144", "156", "168", "180");
my
@positions_32 = ("0", "6", "12", "18", "24", "30", "36", "42", "48",
"54", "60", "66", "72", "78", "84", "90", "96", "102", "108", "114",
"120", "126", "132", "138", "144", "150", "156", "162", "168", "174",
"180", "186");
# Program
foreach ( @positions_1 ) {
$pos_var = $_;
$notes_cowbell = $notes_kick.$note_var_1.$pos_var.$note_var_2.$cowbell.$note_var_3
}
foreach ( @positions_4 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_kick = $notes_kick.$note_var_1.$pos_var.$note_var_2.$kick.$note_var_3
} else { next }
}
foreach ( @positions_8 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_stick = $notes_stick.$note_var_1.$pos_var.$note_var_2.$stick.$note_var_3
} else { next }
}
foreach ( @positions_8 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_snare = $notes_snare.$note_var_1.$pos_var.$note_var_2.$snare.$note_var_3
} else { next }
}
foreach ( @positions_16 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_clhh = $notes_clhh.$note_var_1.$pos_var.$note_var_2.$clhh.$note_var_3
}
}
foreach ( @positions_16 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_ophh = $notes_ophh.$note_var_1.$pos_var.$note_var_2.$ophh.$note_var_3
}
}
foreach ( @positions_32 ) {
my $rndbit = int rand(3) - 1;
print $rndbit, "\n";
if ( $rndbit == 1 ) {
$pos_var = $_;
$notes_silly = $notes_silly.$note_var_1.$pos_var.$note_var_2.$silly.$note_var_3
}
}
# Pattern speichern
my $pattern_new = $head.$notes_cowbell.$notes_kick.$notes_stick.$notes_snare.$notes_clhh.$notes_ophh.$notes_silly.$tail;
open ( my $fh, '>/home/zarko/.hydrogen/data/patterns/randompatterns/hydropattern.h2pattern' );
print $fh $pattern_new;
close $fh;
Und jetzt komme ich allmählich dahin, wo ich schon lange mal hin wollte. Ein computergestütztes Mysuzieren schon bei der Kreation, beim Komponieren ... äh, ja, ich weiß, ich laber Sch..ß. Vielleicht finde ich irgendwann mal die richtigen Worte, um das zu sagen, was ich meine onda sagen will. Heute sicher nicht mehr. Dafür finde ich die Ideen, die ich noch nicht in Worte fassen kann. Und das ist ja mehr wert. Wenn was bei rum kommt, klar. Nur dann.
Und von nun an nennt mich bitte BEATMASTER OMX* !
Dankö.
* Oder "OMX-Hembli".
.......................... nachgereicht ..........................................
( auf Dauer kann das aber schon ganz schön langweilig werden ;-) )
Gääähn .... gute Nacht!
.......................... nachgereicht ..........................................
..........................................................................
Bönüs-Track:
Kommentare
Kommentar veröffentlichen