Atchung! This is a raw text not wiki-formated yet, it should be ready in a few days.

STARKOS v1.1 allg. Dokumentation Hallo zusammen! Arkos ist stolz Euch seinen neuen Soundtrakker für den CPC zu präsentieren - STARKOS v1.1.

ALLGEMEINES

STarKos ist ein „herkömmlicher“ Soundchip-Tracker, d.h. das Komponieren von Musikstücken erfolgt auf die gleiche Art und Weise, wie auf bereits existierenden Soundtracker für den CPC (z.B. BSC’s Soundtrakker) oder dem Atari ST. Neue Funktionen gibt es teilweise in der Tonbearbeitung.

Zuerst einige Funktionen:

- es stehen 256 POSITIONEN zur Verfügung. - jede POSITION besteht aus 3 TRACKs - einen pro Kanal. - es können insgesamt 512 TRACKs verwaltet werden, wobei jeder mehrere Male in verschiedenen POSITIONEN oder in der gleichen POSITION rekursiv wiederverwendet werden kann. Warum auch nicht? Dadurch wird Speicher gespart! - ein TRACK hat eine Größe von 0 bis 127 Zeilen. - jeder TRACK kann unabhängig voneinander in der Tonhöhe verändert (transponiert) werden. - der komplette SONG kann auf einmal transponiert werden. - jede POSITION hat seine eigene Bandbreite, von 0 bis 127, unabhängig von der TRACKebene. - es können 255 verschiedene INSTRUMENTE eingesetzt werden. - jedes PSG-Register kann geändert, während die INSTRUMENTE erzeugt werden. - jeder TRACK / jedes INSTRUMENT wird komprimiert in den Speicher abgelegt und dieser nach jeder Änderung reoganisiert. Daher steht reichlich Speicher zur Verfügung. - Frequenzwiedergabe bei 13, 25, 50, 100, 150 oder 300 hz. - DIGIDRUMS werden unterstützt: es ist möglich einen “SPL”-Schlüssel zusammen mit einer Sample-Nummer einzugeben, die durch die externen Player während der Wiedergabe eines SONGs eingelesen werden kann. Jedoch kann kein Sample innerhalb des Editors geladen bzw. angehört werden.

* Was ist neu in STarKos v1.1 *

Die wichtigsten Verbesserungen in Starkos v1.1 sind einmal das Scrolling der PATTERNs während dem Abspielen des SONGs! Zwei Fehler wurden in den externen Player korrigiert, einschließlich der, mit dem “RST bad Behaviour”.

ES IST WICHTIG die neuen Player zu benutzen, und nicht die alten. Beachte, dass sie alle exakt die gleiche Speichergröße und Maschinenzyklen haben wie die alten.

- Vielen Dank auch an SICE von Dirty Minds. Ich habe einen Fehler im DIGIDRUM-Kit korrigiert. Einige Klänge wurden nicht korrekt nach einem DIGIDRUM angesteuert. Danke Sice! - Ein seltsames (aber harmloses) Verhalten konnte (sehr) selten während einer GET-DIR-Operation auftauchen. - Bei der Umwandlung eines SONGs konnte es passieren, dass in einem (sehr) seltenen Fall die Zeilenpositionen falsch ausgelesen bzw. verarbeitet werden.

Weitere Verbesserungen: - die ENTER-Eingabe im PATTERN-Editor erfasst die Nummer des INSTRUMENTES, auf dem sich der Cursor befindet, um das aktuelle INSTRUMENT zu setzen. Das ist sehr praktisch während des Komponierens! - Im Linker und INSTRUMENTEN-Editor wird automatisch ein END nach einer Änderung eines Wertes gesetzt. Das spart Arbeit! - Einfügen/Löschen eines Wertes hat den gleichen Effekt. - DEL im INSTRUMENTEN-Editor setzt den aktuellen Wert auf “0”. SHIFT + DEL die ganze Zeile auf 0. - Im Linker oder INSTRUMENTEN-Editor springt der Cursor bei CONTROL+SHIFT+CURSOR DOWN zum Ende der Liste (gehe zu END). - Eine Änderung (Abnahme oder Zunahme) des aktuellen POSITIONswertes (F7/F4) zwingt den Cursor nicht mehr zur Zeile 0 zu springen. - COPY im INSTRUMENTEN-Editor kopiert den aktuellen Wert in die nächste Zeile. Nützlich! - Bei SHIFT+CONTROL wird beim Bearbeiten des ARP-Wertes dieser nun um eine Oktave verändert. Praktisch!

WICHTIG: Ich musste die Funktion “Kopieren/Ausschneiden/Einfügen 3 TRACKs” entfernen, weil der Puffer zu viel Speicher verschwendet hat. Hinzu kommt, dass dieser Puffer dann andere Funktionen zum Speicherüberlauf gebracht hat. Ich hoffe, niemand wird dadurch verärgert sein.

Letzte Bemerkung: Die SKI-Dateien befinden nun auf Seite 2. Ich habe es vermieden die 1. Seite im 187kB Format zu nutzen/formatieren, so dass ein Extrahieren von Dateien aus dem DSK-File nun wieder möglich ist. *

ALLGEMEINE HANDHABUNG

Nach der Eingabe von RUN”STK” startet STarKos im Hauptmenü.

(1st PICTURE)

Der Aufbau von STarKos folgt dem gewohnten, übersichtlichen “3-Fenster-Menü”: eines oben, links, einigen Daten oben, rechts und in der Mitte und unten wird der Bildschirm von den Musik- / SONGinformationen beansprucht.

Man kann von einem zu einem zum anderen Fenster durch das Drücken der TAB-Taste bzw. der ESC-Taste wieder zurück zum ersten springen.

Mit den Pfeiltasten bewegt man sich innerhalb des Fensters oder verwendet SPACE oder RETURN zum Auswählen.

Jede Zahl, auf die man gerade zeigt kann geändert werden, entweder, indem man eine neue Zahl eingibt (ESC um abzubrechen), oder man erhöht/senkt sie durch die Cursortasten LINKS oder RECHTS, zusammen mit SHIFT und/oder CONTROL. Jede Zahl besitzt ein Min-Max-Limit, und jeder der Einträge wird entsprechend dem Intervall korrigiert.

Beachte, dass einige Zahlen Vorzeichen haben, so wird es notwendig ein Minus '-' einzugeben, wenn man einen negativen Wert möchte. Schließlich folgen alle Zahlen der hexadezimalen Notation. Ich möchte niemanden mit genaueren Erklärungen beleidigen.

WICHTIG: Die meiste Zeit kann man jeden Bildschirm / jedes Fenster mit folgenden Tastaturkürzel erreichen: STRG + F1 = TRACKER-LINKER (erste Seite) STRG + F2 = PATTERN-EDITOR STRG + F3 = INSTRUMENTEN-EDITOR

Ebenfalls nützliche Tastaturkürzel:

F7/F4 = Zunahme / Abnahme POSITION F8/F5 = Zunahme / Abnahme INSTRUMENT F9/F6 = Zunahme / Abnahme Oktave

POSTIONEN, PATTERNs, TRACKs, SPECIAL TRACKs und INSTRUMENTE

Obwohl STarKos wie die meisten TRACKers arbeitet, existieren dennoch einige Unterschiede. Eine kleine Einführung ist daher notwendig:

- Die TRACKs representieren die Grundlage einer Komposition. Alle Noten werden hier eingegeben. Jeder TRACK hat eine Bandbreite (Zeilenumfang) von 0 bis 127, insgesamt sind also 512 verschiedene Eingaben möglich (inkl. SPECIAL TRACK). Jeder TRACK wird (anahnd seiner Nummer) indiziert.

- Ein PATTERN besteht aus 3 TRACKs und jeder spielt auf einem der Kanäle des PSG. Es ist unmöglich, einen TRACK allein abzuspielen; er muss einem PATTERN zugeordnet sein! Man kann bis zu 256 PATTERN benutzen, die jeweils einen Umfang von 0 bis 127 Zeilen haben können. Wenn die darin enthaltenen TRACKs mehr in Anzahl sind, dann werden diese NUR INNERHALB der PATTERNgrenzen abgeschnitten, was nicht bedeutet, dass die “überschrittenen” Daten aus dem Speicher gelöscht werden, sondern sie werden einfach nicht in diesem PATTERN beachtet, das ist alles. Es ist also möglich, die Hälfte der eines TRACKs in einem PATTERN zu nutzen, und das ganze in einem anderen. Auf der anderen Seite kann ein PATTERN höher sein, als die darin enthaltenen TRACKumfänge. In diesem Fall ist es kein Problem, da dann einfach “leere” Noten am Ende des TRACKs zu finden sind. Beachte, dass es möglich ist, den gleichen TRACK 2 oder 3 mal im gleichen PATTERN zu verwenden.

Die Tatsache, dass TRACKs unabhängig von den PATTERN verwendet werden können, ermöglicht viel Speicher dadurch zu sparen. Ich ermutige jeden, einen TRACK so oft wie möglich in jedem SONG zu nutzen bzw. zu wiederholen.

- POSITIONEN sind die Art und Weise, wie PATTERN gespielt werden. Betrachte die POSITION wie eine Verknüpfung zu einer Kette. Zu jeder Verknüpfung gehört ein EinzelPATTERN. Wenn man anfängt den SONG abzupielen, wird mit der der POSITION 0 gestartet. Wenn das PATTERN, mit dem es verbunden ist, aufhört, dann wird mit der POSITION 1 weitergespielt, und so weiter … 256 POSITIONEN sind erlaubt, aber die SONGs sind wesentlich kürzer als gewöhnlich. Das System der POSITION ermöglicht es dem Musiker, das gleiche PATTERN mehrere Male zu spielen, ohne sie zu kopieren.

- Was INSTRUMENTE sind, ist einfach, also werde ich nicht näher darauf eingehen. Ihr könnt 255 verschiedene INSTRUMENTE definieren, von 1 bis 256.

- SPECIAL TRACKs sind neu. Sie erlauben es, DIDIDRUMs einzusetzen und ihre Geschwindigkeit zu verändern. Jedes PATTERN hat einen SPECIAL TRACK, am Ende der 3 'normalen' TRACKs. 256 SPECIAL TRACKs stehen daher zur Verfügung.

DIE VERSCHIEDENEN FENSTER

Wenn STarKos einmal geladen ist, erscheint des Hauptfenster:

DER TRACK/PATTERN-LINKER

(2nd PICTURE)

Dieses Fenster ermöglicht es die TRACKs mit anderen SONGs zu verknüpfen. Drücke TAB, um in den mittleren Teil des Fensters zu gelangen, und benutze CURSOR AUF/AB zusammen mit SHIFT und/oder CONTROL, um schnell umherzuspringen.

Hier die Beschreibung der Spalten:

NOPOS: POSITIONs Nummer. Die POSITION 0 ist die erste, die in dem SONG gespielt wird. TRACK 1/2/3: Zeigt, welcher TRACK gerade in der POSITION gespielt wird, und auf welchen Soundkanal. TRANSP 1/2/3: Zeigt die Höhe der Transposition, die zu jedem TRACK eines jeden Kanals zugeordnet ist. In den meisten Fällen ist sie gleich 0. HEIGHT: die Zeilennummer des PATTERN, von &00 bis &7F, d.h. es stehen insgesamt 128 Zeilen zur Verfügung. SPECIAL TRACK: Anzahl des SPECIAL TRACKs, der für diese POSITION genutzt wird.

Wie Du wahrscheinlich bemerkt hast, sind einige NOPOS weiß und andere blau. Und nur weiße POS werden gespielt, weil nur diese innerhalb eines Intervalls der gespielten POSITION enthalten sind, von 0 bis ENDPOS. Um diesen Wert zu verändern gibt es zwei Wege: Drücke TAB, um ins rechte obere Fenster zu gelangen und gebe den den Wert ein. Es ist auch möglich aus dem mittleren Fenster mit den KEYBOARD-Tastaturkürzel zu arbeiten: RETURN definiert ein ENDPOS, SPACE definert ein LOOPTO, natürlich auf der aktuelle Cursorposition. Beachte, dass jede Bewegung die NOPOS erneuert. Darüber hinaus ist LOOPTO immer entweder gleich oder kleiner als ENDPOS, was logisch ist.

Zurück zum oberen, linken Fenster. Wir werden später auf DISC und MISC eingehen. Beim Anwählen von SONG INFO (oder beim zweimaligen Drücken von TAB), gelangt man in das obere, rechte Fenster.

Hier die Beschreibung der verschiedenen Spalten:

SONG POS = aktuelle POSITION. Es wird der PATTERN editiert, der mit dieser POSITION verknüpft ist, wenn man zum PATTERN Editor wechselt. Auch wird der SONG von dieser POSITION ab gespielt, wenn man PLAY SONG wählt.

END POS = Letzte POSITION in diesem SONG. Definiert in anderen Worten das Ende des SONGs.

LOOPTO = Wenn die Musik endet, springt die POSITION auf die Stelle zurück, die von LOOPTO definiert wurde. Im allgemeinen ist LOOPTO = 0, d.h. der SONG beginnt von vorne.

INSTR = Die Nummer des aktuellen INSTRUMENTS. Es wird dieses Instrument gespielt (s. auch unten), und es ist dieses, dass für die TRACKs auch genutzt wird, wenn die PATTERN editiert werden. Natürlich können diese jederzeit verändert werden.

BEG SPD = (BEGINNING SPEED) Geschwindigkeit des SONGs, wenn dieser durch PLAY SONG gestartet wurde.

REP FRQ = (REPLAY FREQUENCY) Wiedergabefrequenz. Folgende Möglichkeiten: 13, 25, 50, 100, 150, 300 Hz. Genug, um über Jahrhunderte jemanden zu beschäftigen. Achtung, hohe Frequenzen verlangsamen beträchtlich die Ausführungszeit. 50Hz wird im allgemeinen genutzt. Achtung! Wenn der Wert für REP FRQ verändert wird, dann sind alle SONGs davon betroffen. Ursprünglich sollte damit die Geschwindigkeit ausgeglichen werden (einige habe sich darüber geärgert, weil ich keine „außergewöhnlichen“ Frequenzen zugelassen habe).

OCTAVE = … Oktave. Wird benötigt, wenn eine Melodie gespielt, oder eine Note in einem TRACK eingefügt wird.

FREEMEM = freier Speicher. STarKos verwaltet den Speicher dynamisch und optimiert soviele Daten wie möglich. Wenn dieser Wert gleich 0 ist, wird der Bildschirm rot und die letzte Aktion wird abgebrochen. Es ist ratsam NIEMALS einen SONG zu speichern, sollte dies passieren.

Nun ein Blick auf die Optionen DISC und MISC.

DISC OPERATIONEN

(3rd PICTURE)

Dieses Menu erlaubt einen SONG oder ein INSTRUMENT zu speichern oder zu laden.

Beachte: Alle Dateien, die mit STarKos generiert werden, werden im ASCII-Format gespeichert. Dadurch sind die Diskettenzugriffe zwar langsamer, aber das ist notwendig, weil Daten nicht linear im Speicher abgelegt sind. Das führt zu einem zweiten Problem: Das AMSDOS Fehlermanagement solcher Dateien ist sehr eingeschränkt: es erlaubt keine exakte Fehlererkennung während des Lades und Speicherns. Wenn ein Fehler jedoch passieren sollte, ist es aber möglich die Aktion zu Wiederholen (RETRY) oder abzubrechen (CANCEL).

STarKos Dateinamen haben reservierte Erweiterungen:

*.SKS für SONGs und *.SKI für INSTRUMENTE.

Zum DISC Menü:

- GET DIR: liest das Diskettenverzeichnis ein, und gibt den restlichen Speicher sowie die Anzahl der SONGs und INSTRUMENTEN auf der Diskette aus. LOAD ist dann nicht möglich, wenn es nichts zu laden gibt, logisch. - DRIVE A/B: Erlaubt zwischen den Laufwerken zu wechseln, vorausgesetzt es gibt zwei. - LOAD SONG: Lädt einen SONG, der über die Liste angewählt wurde. Achtung. Wenn der Ladevorgang beginnt, wird der ursprüngliche SONG im Speicher gelöscht. - LOAD INST: Lädt ein INSTRUMENT. Einmal im Speicher geladen, muss dieses eine der 255 möglichen Nummern zugeordnet werden. Beachte, dass ein schlecht geladenes INSTRUMENT automatisch aus dem Speicher gelöscht wird. - SAVE INS: Speicher das ausgewählte INSTRUMENT. Der Dateiname lautet ganau so wie der Name des INSTRUMENTs. - ERASE: Löscht die ausgewählte Datei in der Liste. Weiße Dateinamen sind mit STarKos generiert worden, nicht die falschen löschen!

Eine kleine Bemerkung: ein geladener SONG wird automatisch optimiert, so dass es nutzlos ist, diesen danach nochmals zu optimieren.

Drücke ESC, um dieses Menü zu verlassen.

Nun zum MISC Menü:

MISCallaneous

(4th PICTURE)

In diesem Menü gibt es verschiedene Optionen zur Software und dem SONG.

OPTIMIZE = Der SONG wird im Speicher „defragmentiert“. Wenn der Speicher eng werden sollte, versuch dies. Achtung, je nach Defragmentierungsgrad des Speichers, wird der Rechner entsprechend stark ausgelastet sein.

OPT LEV = Optimierungsgrad. MAX = so bald ein PATTERN / INSTRUMENT erzeugt oder verändert wird, wird der dafür notwendige Speicher ermittelt. Diese Option optimiert jedes mögliche Byte im Speicher, beansprucht aber die Software, proportional zur Größe des SONGs.

NORMAL = Der Speicher wird nicht reorganisiert, wenn ein PATTERN / INSTRUMENT kleiner wird. Dieser Modus sollte gut genug für 99,9% aller Arbeiten/Melodien sein.

CLEAR = Löscht das PATTERN oder das INSTRUMENT oder beides. Achtung, dies kann nicht rückgängig gemacht werden, also vorsichtig verwenden!

TRANSP = Definiert den Transpositionsgrad des GESAMTEN SONGs. ALLES wird transponiert, außer die TRACKs, die nicht verändert wurden. Sogar die Noten, die mit der Tastatur eingegeben wurden, werden transponiert. Weil dieser Effekt den SONG nicht in irgendeiner Weise komplett verändert, kann er so oft angewendet werden wie gewünscht.

Notizen/Anmerkungen.

AUTHOR = erlaubt die Melodie zu kennzeichnen. Wird in der *.SKS-Datei gespeichert, aber nicht in der erzeugten binären Datei!

COMMENTS = erlaubt einen kleinen Eintrag / Kommentar von 32 Zeichen. Gleiche Einschränkung wie oben.

ABOUT = Zeigt Information über STarKos und seinem Autor (über mich!).

SPLS CHAN = Legt den Kanals fest, wo Samples, die in den SPECIAL TRACKS eingegeben wurden, gespielt werden sollen. Diese Option hat im Moment nur ästätischen Sinn, weil kein Sample im Editor gehört werden kann. Jedoch kann der Wert über einen externen Player erfasst werden: daher ist es möglich eine Melodie mit externen Samples abzuspielen.

Drücke ESC, um dieses Menü zu verlassen.

Jetzt zu den wirklich wichtigen Dingen:

INSTRUMENTEN EDITOR

(5th PICTURE)

Hier fängt nun der erste wirklich interessante Teil an:

Hier werden die INSTRUMENTE (Klänge) erzeugt. Im oberen linken Menü kann man das INSTRUMENT kopieren oder löschen.

Ein STarKos INSTRUMENT basiert auf einer Werteliste, die maximal 256 Zeilen umfassen kann. Diese Werte werden unten detailiert beschrieben.

Beachte, dass es zwei Möglichkeiten gibt, ein INSTRUMENT zu erzeugen. Die erste, komplizierte, aber mächtige Art, geschieht durch einen Zeileneditor. Die zweite erfolgt grafisch, wie im BSC's Soundtrakker. Man kann von einem zum anderen durch das Drücken von ENTER wechseln.

(6th PICTURE)

…zuerst die erste Möglichkeit. Im oberen, rechten Menü kann man folgendes finden:

NO INSTR: Nummer des aktuellen INSTRUMENTES, welches gerade editiert wird.

INSTR END: “Größe” des INSTRUMENTES  stimmt natürlich mit der letzten Zeile überein.

INSTR LOOP: Nummer der Zeile, wohin gesprungen werden soll, wenn das Ende nach dem Abspielen erreicht wird. INSTR LOOP ⇐ INSTR END

LOPP?: Boolean Ausdruck. Zeigt, ob der Klang Schleifen durchlaufen soll oder nicht. INSTR LOOP ist nutzlos mit LOOP? = 0. Ein Klang, der keine Schleife durchläuft, macht zum Schluß keinen erneuten Klang mehr.

RETRIG?: Ein kleiner, aber nützlicher boolean Ausruck, der, wenn einmal auf 1 gesetzt, das Register 13 des PSGs auf den Anfang des Klanges zurücksetzt, so dass dafür keine eigene Zeile geschaffen werden muss.

SPEED: Definiert die Zeit (ein Multiplikator von REPLAY FREQUENCY) zwischen dem Spielen von zwei Zeilen. 0 bedeuted, dass eine Zeile alle 50Hz (wenn REP FRQ = 50Hz) gespielt wird, 1 = alle 100Hz… Sehr nützlich, um langsame und lange Klänge abzuspielen, ohne immer die Zeilen jedesmal zu kopieren zu müssen. Spart sowohl Zeit als auch Speicher!

CLIPBOARD: Auf den Zwischenspeicher kann man nicht direkt zugreifen (s. auch unten). Aber der Wert zeigt an, wo sich gerade der Zeiger im Zwischenspeicher befindet und erlaubt das Kopieren von Zeilen von INSTRUMENTEN im Speicher, um sie später irgendwo einzufügen.

Wenn TAB gedrückt wird, dann gelangt man direkt in eigentlichen INSTRUMENTEN-EDITOR. Die Cursortasten arbeiten dann genauso wie im PATTERN-Editor. RETURN/SPACE definiert ein END/LOOP. CONTROL+SPACE schaltet LOOP? ein/aus. Beachte, wenn LOOP definiert wird, wird LOOP? automatisch auf 1 gesetzt.

Ein Blick auf die Spalten:

SND = Weist den PSG an, einen Klang zu erzeugen, wenn dieser auf 1 gesetzt wird. Wird er auf 0 gesetzt, kann auf gewöhnlichen Weg kein Klang mehr erzeugt werden. Aber man kann immer noch eine „systemseitige“ (HARD) Hüllkurve oder ein Rauschen (NOISE) erzeugen.

VOL = Definiert die Lautstärke von &00 bis &0F. Die Lautstärke wird deaktiviert, wenn eine HARD Hüllkurve / Klang angesteuert wird. Genauso wie ein „nicht“-HARD Klang mit einer Lautstärke von 0 alle Zeilen deaktiviert würde, so dass nichts gehört werden kann.

NOISE = Wert für das weiße Rauschen von &00 bis &1F. Wird hauptsächlich für Schlagzeug, Percussion oder Exposionen eingesetzt. Wird nicht mit SND verknüpft, benötigt aber eine Lautstärke größer als 0 oder einen HARD Hüllkurve.

ARP = Arpeggio. Ein vorzeichenbehafteter Wert (von -&5F bis +&0F), der zum Basisklang hinzugefügt wird (die Vorgaben/Eingaben erfolgen durch die TRACKs oder die Tastatur). Werte mit 0, 3, 7 auf 3 Zeilen erzeugen einen “beinahe” Akkord (Arpeggio = gebrocher Akkord / Töne werden nicht gleichzeitig, sondern kurz auffolgend / nacheinander gespielt).

PITCH = ein Wert der zur abschließenden Tonhöhe hinzugefügt wird. Wird gewöhnlich verwendet, um Vibratos oder Pitch-Bends zu erzeugen. Werte zwischen -&0FFF und +&0FFF.

HARD = Zeigt an, ob eine HARD Hüllkurve genutzt wird. Bei 0 „nein“, bei 1, 2, 3 oder 4 „ja“. 1 erzeugt eine Sägezahnkurve, 3 ihre Symetrie dazu. 2 erzeugt eine Spitzkurve, 4 ihre Symetrie. Nicht vergessen, der PSG kann nur eine HARD Hüllkurve „ordentlich“ verwalten, daher erzeugt das Zuordnen eines HARD Klanges zu mehr als einem TRACK gleichzeitig einen harschen Sound (natürlich finden das einige sicher sehr interessant).

SOUND FRQ = Klangfrequenz. Im AUTO-Modus (Wert = 0), hängt die Klangfrequenz von der TRACK bzw. Tastatureingabe ab. Man kann dem ganzen einen Wert auch erzwingen (Bereich von &0001 bis &0FFF), um z.B. Spezialeffekte oder Effekte / Schlagzeug vor dem Rest des Klanges einzufügen.

HARD FRQ = das gleiche wie oben, nur für die HARD Hüllkurve (Werte zw. &0001 und &FFFF). Beachte, dass der AUTO-Modus (Wert = 0) dann nicht mehr genutzt wird, SHIFT wirkungslos und abgebrochen wird.

SHIFT = Dies ist sehr interessant. Erzeugt einen Austausch zwischen HARD FRQ und SOUND FRQ (ob in AUTO-Modus oder nicht). Folgt der schönen Gleichung: HARD FRQ = SOUND FRQ / (2 hoch SHIFT). Werte können zwischen 0 und 7 sein. Im allgemeinen werden Werte von 4 und 5 für coole Bässe gebraucht.

INITWAVE = erlaubt das Erzwingen der Register 13 bis 1. Wenn dies passiert, wird die HARD Hüllkurve von Beginn an neu gestartet. Achtung, INITWAVE = 1 in einem LOOP erzeugt einen disharmonischen Klang.

HARDSYNC = Dies ist eine Idee aus den ST Trackern. Es erlaubt eine perfekte Synchronisation zwischen einer normalen und einer HARD Hüllkurve (vorausgesetzt HARD = 1). Wenn vorangegange Formel genutzt wird, erfolgt eine Schätzung zwischen den beiden Kurven und erzeugt einen markanten “mwwwaaaiii” Klang. Wenn HARDSYNC = 1 korrigiert der Player die Klangfrequenz auf einen exakten Multiplikator der HARD FRQ. Keine weiteren Desynchronisationen. Das Problem nur ist, das die Schätzung auf beide Kurve angewandt wird, was einige “off-key” Noten erzeugt. Dieser Effekt ist nur bei tiefen Klängen sinnvoll, da hohe Töne vollständig falsch gespielt werden, weil zu viele hohe Frequenzen abgeschnitten werden.

FINETUNE = Wenn HARDSYNC aktiviert ist, ist auch FINETUNE aktiv. Es erlaubt die Erzeugung eines Anheben zwischen der SOUND FRQ und der HARD FRQ. Nun kann man das “mwwwaaaiii” exakt ansteuern, na glücklich?. Werte zwischen &00 und &FF.

Die Werte für NOPOS sind entweder in weiß (wenn ein INSTRUMENT leer ist) oder in blau. Nur die weißen Werte werden genutzt. Um das Intervall zu vergrößern muss der END Parameter verschoben / vergrößert werden.

Es gibt eine Einfügen/Löschen-Funktion über die Tasten „F0“ und „.“. Sie wirkt sich auf die KOMPLETTE Zeile aus. Indem man zusätzlich CONTROL + „F0“ oder „.“ drückt, ist es aber auch möglich, einen einzelnen Wert in einer einzelnen Spalte zu editieren. Vorsicht! Diese Funktion schließt nicht alle INSTRUMENTE ein, sondern nur den Intervall, der ab Cursor bis END des INSTRUMENTES definiert wird (im Gegensatz zum „ursprünglichen“ Einfügen eines INSTRUMENTES, das alles ab dem Cursor verändert).

WARNUNG! Sobald der INSTRUMENTIERUNGS-Editor verlassen wird (beim Wechsel in ein anderes Fenster oder ein anderes INSTRUMENT), wird der Speicher optimiert. Das bedeuted, daß einige Werte durch sich selbst verändert werden, und das die Zeilen, die keine Werte enthalten, gelöscht werden.

Ein alternativer INSTRUMENTEN-Editor

(7th PICTURE)

Wie oben angesprochen, gibt es eine zweite, grafische, aber weniger mächtige Möglichkeit Klänge zu erzeugen. Sie ist manchmal nützlich, um schnell und einfach, mittels Lautstärke- und Geräuschhüllkurven, Klänge zu kreieren.

Mit Hilfe der ENTER-Taste kann man zwischen den beiden Fenstern wechseln.

Indem man TAB drückt, kann zwischen den zwei Graphen hin- und hergewechselt werden. Der erste beinhaltet die Lautstärke und der zweite die Geräuschhüllkurve.

Einige Erklärungen:

Die Säulen können entweder hell- oder dunkelblau, oder eine Zwischenstufe (oder auch gar nicht) besitzen:

- Hellblau: Diese Säule wird gespielt, also kein Problem - Dunkelblau: Diese Säule wird NICHT gespielt, weil diese jenseits der END Markierung steht.

- Zwischenstufe (Halbton): Wird NICHT gespielt, weil der SND Wert nicht gleich 1 ist (die Lautstärke hat damit keinen Einfluss auf den Klang), egal ob HARD = 1 oder 0, was sowieso die Lautstärkeneinstellung löscht bzw. auf 0 setzt. Um diese Zwischenstufe nun zu verändern, müssen im Zeilen-Editor-Fenster zwei Flags korrigiert werden (ein anderer, sehr einfacher Weg wird auch unten beschrieben).

- Keine Zwischenstufe / Leer: Kein Problem, da keine HARD Flag gesetzt wurde. Der Klang kann also gespielt werden, außer er wird dann Dunkelblau.

Der Einfachtheit, wird SND automatisch auf 1 gesetzt, sobald die Säule verändert wird (außer HARD = 0), also wird bei einfachen Klänge der Zeileneditor nicht benötigt.

Warnung: Halbton (Zwischenstufen) bzw. dunkelblaue Säulen werden bei einer Optimierung gelöscht, da keine Notwendigkeit mehr dafür besteht.

Ratschlag: Um END, LOOPTO und LOOP? zu setzen, können die Tastaturkürzel verwendet werden, ohne in das obere rechte Fenster zu wechseln.

Zum Abschluß: Beachte, dass es möglich ist, eine Säule mit „F0“ oder mit „.“ einzufügen bzw. zu löschen, was mit dem Zeileneditor korrespondiert. Damit werden dann auch die entsprechenden Lautstärken- bzw. Geräuschsäulen verschoben. Und wie zuvor, wird nur das Interval von Cursoranfang bis END damit definiert bzw. versetzt.

Jetzt hast Du einen wundervollen Klang geschaffen. Lerne nun ihn zu spielen!

