Fragen zu Sound / Musik

  • Hallo zsuammen

    Ich bin gerade etwas mit den Sound-Routinen am spielen und habe da natürlich wieder einmal ein paar Fragen...

    1. Ich habe einen Chunk mit den Sound-Events, welche ich per SoundPlayMusic() abspiele. Da übergebe ich den gelockten Memory-Handle von dem Chunk. Gleichzeitig setze ich UNLOCK_ON_EOS, was nach meinem Verständnis den Memory-Lock wieder aufheben sollte.

    Code-mässig sieht das so aus:

    Code
    MemHandle highSongHandle;
    Code
    SoundAllocMusic(0, 4, &highSongHandle);
    Code
    word *p_music;
    SoundStopMusic(highSongHandle);
    MemLock(HandleOf(@HighSong));
    p_music = LMemDeref(@HighSong);
    SoundReallocMusic(highSongHandle, p_music);
    SoundPlayMusic(highSongHandle, SP_STANDARD + SP_IMMEDIATE, EIGHTH, UNLOCK_ON_EOS);

    Was geschieht nun mit dem Memory-Lock, wenn während dem Abspielen die Funktion SoundStopMusic() aufgerufen wird?

    2. Da sich bei Musik sehr oft Teile wiederholen, würde ich diese gerne einzeln definieren und dann in der entsprechenden Reihenfolge ausgeben. Per Sound-Buffer das über Messages zu versuchen, wird wahrscheinlich nichts gescheites geben. Am ehesten würde das wohl über die Stream-Varianten der Sound-Routinen gehen. Die Dokumentation dazu ist aber sehr eingeschränkt und es finden sich auch keine Beispiele in den Sourcen. Hat das schon jemand versucht?

    3. Für allgemeine Hinweise und Warnungen zur Sound-Ausgabe bin ich sehr empfänglich. Dass die Instrumente nicht die besten sind und es eigentlich nur etwa 5 verschiedene Sounds gibt, ist leider so. Und dass das Abspielen auch nicht immer ganz sauber im Takt läuft, kann auch an der DosEmu liegen.

    Besten Dank schon einmal für Eure Antworten.

    Gruss Andreas

  • Hallo Andreas,

    Was geschieht nun mit dem Memory-Lock, wenn während dem Abspielen die Funktion SoundStopMusic() aufgerufen wird?

    Das weiß ich nicht genau, vermute aber, der Block bleibt gelockt. Das kannst du aber a) unter swat (Kommando phan) oder programmiertechnisch (MemGetInfo()) herausbekommen.

    2. Streams habe ich noch nicht versucht. Soundbuffer sind i.A. nicht sehr groß. Also fragt sich, ob der Aufwand, etwas "zusammenzubasteln" den Nutzen (weniger Speicherverbrauch) wirklich aufwiegt.

    Dass die Instrumente nicht die besten sind und es eigentlich nur etwa 5 verschiedene Sounds gibt, ist leider so.

    Nichts ist in Stein gemeißelt. Ich hab das Thema ja schon in Syhra letztes Jahr angesprochen. Also: da tut sich aktuell wirklich etwas.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Hallo Rainer

    Super, dann werde ich einmal mit der MemGetInfo() ansetzen.

    Auch wenn die Sound-Streams nicht "so" gross sind, muss man diese doch realtiv mühsam ausprogrammieren. Man müsste sich hier schon fast ein Tool dazu erstellen... (nicht, dass ich Dir irgendwas aufschwatzen will!). Wenn man kleine Abschnitte hat und diese dann einfach in einen Buffer füttern kann, wäre definitiv cool. Es geht in einem meiner konkreten Fälle doch schon in den Bereich >100s.

    Dass Du auf der Suche nach besseren Sound-Definitionen bist, habe ich nicht vergessen. Ich glaube definitiv daran, dass hier noch Luft nach oben ist. Alternativ zur FM-Synthese wäre auch die Midi-Funktionalität ein wünschenswerter Weg. Aber soweit ich verstehe, ist das im Sound-System von PC/GEOS nicht implementiert.

  • 100 Sekunden sind schon sehr viel. Für doppelte Sequenzen kannst du doch einfach die Soundbuffer-Definition kopieren, oder? Oder deklarierst du keinen statischen Buffer?

    Für MIDI müsste man, wenn ich das richtig verstanden habe, auf das MIDI-Interface des Hosts aufsetzen. Das wäre dann ein separater Sound-Treiber.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Ich habe die Definitionen in einem Chunk und war am überlegen, die einzelnen Teile in ein ChunkArray zu verpacken. Von dem her habe ich (noch) keinen statischen Buffer und verwende auch nicht die LMem-Varianten.

    Ja, denke auch, dass für MIDI es einen separaten Treiber bräuchte. Sind eigentlich die FM-Synth und DAC auch getrennt?

  • Mit statischem Buffer meinte ich auch nur, dass der Buffer-Inhalt im Code fest vereinbart ist und nicht Ont the fly konstruiert wird. Ein Chunk ist OK, wäre auch meine Wahl, wenn ich verschieden Musikstücke hätte. Er muss halt nur währen der ganzen Soundausgabe gelockt bleiben. Chunk-Array? Keine Ahnung ob das was bringt.

    FM-Sound und DAC (Wav) sind theoretisch getrennt, in der Ini gibt es separate Einträge dafür. Der aktuelle Soundblaster-Treiber handelt aber beides - und ich glaube, er ignoriert die Einträge auch. Genauso wie es ihm egal ist, ob du SB1.0, SB 1.5 oder SB sonstwas angeklickt hast.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Vielen Dank Dir Rainer für die Insights ;)

    Ich habe auhc noch Tests gemacht. Es scheint wirklich so zu sein, dass das UNLOCK_ON_EOS nicht den MemLock auslöst. Das bringt mich nun zum Grübeln. Wenn ich den Chunk mit den Musikdaten an die Funktion SoundPlayMusic() gelockt übergeben muss, die Funktion aber während der Sound-Ausgabe nicht blockiert, frage ich mich nun, wie und wann ich den MemLock wieder freigeben kann...

    Entweder der Sound-Treiber kopiert den Inhalt des Chunks an einen Ort, wo er den Speicherbereich lockt, oder er muss mir irgendwie zurückmelden, wenn er mit der Wiedergabe fertig ist.

    Getestet habe ich die Anzahl Locks mit folgendem Code:

    Belasse ich das MemUnlock() einkommentiert, zählt er bei jeder Ausführung hoch. Ansonsten bekomme ich schön die 1 zurück.

    In der Doku von MemGetInfo() steht übrigens folgendes:

    Code
    MGIT_FLAGS_AND_LOCK_COUNT
    The upper byte of the return value is the current HeapFlags record for the block. The lower byte is the number of locks currently on the block.

    Das war ziemlich verwirrend, aber bei Little Endian wohl richtig... Im Quelltext in ASM steht dand AH für die Anzahl Locks.

  • Code
    MGIT_FLAGS_AND_LOCK_COUNT

    .. das ist in der Doku wohl einfach falsch.

    Den Rest überblicke ich jetzt auf die Schnelle nicht. Müsste ich mal in den R-BASIC Code schauen :) Oder mich durch den Soundtreiber Code wühlen.

    l = MemGetInfo(HandleOf(@HighSong)

    Das ist natürlich ... suboptimal. Unlocken kann er nur das highSoundHandle, das du übergeben hast. Zu prüfen wäre jetzt, ob SoundReallocMusic() die Daten kopiert (dann kannst du HighSong gleich unlocken) oder nicht.

    Unabhängig davon hat der Soundtreiber noch ein paar Baustellen. Die Fertig-Meldung ist nur eine davon.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Wenn man die Doku zur Sound-Unterstützung liest, kommt man schon ein wenig ins Schmunzeln... Da wird doch leicht hochgestapelt ;) Wobei da eventuell ein ehemaliger Mattel-Mitarbeiter dran war...

    Unabhängig davon hat der Soundtreiber noch ein paar Baustellen. Die Fertig-Meldung ist nur eine davon.

    Ja, das Pausieren und Fortsetzen wäre auch nicht erst eine Erfindung der letzten drei Jahre :/:D