Heute so gecodet...

  • Aus ernstem Interesse, was versteht man unter einer Musikroutine und wie sieht sie aus?

    Ähnlich wie ein Synthesizer mit Keyboard, nur das man die Werte direkt ins Programm gibt, oder eine Abspielroutine für verschiedene eingelesene Klänge?
  • Nur eine Abspielroutine. Ueblicherweise macht man seine Musik ja mit einem Programm wie GoatTracker usw und exportiert das dann als Binaer-File, da sind dann alle Daten drin und man ruft die integrierte Abspielroutine 1x pro Raster-Interrupt auf und somit erhaelt man die Musik. Nun habe ich mir eben dafuer eine eigene Routine geschrieben, die aber ganz simpel vorgeht, sprich es sind wirklich nur Noten, die gespilt werden, keine Aenderungen am Sound usw (das wird einmal vorab eingestellt und fertig). Auch rufe ich sie aktuell noch nicht im Raster-Interrupt auf, sondern habe eine Verzoegerung eingebaut um das zu simulieren. Wird aber bald auch noch geaendert.

    Im Grunde ist es also ganz primitiv, ich habe 3 Listen von Frequenz-Werten (2 Byte pro Wert), diese werden Schritt fuer Schritt eingelesen und in die passenden SID-Register fuer die 3 Stimmen geschrieben. Dann wird immer eine feste Zeit gewartet und dann kommt der naechste Wert. Somit ergibt sich dann eine Melodie :)
    SHOTGUN - 4-Player Death Match - Website / CSDb / X-Mas
    FROGS - 4-Player Frog Pond - Website / CSDb
  • Genau. Naja was Assembler angeht, das lustige ist, eigentlich kann man die Sprache auf zwei Arten betrachten. Auf der einen Seite ist es natuerlich kompliziert - auf der anderen Seite ist es aber auch sehr simpel. Man muss nur auf einer anderen Ebene denken, viel weiter "unten" als normalerweise gewohnt. So gesehen ist es also einfach und kompliziert zugleich :)
    SHOTGUN - 4-Player Death Match - Website / CSDb / X-Mas
    FROGS - 4-Player Frog Pond - Website / CSDb
  • ENDLICH den Algorithmus zum laufen bekommen, der in meinem Editor für Zeit der Stille 2 aus den Leveldaten automatisch (halbwegs) optimale (Teil-)Charactersets extrahiert. Seit 3 Wochen zerbreche ich mir den Kopf darüber, und seit einer Woche plage ich mich mit unterwarteten Resultaten herum (die manchmal tatsächlich schlauer sind als eine intuitive Lösung, manchmal aber auch Schrott, weil noch ein Bug im Algorithmus war).

    Die Engine kann Charsets aus beliebigen Teil-Charsets zusammensetzen. Wie man aber jetzt solche Teil-Charsets aus der Verwendung der Characters in den verschiedenen Maps eines Levels speicherplatzideal bestimmt, ist leider nicht trivial. Ich hatte auf einen Brute-Force-Ansatz für ein globales Minimum gehofft, aber der Lösungsraum ist viel zu groß. Daher habe ich auf einen greedy Algorithmus gesetzt, der nach jeder Iteration den Schritt mit der meisten Speicherersparnis wählt. Aber ein bisschen mehr Intelligenz war dann doch nötig, sonst hat sich der Algorithmus am Ende selbst ein Bein gestellt und die Character für ein Charset wurden mehr als 256...

    Der Algorithmus braucht nur leider immer noch mehrere Minuten auf meinem PC, da ist noch Optimierung nötig :(
    ────────────────────────────────────────────────────────────
    Time of Silence - Time of Silence 2 Development Blog
    ────────────────────────────────────────────────────────────
  • Kennst Du "CSAM Super" von Algorithm? Deine Beschreibung hört sich irgendwie ähnlich an...

    Sind mehrere Minuten Rechenzeit wirklich ein Problem? Wie viele Berechnungen dieser Art benötigst Du denn? Sonst steckst Du am Ende noch mehr Zeit in die Optimierung als die Berechnung ohne Optimierung dauern würde :)
    Sokrates - das F steht für Philosoph!
  • Kannte ich noch nicht, aber das scheint auf den ersten Blick wohl Charsets für gegebene Bitmaps zu erzeugen, oder? Mein Problem ist leider etwas anders gelagert. Aber Danke für den Hinweis auf das Tool, das könnte an anderer Stelle noch nützlich sein!

    Ich würde die Charsets gerne bei jedem Export aus dem Editor erzeugen und das wird Teil meines Workflows beim Level-Editing. Also je schneller desto besser. Ich habe aber schon Ideen, wie man den Vorgang beschleunigen kann ^^ ...
    ────────────────────────────────────────────────────────────
    Time of Silence - Time of Silence 2 Development Blog
    ────────────────────────────────────────────────────────────
  • Claus schrieb:

    Kannte ich noch nicht, aber das scheint auf den ersten Blick wohl Charsets für gegebene Bitmaps zu erzeugen, oder?
    Ja, es kann dabei aber vor allem optimieren! Wenn Deine Bilder z. B. 500 unterschiedliche Chars enthalten, Du aber nur Platz für 100 Chars hast, so versucht das Tool möglichst optimale 100 Chars zu finden, die den 500 Chars am nächsten kommen. Sprich: die Bitmaps werden verlustbehaftet in ein Charset gepackt, dessen Größe vorgegeben werden kann.
    Sokrates - das F steht für Philosoph!