SoundBufferについて

SqueakどころかSmalltalk言語ですらも素人ですので、とんちんかんな事言っている可能性があります。そのつもりで読んでください。
ついでに、基本的には独り言です。なので情報量は限りなく少ないです(^^;)。


ChipTuneネタを実現すべく、以下の方針でサウンド出力用クラスを作っています。

  • 単音の波形データをOrderedCollectionに作成
  • これを、SoundBuffer派生のクラスに合成機能を付け、合成
  • これを、SampledSoundに直す
  • これを、再生

このときステレオで合成することってできるのでしょうか? そもそも、SoundBufferにステレオでの指定って可能なのでしょうか?
stereoSampleCountのコメントにこんな事が書いてあるのですから、出来はするのでしょうけど、その場合要素にどのような値を入れればいいのでしょう?

"Return the number of stereo slices that fit into this SoundBuffer. A stereo 'slice' consists of two 16-bit samples, one for each channel."

そもそも「slice」って何だろう? ArrayedCollectionって、各要素16bitじゃないの?


参考までにソースをちょっと

makeSquare: freq volume: vol span: span

div

div := *1 asInteger timesRepeat:
[
div timesRepeat: [ self add: vol ].
div timesRepeat: [ self add: (0-vol)].
].

ちなみに、SamplingFreqは「22050」固定のインスタンス変数。

mix: aOrderedCollection

index maxsize

index := 1.
(aOrderedCollection size > self size )
ifTrue: [maxsize := self size]
ifFalse: [maxsize := aOrderedCollection size].
maxsize timesRepeat:
[
self at: (index) incrementBy: (aOrderedCollection integerAt: index).
index := index + 1.
].

  • CTLLSoundPlayerのクラスメソッド

playBuffer: aSoundBuffer

SoundPlayer initialize; shutDown; startUp.
SoundPlayer stopReverb.
(SampledSound samples: aSoundBuffer samplingRate: 22050) play.

  • 使い方

og := SSGGenerator new.
og samplingFreq: 22050.
og makeSquare: 261 volume: 1000 span: 250.
og makeSquare: 293 volume: 1500 span: 250.
og makeSquare: 329 volume: 2000 span: 250.
og makeSquare: 440 volume: 2000 span: 250.
sb2 := CTSoundBuffer newStereoSampleCount: (22050*2*5).
sb2 mix: og .
CTLLSoundPlayer playBuffer: sb2.


使い道があるかどうかはともかく、チェンジセットはこちら

*1:SamplingFreq / freq) / 2) asInteger. (span / 1000 * SamplingFreq / (div *2