Results 1 to 9 of 9

Thread: How to mix waves

  1. #1

    Question 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?
    No signature provided yet.

  2. #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;
    Peregrinus, expectavi pedes meos in cymbalis
    Nullus norvegicorum sole urinat

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

  4. #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. #5
    Quote Originally Posted by ?ëu?±o Mart??nez View Post
    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. #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.
    No signature provided yet.

  7. #7
    Quote Originally Posted by ?ëu?±o Mart??nez View Post
    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.
    No, I hadn't seen any reply from you.

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

    cheers,
    Paul

  8. #8
    This article sums it up pretty nicely. http://kebby.org/articles/fr08snd4.html

    Just under the illustration in section 4.2 there's a section about mixing. In short, don't do any tricks to avoid clipping
    Peregrinus, expectavi pedes meos in cymbalis
    Nullus norvegicorum sole urinat

  9. #9
    Quote Originally Posted by JSoftware View Post
    This article sums it up pretty nicely. http://kebby.org/articles/fr08snd4.html

    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

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •