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.

Code

#!/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!)

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.

Code:


#!/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 ..........................................
..........................................................................

Bönüs-Track:


( auf Dauer kann das aber schon ganz schön langweilig werden ;-) )




Gääähn .... gute Nacht!

Kommentare

Beliebte Posts aus diesem Blog

·

Es brennt.

Bye, bye Nord Stream 2!