Detailfragen zum Wave-Format

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Detailfragen zum Wave-Format

Beitrag von Regenduft »

Hat jemand eine Ahnung wo bei 8-Bit-Waves die Nulllinie liegt? Bei 127 oder bei 128?

Und wie sieht es bei 16-Bit-Waves aus? Sind die wirklich asymmetrisch? Klar, dass es so oder so keinen hörbaren unterschied gäbe, aber liegt ein Sample mit dem Wert -32768 überhaupt im definierten Bereich?

Ich habe mal ein paar Samples (8 und 16 Bit) aus meiner Sammlung untersucht, konnte da aber nichts ableiten. Macht fast den Eindruck, als ob jeder einfach frei aus dem Bauch raus macht was er für richtig hält...
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Detailfragen zum Wave-Format

Beitrag von NicTheQuick »

Dafür gibt es extra vorzeichenbehaftete Variablen:

Code: Alles auswählen

b.b = 0
Debug PeekA(@b)
b = -128
Debug PeekA(@b)
b = 127
Debug PeekA(@b)
Damit ist auch klar, wo die Nulllinie ist. Und dass dabei eine Assymmetrie entsteht, ist leider unvermeidbar. Notfalls nutzt man einfach den Wert -128 nicht.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Detailfragen zum Wave-Format

Beitrag von Regenduft »

Danke für die Antwort, aber leider verstehe ich nicht, was Du mir mit dem Code sagen willst...

Mein Problem ist, dass in 8-Bit Waves (PCM) der die Samples im Datenblock per Definition je als "unsigned char", also vorzeichenlose Bytes gespeichert werden.

Ich muss zugeben, dass ich hier etwas haarspalterisch bin, aber ich versuche grundsätzlich mich möglichst genau an Spezifikationen zu halten, einfach um möglichst kompatibel zu bleiben. (Da ich bei Musik noch viel mit dem Amiga arbeite ist das auch nicht völlig sinnfrei)


EDIT

Scheinbar gibt es wirklich keinen definierten Nullpunkt bei 8-Bit-Waves, da das Wave-Format ein einziges Chaos ist, welches mehrfach "aufgebohrt" wurde. In der Praxis hat sich aber scheinbar 128 als Nullpunkt durchgesetzt, da man dann einfach mit Signed-Bytes arbeiten kann und nur das Vorzeichen-Bit negieren muss. (@NicTheQuick: Wolltest Du mir das mit Deinem Code sagen?)

Bei 16-Bit-Waves (bzw. generell) gibt es keine Einschränkung betreffs des maximalen negativen Wertes.

Bei Waves mit 8-Bit und 22,05 kHz gibt es je nach Wellenform übrigens hörbare Unterschiede, wenn man "synchron" arbeitet (also einen Wert unter den Tisch fallen lässt). Spätestens ab 16 Bit braucht man aber schon ein sehr gutes Gehör...


EDIT 2

Inzwischen habe ich's in der offiziellen RIFF-Spezifikation von Microsoft gefunden: 128 ist der Nullpunkt!
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten