Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

FX abspielen ...

9 views
Skip to first unread message

Dirk Aehnlich

unread,
Mar 28, 1997, 3:00:00 AM3/28/97
to

Moin moin,

Ich habe da ein kleines Problem ...

Ballerspiel, schoenes scrolling, tolle Grafik, Sound im
Hintergrund und dann sind da noch FX-Effekte (Knall, Rumms,
Baller usw.)

Mein Problem ist jetzt, das ich z.Z. immer nur ein
Geraeusch (WAV bzw. VOC-Format) auf einmal abspielen
kann (klingt natuerlich ziemlich sch...)

FRAGE : Wie kann ich mehrere Geraeusche auf einmal
abspielen, mit Ueberlagerung usw.


Waere fuer jeden Tip in dieser Hinsicht dankbar !


und wech.........
Dirk !

Lukas Eder

unread,
Mar 30, 1997, 3:00:00 AM3/30/97
to

Hi Dirk

Am Freitag Maerz 28 1997 schrieb Dirk Aehnlich an All:

AE> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
AE> abspielen, mit Ueberlagerung usw.

Ganz einfach:
Du addierst die Werte (du nimmst dafuer am besten ShortInt bzw. Integer und
nicht Byte oder Word)

CU l8r LEg8r
Lukas

Roman Galperin

unread,
Mar 30, 1997, 3:00:00 AM3/30/97
to

Elen síla lúmenn' omentielvo, Dirk!

DA> Mein Problem ist jetzt, das ich z.Z. immer nur ein
DA> Geraeusch (WAV bzw. VOC-Format) auf einmal abspielen
DA> kann (klingt natuerlich ziemlich sch...)
DA> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
DA> abspielen, mit Ueberlagerung usw.
Bytes von mehreren Geraeuschen auslesen, und dann Mittelwert berechnen.

Namárië...
agalp...@aol.com

Elias Weingaertner

unread,
Mar 30, 1997, 3:00:00 AM3/30/97
to

Hallo Dirk

DA> Mein Problem ist jetzt, das ich z.Z. immer nur ein
DA> Geraeusch (WAV bzw. VOC-Format) auf einmal abspielen
DA> kann (klingt natuerlich ziemlich sch...)

DA> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
DA> abspielen, mit Ueberlagerung usw.

Das Problem liegt daran,daß du einen SB verwendest,der nur einen Digikanal
hat.
Es gibt 2 Lösungen:

1) Auf ne GUS ausweichen (32 Kanäle!)
2) Mixen.
Du nimmst ein Array und schickst alle Sounddaten da rein.

Wenn du 2 Samples hast,musst du einfach zuerst dann das erste reinstopfen
u. dann aus den Bytewerten und den Sampledaten den Mittelwert bestimmen
u. diese Mittelwerte wieder ins Array speichern. Das Array wird dann
als Sample an die Karte geschickt. Es muß erwähnt werden,das Mixing Routinen
sehr zeitkritisch sind,d.h ohne ASM gehts nicht!!!


Ciao Elias

Martin Stigge

unread,
Mar 31, 1997, 3:00:00 AM3/31/97
to

Hi!

On 28 Mar 97, Dirk Aehnlich wrote to All:

DA>Mein Problem ist jetzt, das ich z.Z. immer nur ein
DA>Geraeusch (WAV bzw. VOC-Format) auf einmal abspielen
DA>kann (klingt natuerlich ziemlich sch...)

DA>FRAGE : Wie kann ich mehrere Geraeusche auf einmal
DA> abspielen, mit Ueberlagerung usw.

DA>Waere fuer jeden Tip in dieser Hinsicht dankbar !
Zum Tippen waere sicherlich hilfreich zu wissen, wie du im Moment die FX
abspielst...


Bye,

Martin & Roland Stigge / StiggeBrothers/TVC \ s...@mystic.berlin.fido.de

Thomas Saenger

unread,
Apr 1, 1997, 3:00:00 AM4/1/97
to

Hello Roman,

> DA> Mein Problem ist jetzt, das ich z.Z. immer nur ein
> DA> Geraeusch (WAV bzw. VOC-Format) auf einmal abspielen
> DA> kann (klingt natuerlich ziemlich sch...)
> DA> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
> DA> abspielen, mit Ueberlagerung usw.

> Bytes von mehreren Geraeuschen auslesen, und dann
> Mittelwert berechnen.

Aha, und wie funtioniert das in der Praxis? Ich bin da zwar interessiert, aber
ein absoluter Neuling in Sachen FX... Vielleicht kann Deinereiner meinereiner
mal etwas unter die Arme greifen?

.+'''+. .+'''+. .+'''+. .+'''+.
GREETINX from Lennestadt ---------------Tom----------------
'+...+' '+...+' '+...+'

Jochen Dehmer

unread,
Apr 1, 1997, 3:00:00 AM4/1/97
to

Hi *Lukas* !

Dieses Thema hat mich so brennend (autsch, heiss!) interessiert, da konnte
ich einfach nicht widerstehen zu antworten :-) :


AE>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
AE>> abspielen, mit Ueberlagerung usw.

LE> Ganz einfach:
LE> Du addierst die Werte (du nimmst dafuer am besten ShortInt bzw. Integer und
LE> nicht Byte oder Word)

