「入れ子」の件は,以下で鳴らせるので基本的な部分では問題ない.問題なのは無限リピートにした 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 件のコメント:
コメントを投稿