zatzen hat geschrieben:Ich habe jenes AMF im OpenMPT (Tracker) reingeladen, sind 64 Zeilen Patterns...
Eine Formatbeschreibung wäre mal interessant, habe ich aber auf die Schnelle nicht im Netz gefunden.
Naja, von allem (Grafik, Musik, Film, Text, Datenbank, Tabellen, etc...) gibt es Formate über Formate. Die Anzahl verschiedener Formate, die es für den gleichen Zweck gibt, gehen in die Tausende. Ich persönlich halte es für eine Mammutaufgabe, alle möglichen Formate zu supporten/umzusetzen. Wenn ich was brauche, gibt es schon passende Konverter. Ich selbst benutze nur wenige gängige Formate (die ich dann z.B. in eigene konvertiere).
Für Grafik z.B. nur PCX und (MS-)BMP - habe aber auch schonmal einen GIF-Anzeiger gebaut. Für Sound nur ungepackte WAVs (Mono/Stereo, 8bit/16bit). Bei Text ist mir immer noch normaler Text am liebsten - ich kann auch UTF-8 lesen/schreiben, aber ein Textformat, bei dem die Zeichen unterschiedlich viel Speicher brauchen (Doppel- und Mehrfachbytes für Zeichen ab 128) läßt sich wesentlich schlechter verarbeiten und handlen. Das sind nur so Beispiele.
zatzen hat geschrieben:Am Amiga waren die MODs mit 50 Hz, also der PAL Bildfrequenz getaktet, manche Player
haben aber auch einen Schalter auf NTSC mit seinen 60 Hz.
Das Tickspeed gibt an, wieviele Bilder vergehen, bis die nächste Zeile kommt.
Auf dem Amiga waren also Bild und Ton untrennbar miteinander verheiratet, und die Nichtvariablität
war ja auch kein Problem weil alle Amigas das gleiche leisteten.
Ja, das ist der Vorteil monolithischer Systeme. Man kann das Ganze so hardwarenah/hardwarebezogen machen wie man will, ohne daß es seltsame Probleme gibt.
Der PC ist eher ein Flickwerk aus allem Möglichen - aber zumindest zu einer bestimmten Zeit konnte man sich einigermaßen drauf verlassen, daß im PC eine VGA-kompatible (wenn auch nicht immer 100% registerkompatible) Grafikkarte drin war, dann irgendwas Soundblaster-mäßiges, was entweder ein selber ein SB war, oder zumindest SB 1, 1.5 oder 2.0 hinlänglich brauchbar supportete und auch sonstige Hardware/Speicher, die gewissen allgemein anerkannten Größen/Normen entsprachen. Da konnte man selbst auf dem PC ein Spiel bauen, das auf fast allen anderen PCs auch lief.
Dann kam Microsoft irgendwann mit seiner Softwaretreiber-Idee um die Ecke - schon brauchten Hardwarehersteller sich an überhaupt keinen Standard mehr zu halten und man war immer gezwungen, das gerade aktuellste OS zu nutzen, damit überhaupt IRGENDETWAS funktionierte. Aber bis WinXP (32bit), (von WinME und solchem Blödsinn mal abgesehen) konnte man sich sogar einigermaßen sicher sein, daß auch die meisten 16bit-DOS-Programme noch immer liefen.
Inzwischen sind moderne PCs nichts mehr, bei dem ich mir vorstellen könnte, daß mir programmieren darauf Spaß machen könnte. Aber ich bin ja auch nicht das "Maß der Dinge" - und solange es immer noch die alten Kisten gibt und die funktionieren, kann ich weiter meinem Hobby frönen. Ich bin in der glücklichen Lage, daß ich nie, nicht mal zu Zeiten, als das noch möglich gewesen wäre, Interesse daran hatte, an meiner Software Geld zu verdienen. Somit kann ich quasi "machen, was ich will"...
zatzen hat geschrieben:Oh, DDMF, das ist ja das Format des X-Trackers, der Tracker den ich heute noch benutze und von
dem ich konvertieren möchte. Daher kenne ich das Format sehr gut und die Patterns sind gespeichert
mit Lauflängen per Track, um die Nullen zu beseitigen, und mit Flaggen der Effekte.
Ja, Du hattest mir ja mal die Specs geschickt und ich habe ich auch vor ein paar Monaten schonmal durchgelesen und fand die Art, wie die Speicher sparen und trotzdem alles ermöglichen, schon recht gut. Wie gesagt: Bitmaske mit benutzten Werden (0=Wert bleibt wie vorher und muß nicht neu gespeichert werden) wird auch von der Van-Jacobsen-TCP/IP-Header-Compression so benutzt, daran hat mich das gleich erinnert. Ist meiner Meinung nach eine recht effiziente Art der Speicherung.
zatzen hat geschrieben:Das komprimiert schonmal ganz nett, aber mein Vorgehen wird schon alleine wegen dem Lesen
in beliebiger und angepasster Bitbreite effizienter sein.
Sobald Dein Format steht, würden mich da auch die Specs interessieren. Schaue mir immer gern an, was andere Coder, die ich kenne, so machen.
zatzen hat geschrieben:Erstaunliche Sache, mit dem Vorpfeifen. Es ist nur so, dass ich auch Samples verwende, die direkt
einen ganzen Akkord enthalten oder generell etwas das man nicht einfach einer Note zuordnen kann.
Ja, aber für diese wäre das ja sowieso nicht nötig. Es geht ja eher darum, wenn man eine Melodie haben will, die in "Noten" (also Computernoten, D#4 und so) abgebildet werden soll. Ich hab manchmal genau im Kopf, wie es klingen soll, aber ich "treffe" bei den Noten manchmal knapp daneben - muß dann immer anhören, wo es schräg klingt und die falsche Note eliminieren... Und das Gleiche mit den Längen. DAFÜR wäre das eigentlich gedacht. Wenn man ein komplettes Sample an eine Stelle setzen will, das aus mehreren verschieden hohen Tönen besteht, ist das etwas anderes. Das muß man ja "nehmen, wie es ist" und entsprechend pitchen.
zatzen hat geschrieben:XMS: Da käme ja wieder das Argument rein, dass Patterns UND Samples klein sein sollen, meinetwegen
80KB für ein ganzes Spiel, für die Intro Musik, Level Musik etc. Klar könnte man auch einen Synthesizer
nehmen, im einfachsten Fall OPL3 also AdLib, aber irgendwie haben für mich Samples mehr Reiz, sie
klingen zwar wenn man Speicher spart etwas schäbig und sind vielleicht sehr kurz, aber man hat immer
noch einen ganz individuellen Sound, während AdLib Musik irgendwie die meisten Spiele erscheinen
lässt, als wären sie vom gleichen Entwickler.
Naja, ich nehme ja keinen OPL3 - das Synthesizing passiert bei mir ebenfalls softwareseitig aus (kombinierbaren) Wellenformen und einstellbaren Hüllkurven. Das wird alles berechnet.
zatzen hat geschrieben:Aber sehen wir es doch mal so: Wenn ich jetzt einen Adlib Tracker hätte und mir ein Pattern-Speicherformat ausdenken würde... Dann hätte man gar keine Sampledaten. Wäre es dann nicht frevelhaft, nicht zu
versuchen, die Musik-Instruktionen so klein wie möglich zu halten?
Aber natürlich. Ich sage ja auch nicht, daß es nicht so sein soll.
Ich komme nur mit meiner ganzen Computer-Musik-Selbermachen-Geschichte aus einer ganz anderen Ecke und habe z.B. Patterns nie für nötig erachtet. Für mich ist das nur ein weiteres sogenanntes Abstraktionslevel. D.h. es gibt einen Sequenzer, der dann angibt, welche Patterns gespielt werden sollen und dann gibts die Patterns.
ABER: Bedingt dadurch, daß mein ISM auch "Unterprogramme" unterstützt, wäre es kein Problem, das Ganze dementsprechend aufzuteilen/anzuzeigen. Nur ist es eben keine Pflicht - also kann man beliebige und beliebig lange Stücke und Teilstücke der Musik in jeder Stimme mit jedem Instrument an jeder Stelle in jeder Geschwindigkeit abspielen, braucht also quasi an keiner einzigen Stelle irgend etwas doppelt zu speichern. Wer allerdings MOD-artige Tracker gewöhnt ist, für den ist diese Art, Musik auf dem Computer zu "programmieren"/darzustellen, sicher extrem gewöhnungsbedürftig - das weiß ich auch.
zatzen hat geschrieben:Genau, das ganze wird nur ein Converter. Ein Tracker wäre zwar schön, aber ist im diesen Fall nicht erforderlich und würde nur unnötig Aufwand kosten. Ausser mir wird wohl kaum jemand dieses Format nutzen, und wenn,
dann kann ich für's MOD oder IT oder XM Format einen Converter machen.
zatzen hat geschrieben:Der Player wird wohl in provisorischer Instanz erstmal nur die Patterns decodiert als Textdatei ausgeben.
Schon klar - damit man erstmal sieht, ob das Packen/Entpacken auch richtig arbeitet.
zatzen hat geschrieben:Update:
Ich setze die Samples doch mit variabler Grundfrequenz um. Stimmbarkeit ist doch eine wertvolle Sache.
Da ich ja zu jedem Sample eine Tabelle speichern möchte, in der steht auf welchen Tönen es ingesamt
gespielt wird, mache ich nun statt Notenwerten direkt die "Periods" dort hinein, wahrscheinlich mit
16 Bit Auflösung. Und diese sind nun pro Sample individuell. So spare ich mir auch eine allgemeine
Period-Tabelle für das ganze Spektrum an Noten, wenn die Notentabellen für ein Sample nicht auf
eine allgemeine Tabelle verweisen sondern selbst direkt die Werte enthalten.
Ich gehe hier ganz anders vor. Ich habe eine Frequenztabelle für alle 96 Noten (8 Oktaven), die ich unterstütze (eigentlich unterstütze ich - mit Transponieren - etwas über 10 Oktaven...
Die Samples selbst erhalten bei mir keine solche Tabelle, sondern nur die Grundfrequenz. Dieser Wert wird vom Samplemaker eingestellt und gibt an, welchem Notenton das Sample entspricht, wenn man es 1:1 (also mit Originalgeschwindigkeit) auf 16384 Hz abspielen würde. Wird nun das Sample mit einem bestimmten Ton angeschlagen, berechnet eine Subroutine einen "Speed-Adder" für das Sample, abhängig von der "Abspielfrequenz" des Players, dem obengenannten definierten Samplegrundfrequenzwert und dem abzuspielenden Notenwert. Dann wird das Sample abgespielt. Dieser Adder ist 32-Bit Festkomma (16bit Vorkomma, 16bit Nachkomma) - damit ist eine hinreichende Genauigkeit gegeben.
Ich habe in meinem ganzen Leben noch nie RICHTIG gepitcht - ich wüßte nichtmal, wie das gehen soll. Wahrscheinlich mit Fourier-Frequenz-Analyse und so Zeug, aber wenn ich im Netz sowas suche und dazu die Formeln lese, bluten mir die Augen. Sowas könnt ich nicht mal in Hochsprache umsetzen, geschweige denn in Assembler.
Oder, um es anders auszudrücken: Ein mit höherem Ton gespieltes Sample wird schneller, eins mit niedrigerem Ton langsamer abgespielt. Meist sind Samples aber sowieso nur für die Spannweite von 1 oder 1,5 Oktaven geeignet, darunter und darüber klingen sie nicht mehr so dolle. Und weil die Änderung der Tonhöhe bei einem mit anderer Frequenz abgespielten Klangsample wesentlich eher auffällt als die andere Geschwindigkeit, sehe ich das nicht als das gravierendste Problem an.
Wenn allerdings jemand eine EINFACHE Methode kennt, um zu pitchen ohne Änderung der Abspiellänge, laßt es mich wissen...
zatzen hat geschrieben:Übrigens auch ein Grund, warum ich das ganze so klein halten möchte ist, dass wenn ich schon für
DOS programmiere, ich mir auch die Möglichkeit offen halten möchte, etwas vom Datenumfang her
insgesamt sehr kleines zu schaffen.
Das ist sehr löblich. Genauso geht es mir auch - bei fast allem. Deshalb sind auch Sprites bei mir gepackt usw.
zatzen hat geschrieben:Man denke nur an die alten Zeiten wo man mehrere Spiele auf einer Diskette hatte und diese auch
von dort startete.
Klar. Auf dem C64 war das normal. DIe "großen" Spiele, die eine ganze oder beide Diskettenseiten brauchten, kamen erst später und selbst zuletzt (und jetzt) gibt es immer noch Singlefile-Spiele auf C64.
Natürlich muß man bei jeder Verkleinerung immer mit Qualitätseinbußen leben. Vom Spielprinzip her würde etwas wie das neue TombRaider sicher auch vielleicht auf 20 Disks passen - nur dann eben mit einfarbigen groben Polygonen und ohne Effekte. Will man mehr Grafik, mehr Sound, usw. erreicht man irgendwann eine Grenze, wo mehr Packen einfach nicht mehr geht.
zatzen hat geschrieben:Mit solch klotzigen MODs wäre das schwierig, wenn allein die Patterns pro Minute etwa schon 10 KB
oder je nach Geschwindigkeit sogar 20 KB verschlingen.
MODs unter 10 KB sind sehr rar.
Ja natürlich. Ich für meinen Teil versuche immer, einen Trade-Off zwischen Speicherverbrauch, CPU-Leistungsverbrauch udn Qualität zu finden. Für mich ist da der "Mittelweg" das richtige Maß. Minimierung von Speicherverbrauch erfordert mehr Berechnung, Minimierung der Berechnungen erfordert mehr Speicher (weil schon vorberechnet oder ungepackt), Minimierung von beidem stößt irgendwann an die Untergrenze erträglicher Qualität.
zatzen hat geschrieben:Aber man kann wirklich auch mit sehr kleinen Samples Musik erzeugen.
So ist es.
zatzen hat geschrieben:Bloß die Motivation dazu war bisher nicht gegeben mit so großen Patterndaten, und das will ich ändern.
Gut so.
zatzen hat geschrieben:Dann gibt es da aber noch etwas, das mir nicht gefällt. Ein Melodie-Sample kann z.B. 10 Notenwerte
haben, auf denen es insgesamt gespielt wird. Das bedeutet, es würde überall in den Patterns durch
4 Bit repräsentiert. Aber es kann durchaus sein, dass mal ein Pattern vorliegt, in dem dieses Sample
nur auf zwei verschiedenen Noten gespielt wird, und man bräuchte dann nur 1 Bit.
Wie ich schon sagte kann ich nicht für jedes Pattern und für jeden Track für alle vorkommenden Samples
die jeweiligen Notentabellen anlegen, das würde mehr aufblähen als komprimieren.
Naja, wie gesagt: Ich gehe da von der anderen Seite aus dran, daher ergibt sich ein derartiges Problem für mich nicht.
zatzen hat geschrieben:Aber ich könnte entweder durch nur 10 Bit in diesem Fall flaggen, welche Noten im Track für
dieses Instrument kommen werden, oder aber vielleicht durch eine Startposition und Endposition
in der Tabelle eingrenzen. Ersteres wäre aber effektiver.
Ich habe das mal mehr als Brainstorming aufgeschrieben, da es doch fast etwas verrückt wirkt.
Ja, wie gesagt, daß ich da ganz anders vorgehe, kann ich das Ganze nicht so nachvollziehen.
zatzen hat geschrieben:
Eine Frage aber mal:
Wie setze ich in einem Player Schleifen um?
An der Stelle dachte ich, Du willst eine bestimmten Teil aus der Musik mehrmals spielen...
zatzen hat geschrieben:
Die einfachste Möglichkeit wäre, wenn man die Position im Sample als Variable nimmt, die dann beim
Mixen in ein Register wandert, welches man bei jedem Sampleschritt entsprechend der Periods hochzählt
und mit einem anderen Register, welches das Schleifenende beinhaltet, vergleicht.
Eine andere, schnellere Möglichkeit soll sein, vorher auszurechnen wieviel von der Schleife in den Puffer
passt und wenn die Schleife kürzer ist als der Puffer, dann erstmal nur nen Mix-Loop für diese Schleifen-
länge machen, dann weiter bis der Puffer voll ist usw... Stelle ich mir etwas kompliziert vor.
... aber hier hat es sich geklärt: Du meinst den Sample-Repeat.
Naja, ein Sample, das gerade in Benutzung ist, liegt bei mir immer vollständig im Sample-Speicher.
Die Repeat-Position steht bei meinen Samples ebenfalls im Sample-Header. Man kann aber mit Spezialbefehlen
auch an jede beliebige Sample-Stellle springen. Das Puffer-Problem ist bei mir nicht existent.