Das hatten wir ja schonmal, das das net so geht. z.b: 0+128 DIV 2 = 64 !
Das heisst, wenn im einen Kanal nix kommt, dafuer im anderen was, dann wirds
nur halbe Lautstaerke ! Das geht also _nicht_ ! :-(
Aber wie man es richtig machen muesste, weiss ich leider auch nicht :-(
Weiss es jemand? (NM an mich bitte auch , dann, THX)


C'Ya -.-=[ _MegaDunk_ ]=-.-

Auch die schoenste Frau ist an den Fuessen zu Ende, doch in der Mitte ist das
Schoenste.

Stephan Weinberger

unread,
Apr 2, 1997, 3:00:00 AM4/2/97
to

Recycling a Message by _Dirk Aehnlich@2:249/4130.9_ to
_All_ (Date: 28.03.97)

DA> Moin moin,
Hallo Dirk...

DA> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
DA> abspielen, mit Ueberlagerung usw.

Zum mischen musst du einfach das arithmetische Mittel (Durchschnitt) aller
Samplewerte bilden. (Also alle Samples aufaddieren und dann durch die
Anzahl der Samples dividieren.) Das sollte natuerlcih in Echtzeit
passieren -> Assembler.

DA> Waere fuer jeden Tip in dieser Hinsicht dankbar !

HTH

DA> und wech.........
DA> Dirk !
DA> * Origin: Call IRATA BBS 0365-7106038 (2:249/4130.9)


CU, Fido: 2:316/25.8
Stephan e-Mail: we...@sbox.tu-graz.ac.at
WWW: http://www.sbox.tu-graz.ac.at/home/weini

Jochen Dehmer

unread,
Apr 2, 1997, 3:00:00 AM4/2/97
to

Hi *Roman* !

Dieses Thema hat mich so brennend (autsch, heiss!) interessiert, da konnte
ich einfach nicht widerstehen zu antworten :-) :

DA>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
DA>> abspielen, mit Ueberlagerung usw.

RG> Bytes von mehreren Geraeuschen auslesen, und dann Mittelwert berechnen.

ROTFL! Auf sowas hab ich nur gewartet...

SCNR ;)


C'Ya -.-=[ _MegaDunk_ ]=-.-

Auch Wolkenkratzer haben mal als Keller angefangen.

Jochen Dehmer

unread,
Apr 2, 1997, 3:00:00 AM4/2/97
to

Hi *Elias* !

Dieses Thema hat mich so brennend (autsch, heiss!) interessiert, da konnte
ich einfach nicht widerstehen zu antworten :-) :


DA>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
DA>> abspielen, mit Ueberlagerung usw.

[...]
EW> Wenn du 2 Samples hast,musst du einfach zuerst dann das erste reinstopfen
EW> u. dann aus den Bytewerten und den Sampledaten den Mittelwert bestimmen
EW> u. diese Mittelwerte wieder ins Array speichern. Das Array wird dann
EW> als Sample an die Karte geschickt. Es muss erwaehnt werden,das Mixing
EW> Routinen sehr zeitkritisch sind,d.h ohne ASM gehts nicht!!!

Oh mann, hat den hier keiner eine Ahnung? Gut, ich weiss es ja selbst nicht,
aber so wie da oben geht es NICHT !!!!!!!

Warum? (wie oft hab ich das schon gesagt?) :

Kanal1 Kanal2 Gemixt=Ausgabe
100 0 50
120 0 60
110 0 55

Aha, was sieht man daran??? Wenn z.B. der 2.Kanal schweig (oder was ganz
leises kommt), dann wird es insgesammt auch viel leiser, entspricht also
NICHT der Realitaet!!
Oder wenn in 2 Kanaelen genau das gleiche kommt, dann hoert sich sowas doch
lauter an, oder? Tja, nach der Methode mit dem Mittelwert nicht :-( Es bleibt
auf der einfachen Lautstaerke.
ALso das merkt man ja bei jedem MOD Player, wenn in 2 Channels das selbe
laeuft, dass es dann lauter ist...

Leider bin ich auch ein "Nixwisser", und hab keine Ahnung, wie man's RICHTIG
mixt... Weiss es denn hier keiner??? Hallo, coders, was ist mit euch???
Ich wills auch mal wissen!!!!!


C'Ya -.-=[ _MegaDunk_ ]=-.-

Alle reden vom oeffentlichen Verkehr, aber keiner traut sich.

Martin Lang

unread,
Apr 4, 1997, 3:00:00 AM4/4/97
to

Neulich am 01.04.97 schrieb Jochen Dehmer
an Lukas Eder zum Thema 'FX abspielen ...':
--------------------------------------------------------------------------

AE>>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
AE>>> abspielen, mit Ueberlagerung usw.
LE>> Ganz einfach:
LE>> Du addierst die Werte (du nimmst dafuer am besten ShortInt bzw. Integer

LE>> und nicht Byte oder Word)


> Das hatten wir ja schonmal, das das net so geht. z.b: 0+128 DIV 2 = 64 !
> Das heisst, wenn im einen Kanal nix kommt, dafuer im anderen was, dann wirds
> nur halbe Lautstaerke ! Das geht also _nicht_ ! :-(
> Aber wie man es richtig machen muesste, weiss ich leider auch nicht :-(
> Weiss es jemand? (NM an mich bitte auch , dann, THX)

Ich wuerde sagen, eine ODER-Verknuepfung:

Also z.B: Quelle 1 hat den Wert 10011000b
Quelle 2 hat den Wert 10110100b

Dann wird daraus einfach 10111100b

Muesste doch so gehen oder?


.
... *wir lesen uns* ... .
.
marti...@hyperbox.org ; Martin Lang@2:314/20.6 ; Martin Lang@A-L |
- - - - -- -- -- --- --- --- -------------------------------------+


Lukas Eder

unread,
Apr 5, 1997, 3:00:00 AM4/5/97
to

Hi Jochen

Tuesday April 01 1997 22:40, Jochen Dehmer schrieb an Lukas Eder:

AE>>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
AE>>> abspielen, mit Ueberlagerung usw.
LE>> Ganz einfach:
LE>> Du addierst die Werte (du nimmst dafuer am besten ShortInt bzw. Integer
LE>> und nicht Byte oder Word)

DE> [...] z.b: 0+128 DIV 2 = 64! Das heisst, wenn im einen Kanal nix
DE> kommt, dafuer im anderen was, dann wirds nur halbe Lautstaerke ! Das
DE> geht also _nicht_ !

Wer sagt denn etwas von "DIV 2"? Ich meine, du musst 0+128=128 rechnen.
Ich mach das mal "grafisch":

# = 1. Geraeusch
+ = 2. Geraeusch
X = Ueberlagerung

... -> wird zu ->
5 | | XX |
4 ### | X| |
3 ## | ## | | X |
2 # | # ++ X | X |
1 # ++ #+ |+ ++ X | XXXX|
Traeger (=0) -----+--+--+#---+--+--+- -XX-----------X---------
-1 + + | ++ #| ++ # | |
-2 ++ | # # | |X XXXX
-3 | |## ## | | X
-4 | | ### | | X
-5 | | | | XX
... 1 2 1 2

Beispiele
1) + = 1, # = 4 ; daher X := 1 + 4 {5}
2) + = 2, # = -2; daher X := 2 + -2 {0}

Das sieht jetzt etwas eckig aus, da es im ASCII ist. Aber es stimmt so. Ist
einfachste Physik (Schall und so). Das stimmt natuerlich nur, wenn die Daten
_Integer_ sind (Also ein - oder + haben). Hmm, das is langsam off-topic :-/
Aber trotzdem:

{ Bei 8Bit-Daten ist's ShortInt, bei 16Bit Integer }
Function Ueberlagerung(A, B : ShortInt) : ShortInt;
Begin
Ueberlagerung := A + B;
end;

Ich hoffe, damit ist das Problem geloest.

CU Lukas

Karsten Petersen

unread,
Apr 6, 1997, 4:00:00 AM4/6/97
to

Jochen Dehmer meinte am 02.04.97
zum Thema "FX abspielen ...":

JD> Oh mann, hat den hier keiner eine Ahnung? Gut, ich weiss es ja selbst
JD> nicht, aber so wie da oben geht es NICHT !!!!!!!
uebermut kommt vor dem fall...

JD> Warum? (wie oft hab ich das schon gesagt?) :
JD>
JD> Kanal1 Kanal2 Gemixt=Ausgabe
JD> 100 0 50
JD> 120 0 60
JD> 110 0 55
JD>
JD> Aha, was sieht man daran??? Wenn z.B. der 2.Kanal schweig (oder was ganz
JD> leises kommt), dann wird es insgesammt auch viel leiser, entspricht also
JD> NICHT der Realitaet!!
denkfehler, eben doch. (s.u.)

JD> Oder wenn in 2 Kanaelen genau das gleiche kommt, dann hoert sich sowas
JD> doch lauter an, oder? Tja, nach der Methode mit dem Mittelwert nicht :-(
JD> Es bleibt auf der einfachen Lautstaerke.
denkfehler, eben nicht: 100 & 0 -> 50
100 & 100 -> 100

JD> ALso das merkt man ja bei jedem MOD Player, wenn in 2 Channels das selbe
JD> laeuft, dass es dann lauter ist...
JD>
JD> Leider bin ich auch ein "Nixwisser", und hab keine Ahnung, wie man's
JD> RICHTIG mixt... Weiss es denn hier keiner??? Hallo, coders, was ist mit
JD> euch??? Ich wills auch mal wissen!!!!!

also noch mal ganz von anfang an:

1. physikalisch: die gesamtamplitude einer welle ergibt sich aus den
summierten amplituden ihrer teilwellen

2. biologisch: das ohr hat keine obergrenze (es sei denn man wertet
einen trommelfellriss als solche ;)

3. elektronisch: eine soundkarte hat eine obergrenze

daraus ergibt sich, das wir laut 1 die schwingungen aufeinanderaddieren
muessen, da aber 3 gilt muessen wir dafuer sorge tragen, das die
gesamtamplitude nicht das maximum ueberschreitet.

moeglichkeit 1: clipping. ergebniss: massivste verzerrungen

moeglichkeit 2: so leise eingangsamplituden, das die gesamtamplitude nicht
das maximum ueberschreitet. nachteil: teilungsfehler

moeglichkeit 3: maximal gesamtamplitude auf maximal maoegliche ausgabe-
amplitude runterrechnen.

der denkfehler den du die ganze zeit baust beruht darauf, das dein
ursample einmal alleine, und einmal mit einem anderen gemixt gespielt
wird. natuerlich muss es bei diesem vergleich leiser werden.
wenn du jedoch konstant z.b. 8 stimmen mischst, und dein sample einmal
alleine (die anderen 7 stimmen also neutral) und einmal mit
'hintergrundgeraeuschen' spielst, wird es gleich laut klingen.

CU...
Karsten alias TI

Harald Diebek

unread,
Apr 6, 1997, 4:00:00 AM4/6/97
to

Hochfeld, der 06.04.97

Am 02.04.97 schrieb _Jochen Dehmer_ an _Elias Weingaertner_
die folgenden bemerkenswerten Zeilen:

JD> Hi *Elias* !
JD>
JD> Dieses Thema hat mich so brennend (autsch, heiss!) interessiert, da konnte
JD> ich einfach nicht widerstehen zu antworten :-) :

DA>>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
DA>>> abspielen, mit Ueberlagerung usw.

JD> [...]

JD> Oh mann, hat den hier keiner eine Ahnung? Gut, ich weiss es ja selbst
JD> nicht, aber so wie da oben geht es NICHT !!!!!!!

[....]

Aber, aber, bitte nicht so heftig. kiep kuhl.

Diese Thema ist -obschon OffTopic- bis in die Einzelheiten ausdiskutiert.

Entweder schwaechst Du die Eingangs-Signale ab, oder Du uebersteuerst
beim Mischen. Punkt, Ende, Aus.

Ciao,

Harald

Markus Meyer

unread,
Apr 6, 1997, 4:00:00 AM4/6/97
to

Am 01.04.97 schrieb Jochen Dehmer zum Thema "FX abspielen ..."
eine Nachricht, die mich so beeindruckte, dass ich nichts anderes
tun konnte, als sie sofort zu quoten:

AE>>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
AE>>> abspielen, mit Ueberlagerung usw.
LE>> Ganz einfach:
LE>> Du addierst die Werte (du nimmst dafuer am besten ShortInt bzw. Integer
LE>> und nicht Byte oder Word)

> Das hatten wir ja schonmal, das das net so geht. z.b: 0+128 DIV 2 = 64 !
> Das heisst, wenn im einen Kanal nix kommt, dafuer im anderen was, dann wirds
> nur halbe Lautstaerke ! Das geht also _nicht_ ! :-(

---------------------------------------------------------------------------
Mann Leute, jetzt will ich mal was klarstellen:

1. die amplitude, die man dem dsp uebergibt, ist NICHT die lautstaerke,
sondern die stellung (die "woelbung") des lautsprechers. eine sinusschwingung,
die zwischen 0 und 27 hin und her schwingt, klingt (im idealfall) exakt
genauso, wie eine die zwischen 100 und 127 hin und her schwingt. okay?

2. weil sich jetzt immer alle streiten, ob man jetzt durch die anzahl der
samples dividieren muss oder nicht: die antwort lautet: JEIN!
Rein theoretisch gesehen (physikalisch) ueberlagern sich zwei schwingungen
additiv:


127 xxx xxx xxx xxx
xx xx xx xx xx xx xx
0 x x x x x x x Sample 1
xx xx xx xx xx xx xx
-127 xxx xxx xxx xxx

20 x x x x x x x x x x x x x x x
0 x x x x x x x x x x x x x x x x x x x x x x x x x x x x x Sample 2
-20 x x x x x x x x x x x x x x x

Gibbet zusammen:

147 x x
x x x
x x xx
0 xxx x Sample 1+Sample 2 (hab jetzt keine Lust, das
x xx weiterzumalen)
x x
-147 x

Plaerrt mal zu zweit in ein Microphon rein und schaut euch die Huellkurve auf
dem Oszilloskop an, ihr werdet eine REINE additive Ueberlagerung der Kurven
finden!

----------------------------------------------------------------------------
Frage: Warum meinen dann alle, dass man das entstehende Gebilde noch durch
die Anzahl der Samples teilen muesste?

Antwort: Die haben schon recht, weil

1. nur dadurch, dass man durch einen Faktor teilt, wird der Sound nur leiser!
Im Ausdruck a/f=b sind a und b schliesslich proportional.

2. diese Leute rein praktisch denken. Der Soundblaster kann, sagen wir, im
8-bit modus Werte von 0..255 (das entspricht -127..127) ausgeben. wenn man
einen wert von z.b. -147 (waere respektive -20 am soundblasterport) ausgeben
will, wird das nix, man koennte hoechstens 0 ausgeben, was zu verzerrungen
fuehrt. also teilt man durch die anzahl der samples, da dann nie verzerrungen
auftreten koennen. dass das dann leiser wird, ist klar, laesst sich aber nicht
vermeiden. viele modplayer etc. erlauben jedoch, den dann entstehenden wert
wieder mit einem faktor zu multiplizieren, was einen lauteren sound, aber
auch das risiko von verzerrungen mit sich bringt.

| Achtung! Man muss natuerlich immer durch die MAXIMALE Anzahl von Samples
| dividieren. Wenn man naemlich z.b. eine 4stimmige-Mod Datei hat, muss man
| natuerlich auch durch 4 dividieren, wenn nur 2 Samples gerade aktiv sind.
| Sonst wuerde es ja enorme Schwankungen in der Lautstaerke geben.

---------------------------------------------------------------------------
Frage: Was soll die Sache mit dem Durchschnittswert? Das ist aber doch
Quatsch, oder?

Antwort: Auch nicht. Der Durchschnittswert ist mathematisch definiert als
summe(x1..xn)/xn. Das ist genau das oben gesagte. Wie gesagt,
Voraussetzung fuer ein stoerungsfreies Abspielen ist ein konstantes n.

Wow, hab' ich wieder viel geschrieben...
+-+
| |arkus

Fido: Markus Meyer@2:2490/1634.5
iNet: mme...@bene.baynet.de

++ HOL DIR DEN NEUEN BLUECHAT 5.0 MIT HINTERGRUND-FILETRANSFER ++
++ BEI 2:2490/1634, BC5BETA.ARJ ++

Elias Weingaertner

unread,
Apr 7, 1997, 3:00:00 AM4/7/97
to

Hallo Jochen


JD> Oh mann, hat den hier keiner eine Ahnung? Gut, ich weiss es ja selbst
JD> nicht,

JD> aber so wie da oben geht es NICHT !!!!!!!

JD> Warum? (wie oft hab ich das schon gesagt?) :

JD> Kanal1 Kanal2 Gemixt=Ausgabe
JD> 100 0 50
JD> 120 0 60
JD> 110 0 55

Es funktioniert!!!!

Ein Paar Dinge sind zu ergänzen:

1. 2 Samples können sich abschwächen,sogar aufheben!
(Eine Sinus und eine Cosinus Schwingung gleicher Frequenz heben sich
gegenseitg wegen 90% Phasenverschiebung auf)
2. Du mußt solange durch 2 teilen,bis ein Sample fertig ist.
Wenn du immer durch zwei teilst,passiert das,was in der Tabelle steht.

Ich hoffe,mehr Licht in das Dunkel gebracht zu haben.

Ciao Elias

Jochen Dehmer

unread,
Apr 8, 1997, 3:00:00 AM4/8/97
to

Hi *Lukas* !

Dieses Thema hat mich so brennend (autsch, heiss!) interessiert, da konnte

ich einfach nicht widerstehen zu antworten :-) :


[Samples uebernander mixen]


DE>> [...] z.b: 0+128 DIV 2 = 64! Das heisst, wenn im einen Kanal nix
DE>> kommt, dafuer im anderen was, dann wirds nur halbe Lautstaerke ! Das
DE>> geht also _nicht_ !

LE> Wer sagt denn etwas von "DIV 2"? Ich meine, du musst 0+128=128 rechnen.
LE> Ich mach das mal "grafisch":

Ohhhh ! Kewl ;)

[GFX killed]
LE> Beispiele
LE> 1) + = 1, # = 4 ; daher X := 1 + 4 {5}
LE> 2) + = 2, # = -2; daher X := 2 + -2 {0}

