この記事では、この素晴らしいプログラムのすべてのユーザーのための1つの痛ましいトピック、つまり数値ボックス、スライダー、ノブなどのパラメーターの保存を解決しようとします。 これは非常に重要な機能のようですが、なぜMaxの プリセットに似た特別なオブジェクトがまだないのですか? 問題は、 PureData APIを使用すると他のオブジェクトのデータにアクセスできないため、外に出なければならないということです。
もちろん、プリセットを実装する試みがありました。 私はそれらのいくつかを見ましたが、それらの実装は私には複雑に見えました(はい、私はそれらを完全に理解していませんでした)-軽量で柔軟なものも欲しかったです。 その結果、1日を振り返ってパッチを当てた後、そのようなシステムが生まれました。
問題の声明
プリセットを保存するには、次のものが必要です。
- 保存されたパラメータを常に監視します。
- それらをいつでも抽出して保存できる。
- 保存されたデータからオブジェクトの状態を復元できます。
maxのpattrおよびpattrstorageオブジェクトをすぐに思い出しました。 最初は値を保存するguiオブジェクトに接続し、2番目はデータウェアハウスです。 同様のことをすることにしました。
すべてがどうなるかを紹介
そのため、 pattrオブジェクトの「アナログ」はパラメーターに従い、 pattrstorageの類似物は必要に応じてそれをポーリングし、値を保存します。 これらのオブジェクトをそれぞれストアおよびストレージと呼びます。 これはすべて次のようになります。

ストアオブジェクトは現在のものを保存し、新しい値を番号ボックスに割り当てます。 そのため、これらのオブジェクトはこのように相互接続されています。 「save」 ストレージというメッセージを使用すると、 ストアにコマンドが送信されるため、彼はナンバーボックスの現在の値を送信します。 「リコール」は反対のことを行います-ボックスに新しい意味を与えます。
したがって、一般的な見方は明らかです。次に進みます。
基盤を作る
最大で、プリセット情報はjson形式で保存されます。 理論的には、 PdはPuRESTライブラリを介して操作できますが、オンラインサービス用に調整されており、なぜ複雑なのですか? textfileオブジェクトを使用して.txtファイルにデータを書き込むのが最も簡単です。 メッセージをいくつでも保存して、順番に表示できます。 ヘルプでその仕組みについて詳しく読むことができます。次に、オブジェクトの作成を始めましょう。

上の図では、3つの開いているパッチのコメントを含む画面が作成されています。 rootは、 ストアとストレージの動作をテストするテストパッチです。 原則として、この段階では、1つの数値ボックスの値を保存および復元することがすでに可能です。 手順は次のとおりです。
- 数値ボックスの値を変更します。
- 「get」を押します -これによりテキストファイルが消去され、その後bangが[s presetTrigger]に送信されます。 このバングの受信者は、 ストアにあるfloatオブジェクトになります。このオブジェクトは、アウトレットから保存された数値を出力し、 ストアに再度送信します。[r presetGetAll]]で表示され、 「add%box_name%」形式のメッセージに変換され、 textfileに送信されます 。
- 「ストア」をクリックします。これにより、テキストファイルに「書き込み」メッセージが送信され、すべてのプリセットパラメーターが保存されるルートパッチフォルダーにテキストファイルが作成されます。
- 数値ボックスの値を変更し、「リコール」をクリックします-以前に保存された値が復元されます。
ビルド機能
そこで、主要部分を作成し、パフォーマンスのテストに成功しました。 ただし、現時点で保存できるパラメーターは1つだけで、これは賑やかではありません。 思い出すと、引数のオブジェクトpattrには、値が記憶されるパラメーターの名前を指定する必要があります。 したがって、maxはjsonファイル内のパラメーターにインデックスを付けるため、後で必要なguiオブジェクトにデータを復元できます。 同様のことを行い、それを巧妙に行います。 スクリーンショットを見てください:

ご覧のとおり、パッチroot.pdで、3つの数値ボックスが3つのオブジェクト[ストア1] 、 [ストア2] 、および[ストア3]に接続されています。 保存された各パラメーターには名前が付けられます。 ボックスのオプションをひねり、preset.txtを開くと、次のように表示されます。
three 67;
two 43;
one 165;
つまり、 ストアオブジェクトに入力された引数に対応するインデックスが、ファイルの各パラメーターに追加されました。 これは、いわゆる抽象化作成引数のおかげで行われます 。 store.pdパッチを注意深く見ると、 ルートとプリペンドオブジェクトに引数「$ 1」があることに気付くでしょう-これらは引数です。 結論としては、抽象化としてパッチを使用する場合、内部は$ 1、$ 2、$ 3などではありません。 それぞれ、1番目、2番目、3番目の引数に置き換えられます。 つまり、 [store one]には実際にオブジェクト[route one]および[prepend one]があります。
なぜ実際には、 prependとrouteが追加されたのかについて。 テキストファイルにパラメーターを送信する前の最初の方法では、テキストファイルで見たのと同じインデックスを作成し、テキストファイルのすべてのコンテンツが[p presetSetParam]を介してブロードキャストされるときに、 ルート bは非エイリアンインデックスを持つパラメーターを削除します。
前述のように、 bangを使用すると、 テキストファイルから1つのメッセージを一度に 1つずつ表示できます。 最後のメッセージに到達すると、オブジェクトは右のアウトレットにバタンを表示します。
すべてのメッセージを抽出するには、ファイル全体を処理する必要がありますが、 untilオブジェクトはこれを実行します。 これは非常に興味深いオブジェクトです。たとえば10といった任意の数を送信すると、10個のバングメッセージが1つずつ表示されます 。 入力にbangを送信するだけの場合、 untilは、 bangが右側のインレットに到達するまでbangsを生成します。
これで、 「recall」というメッセージをクリックするとどうなるかを理解できます。 最初に、 bangはメッセージ「read preset.txt、rewind」を入力し 、 preset.txtファイルをtextfileにロードします。次に、メッセージ「rewind」を送信し、オブジェクトが受信した次のbangがファイルから最初のパラメーターを出力します。 次に、 bangはuntilオブジェクトに移動します。これにより、 bangが1つずつ生成され、最後の1つが右側のアウトレットからbangを取り出してまで停止します。
現時点では、プリセットに保存できるのは数字のみですが、実際のパッチで使用できるようにするには、少なくともリストの保存を追加する必要があります。 これを行うには、残りのデータ型のストアパッチの類似物を作成します。 ストアの名前をsfloatに変更し、 slistオブジェクトを作成します。

これは、リストに合わせて少し修正されたパッチsfloat.pdです。
次のステップでは、さまざまなプリセットを保存する機能を追加します。 これを実装する方法を考えて、各プリセットを個別のファイルに保存するのが最善であるという結論に達しました。 この場合、テキストファイル内の異なるプリセットの行を分離する追加のロジックを構築する必要はありません。パッチの複雑さが減るほど、その動作は安定します(結局、2つまたは3つのパラメーターを保存することと、100を超える場合は別のことです)。
そのため、複数のプリセットを管理できるようにするには、メッセージボックス「read preset.txt」および「write preset.txt」の内容を変更する必要があります。つまり、対応するプリセットのファイル名を変更します。 変更されたstorage.pdを見てください:

新しいオブジェクトmakefilenameが登場しました。 ファイル名を生成するように設計されており、私たちに最適です。 インターネットに番号が届くと、オブジェクトは「preset-%i.txt」という形式のメッセージを表示し、 %iを番号に置き換えます。 また、コンマ付きの複雑なメッセージを簡単に生成する方法が見つからなかったため、「巻き戻し」を別のメッセージボックスに入れる必要がありました。
すべて、今ではシステムが機能しています。 ここで、小さなGUIを作成して利便性を追加します。 storage.pdを開き、空のスペースを右クリックして[プロパティ]を選択します。 表示されるウィンドウで、 「親のグラフ」ボックスをチェックすると、パッチに赤い長方形が表示されます。 この長方形内のボタン、数値ボックス、コメントなどのすべてのインターフェイスオブジェクトは、パッチa Max Max bpatcherに表示されます。 長方形の寸法と位置は、 サイズとマージンのパラメーターを使用してキャンバスウィンドウで設定されます。

これが、パッチのストレージオブジェクトの外観です。
![PureDataをプリセットします。 [ストレージ]オブジェクトの最終バージョン。](http://pattr.ru/img/pd-preset/7.png)
Pdはもう少し便利になりました:)
最後に
このプリセットシステムはテーブルを保存するのに十分ではありませんが、おそらく便利にするために、willな魔術が必要になる可能性が高いため、これを将来延期します。 また、外部プリセット管理用のストレージにインレットを追加して、ある種のMIDIコントローラーを盗むこともできます。
パッチセクションの pattr.ruからファイルをダウンロードできます。お楽しみください!
直接リンク