Hydrogen-Pattern-Creator 4.0 - Entwicklung, Weiterschritt
Hydrogen-Pattern-Creator 4.0
Noch laufen die Vorarbeiten, aber es sieht schon sehr gut aus!
Die
neue Produktlinie soll eine Postgres-Datenbank nutzen. Diese soll den
Namen "emysuk" tragen. Folglich muß ich sie neu anlegen. Das geschieht
so:
Nach entsprechenden Einsetzungen in NUTZERNAME und DATENBANK existiert diese nun wie gewünscht.PostgreSQL › Wiki › ubuntuusers.desudo -u postgres createdb -O NUTZERNAME DATENBANK
Nun
möchte ich, daß neu erstellte bzw. überarbeitete/gecheckte Pattern
durch Abspeichern des Songs (den der Pattern-Creator vorher erzeugt hat)
und nachfolgender Programmbearbeitung in eine temporäre Tabelle in der
emysuk-Datenbank gespeichert werden.
Code-Schnippsel
...# Pattern in die E-Mysuk-Datenbank schreibenconnect_emysukdb();pattern_temp_create();disconnect_emysukdb();...###############################################################
#### Datenbank-Handling ####
###############################################################
# Subroutinen Verbindung
sub connect_emysukdb {
## Verbindung zur DB herstellen
$dbh = DBI->connect("DBI:Pg:dbname=emysuk;host=localhost", "$DB_USER", "$DB_PASSWD");
}
sub disconnect_emysukdb {
$dbh->disconnect();
}
# Pattern in emysuk-DB speichern
## Temporäre Tabelle pattern_temp erzeugen
sub pattern_temp_create {
my $pattern_temp_create = 'CREATE TABLE IF NOT EXISTS pattern_temp
( pattern_id INT PRIMARY KEY UNIQUE,
pattern TEXT,
soundbank TEXT );';
$dbh->do($pattern_temp_create) or print $dbh->errstr;
}
So. Funzt.
Nun noch kurz den Insert entwerfen (ich
schreibe das deshalb wieder peu ´a` peu, weil ich eine längere Pause in
Sachen PostgreSQL hinter mir habe; nach diesem Einstieg werde ich
wieder einsilbiger, ich versprech's!):
Mir ist eingefallen, daß ich kenntlich machen sollte, wozu die Pattern gehören:
...# Pattern in emysuk-DB speichern## Temporäre Tabelle pattern_temp erzeugensub pattern_temp_create { my $pattern_temp_create = 'CREATE TABLE IF NOT EXISTS hydrogen_pattern_temp ( pattern_id INT PRIMARY KEY UNIQUE, pattern TEXT, soundbank TEXT );'; $dbh->do($pattern_temp_create) or print $dbh->errstr;}## Insert-Statementsub pattern_insert { my $pattern = shift; my $soundbank = shift; my $pattern_insert = $dbh->prepare("INSERT INTO hydrogen_pattern_temp (pattern, soundbank) VALUES (?,?) ON CONFLICT (pattern) DO NOTHING;"); $pattern_insert->execute($pattern,$soundbank) or print $dbh->errstr; print "\nDie Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!\n";}...
Die emysuk-DB soll ja auch Midi-Pattern für MuseScore etc. in Zukunft enthalten & verwalten.
...# Pattern in die E-Mysuk-Datenbank schreiben## DB-Connect & Temp-Table-Createconnect_emysukdb();pattern_temp_create();## Die einzelnen Pattern übergeben & DB-Disconnectforeach ( @patterns ) { pattern_insert($_,$soundbank)}disconnect_emysukdb();...
...
atching the ON CONFLICT specification at hydrogen-patternwriter_4.minus1.pl line 339.ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specificationDie Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!DBD::Pg::st
execute failed: ERROR: there is no unique or exclusion constraint
matching the ON CONFLICT specification at
hydrogen-patternwriter_4.minus1.pl line 339.ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specificationDie Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!
Stimmt ja! Da ist noch kein Unique- oder Exclusion-Constraint angelegt.
my $pattern_temp_create = 'CREATE TABLE IF NOT EXISTS hydrogen_pattern_temp ( pattern_id INT PRIMARY KEY UNIQUE, pattern TEXT UNIQUE, soundbank TEXT );';
...
ERROR: null value in column "pattern_id" violates not-null constraintDETAIL: Failing row contains (null, {" <pattern>"," <name>random-pattern-11.3.3-39</name>"," ..., Forzee Stereo Drumkit Gain 0,5).Die Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!DBD::Pg::st execute failed: ERROR: null value in column "pattern_id" violates not-null constraintDETAIL: Failing row contains (null, {" <pattern>"," <name>random-pattern-11.3.3-40</name>"," ..., Forzee Stereo Drumkit Gain 0,5). at hydrogen-patternwriter_4.minus1.pl line 339.ERROR: null value in column "pattern_id" violates not-null constraintDETAIL: Failing row contains (null, {" <pattern>"," <name>random-pattern-11.3.3-40</name>"," ..., Forzee Stereo Drumkit Gain 0,5).Die Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!
Ach, es fehlt noch etwas. Bzw., es darf etwas fehlen:
sub pattern_temp_create { my $pattern_temp_create = 'CREATE TABLE IF NOT EXISTS hydrogen_pattern_temp ( pattern TEXT UNIQUE, soundbank TEXT );'; $dbh->do($pattern_temp_create) or print $dbh->errstr;}
An
dieser Stelle brauche ich keinerlei Nummerierung oder IDierung der
wenigen Pattern, die nur zwischengeparkt werden, um dann unter
ID-Vergabe in eine feste Tabelle übernommen zu werden.
...
Die Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!Die Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!Die Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!Die Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!Die Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!
Der Ausdruck ist noch inperfekt, ansonsten:
SELECT pattern, soundbank FROM public.hydrogen_pattern_temp;Total query runtime: 344 msec35 Zeilen geholt.
...
Nach ein paar wenigen Holpern ist es nun so gut wie perfekt, so:
...
# Pattern in die E-Mysuk-Datenbank schreiben## DB-Connect & Temp-Table-Createconnect_emysukdb();pattern_temp_create();## Die einzelnen Pattern übergeben & DB-Disconnectforeach ( @patterns ) { my $pattern = join("",@$_); pattern_insert($pattern,$soundbank)}disconnect_emysukdb();
...
###############################################################
#### Datenbank-Handling ####
###############################################################
# Subroutinen Verbindung
sub connect_emysukdb {
## Verbindung zur DB herstellen
$dbh = DBI->connect("DBI:Pg:dbname=emysuk;host=localhost", "$DB_USER", "$DB_PASSWD");
}
sub disconnect_emysukdb {
$dbh->disconnect();
}
# Pattern in emysuk-DB speichern
## Temporäre Tabelle pattern_temp erzeugen
sub pattern_temp_create {
my $pattern_temp_create = 'CREATE TABLE IF NOT EXISTS hydrogen_pattern_temp
( pattern TEXT UNIQUE,
soundbank TEXT );';
$dbh->do($pattern_temp_create) or print $dbh->errstr;
}
## Insert-Statement
sub pattern_insert {
my $pattern = shift;
my $soundbank = shift;
$pattern = encode('UTF-8', $pattern, Encode::FB_CROAK);
$soundbank = encode('UTF-8', $soundbank, Encode::FB_CROAK);
my $pattern_insert = $dbh->prepare("INSERT INTO hydrogen_pattern_temp (pattern, soundbank)
VALUES (?,?) ON CONFLICT (pattern) DO NOTHING;");
$pattern_insert->execute($pattern,$soundbank) or print $dbh->errstr;
print "\nDas Hydrogen-Pattern wurden in eine temporäre Tabelle der DB emysuk übergeben!\n";
}
...
Zur Sicherheit selecte ich nochmal in eine Textdatei:
SELECT pattern, soundbank FROM public.hydrogen_pattern_temp;... <pan_L>0.5</pan_L> <pan_R>0.5</pan_R> <pitch>0</pitch> <key>C0</key> <length>-1</length> <instrument>19</instrument> <note_off>false</note_off> </note> <note> <position>144</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>19</instrument> <note_off>false</note_off> </note> <note> <position>144</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>19</instrument> <note_off>false</note_off> </note> </noteList> </pattern>";"Forzee Stereo Drumkit Gain 0,5"
Alles paletti!
Nein, ganz wichtig!!
... <note_off>false</note_off> </note> </noteList> </pattern>";"Forzee Stereo Drumkit Gain 0,5"" <pattern> <name>random-pattern-11.3.3-40</name> <category>No category</category> <size>192</size> <noteList> <note> <position>0</position> <leadlag>0</leadlag> <velocity>0.8</velocity>...
Der Pattern-Name muß natürlich verschwinden, sonst können Dubletten übersehen werden!
...
foreach ( @pattern_lines ) { if ( $_ =~ /<pattern>/ ) { $pattern_toggle = 1 } if ( $pattern_toggle == 1 ) { $_ =~ s/<name>(.*)<\/name>/<name>leer<\/name>/; push @pattern_lines_temp, $_ } if ( $_ =~ /<\/pattern>/ ) { $pattern_toggle = 0 } my $scalplt = scalar @pattern_lines_temp; if ( $pattern_toggle == 0 && $scalplt > 0 ) { push @patterns, [@pattern_lines_temp]; @pattern_lines_temp = (); }}
...
Sollte eigentlich funzen.
...
<instrument>14</instrument> <note_off>false</note_off> </note> </noteList> </pattern>";"Forzee Stereo Drumkit Gain 0,5"" <pattern> <name>leer</name> <category>No category</category> <size>192</size> <noteList> <note> <position>0</position> <leadlag>0</leadlag> <velocity>0.8</velocity>
...
Klappt. Somit eine kurze Pause und die nächsten Schritte können folgen.
Kommentare
Kommentar veröffentlichen