ぐる式 (貳) より引っ越し作業中.未完.

2005年10月24日月曜日

Squeak: 入れ子の基本方針

入れ子」の件は,以下で鳴らせるので基本的な部分では問題ない.問題なのは無限リピートにした RepeatingSound をコントロールする UI を作るのが「面倒くさい」 (笑).

sequentialSoundTest02    "M3Memo sequentialSoundTest02 play."    | sounds sequentialSound mixedSound |    sounds := OrderedCollection new.    #('1071734022.wav' 'hahaha.wav' 'LainIsLain.wav' 'yarukoto.wav' )        do: [:each |            | sound |            sound := SampledSound fromWaveFileNamed: each.            sounds add: sound.            sound play.            SoundPlayer waitUntilDonePlaying: sound].    "see below"    sequentialSound := M3Memo sequentialSoundTest01.    mixedSound := MixedSound new.    mixedSound        add: (sounds at: 1)        pan: 0.2.    mixedSound        add: (RepeatingSound                repeat: (sounds at: 3)                count: 15)        pan: 0.8.    sequentialSound add: mixedSound.    mixedSound := MixedSound new.    mixedSound        add: (RepeatingSound                repeat: (sounds at: 2)                count: 9)        pan: 0.8.    mixedSound        add: (RepeatingSound                repeat: (sounds at: 4)                count: 11)        pan: 0.2.    sequentialSound add: mixedSound.    ^ sequentialSound

これはサポート・コードとして以下が必要.

*

sequentialSoundTest01    "M3Memo sequentialSoundTest01 play."    | sounds sequentialSound mixedSound |    sounds := OrderedCollection new.    #('1071734022.wav' 'hahaha.wav' 'LainIsLain.wav' 'yarukoto.wav' )        do: [:each |            | sound |            sound := SampledSound fromWaveFileNamed: each.            sounds add: sound.            sound play.            SoundPlayer waitUntilDonePlaying: sound].    sequentialSound := SequentialSound new.    mixedSound := MixedSound new.    mixedSound        add: (sounds at: 1)        pan: 0.2.    mixedSound        add: (RepeatingSound                repeat: (sounds at: 2)                count: 7)        pan: 0.8.    sequentialSound add: mixedSound.    mixedSound := MixedSound new.    mixedSound        add: (RepeatingSound                repeat: (sounds at: 3)                count: 9)        pan: 0.2.    mixedSound        add: (RepeatingSound                repeat: (sounds at: 4)                count: 7)        pan: 0.8.    sequentialSound add: mixedSound.    ^ sequentialSound

返って来た sequentialSound に play を送れば,四組の aMixedSound が順繰りに再生される.一つの aMixedSound でミックスされたそれぞれの声部の長さが違っていても,全部が終わってから (いちばん長いものの再生が終わってから) 次へ進む. aMixedSound を完成した素材として扱うのなら,これが真っ当な処理.現状では MixedSoundPlayer が自分が抱え込んでいる (中の中の中にある)「無限リピートにした RepeatingSound をコントロールする UI」を持ってるから,それをハメ込んで再利用する SequentialSoundPlayer を作って, mixSampleCount:into:startingAt:leftVol:rightVol: 中の

currentIndex _ currentIndex + 1. snd _ (sounds at: currentIndex)

のタイミングで抱え込んだ MixedSoundPlayer を update:(with:) するのがいちばん簡単かな〜.音長と音量のコントロールはできてるから,あとはパニングを付けると,一応上がりかな.パニングが可能になると,コーネリアス・カーデューってか,アイヴスもどきが鳴らせる (笑).右と左からそれぞれ違った曲を演奏する楽隊が行進して来て,中央で交差して進んでくってヤツ (笑).ちょっと実験すると aMixedSound の rightVols と leftVols をいじれば演奏中にパニングできる.注意するのは,音長と音量は aMixedSound の「中身」を触るんだが,パニングは aMixedSound 「そのもの」をいじるということだな.アクセサ切ってないということは「触っちゃダメ」っつ〜ことかも知れんが,そうも言っとれんよな〜.サブクラス切っといて佳かった (笑).

プロセスの入れ子の場合は,こう簡単には行かない orz.

0 件のコメント:

コメントを投稿