Hmmm ja, aber was macht man denn wenn im einen Sample +128 ist, und im
anderen auch +128? Dann ist es +256, wie bekommt man den sowas in einem
ShortInt unter?

LE> Das sieht jetzt etwas eckig aus, da es im ASCII ist. Aber es stimmt so. Ist
LE> einfachste Physik (Schall und so). Das stimmt natuerlich nur, wenn die
LE> Daten _Integer_ sind (Also ein - oder + haben). Hmm, das is langsam
LE> off-topic :-/ Aber trotzdem:

Leuchtet ein.

LE> { Bei 8Bit-Daten ist's ShortInt, bei 16Bit Integer }
LE> Function Ueberlagerung(A, B : ShortInt) : ShortInt;
LE> Begin
LE> Ueberlagerung := A + B;
LE> end;
LE>
LE> Ich hoffe, damit ist das Problem geloest.

Fast, wie du ja jetzt weisst, was wenn es groesser als ein ShortInt wird?


C'Ya ·.-=[ _MegaDunk_ ]=-.·

Das sicherste Mittel, arm zu bleiben, ist ein ehrlicher Mensch zu sein.

Jochen Lannig

unread,
Apr 8, 1997, 3:00:00 AM4/8/97
to

Dienstag der 08.04.97, es ist genau 21:29.
Hier ist Radio Vulkan mit einer Durchsage:


Shacha, Lukas Eder!

AE>>>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
AE>>>> abspielen, mit Ueberlagerung usw.

[...}


LE>Function Ueberlagerung(A, B : ShortInt) : ShortInt;
LE> Begin
LE> Ueberlagerung := A + B;
LE> end;

Aber nur dann, wenn keins der beiden Geraeusche auf mehr als 128 (bei
8bit) bzw. 32.768 (bei 16bit) kommt, sonst gibt's boese Verzerrungen.


Tai nasha no karosha.

Lemming von Vulkan

Member of *V:FIG* and *DS9:DMS*

Oliver Maske

unread,
Apr 9, 1997, 3:00:00 AM4/9/97
to

Hallo Jochen,

02 Apr 97 22:16, Jochen Dehmer schrieb dies zu Elias Weingaertner:

[Mischmethode]

JD> Oh mann, hat den hier keiner eine Ahnung? Gut, ich weiss es ja

JD> selbst nicht, aber so wie da oben geht es NICHT !!!!!!!

Wenn sich zwei Schwingungen ueberlagern, dann gibt es Stellen, die sich
neutralisieren und Stellen, die sich verstaerken. D.h. trifft eine negative
Amplitude mit eine positive Amplitude, deren Betrag gleich ist, zusammen, so
ergibt sich 0.

PC-Samples sind aber nicht vorzeichenbehaftet und daher gibt es keine negative
Amplitude. Deshalb addiert man zum Mittelwert einfach 128.

Kanal 1 Kanal 2 Mischung
110 0 183
120 60 218
255 255 383 => 127

Da Ueberlaeufe sowohl bei der Bildung des Mittelwertes und der Addition mit 128
entstehen koennen, muessen bei 8Bit Samples 16 Bit Variablen und bei 16Bit
Samples 32 Bit Variablen benutzt werden!

Ciao,
Oliver

1010 - Strom Ein, Aus, Ein, Aus. So Funktioniert ein Computer. - Ich bin ja
nicht bloed, dies ist klar, dasz man den Computer einschalten musz!

Matthias Schnelte

unread,
Apr 9, 1997, 3:00:00 AM4/9/97
to

Jochen Dehmer@2:2476/108.6 meinte am 02.04.97
zum Thema "FX abspielen ...":

JD> [...]


EW>> Wenn du 2 Samples hast,musst du einfach zuerst dann das erste reinstopfen
EW>> u. dann aus den Bytewerten und den Sampledaten den Mittelwert bestimmen
EW>> u. diese Mittelwerte wieder ins Array speichern. Das Array wird dann
EW>> als Sample an die Karte geschickt. Es muss erwaehnt werden,das Mixing
EW>> Routinen sehr zeitkritisch sind,d.h ohne ASM gehts nicht!!!

JD> Oh mann, hat den hier keiner eine Ahnung? Gut, ich weiss es ja selbst
JD> nicht, aber so wie da oben geht es NICHT !!!!!!!
So geht es aber doch!
(Evtl. noch mit Oversampling, aber das ist nur eine etwas abgewandelte
Methode)

JD> Aha, was sieht man daran??? Wenn z.B. der 2.Kanal schweig (oder was ganz
JD> leises kommt), dann wird es insgesammt auch viel leiser, entspricht also
JD> NICHT der Realitaet!!

Und? Es geht nicht anders!!! Du hast nur 8/16 Bit!!

JD> Oder wenn in 2 Kanaelen genau das gleiche kommt, dann hoert sich sowas
JD> doch lauter an, oder? Tja, nach der Methode mit dem Mittelwert nicht :-(
JD> Es bleibt auf der einfachen Lautstaerke.

JD> ALso das merkt man ja bei jedem MOD Player, wenn in 2 Channels das selbe
JD> laeuft, dass es dann lauter ist...

Okay, ich habe schon mehrere Mixing Routinen fuer MOD Player gecodet
und ich kann dir versichern, das da immer mit Mittelwert(Oversampling)
gearbeitet wurde.
Und deine Behauptung ist schlicht und einfach falsch. Wenn erst
nur auf einem Kanal ein Instrument abgespielt und dann kommt das
gleiche Instrument noch auf dem 2. Kanal hinzu dann ist das auch lauter.

JD> Leider bin ich auch ein "Nixwisser", und hab keine Ahnung, wie man's
JD> RICHTIG mixt... Weiss es denn hier keiner??? Hallo, coders, was ist mit
JD> euch??? Ich wills auch mal wissen!!!!!

Wie gesagt Mittelwert bilden ist richtig.
Oversampling heisst nix anderes, als das man die Sample einfach
ein wenig lauter ausgibt als die sind und an den Grenzen clippt.
Das soll den Qualitätsverlust vermindern und wird vorallem
bei Playern die mehr als 4 Kanäle haben angewandt, da da meistens
nicht alle Kanäle aktiv sind.

=========
*Mixing*

Wir sind jetzt soweit, daß wir einen Kanal mit verschiedenen Tonhöhen
+ Lautstärken ausgeben koennen, aber Module haben bis zu 32 Kanäle.
Um diese Kanäle auf den einen Soundblasterkanal auszugeben, muessen wir
die Samples mischen.
Die einfachste Möglichkeit ist den Mittelwert der Samplebytes zu bilden.
D.h. erst alle Samplebytes der Kanäle addieren und dann durch die Anzahl
der Kanäle dividieren.
Das mag sich bei 4 Kanälen ja noch ganz gut anhören, aber wenn man
16 Kanäle hat, dann hört es sich ziemlich schlecht an, wenn nur ein oder
zwei Kanäle gerade aktiv sind. Das ist auch logisch, denn die Samples
werden ja durch 16 geteilt und dadurch wird die Auflösung pro Kanal
praktisch auf 4 Bits reduziert.
In der Praxis hört man den Qualitätsverlust IMO nicht, sondern das Sample
wird einfach nur ziemlich leise abgespielt.
Um das zu verhindern werden die Samples einfach lauter ausgegeben als
sie eigentlich gespielt werden sollten und an den Grenzen (0+255) werden
sie geclippt. Das ganze wird auch wieder ueber eine Tabelle erledigt:

const
MC=16; { Maximale Anzahl an Kanälen }
ppHalfSize=MC*64; { Die Mitte des Postprocessing Table }
ppsize=MC*128;

{ 64 = Normale amplification, 32 = 50%, 128 =200% ...}
procedure MakePostTab(amp:byte);
var
b:byte;
i:integer;
h:longint;

begin
for i:=0 to ppsize do begin
h:=i- ppHalfSize ;
h:=h * amp;
h:=h div 64;
h:=h div (MC div 2);
h:=h+128;
if h<0 then h:=0 else if h>255 then h:=255; { Clipping }
pPostTab^[i]:=h;
end;
end;

Das Mixing läuft folgendermassen ab:

Erst wird der Mixbuffer (array of word) mit ppHalfSize gefüllt,
dann werden für jeden Kanal die Samplebytes (signed!) dazuaddiert.
Nachdem alle Kanäle gemixt worden sind, werden die Werte aus dem Mixbuffer
mit Hilfe des Postprocessing Table zu 8Bit Werten, die ueber die
Soundkarte ausgegeben werden koennen:

_8BitWert:=pPostTab^[Mixbuffer[i]];

i ist einfach ein Index im Mixbuffer

Um das besser zu verstehen sollte man sich den Postprocessing Table
vieleicht mal ausgeben lassen.
=========

So, ich hoffe, das damit dieses Thema geklärt ist.

Matthias
---
"Mitten in den Napf!" [Data]

Jochen Dehmer

unread,
Apr 9, 1997, 3:00:00 AM4/9/97
to

Hi *Harald* !

Dieses Thema hat mich so brennend (autsch, heiss!) interessiert, da konnte
ich einfach nicht widerstehen zu antworten :-) :

DA>>>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
DA>>>> abspielen, mit Ueberlagerung usw.
JD>> [...]

JD>> Oh mann, hat den hier keiner eine Ahnung? Gut, ich weiss es ja selbst
JD>> nicht, aber so wie da oben geht es NICHT !!!!!!!

HD> [....]
HD>
HD> Aber, aber, bitte nicht so heftig. kiep kuhl.

Joooooo! (mann ist das kalt hier) :)

