# Thread: How to mix waves

1. ## How to mix waves

I've made a "wave reator" to simulate old sound stuff (square, saw, sinus and noise). Now I want to write a function to mix the waves.

I did something similar to:
Code:
```(* Pseudo Pascal *)
FUNCTION MixWaves (Wave1, Wave2: ARRAY OF BYTE): ARRAY OF BITE
BEGIN
FOR B := 1 TO Length (Wave1) DO
Result[B] := (Wave1[B] + Wave2[B]) DIV 2;
END;```
It almost works but the result sounds "softer" (I mean with less volume).

What function should I use?

2. Just sum them

If you fear it might overflow then adjust gain in the inputs before mixing
Code:
```(* Pseudo Pascal *)
FUNCTION MixWaves (Wave1, Wave2: ARRAY OF BYTE): ARRAY OF BITE
BEGIN
FOR B := 1 TO Length (Wave1) DO
Result[B] := Wave1[B] + Wave2[B];
END;```

3. Result[B] := Min(Wave1[B] + Wave2[B], 255); that should do it

4. I just thought of something possibly cool...

Have a mixing function as already mentioned that sums the waves, but also return a variable that shows if, and by how much that the output has overflowed/underflowed.

Then using this value adjust the combined output slightly to stop the clipping

Maybe something like this (not tested...)?

Code:
```function MixWaveValues(const aValues: array of Integer; var aHasClipped: Boolean;
// aHasClipped returns true if input has clipped ( < -128 or > +127)
// aClippedAmount returns the integer amount under/over the minimum/maximum values.
var aClippedAmount: Integer): Integer;
var
i: Integer;
Value: Integer;
begin
aHasClipped := False;
aClippedAmount := 0;

Value:= 0;
for i := 0 to High(aValues) do
begin
Value:= Value+ aValues[i];
if Value < -128 then
begin
aHasClipped := True;
if (Value + 128) < aClippedAmount then aClippedAmount := Value + 128;
end
else
if Value > +127 then
begin
aHasClipped := True;
if (Value - 127) > aClippedAmount then aClippedAmount := Value - 127;
end
end;
Result := Value;
end;```
cheers,
Paul

5. Originally Posted by ?ëu?±o Mart??nez
I've made a "wave reator" to simulate old sound stuff (square, saw, sinus and noise). Now I want to write a function to mix the waves.

I did something similar to:
Code:
```(* Pseudo Pascal *)
FUNCTION MixWaves (Wave1, Wave2: ARRAY OF BYTE): ARRAY OF BITE
BEGIN
FOR B := 1 TO Length (Wave1) DO
Result[B] := (Wave1[B] + Wave2[B]) DIV 2;
END;```
It almost works but the result sounds "softer" (I mean with less volume).

What function should I use?
I know it has been a while, but I found this site the other day which might help with the mixing and volume issues:
http://www.vttoth.com/digimix.htm

cheers,
Paul

6. Didn't I reply you? IIRC i commented that JSoftware's and Dan's solution would result in distorted sound. BTW I didn't tested it yet so I can't tell you.

7. Originally Posted by ?ëu?±o Mart??nez
Didn't I reply you? IIRC i commented that JSoftware's and Dan's solution would result in distorted sound. BTW I didn't tested it yet so I can't tell you.

Anyway, apparently the link I gave you makes mixing possible without volume changes or distortions

cheers,
Paul

Just under the illustration in section 4.2 there's a section about mixing. In short, don't do any tricks to avoid clipping

9. Originally Posted by JSoftware

Just under the illustration in section 4.2 there's a section about mixing. In short, don't do any tricks to avoid clipping
hmm...interesting article, thanks for sharing

cheers,
Paul