Einen Klang spielen

Es ist möglich einen Klang zu spielen, wenn man sich in jedem Haupt-Menü im linken, oberen Fenster befindet. Um dies zu tun, muss einfach die Tastatur wie in BSC’s Soundtracker benutzt werden:

(nach deutschen Tastatur-Layout)

„§$%&/ QWERTZ  aktuelle Oktave +1

SDFGHJ YXCVBN  aktuelle Oktave

Es ist auch möglich im INSTRUMENTEN-Editor einen Klang zu spielen, indem man zusätzlich die CONTROL-Taste zusammen mit den Tastaturkeyboard drückt. Achtung! Während die Melodie bzw. der Klang abgespielt wird, werden die „angeschlagenen“ Töne nicht gehört bzw. die veränderten Daten gespielt. Die Reihenfolge muss wieder aufbereitet (retriggert) werden, um die Veränderungen zu hören. Nun wenden wir uns den Follin Brothers und Madmax zu und lernen wie PATTERN erzeugt werden…

PATTERN-Editor

(8th PICTURE)

Das oberen, linke Fenster ist selbstredend: PLAYPATT spielt den aktuellen PATTERN ab. PLAYSONG spielt den aktuellen SONG, ab der aktuellen Cursorpositionen. Beachte! Wenn den SONG ab POS 0 gespielt wird, übernimmt SPEED den Wert aus BEG SPD.

Beim Drücken der TAB-Taste gelangt man in den unteren Fensterbereich, dem PATTERN-Editor selbst. Es gibt 3 TRACKs und einen SPECIAL TRACK, nur kleiner.

Hier die Beschreibung der Spalten, um einen normalen TRACK zu editieren:

KEY: Noten- und Oktavenangabe, die gespielt wird: z.B. C-1, D#4 INSTR: Nummer des INSTRUMENTES von &01 bis &FF. Immer zusammen mit dem KEY VOL: Lautstärke der Note, von &00 (kein Sound) bis &0F (max.) PITCH: erlaubt das Setzen von Auf- und Abportamentos (hier: Tonhöhen). Dieser Wert kann zwischen -&7F und &7F sein.

INSTR und KEY sind verknüpft: das eine kann ohne dem anderen nicht sein. VOLUME wird immer mit dem KEY verknüpft, jedoch kann dieser Wert auch ohne eine Note eingegeben werden. PITCH ist komplett unabhängig. Er kann gesetzt werden wo immer eine Note (KEY) ist oder nicht nicht.

Es kann ein RST (ein Reset) gesetzt werden, indem CLR gedrückt wird. Der RST beendet sofort den Klang eines Kanales. Achtung! Wenn der TRACK im Speicher abgelegt / optimiert wird, wird alles was nach dem RST verbleibt gelöscht.

Man kann DIGIDRUMs in NORMALEN TRACKs eingeben, indem man | drückt. Die Nummer des SAMPLEs ist durch das aktuelle INSTRUMENT definiert (von &01 bis &1F). Achtung! Der Rest der Zeile wird dann ignoriert.

Der SPECIAL TRACK erlaubt SPEED Änderungen und DIGIDRUMs zu setzen (die im Moment noch nicht gespielt werden). Einfach ein S für SPEED oder ein D für DIGIDRUM, gefolgt von dem gewünschten Wert, eingeben.

Beachte, dass ein kleines Raster im unteren Teil des Fensters anzeigt, wenn ein DIGIDRUM in diesem FRAME gestartet wird. D.h., wenn mehr als ein FRAME gestartet wird (indem ein SONG mit mehr als 50Hz benutzt wird), wird man nur ein Raster auf einmal sehen!

Nun, warum gibt es ZWEI Mögichkeiten um DIGIDRUMs zu setzen? Weil das Verhalten sich je nachdem wo dieser gesetzt wird unterscheidet. Ein DIGIDRUM im normalen TRACK schneidet den Klang im aktuellen Kanal ab, wie es ein normaler Klang eben auch macht. Aber ein DIGIDRUM im SPECIAL TRACK schneidet den KLANG eines Kanales ab, der durch SPC CHAN im MISC Menü definiert wurde, und das nur innerhalb der exakten Dauer des SAMPLEs. Am Ende wird der Klang wieder aufgenommen und weitergespielt!

Zwei kleine Schalter sind auch ziemlich cool: - CYCLE erlaubt das Springen von einem Endpunkt des PATTERN zum anderen, wenn dieser überschritten wird. Der „\“ Shortcut schaltet diese Funktion ein und aus, und wird durch ein Symbol angezeigt. - mit BEYOND, eingeschaltet durch SHIFT + „\“, kann man die Grenzen des PATTERN überschreiten, um zu sehen was „dahinter“ steht. Beachte: Wenn das PATTERN &7F hoch ist und es auf &1F zurückgebracht wird, sind die „versteckten“ Daten immer noch im Speicher und können durch den BEYOND Schalter wieder sichtbar gemacht werden. Sobald dieser eingeschaltet wird wechselt NO LINE auf weiß, das anzeigt, dass man sich immer noch innerhalb der definierten Grenzen des PATTERN aufhält. Wenn es blau sein sollte, dann befindet man sich jenseits dieser Grenzen und es kann die physikalische Grenze von &7F des PATTERN erreicht werden.

Wenden wir uns dem Zwischenspeicher zu. Es gibt 2 Zwischenspeicher nur für den PATTERN Editor. Sie arbeiten genauso wie der BSC Soundtrakker, mit einer zusätzlichen Option mehr.

Der erste Zwischenspeicher wird genutzt, um den gesamten TRACK zu speichern. Beachte, wenn Du einen TRACK kopierst (im Sinne von kopieren/ausschneiden/einfügen), dann ist ein Einfügen in den SPECIAL TRACK (und umgekehrt) nicht möglich. SHIFT + 1 = Einen TRACK in den Zwischenspeicher kopieren SHIFT + 2 = Einen TRACK ausschneiden + in den Zwischenspeicher kopieren SHIFT + 3 = Einen TRACK ausschneiden

Neu hinzugekommen: Wenn CONTROL anstatt SHIFT während des Einfügevorganges benutzt wird, werden nur Noten hinzugefügt und nicht die Leerstellen. Dies entspricht in etwa einer ODER Addition und ist sehr nützlich, wenn man zwei TRACKs in einen kopieren möchte.

Der zweite Zwischenspeicher erlaubt es Noten aus einem TRACK, eine nach der anderen, in den Speicherstack zu kopieren und sie dann wieder (einer nach der anderen) an den Zielort zu kopieren. SHIFT + 7 = Eine NOTE in den Zwischenspeicher kopieren SHIFT + 8 = Eine NOTE in einen TRACK einfügen SHIFT + 0 = Springt zurück zum Anfang des Zwischenspeichers (RESET) Wichtig zu wissen: Wenn Noten aus einem TRACK in hin- und hergeschoben werden, dann wird es nicht möglich sein, irgendetwas aus einem SPECIAL TRACK zu kopieren oder einzufügen. Der Zwischenspeicher muss dazu zurückgesetzt werden (SHIFT + 0), und anschließend kann etwas aus einem SPECIAL TRACK eingefügt werden. Und umgekehrt natürlich auch.

Hinzu kommt, dass der Zwischenspeicher durch das Zurücksetzen (RESET) durch das letzte Zeichen, dass eingefügt wurde, begrenzt wird. Diese Grenze kann durch das Kopieren einer anderen Note in den Zwischenspeicher neu definiert werden.

Ok, es wurde über alles geredet. Großartig, was?

END

Noch ein Ratschlag: Es ist sinnvoll sich die KEYS-Liste (Tastaturkürzel) auszudrucken. Darauf sind einige Kürzel für Funktionen, die ich programmiert habe, um STarKos mächtig machen und leicht handhaben lassen.

Ich hoffe, dass diese Anwendung Dir Freude bereiten wird, weil es nicht gerade einfach zu programmieren war (auch wenn es auf den ersten Blick danach so aussieht….)

Bugs Report, Bemerkungen, Vorschläge und sonstiges an: [email protected] [email protected]

Postanschrift: Julien Nevo Le Louya 35290 GAEL FRANCE

Einige zusätzliche Bemerkungen zum Abschluss

Hier noch einige Punkte, über die ich kurz sprechen möchte:

- Im Gegensatz zu dem, was viele denken werden, ist es NICHT möglich ALLE Atari-ST Musikstücke auf den CPC zu konvertieren, sogar wenn sie oder nur herkömmliche Klänge (keine SAMPLER) benutzen. Der Atari ST PSG läuft auf 2 MHz, der vom CPC nur auf 1 MHz. Um also die gleiche Soundfrequenz zu bekommen, müssen alle Perioden durch 2 geteilt werden. Daraus ergeben sich teilweise Ungenauigkeiten bzw. Desynchronisationen zwischen den normalen und HARD Klängen. Z.B. passiert das im „MEGADIST“ SONG, die auf diesem Kit enthalten ist. Ein Vorschlag von Madram ist, um den Fehler zu korrigieren, das die Soundfrequenz zuerst auf 100 Hz verdoppelt wird, und dann die gewünschten Werte durch die zwei nächstliegende Werte einzugrenzen und auszuprobieren. Viel Glück!

Über die Software selbst:

- STarKos ist langsamer als die meisten Tracker, weil einfach die Speicherverwaltung weitaus komplexer als üblich ist. Es können 255 INSTRUMENTE benutzt werden, 512 TRACKs, 256 PATTERNs und SPECIAL TRACKs… . Das ist mehr als irgendein Tracker auf dem CPC oder ST kann. Wenn ich meine Speicherverwaltung so organisiert hätte wie es BSC oder PRODATRON getan haben, hätte ich niemals genug Speicher gehabt. Alles wird dynamisch zugewiesen und berechnet. Das ist ziemlich kompliziert zu handhaben und benötigt einfach ein wenig Rechenzeit.

- Das PATTERN Display ist langsam. Das liegt nicht daran, das der Programmcode nicht optimiert ist, sondern weil ich das benutze was bereits vorhanden ist; sie sind ziemlich mächtig, ehrlich gesagt sehr schnell, aber leider nicht schnell genug für die Bildschirmausgabe. Ich benötige spezielle Routinen.

- Ich kann aber im Moment dies nicht leisten: ich habe nicht genug Speicher. STarKos ist 24000! Zeilen lang, ungefähr 30 KiB kompilierter Code.

- Und schließlich: ICH HABE STARKOS FÜR DIE CPC SZENE PROGRAMMIERT. BITTE BERICHTET MIR, WAS IHR DARÜBER DENKT!!

Ok Leute, das ist alles! Bis bald!

Targhan

Tastaturkürzel

(SH = SHIFT / CT = CONTROL)

allgemein

TAB Wechsel von einem Teil / Menü innerhalb eines Fensters in den anderen ESC Springe ins linke, obere Menü zurück SPACE auswählen SH und / oder CT + links / rechts Wert erhöhen / verringern CT + F1 gehe zum TRACK Linker CT + F2 gehe zum PATTERN Editor CT + F3 gehe zum INSTRUMENTEN Editor F7/F4 Erhöhe / reduziere aktuelle POSITION F8/F5 Erhöhe / reduziere aktuelles INSTRUMENT F9/F6 Erhöhe / reduziere Oktave 1/2/3 Ausschneiden / Aktiviere Kanal 1/2/3 (nur im PATTERN-Editor) SH/CT + Auswahl PLAYSONG Spielt den SONG von Beginn an

PATTERN Linker

SPACE definiert ein LOOP TO CT + SPACE schaltet LOOP? ein/aus RETURN definiert ein ENDPOS F0/. fügt ein (in der aktuellen Zeile) oder löscht eine Zeile CLR schaltet zwischen STEP ein/aus [ schaltet STEP ein/aus

INSTRUMENTEN Editor

SPACE definiert ein LOOP TO CT + SPACE schaltet LOOP? ein/aus RETURN definiert ein ENDPOS ENTER wechselt zum grafischen INSTRUMENTEN Editor ] schaltet STEP ein/aus A invertiert ein Vorzeichen

DEL setzt den aktuellen Wert auf 0 DEL + SH/CT löscht die Zeile COPY kopiert den aktuellen Wert in die folgende Zeile F0/. fügt ein / löscht eine Zeile, die mit 0 gefüllt ist ST + F0/. fügt ein / löscht eine Zeile, neue Zeile = Zeile zuvor CT + F0/. fügt ein / löscht eine Spalte (Intervall = Cursorpos. bis Zeileende) SH + 7 kopiert aktuelle Zeile in den Zwischenspeicher (und erhöht die Pos. d. Zwischenspeichers) SH + 8 fügt einen TRACK aus dem Zwischenspeicher ein (und verringert die Pos. des Zwischenspeichers) SH + 0 gehe zur Zwischenspeicherposition 0 (Reset) ESC stoppt Klänge keyboard spielt einen Klang (im mittleren Fenster muss zusätzlich CT gedrückt werden) ESC + SH stoppt Klänge, wenn der Cursor im mittleren Fenster sich befindet

grafischer INSTRUMENTEN Editor

SPACE definiert ein LOOP TO CT + SPACE schaltet ein LOOP? ein/aus RETURN definiert ein ENDPOS COPY kopiert die aktuelle Säule in die nächste DEL setzt den aktuellen Säulenwert auf 0 SH + Rauf / Runter erhöht / reduziert das gesamte Intervall F0/. fügt ein / löscht eine Säule

PATTERN Editor

\ schaltet den CYCLE Flag ein/aus  +SH schaltet das BEYOND Flag ein/aus CLR Reset

CT*| invertiert das PITCH Vorzeichen ](+SH) erhöht / reduziert STEP ENTER aktuelles INSTRUMENT = INSTRUMENT auf das der Cursor zeigt SH + Q/W/E/R gehe zu Zeile 0, &10, &20, &30… SH + F7 erhöht den TRACK des aktuellen Kanals SH + F4 reduziert den TRACK des aktuellen Kanals SH + 1 kopiert TRACK SH + 2 schneidet TRACK aus SH + 3 fügt TRACK ein CT + 3 fügt TRACK im ODER-Modus ein SH + 7 kopiert aktuelle Zeile in den Zwischenspeicher (und erhöht Pos. des Zwischenspeichers) SH + 8 fügt aktuelle Zeile in TRACK ein (und reduziert Pos. des Zwischenspeichers) SH + 0 gehe zur Zwischenspeicherpos. 0 DEL Löscht NOTEN+INSTR+VOL oder VOL einzeln oder PITCH einzeln DEL + SH Löscht NOTEN+INSTR+VOL+PITCH DEL + CT Löscht die KOMPLETTE Zeile COPY liest und spielt die Zeile SH + ESC stoppt den SONG F0/. fügt ein / löscht die Zeile

EINEN PLAYER ERZEUGEN

Wenn einmal ein SONG im Editor geschaffen wurde, möchtest Du diesen vielleicht in eigene Programme verwenden. Nachdem die *.SKS Datei in eine BINär-Datei konvertiert wurde (siehe GENSONG.DEU), ist es möglich den SONG mit einem der verfügbaren „Player“ abzuspielen.

Starte einfach run“GP“ bzw. |GP für die ROM-Version.

PLAYER GENERATOR HAUPTMENÜ

Sobald das Programm geladen ist, erscheint folgendes Menü:

1) „Show all files on disc“ (Zeige alle Dateien auf der Diskette an) … selbsterklärend 2) „Generate a BASIC Player“ (einen BASIC Player erzeugen) 3) „Generate an ASM Player“ (einen opt. Assembler Player erzeugen) 4) „Generate an INTERRUPTION Player“ (einen Interrupt gesteuerten Player erzeugen)

5) „Drive A“ Wechsel des Laufwerkes von A nach B und umgekehrt.

Die PLAYER

STarKos hat Auswahl zwischen 3 verschiedenen Players. Warum gerade drei? Nun, es hängt von der Verwendung ab:

- ASM Player: Wenn der SONG in einem DEMO genutzt werden soll (unabhängig vom Betriebssystem), dann ist dieser genau richtig. Dies ist die am stärksten optimierteste Version der STarKos Player. Ersteller von Demos und Fanzines sind nur an diesem interessiert. Der ASM Player speichert überhaupt keine Register, verändert sie alle (einschließlich dem AUX, aber nicht den SP), daher mag das Betriebssystem diesen nicht (verrücktes Verhalten bzw. ev. Crash).

- BASIC Player: Dieser wurde geschaffen, wenn der SONG in einem BASIC Programm genutzt werden soll, oder einem Assembler-Code, der die Systemroutinen nutzt. Der Unterschied zum ASM Player ist der, dass hier einige Register mitgespeichert werden und das BASIC nicht abstürzt wird.

- INTERRUPTION Player: Dieser Player ist für die diejenigen gedacht, die einen SONG starten und nicht mehr darüber nachdenken wollen. BASIC Programmierer sind daher die Zielgruppe für diesen Player, aber er auch für jedes Assembler Programm genutzt werden, wenn dieses nicht gerade Interrupt- oder Systemroutinen stört. Ein einfacher CALL und der SONG startet!

Bitte beachte: Wenn der ASM oder BASIC Player gebraucht wird, hängt es von DIR ab, den SONG zur richtigen Zeit aufzurufen (einmal pro VBL, zweimal… bis zu sechsmal bei 300Hz SONGs). Es ist sicher möglich einen 300Hz SONG in BASIC aufzurufen, aber irgendwie auch sinnlos… einfach den INTERRUPTION Player gebrauchen) Der INTERRUPTION Player erfasst automatisch die SONG Frequenz. In jedem Fall wird ein 300Hz Interrupt (über die Systemvektoren) ausgelöst, aber nur einige wenige Interupts sind notwendig, um einen kleiner als 300Hz SONG abzuspielen.

EINEN PLAYER ERZEUGEN

Wenn der benötigte Player gewählt wurde, muss ein Name für die zu speichernde Datei vergegeben werden (z.B. STKPLBAS, STKPLASM oder STKPLINT) und die START-Adresse, wo der Player aufgerufen werden soll. Der Player ist dann abgespeichert.

EINEN PLAYER IM PROGRAMM BENUTZEN

Das ist sehr einfach und folgt mehr oder weniger der Philosophie aus BSC’s Soundtrakker.

Zuerst wird der Player mit der in GENPLAY vergebenen START-Adresse geladen. In BASIC könnte dies folgendermaßen aussehen: Memory &1FFF:Load“PLAYER“,&2000

Dann wird der SONG an die Adresse geladen, wohin dieser in GENSONG kompiliert wurde. Load „SONG“,&3000

ACHUNG: IMMER die EXAKTEN ADRESSEN verwenden, wenn ein SONG oder Player geladen wird. Das ist notwendig, weil die gespeicherten Startadressen (im Header) nicht funktionieren und richtig sind.

Das Starten des SONGs unterscheidet sich je nach eingesetzem Player:

BASIC Player:

Drei CALL Aufrufe sind verfügbar: CALL PLAYER,ADSONG = Initiiert den SONG CALL PLAYER+3 = spielt den SONG ab CALL PLAYER+6 = beendet den SONG

Die Initiierung des SONGs MUSS vor dem ERSTEN Abspielen erfolgen. Und NICHT die START-Adresse des SONGs vergeesse (ADSONG). Dies ist für den Player notwendig, damit dieser erkennt wo der SONG steht. Angewandt auf das obige Beispiel würde dies folgenderrmaßen aussehen: CALL &2000,&3000 CALL &2003 CALL &2006

Der SONG kann auch wieder reinitialisiert werden, wenn er von vorne beginnen soll. Der BASIC Player kann auch in jedem Assembler Programm aufgerufen werden, er ist nur ein wenig langsamer als der ASM Player. Um ADSONG an den Player zu übergeben, muss einfach das Register DE diesen Wert enthalten und übergeben (s.auch unten).

ASM Player:

Nun, er arbeitet beinahe auf die gleich Art und Weise. CALL ADPLAYER, um den SONG zu initiieren, wobei das Register DE auf die START-Adresse verweist CALL ADPLAYER+3, um den SONG abzuspielen CALL ADPLAYER+6, um den SONG zu stoppen

Auf das Beispiel wieder angewandt: LD DE,&3000; CALL &2000, zum Initiieren CALL &2003 CALL &2006

Da alle Register dann korrupt sind, sollte man sich sicher sein, das die Systemroutinen nicht benötigt werden. (CRASH!)

INTERRUPTION Player:

Der ist sogar noch kürzer: CALL PLAYER,ADSONG = Initiierung und Start des SONGs CALL PLAYER+3 = Stoppt den SONG

Und das gleiche nochmal… Wenn dieser Player in einem Assembler Programm gebraucht wird, zeigt DE auf die START-Adresse, genauso wie oben.

Das ist alles. Technische Hintergrundinfos zu den Players (und wie man diese ein wenig verändern kann) bitte PLAYERS.DEU lesen.

Einen SONG erzeugen

Wenn einmal ein SONG unter STarKos erzeugt wurde, möchte man diesen vielleicht in einem eigenen Programm verwendet werden. Das ist eine sehr einfache Angelegenheit. Einfach den GS (GENSONG) mit run“GS“ oder |GS (ROM-Version) starten und die folgenden Anweisungen beachten:

Das Programm konvertiert eine *.SKS Datei in ACHT BINÄRE Dateien. Diese Dateien können dann benutzt werden, zusammen mit dem STarKos Player (siehe auch PLAYERS.DEU und die GP Anwendung) und irgendein Programm, egal ob dieses in Basic oder Assembler geschrieben wurde.

Wahrscheinlich hast Du bemerkt, dass der Prozess dem des BSC Soundtrakker ähnlich ist, außer dem Erzeugen des SONG, der NICHT in der gleiche Datei wie der Player abgespeichert wird. Das dient nicht der Bequemlichkeit, sonder hat folgende Vorteile: Es kann EIN Player für eine GROSSE ANZAHL von SONGs genutzt werden. Und sie können irgendwo im Speicher stehen (natürlich innerhalb bestimmter Grenzen, wenn in BASIC programmiert wird  HIMEM). Um sowohl SONG als auch Player Adressen anzupassen (relocate) dürfen die zwei Module nicht vergessen werden, die dies ermögichen… Das ist es was STarKos den flexibelsten Musikeditor auszeichnet.

Warum ein Compiler?

Weil !! Es ist sicher ein schrecklicher Fehler einen SONG nicht zu kompilieren, wie AMC.

Warum? Weil sehr of ein SONG ungenutze INSTRUMENTE, PATTERNs enthält, und das Format, das im Editor benutzt wird oft eigenen (nicht Speicher optimierten) Regeln folgt. Das Format des STarKos Players wurde entsprechend optimiert. Alle ungenutzen Daten werden gelöscht, genauso wie Daten, die nicht gespielt werden (HIDDEN DATAS / BEYOND am Ende eines PATTERN).

Das SONG GENERATOR Menü

Wenn einmal GS geladen ist, erscheint folgendes Menü:

1) „Show all files on disc“ (alle Dateien auf der Diskette anzeigen) 2) „Show SKS files on disc“ (alle *.SKS Dateien auf der Diskette anzeigen) Diese beiden Optionen sind selbsterklärend.

3) „Load and compile a song“ (einen SONG laden und kompilieren) Der Hauptteil… (siehe unten)

4) „Drive A“ Erlaubt das Wechseln zwischen den Laufwerken A und B

„Load and compile a song“ (einen SONG laden und kompilieren)

Zuerst wird man nach einem Namen für die *.SKS Datei gefragt. Dann muss die Adresse des SONGs (von &0000 bis &FFFF) eingeben werden. Danach wird der Bildschirm schwarz und der CPC arbeitet, und je länger der SONG, umso länger rechnet muß gewartet werden, egal.

 aus technischen Gründen bleibt der Bildschirm schwarz, weil dieser als Puffer benutzt wird. Sollte ein Diskettenfehler auftauchen, wird der Bildschirm rot und es muss „R“ für RETRY oder „C“ für CANCEL gedrückt werden.

Dann erscheint ein Meldung, die aussagt wie groß der kompilierte SONG ist und wieviel Dateien dafür benötigt werden. Was ist damit gemeint? Nun, ein STarKos SONG kann eine Größe von 54KiB erreichen. Sowohl der Editor als auch der Compiler verwalten die *.SKS Dateien in den Speicherbänken. Wenn jedoch der Comiler einen anderen SONG erzeugt, könnte dieser genauso groß werden! Der CPC hat aber nicht genug Speicher, um soviel Daten aufzunehmen. Aus diesem Grund splittet der Compiler diesen in einzelne Dateien in der Größe von nur &8800 (34KiB). Der Rest des Speichers wird sowieso durch den Compiler beansprucht, dem Puffer und das Betriebssystem. Wenn der SONG größer wird, wird einfach eine zweite Datei erzeugt.

Der Bildschirm zeigt 2 Optionen: „automatic or custom size“ (automatische oder benutzerdefinierte Größe).

Was bedeuted das? Das ist einfach. „automatic“ bedeuted, dass die Dateien so groß werden können, wie nur möglich. Wenn die SONG Größe nun &A000 Byte groß ist, dann wird die erste Datei &8800 Byte groß sein (34 KiB) und die zweite &1800 Byte (&A000-&8800 = &1800 Byte = 6 KiB). Die meisten Benutzer wählen die automatische Größenaufteilung.

„Custon“ bzw. benutzerdefiniert erlaubt es die Größe JEDER Datei frei zu wählen. Es können bis zu 8 Dateien gespeichert werden, mit einer Größe von &0001 bis &8800 (34 KiB). Warum ist das sinnvoll? Nun, es kann nützlich sein, wenn der SONG sehr groß ist und es notwendig wird den SONG in verschiedene Teile zu laden. Vielleicht ist es gewollt zuerst eine Reihe von Dateien zu haben und diese später zu einer einzigen zu verlinken, bevor sie gespielt wird.

Ein wichtiger Hinweis hierzu: Obwohl getrennte Dateien erzeugt werden können, müssen diese denoch EINE NACH DER ANDEREN MITEINANDER VERLINKT werden! Daher ist es im Moment nicht möglich den SONG im Speicher in verschiedene Bereiche zu laden. Die SONG-Daten MÜSSEN LINEAR in den Speicher geladen werden. Jedoch kann eine Speicherbank geöffnet und ein Teil des SONG darin geladen werden, sogar wenn ein anderer Teil den einen überragt. Ein Beispiel: Ein SONG könnte ab der Adresse &6000 starten und bis &7FFF der Bank &C4 abgelegt werden, und dann weiter ab &8000 bis &A000 im „normalen“ Speicher. Zur Erinnerung: der Player muss Zugriff auf alle Daten des SONGs haben. Daher bitte nicht vergessen die benötigte BANK vorher zu öffnen.

Wenn einmal die Wahl getroffen wurde, automatisch oder benutzerdefiniert, startet ein zweiter Durchgang. Der Compiler erzeugt tatsächlich in 2 PASSES den SONG, ähnlich wie beinahe jeder Assembler-Compiler verfährt. Einfach abwarten – wie oben auch. Jedoch werden dieses Mal die Dateien auf die Diskette geschrieben. Sobald der Vorgang abgeschlossen ist, erscheint eine Meldung, ob der SONG erfolgreich gespeichert wurde oder nicht.

Das ist alles!

Die erzeugten Dateien haben den gleichen Namen wie der *.SKS SONG, aber die Erweiterung ändert sich natürlich. Z.B. bezeichnet sich der Output für einen TRY.SKS SONG folgendermaßen: TRY.BIN TRY.BI1 TRY.BI2 … TRY.BI7 (max)

WARNUNG: Die erzeugten Dateien haben nicht die richtige START-Adresse (betrachte einmal deren Header). Wenn diese also geladen werden, dann MUSS die exakte START-Adresse angegeben werden. LOAD „TRY.BIN“ wird nicht funtionieren. Aber LOAD“TRY.BIN“,&4000 dagegen schon.

Das ist alles. Nun wurde ein SONG kompiliert, nun benutze GP, um den Player zu erzeugen. Siehe auch GENPLAY.DEU für mehr Infos!

PLAYER UND SONG RELOCATION (= VERSCHIEBEN DES CODES IM SPEICHER + ADDRESS- ABSTIMMUNG)

Der PLAYER Relocator

Das Modul kann die Player „relozieren“. Z.B. wird der Player in &1000 am Anfang eines Demos platziert und in &8000 für den zweiten Effekt, dann braucht dieser nicht unbedingt zweimal im Speicher stehen. Ein einfacher CALL und das war’s. Allerdings, muss dieser manuell bewegt werden.

Die Quellen dafür sind auf der Diskette, genannt REPLAY.DAM oder .MXM. Die Datei REPLAY.BIN besitzt den gleichen Code, aber auf &9000 kompiliert. Kann genutzt werden, aber bitte nicht verändern!

Der kompilierte Relocateur wird in BASIC mit Hilfe von drei Parametern aufgerufen: CALL relocator,ad1,ad2,type

„relocator“ ist natürlich die Adresse wohin der Relocator kompiliert wurde. ad1 = wohin der Player geladen wurde ad2 = wohin der Relocator den Player ablegen soll type = der Playertyp: 0 = ASM / 1 = BASIC / 2 = INTER

Allgemein gilt insbesondere in BASIC ad1 = ad2, da die Datei sowieso in die gewünschte Speicheradresse geladen und DANACH kann die Relocation erfolgen.

Eine kleine Quellcodeveränderung ist notwendig, wenn dieser in Assembler genutzt werden soll. Es müssen lediglich einige der ersten Zeilen aus dem Quellcode gelöscht werden, welche die Parameter erzwingen einzulesen. Natürlich muss nichts verändert werden, und es können eigene Parameter aus dem Register IX ausgelesen werden. Nicht kompliziert und einfach zu bewerkstelligen.

Wenn das Modul nun wieder kompiliert wird, um diesen in einem Assemblercode zu nutzen, dann kann viel Speicher gespart werden, wenn 2 Relocation Register am Ende des Quellcodes, die nicht benötigt werden, gelöscht werden (das Relozieren des BASIC oder INTER Players macht keinen Sinn für Assemblerprogrammierer)

Der SONG Relocator

Der SONG kann mit diesem Modul reloziert werden und kann durch die BASIC Module in diesem Kit durchgeführt werden. Es kann daher jeder SONG geladen werden ohne auf die originale START-Adresse Rücksicht zu nehmen.

Der Quellcode dieses Relocators ist auf Diskette mit den Namen RELSONG.DAM oder .MXM gespeichert. RELSONG.BIN ist – analog – auf &9000 kompiliert. Gleiche Einschränkung wie oben.

Der Aufruf des Relocators erfolgt durch: CALL relocator,ad1,ad2

„relocator“ ist natürlich die Adresse wohin der Relocator kompiliert wurde. ad1 = wohin der Player geladen wurde ad2 = wohin der Relocator den Player ablegen soll