HD> Diese Thema ist -obschon OffTopic- bis in die Einzelheiten ausdiskutiert.

Ich weiss :(

HD> Entweder schwaechst Du die Eingangs-Signale ab, oder Du uebersteuerst
HD> beim Mischen. Punkt, Ende, Aus.

Okay, okay, ICH WILL MICH HIERMIT BEI ALLEN BETROFFENEN ENTSCHULDIGEN.

Ich muss wirklich einen fetten Mist geschrieben haben. SOrry Leute, nehmt's
bitte nicht persoenlich!


C'Ya -.-=[ _MegaDunk_ ]=-.-

Computer sind nicht intelligent. Sie glauben das nur.

Jochen Dehmer

unread,
Apr 9, 1997, 3:00:00 AM4/9/97
to

Hi *Karsten* !

Dieses Thema hat mich so brennend (autsch, heiss!) interessiert, da konnte
ich einfach nicht widerstehen zu antworten :-) :

JD>> Oh mann, hat den hier keiner eine Ahnung? Gut, ich weiss es ja selbst
JD>> nicht, aber so wie da oben geht es NICHT !!!!!!!

KP> uebermut kommt vor dem fall...

Leider :(

JD>> Aha, was sieht man daran??? Wenn z.B. der 2.Kanal schweig (oder was ganz
JD>> leises kommt), dann wird es insgesammt auch viel leiser, entspricht also
JD>> NICHT der Realitaet!!

KP> denkfehler, eben doch. (s.u.)

okay.

JD>> Oder wenn in 2 Kanaelen genau das gleiche kommt, dann hoert sich sowas
JD>> doch lauter an, oder? Tja, nach der Methode mit dem Mittelwert nicht :-(
JD>> Es bleibt auf der einfachen Lautstaerke.

KP> denkfehler, eben nicht: 100 & 0 -> 50
KP> 100 & 100 -> 100

Hmmmm, ich war wirklich sehr verplant, als ich die Mail schrieb, sorry.

KP> 1. physikalisch: die gesamtamplitude einer welle ergibt sich aus den
KP> summierten amplituden ihrer teilwellen

Ja.

KP> 2. biologisch: das ohr hat keine obergrenze (es sei denn man wertet
KP> einen trommelfellriss als solche ;)

ROTFL ;)))

