Freitag, 1. Mai 2020

AlgoLine B (work-in-progress)

Vorgestern hatte ich einen Tag von akuter Programmiersucht - denn ich hatte mir vorgenommen, endlich etwas zu vereinheitlichen, und alle Instruktionen auf eine gemeinsame Basis zu stellen, sodass bestimmte Keywords für alle verwendbar werden.

Dadurch gibt es jetzt u.a. die Keywords 'start' und 'end', um eine Instruktion nur in einem bestimmten Teil des Stücks aktiv sein zu lassen. Gleich verwendet habe ich das gerade eben mit der ebenfalls neuen Deterministic-Random-Instruktion. Zufallsfaktor will ich eigentlich minimieren, damit würde ich es mir zu leicht machen. Aber hin und wieder ist so ein bisschen Zufall recht praktikabel. Besonders am Start. Die ersten 5 Schläge zufällig zu bestimmen, und dann den Rest des Stückes Regeln folgen zu lassen (die die Vorgabe der ersten 5 Schläge verwenden) hat aber was.

Die Zufallsfunktion ist bewusst "trashy" programmiert, da sind zwei kleine Potenzen drin, und ein Sinus, und das irgendwie hochmultipliziert. Ich wollte da nicht lange darüber nachdenken - es reicht, wenn es irgendwas tut. Und vor allem: Es muss immer das gleiche tun, solange die Parameter unverändert sind. Denn dann kann ich am Stück feilen, ohne ständig eine neue Vorgabe zu haben, mit der die Instruktionen vielleicht vollkommen unterschiedliche Ergebnisse haben.

Allen Instruktionen gemeinsam sind also jetzt die Keywords 'start', 'end', 'fade_in', 'fade_out', 'max' und 'min'. Die Fade-Keywords habe ich noch nicht implementiert, die sollen später dann mit start/end zusammenwirken.

'MAX' ist relativ einfach zu erklären: Es setzt der Gesamtwirkung einer Instruktion einen fixen Deckel - sobald es darüber hinausgeht, wird alles herabskaliert, sodass es in den Rahmen zwischen 0 und diesen Deckel passt.

'MIN' ist etwas schwieriger zu erklären. Es legt nämlich nicht die geringstmögliche Wirkung fest (denn häufig wird ja ein Pitch mit 0 bewertet, und das lässt sich durch multiplizieren schon mal nicht hochskalieren) sondern es setzt ein Minimum fürs Maximum fest. Klingt verdreht?
Ist gar nicht so verdreht. Die Instruktion soll mindestens die festgelegte Auswirkung auf das Stück haben. Mehr ist möglich, dann wird nicht herabskaliert. Wohl aber wird hochskaliert, bis der höchste Wert zumindest mal MIN erreicht hat.

MIN x MAX x lässt es nun in Kombination zu, den höchsten Wert immer fix auf x zu belassen. Vorausgesetzt, es gibt überhaupt eine Wirkung. (Jetzt gerade fällt mir auf, dass eine Instruktion die nur Nullen liefert eventuell Probleme macht. Das muss ich wohl erst abfangen...)

Fehler gibt's viele. Teilweise mache ich durch das Fixen von Bugs alte Stücke, deren Rezept ich noch gespeichert hatte, kaputt. Damit muss ich wohl leben; Rückwärtskompatibilität kann ich einfach nicht gewährleisten, solange ich immer mal wieder an den Grundlagen schraube. Aber insgesamt wird es momentan in sich konsistenter.

Ich lad auch bald wieder neue Stücke hoch. Anhören tut sie quasi niemand.^^ Ein Stück hat zwei Dislikes und sonst nix, das finde ich ziemlich amüsant. Ich selbst hab viel Spaß daran. Zum Erhalt meiner psychischen Gesundheit muss ich nämlich jeden Tag spazieren gehen, und dabei hör ich mir dann die Stücke an. In Zukunft werd ich dann wohl an die erste Pandemiewelle, die Dürre und an die (fast) immer-gleiche Spazierstrecke denken, wenn ich die wieder höre.^^


Was ich bald implementieren will:

- die eine oder andere Funktion, die auf der Zeitachse läuft. Zum Beispiel sowas wie eine Sinuskurve über die Tonhöhen. Vermutlich eher albern, aber was solls, wär recht einfach zu implementieren, und ist noch mal was anderes.

- die Selektoren benötigen ebenfalls eine Generalüberholung (bei denen wär's dann schon die zweite). Ich will ein Feature, das es erlaubt, bevorzugt bei einer bestimmten Tonhöhe zu selektieren (im Moment gibt es da nur: höchster Ton, niedrigster Ton, und mittlerster Ton. Das ist ausbaubar.)

- und einen Selektor will ich einbauen, mit dem vor 4 Jahren mal die erste Version von AlgoLine begonnen hat: Wähle nur einen Ton aus, wenn es nur genau eine bestbewertete Tonhöhe gibt - sonst Stille. Das führte damals zu Stücken die relativ bald in sich selbst zusammenfielen und einfach aus waren. Aber mit der Menge an Instruktionsoptionen, die ich mittlerweile habe, dürfte das anders sein. Bzw. ich kann diesen Selektor ja zu anderen dazuschmeißen.^^