Nochmals, es hängt von Dir ab wohin verschoben werden soll. Weil in BASIC gilt ad1 = ad2, wird auch nichts verschoben. Um sicherzustellen, das der SONG aus dem Beispiel auch bei &2000 funktioniert, ist folgende Relocation notwendig: CALL relocator,&2000,&2000.

Wie oben auch, ist ein kleine Quellcodeänderung notwendig, um das Modul in Assembler zu nutzen. Einfach die ersten 6 Zeilen löschen, wie auch im Quellcode beschrieben)

Das war’s wieder. Einfache, aber nützliche Module.

TECHNISCHE HINTERGRUNDINFORMATIONEN ZU DEN PLAYER

Allgemeines

Die 3 Player besitzen alle den gleichen Programmcode. Der ASM ist am besten optimiert worden. Der BASIC und der INTERRUPTION Player nutzen beiden Systemvektoren um den 300Hz Interrupt anzusteuern., und sind daher ein wenig langsamer, weil sie einige Register speichern und beschreiben müssen, die das Betriebssystem benötigt. Der INTERRUPTION Player benötigt mehr Speicher, weil er die Frequenz der SONGs analysieren, auslesen und danach spielen muss.

Benötigte Ressourcen

Ich habe die Anwednung so gut wie möglich programmiert. Der ASM Player benötigt ein Maximum von 34 Zeilen Rechenzeit, wird im allgemeinen aber bis zu 30 erreichen, mit einer Größe von mehr als 2KiB im Arbeitsspeicher; einiges davon kann gespeichert werden (s. unten). Die Player gebrauchen keinen Puffer, es nicht mehr Arbeitsspeicher benötigt als für den Player plus den SONG, der gespielt wird

Die zwei anderen Player benötigen ein wenig mehr, besonders der INTERRUPTION Player.

Größe der Player:

ASM = &098B BASIC = &09A6 INTER = &09FC

Speicherverwaltung

Beim Gebrauch des ASM Player kann der Player selbst und der SONG irgendwo im Arbeitsspeicher untergebracht werden. Die einzige Randbedingung ist, dass der Player auf die gesamten Musikdaten zugreifen kann, wenn diese aufgerufen werden. Wenn die Musik oder/und der Player in einer Speicherbank ist/sind (teilweise oder komplett), muss die Bank VOR dem Playeraufruf geöffnet werden.

Der Player verändert nicht den Stack, den Interruption Flag/Mode, oder irgendwelche anderen Chipregister (außer im Z80 und PSG natürlich). Keine barbarischen Tricks (out (0),a) oder ähnliches. Alle Z80 Register sind daher korrupt.

Mehr Einschränkungen hat man beim Gebrauch des INTERRUPT Players: man kann die Bank, in der der Song/Player abgelegt ist, nicht schließen, oder eine Bank öffnen, wenn der Player/Song im zentralen Arbeitsspeicher sich befindet. Zusätzlich muss der Player ab der Adresse &4000 compiliert werden, und darf natürlich nicht die Grenzen des Basic HIMEM ( = &A67B) überschreiten. Der HIMEM reduziert sich, wenn ROMs geladen werden. Um weiterhin kompatibel mit den meisten Konfigurationen zu bleiben, sollte der Player nicht zu „hoch“ in den Arbeitsspeicher geladen werden. Der Playergenerator wird dies nicht berücksichtigen und kompiliert lustig drauf los. Nicht vergessen: Diese Einschränkungen und Grenzen betreffen den Player UND auch die SONG Daten.

Den Player oder den SONG anpassen (Tweaking)

Anders als beim AMC und BSCs Soundtrakker gibt es einige Adressen, mit denen man „spielen“ kann, so daß man die Möglichkeit besitzt den Player an die eigenen Bedürfnisse anzupassen, oder einige interessante Werte zu erhalten.

ALLE Adressen sind außnahmslos OFFSETS vom Start des SONGs oder des Players. Sie sind alle hexadezimal.

Im Header des Songs sind… Werte! Ich möchte nicht alle vorstellen, dass wäre sinnlos, aber einige können sehr nützlich sein.

OFFSETS

0-3 DB „SK10“ Einfach ein kleiner ASCII Tag für Musikripper um STK SONGs früher zu erfassen :)

4-5 DW Basisadresse des SONGs. &00, &04 (Low-,Highbyte), um den SONG z.B. in &4000 zu laden.

6 DB Nummer des Kanals, der von den SPECIAL TRACK DIGIDRUMs benutzt wird. 1, 2 oder 3. Ist nicht wirklich nützlich, aber egal.

7-8 DW SONG Frequenz in Hertz (13 (=&000D), 25 (=&0019), 50 (=&0032), 100 (=&0064), 150 (=&0096) oder 300 (=&012C)).

Das ist alles. Weiter darfst Du nicht suchen :)

Es gibt auch eine Angabe zur Basisadresse des Players. Wenn es ein ASM oder BASIC Player ist, dann ist die Adresse bei OFFSET +&09/+&0A (Low-/Highbyte) zu finden. Beim INTERRUPTION Player findet man diese bei +&06/+&07 (Low-/Highbyte).

Wenn es gewünscht ist, die Datenausgabe der Werte an den PSG umzuleiten, dann ein POKE &xxxx,&C9 an folgende Adresse setzen:

ASM = &03AA BASIC = &03B3 INTER = &0406

Dies kann nützlich sein, wenn, zum Beispiel, DIGIDRUMs (s. auch Kapitel DIGIDRUMs unten) erzeugt werden sollen. Kann auch nützlich sein um eine YM-Liste zu erzeugen (YM ist der schnellste Musikcode, der erzeugt werden kann, benötigt durch die Liste aber auch sehr viel Arbeitsspeicher!). In diesem Fall ist ein Anhören des SONGs sinnlos. Einfach den Player laufen lassen, die Werte werden im erzeugt, codieren lassen und neu starten bis der SONG zu Ende ist. Dann können die Wert mit dem eigenen YM Player gelesen werden.

Der ursprünglich Wert der Adresse ist &C3 (JUMP)

WARNUNG: es gibt einen speziellen Fall bei Register 7, dessen Wert auf &0A gesetzt ist, VOR dem JUMP! Wenn dieser Jump umgeleitet wird, und später wieder auf denselben Code gesprungen wird, sollte das Register 7 wieder auf &0A gesetzt werden…

WARNUNG: Ein RET im BASIC oder INTER Player führt zum Absturz! Warum? Weil diese Player einige Register (durch das PUSHen beim Start) speichern, und sie wieder nach dem Senden der PSG-Werte zurückholen (durchs POPen ). Beim Umleiten also werden die Register niemals wieder hergestellt und ein RET springt eine falsch Adresse an. Anstatt ein RET zu setzen, sollte die Adresse direkt angesprungen werden, die die Register wiederherstellt. Folgendes sollte „gepoked“ werden:

BASIC: Poke &03B3,&C3 (JUMP) und dann (Adresse des Players + &085D  zuerst Low-, dann Highbyte) INTER: Poke &0406,&C3 (JUMP) und dann (Adresse des Players + &08B0  w. oben)

Und WIEDER eine WARNUNG! Wenn diese Werte gepoked werden, sind wir nicht in der Lage das Register 7 richtig – durch das Bypassing – auszulesen (s. oben). Er sollte zuerst gespeichert werden. Das kann irgendwo erfolgen. Die Adresse &1F wird hierfür als Beispiel gebraucht, weil keiner diese beansprucht. Aber das muss außerhalb des Player erfolgen, weil dieser zusätzliche Wert innerhalb einen Overflow bei anderen Teilen des Player verursachen würde. Daher werden wir die Adresse &3C verwenden, weil niemand dort hin springt. Wir speichern also ein &0A in &1F und springen dann zum Teil der den Player wiederherstellt:

Poke ADPLAYER+&03B3 (BASIC) oder Poke ADPLAYER+&0406 mit den folgenden Werten: &C3, &3C, &00 Bei &3C folgendes poken: &32, &1F und &00, wobei die letzten beiden Byte die Speicheradresse von Register 7 angeben. Dann die 3 Byte wie oben besprochen poke (erste Warnung!). Nun kann das Register 7 von &1F jederzeit wiederhergestellt werden.

Ich weiß, das ist ein schlechter Trick, ich werde den zukünftigen Player verbessern, jedoch ist dies sehr nützlich, außer im YM Fall. Und die meisten BASIC Programmierer werden dies niemals benötigen…

Wenn der ASM Player benutzt wird: kümmere Dich nicht um den Kram da oben, sondern poke einfach ein RET wie ich es zu Beginn beschrieben habe und speichere &0A!

Hier nun die Adressen, die die Werte an den PSG senden…

ASM = &06CB BASIC = &06D4 INTER = &0727

WARNUNG: Der Wert des Register 7 wird durch ein &0A bestimmt!

Hier die Adressen, woher die Werte ausgelesen werden können. Wenn Du z.B. einen Equalizer programmieren möchtest, dann könnten daraus die Werte entnommen werden. Natürlich sind die Werte je nach Player unterschiedlich und beim INTER Player ziemlich sinnlos, aber egal, hier sind sie trotzdem:

ASM	BASIC	INTER

R0 &06D6 &06DF &0732 Lowbyte Frequenz, Kanal 1 R1 &06F1 &06FA &074D Highbyte Frequenz Kanal 1 R2 &0727 &0730 &0783 Lowbyte Frequenz, Kanal 2 R3 &0742 &074B &079E Highbyte Frequenz, Kanal 2 R4 &0778 &0781 &07D4 Lowbyte Frequenz, Kanal 3 R5 &0793 &079C &07EF Highbyte Frequenz, Kanal 3

R6 &07C9 &07D2 &0825 Geräusche R7 NICHT PROGR. Mixer (R7alt &07E5 &07EE &0841)

R8 &070C &0715 &0768 Lautstärke, Kanal 1 R9 &075D &0766 &07B9 Lautstärke, Kanal 2 R10 &07AE &07B7 &080A Lautstärke, Kanal 3

R11 &07FE &0807 &085A Lowbyte HARD Hüllkurvenfrequenz R12 &0819 &0822 &0875 Highbyte HARD Hüllkurvenfrequenz R13 &0834 &083D &0890 HARD Hüllkurvenform

Das Register 7 wird nicht automatisch verändert! Es erhält ein &0A durch das Programm, dass Werte an den PSG sendet (s. auch oben).

Beachte: Wenn eine &02 an jede Adresse gesetzt wird, erhält man die ursprünglichen Werte der Register. BEVOR ein Wert an das Register gesendet wird, wird dieser mit dem ursprünglichen verglichen. Sind sie gleich, dann besteht auch kein Grund diesen nochmals zu senden, was Rechenzeit spart. Eine Ausnahme bildet das Register 13, welches sich in jedem Fall verändert, wenn RETRIG > 0. (Beachte, dass oben auch die Adresse des alten Wertes bei Register 7 angegeben wurde, der neue aber durch ein &0A gesetzt wird).

RETRIG: ASM = &083B BASIC = &0844 INTER = &0897

Um das Senden eines Wertes zu erzwingen, kann ein 255 als ursprünglichen Wert gesetzt werden. Die meisten Register gebrauchen einen solchen nicht (und ich habe auch niemals etwas anderes aus den Frequenzresiter gelesen).

Ein wenig Rechnenzeit sparen?

Hmm…. leider nicht mögich, tut mir leid :). Ich hoffe später ein paar optimiertere Versionen zu veröffentlichen, weil ich weiß wo die Schwachstellen liegen. Jedoch, wie ich bereits bemerkt habe, benötigt der erste Frame viel Rechenzeit, weil alle PSG Register neu aufgebaut werden und diese an den PSG gesendet werden (deren ursprünglicher Wert auf 255 gesetzt wird). Um dies nach der INITIALISIERUNG zu vermeiden können die aktuellen PSG Register ausgelesen (durch den PPI, nicht durch die Player!) und die jeweiligen „alten“ Werte im Player adressiert werden. Nur die sich veränderten Werte werden dann im ersten Frame gespielt.

Ein-/Ausblenden

Es ist mögich ein Ein- und Ausblenden in einem STarKos SONG zu erzeugen. Es muss, jedoch, manuell erzeugt werden. Tatsächlich habe ich keine explizite Funktion dazu geschrieben, einfach um Rechenzeit zu sparen. Aber durch einen kleinen Trick ist dies möglich.

Es muessen einfach die Werte, die an den PSG gesendet werden, umgeleitet werden. Einmal den SONG gespielt, können die Werte der Register 8, 9 und 10 gelesen und diese um 1, 2, 3 … bis 15 reduziert werden (Ausblenden), dann zurück zum Programmcode springen, der die Werte sendet (vergiss nicht das &0A ins Register 7 zu schreiben bzw. wiederherzustellen). Vorsicht bei „Overflows“. Wenn die Lautstärke unter 0 ist, setze sie auf 0. Wenn sie höher als 15 (während des Einblendens), setze sie auf 15.

Das Ende eines SONGs erfassen

Das Ende eines SONG soll gesucht werden? Um, z.B., eine SKS in ein YM Datei zu konvertieren? Ok, das ist möglich. Und noch einmal, es gibt hierzu keine programmierten Funktionen. Dieses ist es aber ziemlich tricky. Ich muss mich auch gleich dafür entschuldigen, aber ich habe keinen anderen Weg gefunden. Es ist aber sehr einfach zu programmieren und man muss sich einfach nur an den nachfolgenden Algorithmus halten:

(xxxx) 16 bedeuted „16 Bits number found at the offset &xxxx“. (Es wurde eine 16-Bit breite Zahl bei Offset &xxxx gefunden). (bei xxxx = das Lowbyte, bei xxxx+1 = das Highbyte)

(xxxx) 8 bedeuted „8 Bits number found at the offset &xxxx“. (Es wurde ein 8-Bit breite Zahl bei Offset &xxxx gefunden).

ASM BASIC

STATE=0

LOOP: Spielt den Song

IF STATE=0:IF (&009D)16<>(&0283)16 THEN GOTO LOOP (&00A6)16<>(&028C)16 STATE=1:GOTO LOOP

IF STATE=1:IF(&0270)8<>0 THEN GOTO LOOP (&0279)8<>0 IF (&0015)8<>(&0017)8 THEN GOTO LOOP (&001E)8<>(0020)8 STATE=2:GOTO LOOP IF STATE=2:IF(&0015)8<>(&0017)8 THEN GOTO LOOP (&001E)8<>(&0020)8 STATE=0 Der Song ist nun zu Ende!

Das Löschen von nutzlosen Teilen im Player!

Es ist wenig Arbeitsspeicher vorhanden und es soll soviel wie möglich eingespart werden? Dann ist STarKos dafür geschaffen worden, wirklich :). Im BASIC und ASM Player gibt es einen INITIALIZE Programmteil am Ende der Anwendung. Diese kann ganz einfach gelöscht werden. Kurz zuvor kommt der STOP MUSIC Programmteil, aber der ist so klein, dass nicht viel dazugewonnen wird.

Die Adressen stellen dar, wann diese Programmteile beginnen:

	ASM	BASIC

STOPMUS &0854 &0866 INITMUS &0870 &088B

Noch ein Hinweis: Der Player INITIALIZE Programmteil kann komplett vergessen werden. Beim Laden des SONGs wird der INITILIZE Programmteil aufgerufen, und beim Abspeichern OHNE. Auf diesem Weg bekommt der Player alle Initialisierungsoptionen, die er braucht. Natürlich kann er dann nicht noch einmal gestartet und für einen anderen SONG wiederverwendet werden, aber DEMOMAKER finden das sicher brauchbar.

DIGIDRUMs

STarKos Player können DIGIDRUMs verwalten und in einer sehr flexiblen Art und Weise damit umgehen. Der Player liest den SONG, und sobald ein DIGIDRUM erkannt wird, wird die Nummer des Samples (von &01 bis &3F, mit &00 = kein DIGIDRUM) zurückgegeben. Damit könnten auch bestimmte Ereignisse (Events) angesteuert werden (funktioniert auch im ASM). DIGIDRUMs sollten in keinem Fall nicht im INTER Player gespielt werden, weil dann einige Ereignisse vermisst werden könnten, aber hey, Du kannst tun was Du willst….

Die Werte müssen hier ausgelesen werden:

Sample Nummer: ASM = &0B BASIC = &0B INTER = &08

Kanal: ASM = &0C BASIC = &0C INTER = &09

Wie spielt man DIGIDRUMs?

Ich möchte hier nicht die technischen Details erzählen, wie DIGIDRUMs gespielt werden, das ist nicht der Zweck des Textes (verweise auf Demoniak 5 oder Quasar). Jedoch möchte ich gerne über die Möglichkeit sprechen, die DIGIDRUMs so genau wie möglich abzuspielen.

Die gewöhnlichste, einfachste, aber nicht sehr effektive Art DIGIDRUMs zu spielen ist jedes Mal den Player von vorne spielen zu lassen, und Testen, ob ein DIGIDRUM gespielt wird (natürlich sind die Geräusche und Klänge der Kanäle herausgeschnitten). Dies kann wesentlich einfach folgen:

Prüfe die Datei DIGIDRUM.DAM / DIGIDRUM.MXM.

Die folgende Methode ist komplexer, liefert aber eine bessere Soundqualität. Natürlich kannst Du dies so frei wie möglich nach Deinen Vorstellungen programmieren.

Der Punkt ist der, das beim Spielen der Musik kein Wert an den PSG gesendet wird. Wenn ein DIGIDRUM erkannt wird, muß das Verändern der PSG Register durch den Sample, der mit dem entsprechenden Kanal verknüpft ist, unterbunden werden (tatsächlich ist nur die LAUTSTÄRKE davon betroffen). Daher muss also das Geräusche- und Klang des DIGIDRUMkanals in Register 7 abgeschnitten werden. Nun sind wir in der Lage, die veränderten Werte in den PSG zu senden. Und dann kann der Sample auch gespielt werden.

In dem Beispiel liegen die Sample Adressen und Größe in einer Tabelle, aber wir testen nur, ob der Sample zu Ende ist. Wenn also 160 Samples pro Frame gespielt werden sollen (160*50 = 8000KHz, was OK für ein DIGIDRUM ist), und der Sample ist 350 Bytes lang ist, der CPC wird tatsächlich 480 Bytes spielen (160*3). Diese geringe Genauigkeit spielt beim Spielen der DIGIDRUMs keine Rollen. Das Testen des Endes nach jedem Byte wird kein besseres Ergebnis liefer und weitaus mehr Rechenzeit benötigen.

OK, das ist genug für heute, sonst wird der Player verrückt.

EINEN YM/AYC SONG ERZEUGEN

Die meisten wissen wofür YM oder AYC steht. Wenn nicht, dann suche einfach nach einigen Informationen auf der Leonard-Website im Internet (er ist ein Atari ST Coder). Zusäztlich wird von Madram das AYC-Kit auf der Overlander-Webiste (OVL) benötigt. Enfach downloaden.

Es gibt ein kleines Modul in diesem Kit, das jeden STarKos SONG in eine YM Datei konvertiert. Danach kann zusammen mit dem YM2AY Konverter von Madram der SONG mit dem AYC (ebenfalls Madram) abgespielt werden, der sehr wenig Rechenzeit beansprucht.

Mein Konvertierungsprogramm ist sehr einfach zu benutzen. Einfach mit run“STARK2YM“ starten.

Zuerst den Namen des STarKos SONGs eingeben und danach den YM Namen, der erzeugt werden soll (ohne Erweiterung). Es ist möglich zusätzlich einige Informationen im YM Code mit abzuspeichert (Name des SONGs, der Komponist und Kommentare).

Normalerweise sind YM Dateien nicht komprimiert und benötigen VIEL Speicherplatz auf der Diskette.

Auf einer 178KiB Diskette kann max. ein 4’30’’ SONG untergebracht werden. Es ist sehr zu empfehlen PARADOS und das D10 Format zu einzusetzen, um damit die max. Dauer auf 20’ zu erweitern.

Der Konverter arbeitet in 14 PASSES (Durchläufen), plus einem zusätzlich, der die Anzahl der Interationen im SONG ermittelt. Daher ist dieser sehr langsam, SEHR langsam…

Wenn einmal die YM Datei erzeugt wurde, kann YM2AY von Madram gestartet werden. Ich habe diesen nicht in das STarKos-Kit integriert, weil ich den Konverter und Player nicht programmiert habe. Daher muss dieser von der OVL-Website heruntergeladen werden.

Das ist alles!

documentations/software/starkos/manual.de.txt · Last modified: 2009/05/20 12:38 by grim