KP> 3. elektronisch: eine soundkarte hat eine obergrenze

Aha, da haben wir's ja.

KP> daraus ergibt sich, das wir laut 1 die schwingungen aufeinanderaddieren
KP> muessen, da aber 3 gilt muessen wir dafuer sorge tragen, das die
KP> gesamtamplitude nicht das maximum ueberschreitet.
KP>
KP> moeglichkeit 1: clipping. ergebniss: massivste verzerrungen
KP> moeglichkeit 2: so leise eingangsamplituden, das die gesamtamplitude
KP> nicht maximum ueberschreitet. nachteil: teilungsfehler
KP>
KP> moeglichkeit 3: maximal gesamtamplitude auf maximal maoegliche ausgabe-
KP> amplitude runterrechnen.
KP>
KP> der denkfehler den du die ganze zeit baust beruht darauf, das dein
KP> ursample einmal alleine, und einmal mit einem anderen gemixt gespielt
KP> wird. natuerlich muss es bei diesem vergleich leiser werden.
KP> wenn du jedoch konstant z.b. 8 stimmen mischst, und dein sample einmal
KP> alleine (die anderen 7 stimmen also neutral) und einmal mit
KP> 'hintergrundgeraeuschen' spielst, wird es gleich laut klingen.

Okay, ich habt ja alle Recht, und ich haette besser mein Maul halten sollen.
Verdammt, sorry es tut mir leid. Ihr seid echt nett, dass ich mir alles so
genau erklaert. Danke!!
Ich hoffe ich lasse es jetzt mal mit dem Besserwissen..... :)


