Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Jens

Treue Seele

  • »Jens« ist der Autor dieses Themas

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

1

03.04.2006, 11:01

Hüllenkurve über einen 3D-Soundbuffer

Hallo,
ist es irgendwie möglich, die Amplitude beim Abspielen eines Soundbuffers (DirectSound) durch eine Hüllenkurve (wie bei einem Synthesizer) zu beeinflussen?

In den DX-SDK-Samples habe ich die Beispiele Crossfade und Amplitudenmodulation entdeckt, aber keines bringt mich wirklich weiter, denn beim Modulationseffekt kann man nur angeben, ob in Rechteck oder Dreieckskurve moduliert wird und beim Crossfade-Bsp wird DirectMusic und MIDI verwendet.

Ich habe aber einen WAVE-Sound in einem Buffer (LPDIRECTSOUNDBUFFER8) liegen, der in Abhängigkeit einer gezeichneten Hüllenkurve seine Lautstärke verändern soll.
Bleibt mir hier nur SetVolume in sehr kurzen Abständen?
Gibt es noch eine bessere Möglichkeit?

Danke
Jens
Bis später...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

03.04.2006, 11:45

Geht das nicht per "Parametric Equalizer"? Bzw. generell mit Effekten?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

03.04.2006, 11:52

Nein, einen solchen Effekt gibt es nicht.
Da bleibt Dir also wohl wirklich nichts anderes übrig, als SetVolume in regelmäßigen Abständen zu setzen. Das wird man wahrscheinlich gar nicht wahrnehmen. Du könntest das in einem separaten Thread machen.

Jens

Treue Seele

  • »Jens« ist der Autor dieses Themas

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

4

03.04.2006, 13:17

Danke Euch,

Hallo David, einen zweiten Thread wollte ich dafür nicht nehmen, weil ich sonst wieder mit CriticalSection sämtliche globale Objekte, auf die ich zugreife, locken müsste. Das erspare ich mir in dieser Anwwendung, in dem ich SetVolume in OnIdle von CWinApp (MFC) in bestimmten Abständen (iCount == 0 || iCount == 1) durchführe.

-------

mmm. also das ganze in OnIdle durchzuführen, war ne doofe Idee von mir.
Die Zeitabstände sind unberechenbar, weil die MsgPump logischerweise einige andere Aufgaben zu erfüllen hat, wie z. B. WM_PAINT usw.
Bei mir werden die ersten 500 ms völlig ignoriert und dann erst wieder weitere 500ms später SetVolume (dann aber regelmäßig) durchlaufen.
Aber gerade auf die erste Sekunde kommt es an.

Bevor ich mich an die Idee mit den Workerthreads mache, wollte ich mal nachfragen, ob jemand mit den Notifications Erfahrungen gesammelt hat.

Wenn ich ca. 16 verschiedene Soundbuffer habe und dann für jeden Buffer ein Event für SetPos auswerten möchte, verhält sich das zeitkritisch?
Ich meine, gibt es dann evtl. wieder Aussetzer, weil das Programm im Moment des Sound-Startens (Play) noch anderes zu tun hat und die WaitForMultipleObjects-Funktion, die die Events überwacht, einfach abwartet oder eben die WorkerthreadProc?

Jens
Bis später...

5

30.05.2007, 19:04

Also ich würd die Hüllkurve ja selbst berechnen und auf den gesperrten Soundbuffer oder Speicherbereich in dem der Sound abgebildet ist anwenden.

also in der Form:

C-/C++-Quelltext

1
2
3
4
for ( i = 0; i < samplesOfSound; i++)
{
     sound [i] = Envelop(i) * sound [i];
}


wobei Envelop() für jedes Sample den Lautstärkefaktor berechnet.
Sollte die Hüllkurve abhänging von der Länge des Samples sein dann bietet sich Envolop(samplesOfSound/i) als Lösung an.

Ich nehme an, dass es während des Apspielens wohl keine Manipulationen an der Hüllkurve geben soll!? ;)

Am besten ist es wahrscheinlich die Hüllkurve beim kopieren der Sounds in den Soundbuffer anzuwenden.

---< Ich habe mich zwar noch nicht so intensivst mit der Soundhardware auseinandergesetzt, aber wäre es nicht mal an der Zeit für einen SampleShader, sowie bei den Graphikkarten die Pixelshader >----

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

31.05.2007, 10:55

Ich glaube Envelop( i / samplesOfSound ) macht mehr Sinn als Envelop( samplesOfSound / i ), ganz abgesehen von Division durch 0. Da vielleicht Werte von 0 bis einschließlich 1 gewünscht sind, wäre vielleicht Envelop( i / (samplesOfSound-1) ) noch sinniger. Oder gleich Envelop( i, samplesOfSound ), so dass die Envelop-Funktion für die Umrechnung zuständig ist.
Ansonsten doch ne ganz gute Idee. ;)
Kommen Sie nie mit einem Schwert zu einer Schießerei.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

31.05.2007, 16:54

Habt ihr mal gemerkt, dass der Thread über 1 Jahr alt ist?

Schnitter

Treue Seele

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

8

31.05.2007, 17:24

1 Jahr? Bei mir sinds mehr als 4.

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

9

31.05.2007, 18:02

In welcher Zeitblase befindest du dich denn? :P

Schnitter

Treue Seele

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

10

31.05.2007, 18:03

Oh, ich hab auf das Anmeldedatum geduckt :-/

EDIT: Ich meine natürlich geguckt^^

Werbeanzeige