<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:large">Hi All,</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">     the SampledSound>>#mixSampleCount:into:startingAt:leftVol:rightVol: method looks to be badly broken.  I don't understand the index scaling (yet) so I thought I'd throw this out there and see if anyone can spot when and why this broke.</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">Here's a simple example that generates a second long A below middle C (220Hz), smoothing start and stop, and then plays it, so far so good:</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default"><div class="gmail_default" style="font-size:large"><font face="times new roman, serif">| samples sineTable sound |</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif">"1 second of A below middle C (220Hz). 16000 / 220 is 72.72 recurring"</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif">sineTable := SoundPlayer sineTable: 73.</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif">sineTable doWithIndex: "And let's not deafen anyone..."</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>[:sample :index| sineTable at: index put: sample // 4].</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif">samples := SoundBuffer new: 16000.</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif">1 to: samples size by: sineTable size do:</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>[:i| samples replaceFrom: i to: (i + sineTable size - 1 min: 16000) with: sineTable startingAt: 1].</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif">1 to: 146 do: "smooth start and end of the sound"</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>[:i|</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">        </span>samples at: i put: ((samples at: i) * i / 146) asInteger.</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>samples at: 16001 - i put: ((samples at: 16001 - i) * i / 146) asInteger].</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif">(SampledSound samples: samples samplingRate: 16000) play</font></div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">Now let's create a stereo sound image and try and play that:</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large"><div class="gmail_default"><font face="times new roman, serif">| samples sineTable sound |</font></div><div class="gmail_default"><font face="times new roman, serif">"1 second of A below middle C (220Hz). 16000 / 220 is 72.72 recurring"</font></div><div class="gmail_default"><font face="times new roman, serif">sineTable := SoundPlayer sineTable: 73.</font></div><div class="gmail_default"><font face="times new roman, serif">sineTable doWithIndex:</font></div><div class="gmail_default"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>[:sample :index| sineTable at: index put: sample // 4].</font></div><div class="gmail_default"><font face="times new roman, serif">samples := SoundBuffer new: 16000.</font></div><div class="gmail_default"><font face="times new roman, serif">1 to: samples size by: sineTable size do:</font></div><div class="gmail_default"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span>[:i| samples replaceFrom: i to: (i + sineTable size - 1 min: 16000) with: sineTable startingAt: 1].</font></div><div class="gmail_default"><font face="times new roman, serif">1 to: 146 do:</font></div><div class="gmail_default"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>[:i|</font></div><div class="gmail_default"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">  </span>samples at: i put: ((samples at: i) * i / 146) asInteger.</font></div><div class="gmail_default"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>samples at: 16001 - i put: ((samples at: 16001 - i) * i / 146) asInteger].</font></div><div class="gmail_default"><font face="times new roman, serif">sound := SampledSound samples: samples samplingRate: 16000.</font></div><div class="gmail_default"><font face="times new roman, serif">sound := MixedSound new</font></div><div class="gmail_default"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="color:rgb(0,0,0);white-space:pre">                 </span><span style="color:rgb(0,0,0)">add: sound pan: 0.25;</span></font></div><div class="gmail_default" style="color:rgb(0,0,0)"></div><div class="gmail_default"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>add: sound pan: 0.75;</font></div><div class="gmail_default"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">                 </span>yourself.</font></div><div class="gmail_default"><font face="times new roman, serif">sound play</font></div><div class="gmail_default"><br></div></div><div class="gmail_default" style="font-size:large">Eek!!</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">You can examine the mixing without hurting your ears by replacing</div><div class="gmail_default" style="font-size:large">    "sound play"</div><div class="gmail_default" style="font-size:large">with</div><div class="gmail_default" style="font-size:large">    "sound computeSamplesForSeconds: sound duration"</div><div class="gmail_default" style="font-size:large">which invokes the mixing directly.</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">Any help making sense of this gratefully received.  Some comments around the</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default"><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">           </span>scaledIndex := scaledIndex + scaledIncrement.</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">               </span>scaledIndex >= ScaledIndexOverflow ifTrue: [</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">                     </span>overflow := scaledIndex >> IncrementFractionBits.</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">                     </span>indexHighBits := indexHighBits + overflow.</font></div><div class="gmail_default" style="font-size:large"><font face="times new roman, serif"><span class="gmail-Apple-tab-span" style="white-space:pre">                  </span>scaledIndex := scaledIndex - (overflow << IncrementFractionBits)].</font></div><div class="gmail_default" style="font-size:large"><br></div><div style="font-size:large">in SampledSound>>#mixSampleCount:into:startingAt:leftVol:rightVol: would be most welcome.</div><div style="font-size:large"><br></div><div style="font-size:large">And if you simply comment out the primitive teh Smaklltalk code produces garbage also, so the problem does not seem to be Slang but the algorithm itself.</div><div><font size="4"><br></font></div></div></div><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><span style="border-collapse:separate"><font size="4"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></font></span></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>