C'Ya -.-=[ _MegaDunk_ ]=-.-

Arme haben Beine. Arme haben Arme. Beine haben keine Arme. Arme Beine!

Jochen Dehmer

unread,
Apr 9, 1997, 3:00:00 AM4/9/97
to

Hi *Roman* !

Dieses Thema hat mich so brennend (autsch, heiss!) interessiert, da konnte
ich einfach nicht widerstehen zu antworten :-) :

DA>>>> FRAGE : Wie kann ich mehrere Geraeusche auf einmal
DA>>>> abspielen, mit Ueberlagerung usw.

RG>>> Bytes von mehreren Geraeuschen auslesen, und dann Mittelwert berechnen.

JD>> ROTFL! Auf sowas hab ich nur gewartet...
RG> Wieso?

Entschuldigung, ich war da nicht gut drauf, irgendwie. Lies mal meine anderen
Mails zu dem Thema hier im Echo, ok?


C'Ya -.-=[ _MegaDunk_ ]=-.-

"Fuehlt sich jemand angesprochen?" - "Nee..."

Martin Lang

unread,
Apr 10, 1997, 3:00:00 AM4/10/97
to

Neulich am 05.04.97 schrieb Lukas Eder
an Jochen Dehmer zum Thema 'FX abspielen ...':
--------------------------------------------------------------------------

DE>> [...] z.b: 0+128 DIV 2 = 64! Das heisst, wenn im einen Kanal nix
DE>> kommt, dafuer im anderen was, dann wirds nur halbe Lautstaerke ! Das
DE>> geht also _nicht_ !

> Wer sagt denn etwas von "DIV 2"? Ich meine, du musst 0+128=128 rechnen.

> Ich mach das mal "grafisch":

JA genau, und wenn ich jetzt zwei Signale mit z.B.: Wert 120 abspiele dann
kommt da hinten 240 raus....

Ne.

Ich wuerde sagen eine Oder - Verknuepfung.

Lukas Eder

unread,
Apr 13, 1997, 3:00:00 AM4/13/97
to

Hi Jochen

Tuesday April 08 1997 21:31, Jochen Lannig schrieb an Lukas Eder:

LE>> Function Ueberlagerung(A, B : ShortInt) : ShortInt;
LE>> Begin
LE>> Ueberlagerung := A + B;
LE>> end;

LE> Aber nur dann, wenn keins der beiden Geraeusche auf mehr als 128 (bei
LE> 8bit) bzw. 32.768 (bei 16bit) kommt, sonst gibt's boese Verzerrungen.

Ja. Ich hab nicht daran gedacht, dass die Daten im Computer, im Gegensatz zur
Physik _keine_ Vorzeichen haben.
Da die Daten unsigned sind (also Byte oder Word), ist der Traeger des
Geraeusches bei $80 bzw. bei $8000 und _nicht_ bei 0. Also muesste die Funktion
dann fuer 8Bit so heissen:

Function Ueberlagerung(A, B : Byte) : Byte;
Begin
Ueberlagerung := (A + B - $80) AND $FF;
end;

A B Mischung
$80 $80 $80 = ($80 + $80 - $80) AND $FF
$20 $90 $30 = ($20 + $90 - $80) AND $FF

Aber ich bin mir nicht sicher, wovon hier die Rede ist (Das Subj leuchtet mir
nicht ganz ein!) Sind das hier nun .WAV und .VOC Dateien oder ist das eine
andere Technik?
Bei .WAV Dateien stimmts auf jeden Fall. Ich habe das geprueft, zuerst mit
meiner Version, dann mit einem _professionellen_ Windows-Anwendungsprogramm,
und die Daten stimmen ueberein!


CU Lukas

Lukas Eder

unread,
Apr 13, 1997, 3:00:00 AM4/13/97
to

Hi Martin

Thursday April 10 1997 23:37, Martin Lang schrieb an Lukas Eder:

LE>> Wer sagt denn etwas von "DIV 2"? Ich meine, du musst 0+128=128
LE>> rechnen.

Ich hab hier den Fehler gemacht, dass ich dachte, die Daten waeren signed (also
+ und -). Da sie das nicht sind, wuerde es mit 0 und 128 wieder 0 geben (Das
hab ich bei einer frueheren Mail erklaert.

ML> Ich wuerde sagen eine Oder - Verknuepfung.

Kaum. Wenn du folgendes verknuepfst:
(125) 01111101 (125) 01111101
(129) 10000001 (253) 11111101
OR -------------- OR --------------
(253) 11111101 (253) 11111101

125 OR 129=253 125 OR 253=253

Wie um alles in der Welt soll das dasselbe geben koennen?

CU Lukas

Willi Marquart

unread,
Apr 13, 1997, 3:00:00 AM4/13/97
to

Hallo Elias,

EW> 1. 2 Samples können sich abschwächen,sogar aufheben!
EW> (Eine Sinus und eine Cosinus Schwingung gleicher Frequenz heben sich
EW> gegenseitg wegen 90% Phasenverschiebung auf)

Das ist neu, ich dachte immer, zur Ausloeschung braucht man 180 Grad
Phasenverschiebung. Wenn Du eine Sinus- und Cosinusschwingung gleicher Frequenz
mit der Amplitude 1 addierst, erhaelst Du eine zum Sinus um -45 Grad
phasenverschobene Sinusschwingung mit der Amplitude Wurzel(2).

Gruss aus dem Vogelsberg

Willi

Jochen Dehmer

unread,
Apr 13, 1997, 3:00:00 AM4/13/97
to

Hi *Oliver* !

Dieses Thema hat mich so brennend (autsch, heiss!) interessiert, da konnte
ich einfach nicht widerstehen zu antworten :-) :


[Mixing]


JD>> Oh mann, hat den hier keiner eine Ahnung? Gut, ich weiss es ja

JD>> selbst nicht, aber so wie da oben geht es NICHT !!!!!!!
[...]
OM> PC-Samples sind aber nicht vorzeichenbehaftet und daher gibt es keine
OM> negative Amplitude. Deshalb addiert man zum Mittelwert einfach 128.
OM>
OM> Kanal 1 Kanal 2 Mischung
OM> 110 0 183
OM> 120 60 218
OM> 255 255 383 => 127
OM>
OM> Da Ueberlaeufe sowohl bei der Bildung des Mittelwertes und der Addition mit
OM> 128 entstehen koennen, muessen bei 8Bit Samples 16 Bit Variablen und bei
OM> 16Bit Samples 32 Bit Variablen benutzt werden!

Braucht man nicht. Bei 8 bit reicht auch ein Byte,oder? Wenn man zu 255 ,z.b.
128 dazuaddiert, dann macht kommt 127 raus, weil TP das automatisch wieder
bei Null anfaengen zu zaehlen laesst.

Achja, dieses Statement von mir war jetzt rein hypothethisch, ich habe
_nicht_ nachgesehen ob's auch wirklich so geht mit dem 8bit und so...
Wollte ich ja nur sagen, damit sich keiner ueber mich aufregt :-)


C'Ya ·.-=[ _MegaDunk_ ]=-.·

Tu mir nichts, ich tu dir auch nichts!

Sebastian Gesemann

unread,
Apr 15, 1997, 3:00:00 AM4/15/97
to

(Matthias Schnelte@2:2432/650.10 meinte am 09.04.97
zum Thema "FX abspielen ..."...)

Hallo, Matthias !

[..]
MS> Okay, ich habe schon mehrere Mixing Routinen fuer MOD Player gecodet
MS> und ich kann dir versichern, das da immer mit Mittelwert(Oversampling)
MS> gearbeitet wurde.

Oversampling bedeutet imho das interpolieren der samples (laut inertia
player) was du meinst ist amplifying, he?

MS> Wir sind jetzt soweit, daß wir einen Kanal mit verschiedenen Tonhöhen
MS> + Lautstärken ausgeben koennen, aber Module haben bis zu 32 Kanäle.
MS> [..]
MS> Die einfachste Möglichkeit ist den Mittelwert der Samplebytes zu bilden.
MS> D.h. erst alle Samplebytes der Kanäle addieren und dann durch die Anzahl
MS> der Kanäle dividieren.

Oh, grauß! mit normalen addieren+dividieren der Kanäle kommste bei einer
anzahl von 32 kanälen sogar nur auf 3Bit pro kanal :-)

Ciao,
Sebastian

Matthias Schnelte

unread,
Apr 21, 1997, 3:00:00 AM4/21/97
to

Sebastian Gesemann@2:2432/207.15 meinte am 15.04.97
zum Thema "Re: FX abspielen ...":

MS>> Okay, ich habe schon mehrere Mixing Routinen fuer MOD Player gecodet
MS>> und ich kann dir versichern, das da immer mit Mittelwert(Oversampling)
MS>> gearbeitet wurde.

SG> Oversampling bedeutet imho das interpolieren der samples (laut inertia
SG> player) was du meinst ist amplifying, he?
Ups, stimmt.

MS>> Die einfachste Möglichkeit ist den Mittelwert der Samplebytes zu bilden.
MS>> D.h. erst alle Samplebytes der Kanäle addieren und dann durch die Anzahl
MS>> der Kanäle dividieren.

SG> Oh, grauß! mit normalen addieren+dividieren der Kanäle kommste bei einer
SG> anzahl von 32 kanälen sogar nur auf 3Bit pro kanal :-)
Ach, sach bloss.

Matthias
---
Man kann Wasser trinken, aber es auch lassen.

0 new messages