SoundToysリハビリ

以前にいじっていた時には、SoundRecorderMorphのタイル化に該当する機能のところで、音声リソースの取り扱い方針が見えなかったので、作業が止まっていました。でもなかなか進展がなく待ちきれないので、勝手に機能拡張して遊ぶことにします。

やりたいこと

  • 音声を取り込みライブラリに登録する。まだできていないのでSoundRecorderMorphを使っておくが、そのうちCSoundRecorderができたら置き換える
  • スクリプトで、make sound: タイルから取り込んだ音声を使う
  • プロジェクトを保存する
  • ProjectBuilderでプロジェクトをロード。自分で追加した音声を含むスクリプトが機能する

現状のTweakでできること

make sound:タイルは、従来の SampledSoundの音声ライブラリの上に実装されています。従って、SoundRecorderMorphで音声を取り込んでMorphicのタイルにすると、音声ライブラリに登録されるので、Tweakのスクリプトでも参照し、これを呼び出すことができます。
しかし、いったんプロジェクトを保存→復元した時、音声ライブラリへの登録は復元されないため、スクリプターの表示(SoundNameTile)は正しいが、実行するとそのような音声がないというエラーになります。

Morphicではどのように実装しているか?

  • 保存する直前に、PasteupMorph>>prepareToBeSaved で、タイルなどから参照している音声のうち、イメージに組み込みのもの(SampledSound>>#universalSoundKeys)以外のものをかきあつめて、自分自身のプロパティに覚えておき、いっしょに保存する。
  • 復元処理の際、PasteupMorph>>fixUponLoad:seg: で、覚えておいた追加音声を 音声ライブラリにマージする(SampledSound>>assimilateSoundsFrom:)

Tweakでの実装方針案

  • 音声ライブラリをSampledSoundクラスに持ってしまうのは気に食わないが(実はCSoundLibraryも作りかけたのですが)、他のツールとの互換性を維持するため、この部分は

そのままにする。

  • Morphicと同様に、プロジェクトの保存処理(EToysProject>>onShutDownProject:)、復元処理(EToysProject>>onStartUpProject:)で、SampledSoundの音声ライブラリと同期をとる。
  • 初期実装として、プロジェクト中の音声名タイル(タイプ=CSoundNameType)で参照されているものだけをプロジェクトから参照されている音声として扱う。