Beiträge von Dragonsphere

    Was zum Testen gibt's, wenn ich noch einige nervige Bugs gefixt habe. Wahrscheinlich am nächsten Wochenende.


    Was ADSR angeht habe ich schon überlegt, ob ich doch Instrumente einbaue. In der ganz simplen Form, dass man eine Attack und Decay Phase definieren kann.

    Aber, da gibt es ja auch noch den ganz regulären Befehl zum setzen der Lautstärke des Samples/Instruments. Ich muss das also mit einer definierten Instrumentenlautstärke verrechnen und das bei nur 15 möglichen Einstellungen.

    Na, ich probier da bei Gelegenheit mal ein bisschen was aus.

    Pfingsten brachte etwas Zeit zum Programmieren und mein Tracker-Projekt ist ein ordentliches Stück vorangekommen:



    Die Oberfläche habe ich nochmal grundlegend überarbeitet, um alles etwas übersichtlicher zu bekommen. Und wie ihr sehen könnt, gibt es einen Extrakanal. Der lässt sich wahlweise über den PC-Speaker oder über den OPL2/OPL3 der Soundkarte ausgeben. Das schafft ein paar interessante Möglichkeiten, zum Beispiel den Tandy Sound mit FM-Drums zu unterlegen.


    Songs lassen sich bereits in einem eigenen Format speichern und laden und auch der Import von Pattern aus MOD-Dateien klappt schon :)

    Die Möglichkeit, die ersten vier Kanäle aus MIDI-Dateien und Sierra SNG Dateien (mit dem AGI-Enditor aus Sierra Games extrahierte Musik) zu lesen sollen noch folgen.


    Kennt ihr vielleicht noch weitere Formate, in denen die Tandy-Musik in Spielen gespeichert wurde?


    Aktuell feile ich auch noch daran, den MOD-Import zu verbessern.

    Die Melodie von MOD-Dateien über den TNDY auszugeben macht schon mächtig Laune (und terrorisiert die Familie :D), aber bis sie richtig abgespielt wird, muss man aktuell noch viel nacharbeiten.

    Das liegt vor allem daran, dass eine Note ja so lange unverändert gespielt wird, bis eine neue Note oder ein Key-off Befehl folgt. Das klingt bei MODs, die hier eigentlich kurze Sample vorsehen, natürlich kacke. Wird zum Beispiel mehrfach die gleiche Note hintereinander gespielt, gibt es über den TNDY nur einen durchgehenden Piepton. Aber die 15 möglichen Werte für die Lautstärke lassen auch keine vernünftige Möglichkeit zu, einen Ton irgendwie ausklingen zu lassen.

    Hier überlege ich gerade, ob ich das noch optimiert bekomme. Eventuell könnte ich die Samplelängen in der MOD-Datei auslesen und entsprechend einen Key-off setzen. Dafür muss aber natürlich Platz sein. Ist der Pattern voll mit Noten, dann klappt das natürlich auch nicht.....

    Grüße,


    die Antwort lautet: Fingertest - wirds dir zu warm, pack einen Kühlkörper drauf.


    Nötig wirds nicht sein - sonst wären da bereits Kühlkörper drauf - aber es schadet auch nicht.

    Genau so sehe ich das auch. Und wir wollen ja, dass die alte Hardware noch lange hält.

    Ich habe zum Beispiel auch auf den Tseng ET4000 meiner Speedstar einen kleinen Passivkühler geklebt. Der Chip hatte nie einen Kühler, wird aber im Betrieb sehr warm und daher bekam er einen - so einfach ist das. :)

    Bisher ist das hier abe leider nur ein erster kleiner Teaser :D und bis wir hier einen fertigen Tracker für Matzes Soundkarte haben, wird es noch dauern.

    Aktuell sieht es nur schon sehr komplett aus, die meisten Button sind noch ohne Funktion. Aber ich kann schon Noten und Effekte für einen Pattern eingeben und den abspielen. :Banana


    An Effekten habe ich schon Pitchbend, Arpeggio, Slide up/down (Portamento) und Slide to Note eingebaut bzw. aus meinem FM-Tracker übernommen und angepasst.

    Hinzu kommt natürlich noch das Setzen von Lautstärke und Geschwindigkeit und natürlich Sprünge im und zu anderen Pattern.

    Die weiteren typische Effekte von Trackern machen hier aber größtenteils wohl keinen Sinn, denn die Möglichkeiten des Soundchips sind ja eher bescheiden. Schon ein Volumeslide ist hier ja kaum umzusetzen, da die Einstellmöglichkeiten für die Lautstärke mit nur 15 Stufen sehr sehr grob ist....



    matze79 :

    Soll ich schon mal einen weiteren, fünften, Kanal für den DAC vorsehen? :D


    root_42 Ja, das Test-tool und das TSR-Programm, um Portzugriffe auch ohne EMM386 oder QEMM umzuleiten, sind von mir. :)

    Ich habe auch wieder ein wenig gebastelt...


    Eine Soundkarte braucht doch auch Unterstützung durch ein Programm zum selber Musik machen :D


    Eigentlich wollte ich gestern abend an dem TSR zur Portumleitung weiterschreiben, aber das frustriert mich gerade zu sehr, da es so instabil läuft (V86 mode zu programmieren ist die Hölle...)||

    Daher habe ich mir dann stattdessen den Quellcode von einem FM-Tracker genommen, den ich mal angefangen hatte, alles auf vier Kanäle zusammengestrichen, alle Abspielroutinen für FM mit denen aus dem Tandy-Sound-Testtool ersetzt und rausgekommen ist das hier. :D

    Noch fehlt aber sehr viel.... Insbesondere ein Dateiformat. Mein Ziel wäre auch, dass man damit die Pattern von *.mod Dateien mit vier Kanälen importieren kann und auch die Tandy-Musik von Sierra-Spielen.

    Bitteschön, sehr gerne :)

    Vom Aufwand her hielt sich das Programmieren dieses Tools auch noch in Grenzen.

    Die ganzen Routinen zum Zeichnen der Fenster und Menüs im Textmodus und auch für die Menüsteuerung per Tastatur und Maus habe ich schon vor über 20 Jahren geschrieben. Die habe ich ja auch schon bei meinem Treiber für die OPTi Soundkarten verwendet. So konnte ich viel alten Code "recyceln" und mit wenig Aufwand etwas schreiben, was optisch auch etwas hermacht.

    Etwas aufwändiger wurde es nur, als matze79 mich neulich darum bat, auch Hercules Grafik zu unterstützen. Damit, dass ein Programm von mir nochmal monochrome Grafikkarten unterstützen soll, hatte ich Ende der 1990er beim Schreiben der Menüroutinen nun wirklich nicht gerechnet :D

    Jetzt war H.EXE schneller :)


    Zitat

    Ich frage mich halt was zum guten Stil gehört. Die Variablen alle auf einen Fleck definieren oder geht das unten tiefer im Programm vor einem Block? Wie ich denken muß um den Spaß nicht zu verlieren, daß fand ich bisher nirgends geschrieben.

    Genauso das Einrücken von Zeilen. Darüber habe ich einiges gelesen. Aber davon ist bei mir nichts hängen geblieben.


    Und wie schreibt man Kommentarzeilen das sie andere verstehen würden? Wie man denkt im Alltag oder wie der Block funktioniert? Wenn ich wüßte wie ein Programmierer denkt, dann würde ich vermutlich gut lernen. So lese ich 5 mal was über grüne Tomaten und nach dem 3 mal lesen weiß ich sie sind noch nicht reif :-))

    Programmierer bin ich selber auch nicht und habe es auch nie "offiziell" gelernt. Alles selbst beigebracht und kann dir daher nur sagen, was für mich gut funktioniert hat, um mich bei großen Projekten nicht zu verzetteln. :)

    Einrücken ist sicherlich sehr sinnvoll für die Lesbarkeit. Neuere Texteditioren für Programmierer rücken ja automatisch ein etc.

    Die IDE von Borland Pascal 7 färbt auch den Syntax doch auch ein :)


    Bestimmte Funktionen und Prozeduren brauchst du ja immer wieder für verschiedene Programme. Hier wäre es ja Mist, die immer wieder in deinen Quellcode kopieren zu müssen. Dafür sind die Units.

    Hier werden Prozeduren und Funktionen zusammengefasst und auch bereits kompiliert (.TPU - Datei), sodass sie vom Compiler später sehr schnell eingebunden werden können.

    Es sind schon jede Menge Units bei deinem Pascal-Compiler dabei, die die Standardbefehle enthalten.


    Beispiel:


    Code
    Program Beispielprogramm;
    uses crt;
    begin
    clrscr;
    writeln('Hallo OS/2-Fan');
    while keypressed do readkey;
    repeat until keypressed;
    end.


    CRT ist eine Unit, die schon bei Pascal mitgeliefert wird und in der Borland Standartfunktionen für Bildschirmausgaben und Tastatursteuerung usw. zusammengefasst hat. Dein Programm bindet Units über "uses" ein und dadurch kannst du dann die Proceduren und Funktionen nutzen, die in der Unit stehen.

    Hier zum Beispiel "clrscr" (Clear Screen), readkey und keypressed.


    Wenn du selber eine Unit schreiben willst, geht das fast wie ein normales Programm. Nur der Aufbau ist etwas anders.


    Hier eine Mini-Unit, die eine Prozedur hinzufügt, mit der du in Zukunft immer ganz schnell einen Titel zentriert in die oberste Zeile schreiben kannst.

    In deinem Programm musst du nur die "Testunit" unter "uses" ergänzen uns schon kann "Schreibe_Titel" aufgerufen werden.

    Unter "interface" wird im Quellcode von Units einmal aufgelistet, welche Proceduren und Funktionen von Programmen aus der Unit aufgerufen werden können und unter "implementation" steht dann der Code davon.


    Jetzt klar? :)

    Über eine sinnvolle Aufteilung des Programms in Prozeduren, Funktionen und Units erhältst du ja Code-Blöcke, die du gut einzeln testen und einen Fehler so eingrenzen kannst.

    Eine gute Organisation ist bei großen Projekten alles. Unter Pascal gibt es auch die Möglichkeit von Include-Dateien, die ich dafür gerne nutze ( {$I Beispieldatei.inc}. Der Compiler springt dann an der Stelle in die angegebene Datei, macht dort mit dem Compilieren weiter und wenn die abgearbeitet ist, springt er zur ersten Quellcodedatei zurück und macht dort weiter. So kannst du deinen Code in verschiedene kleine und übersichtliche Dateien aufteilen, ohne gleich Units zu erstellen und hast keine unübersichtliche Hauptdatei mit 1000 Zeilen.


    Hier kann man dann ja auch eine Datei erstellen, die nur die Variablen und Konstanten enthält und die du in der Entwicklungsumgebung immer nebenbei geöffent haben kannst (früher hätte man sich die dann wahrscheinlich ausgedruckt neben den Monitor gelegt :) ). So hast du deine bisher definierten Variablen beim Schreiben des weiteren Codes immer Blick und es wird nicht unübersichtlich. Natürlich ist es dann empfehlenswert, möglichst mit globalen Variablen für das ganze Programm zu arbeiten und nicht in jeder Prozedur eigene Variablen anzulegen. Auch die Benennung der Variablen usw. ist natürlich wichtig, um in großen Projekten den Überblick zu behalten. Hier lohnt sich die Mühe, quasi objektorientiert zu arbeiten, zumindet bei den Namen. Also z.B. eine Variable als "Fileselector.Dateiname : string[12]" anstatt nur "Name : string[12]" oder gar "N : string[12]" zu definieren. Mehr Schreibaufwand, aber auch kaum Gefahr sich bei großen Projekten später zu verzetteln.


    Ich nehme auch gerne Pascal zum Programmieren unter DOS und das jetzt schon seit 25 Jahren. :D Später habe ich mir selbst Visual C++ beigebracht, um auch unter Windows programmieren zu können (immer nur als Hobby).

    Zum lernen kannst du dir gerne mal die Projekte auf meiner Github-Seite ansehen. Da ist viel Pascal dabei.

    Diese Lucas Arts Classic Adventure Box habe ich auch. Damals original gekauft. Und bei mir sind und waren auch keine Kassette für Loom, kein Gralstagebuch und auch keine Rotlichtbrille+Tabelle enthalten.

    In meinem Handbuch zu Indiana Jones steht aber derselbe Absatz wie hier gepostet und etwas weiter dann auch nochmal, dass man die Rotlicht-Zeichentabelle benötigen würde, um direkt zu Beginn des Spiels einen Dialog mit Marcus abschließen und weiterspielen zu können.

    Anscheinend ist das Handbuch also für alle und vor allem ältere Versionen des Spiels. Sowohl Loom als auch Indy habe ich mehrfach durchgespielt, ohne auf einen der genannten Kopierschutz-Maßnahmen zu stoßen.


    Edit: eltrash ich habe exakt dieselbe Box, aber weder die Kassette noch das Heft, auf der sie auf deinem Bild liegt. Beides ist mir auch völlig unbekannt.

    Anscheinend gab es mehrere Varianten der Adventuresammlung und es wurde später am Inhalt gespart.


    Und noch ein Edit... Auch ich sollte genauer hinsehen.. Meine Version ist von Softgold und die Box hat rechts unten das Softgold-Logo. Auch ist meine CD grün. Rest ist identisch. Anscheinend war die Version dann abgespeckt und kam ohne Kassete, Notenbuch und Gralstagebuch.

    Jetpack hatte ich damals auch auf einen 286er. Das ist wirklich ein schönes Spiel, das ich schon ganz vergessen hatte. Danke Dana :)


    Auch wenn der letzte Betrag hier schon etwas her ist...

    Als super Jump and run für 286er fällt mir neben den genannten noch Bio Menace ein.

    Ansonsten war der 286er bei mir eher die Zeit der Rätsel/Puzzle Spiele. Oxyd, Lemmings, Pushover usw.

    Daryl_Dixon gut das du zurück und wohlauf bist!

    Ich bin ja aktuell (viel zu) selten hier und kriege gerade nur wenig aus dem Forum mit, aber dann lese ich hier so etwas! Daryl ist verschollen! Missed in action, vielleich von Zombis gefressen. Vielleicht inzwischen selbst einer...


    So einfach wärst du mir aber auch nicht davon gekommen! :D Zur Not hätte ich mich hingesetzt und mal wieder was für deine Miro Soundkarte programmiert. Mit einem neuen Programmierprojekt für deine Miros hätte ich bestimmt auch die Zombi-Variante von dir geködert :) Habe hier z.B. noch ein TSR, das bei Karten mit OPL4, wie der Miro PCM10, General Midi unter DOS ermöglicht, als ein begonnenes und dann aus Zeitnot leider auf EIs gelegtes Projekt...... :bump

    Das sollte nicht so sein. Wenn es nur bei manchen Programmen auftritt, muss es ja an einer dort verwendeten Unit o.ä. liegen.
    Oder irgendwo tritt tatsächlich eine division durch 0 oder ein Überlauf einer Variable aus anderen Gründen auf.
    Ich habe mal den blöden Fehler gemacht und in einer eigenen Unit "uses CRT" versehentlich drinnengelassen. Da war ich auf der Suche nach einem Bug gewesen und hatte die CRT reingenommen, um schnell mit writeln die Inhalte einer Variable ausgeben zu können. Als der Fehler gefunden war, habe ich die Ausgabe der Variable rausgenommen, aber die CRT vergessen. :S Fiel mir dann erst viel viel später auf, als ich die Rückmeldung bekam, mein Programm würde auf schnellen Rechnern nicht laufen. Ich habe auch keinen DOS PC mit mehr als 300 MHz, mir selbst fällt das also gar nicht auf :D

    Catchkey liefert den Wert einer gedrückten Taste zurück ohne auf sie zu warten.
    Du suchst ja das Pendant zu keypressed und das ist bei mir iskeypressed.
    Also:

    Code
    while iskeypressed do getkey;
    repeat
    Patterndraw:
    Until iskeypressed;

    Die while-Schleife löscht eventuell noch vorhandene Tastendrücke im Tastaturpuffer.


    Du kannst aber natürlich gerne meinen Code anpassen und die Funktionen bennennen wie du willst. Also aus dem iskeypressed ein keypressed o.ä.

    In meiner MISC.PAS findest du einmal getkey und einmal catchkey. Getkey wartet wie readkey auf den Tastendruck, catchkey holt den Tastencode ohne zu warten, was nützlich in Spielen ist.
    Ich habe nur die Funktionen in meinen Units, die ich oft brauche und bei weitem nicht alles aus der CRT. Mehr als delay, Tastatur und Bildschirmausgaben habe ich eigentlich nie gebraucht oder immer selber in Assembler geschrieben, weil es schneller war.


    Ich habe die Prozeduren und Funktionen teilweise anders benannt, damit ich im Fall der Fälle auch die CRT noch nutzen konnte.
    Xdelay, getkey usw. In meiner Textmode unit sind auch deutlich mehr Funktionen für die Textausgabe, das zeichnen von Fenstern usw.


    Verkaufen oder aufdrängen will ich hier niemandem was. Nur einfach als eine mögliche Hilfe/Lösung anbieten, da es ja hier gut zum Thema passt. :)