SoundTool(仮称)

korakurider2005-05-24

今日の進捗として、ピアノ鍵盤をつくり、ここから鳴らせるようにしました。

  • CPianoKeyboardPlayerを、ピアノ鍵盤画面だけの機能に絞って作成。コスチュームとして流用したり他のプレイヤに組み込み可能とすることを想定しています。
  • 全体をまとめるCSoundToyを作成し、音色選択と鍵盤を埋め込む。CSoundToy open で起動します。
  • MouseDown/UpをCPianoKey→CPianoKeyboardPlayer→CFMSoundという経路で伝えるところは、当初の考えではTweakのイベントで伝播させるつもりでしたが、イベントがキューを経由して伝わりスケジュールされてから実行というTweakの仕組みを通すのはLatencyが不安だったので、伝播経路上の各オブジェクトにStartNote:/StopNoteというプロトコルを定め単なるメッセージ呼び出しのチェーンとしています。ただ、これだとSqueakとなんら変わらないのでおもしろくありません(イベントハンドリングしているのはCPianoKeyでのみ)。時間ができたら、いろいろ試してみたいと思います。

以下、今後の検討事項のメモです。
(1) 任意個数の子供プレイヤの作成タイミングと保持方法
昨日のバージョンの場合、鍵盤がごく少数だったので、親「キーボード」側で次のように処理していました。

  • initialize: 子「鍵盤プレイヤ」を作成し、define:as: で名前をつけて登録
  • setupCostume: 子「鍵盤プレイヤ」の見かけを設定後、add: で埋め込む

今日のバージョンでは、(指定されたオクターブ数にあわせた数だけ)鍵盤プレイヤを任意の数として作成しているので、名前をつけてdefine:as: で登録することができなくなりました。それで、initializeでは何もせず、setupCostumeで、子「鍵盤プレイヤ」の作成を行っています。setupCostumeが呼び出されるタイミングをわかっていないので、このやりかたでいいのか自信がありません。
また、任意数の子プレイヤを作るのに、define:as:で名前をつけたプロパティに格納するのはふさわしくないと思われたので、子「鍵盤プレイヤ」をプロパティに登録していません。add:の埋め込みだけしか行っていません。
VisualBasicの場合、フォーム上に同種のコントロールを任意数持つ場合には「コントロール配列」を使うのが普通です。その場合でも、個別の子コントロールのイベントを親フォーム側のイベントルーチンで普通に処理することができます。Tweakでも、コードをごりごり書けば任意数のオブジェクトのイベントを一箇所で拾うことができるのは教えてもらったのですが、アノテーション という形に書くことができたら楽なんですがね。

(2) CCollectionの用途
CList関係のプレイヤを使う場合、内容リストは生Squeakの配列などではなく、CCollectionを使うことになっています。CCollectionが通常のコードでも広く使用するよう奨励されているのか、プレイヤ内部のプロパティでのみ使用することを想定しているのかがわかりません。


次のステップ:
プレイヤ/コスチュームの分離をやってみるつもりでしたが、部品としてのまとめ方を整理する必要がありそうなので後回しにして、タイル関係を調べていきたいと思います。
糸口を捜索中です。