1021 : Max Tips(003) : 赤松正行
------------------------------------------------------------------------
DSPマガジン 2003.11.11 No.1021
------------------------------------------------------------------------
さらに寒くなって、紅葉が美しい季節になりましたね。私はカブリオレで山野を快走するハズが今日は雨模様でした。さて、今回はMax
Tipsの第3回目、シェル・コマンドとの奮闘記とloadbangの動作回避法、そしてパッチを制作する上で役立つテクニックを紹介します。
・シェル・コマンドの傾向と対策
・loadbangを止めろ!
・快適パッチングのススメ
------------------------------------------------------------------------
Max
Tips(003)
赤松正行
■シェル・コマンドの傾向と対策
インフォーメション(003)でご紹介したshellオブジェクトですが、その後いろいろと利用しているうちに不都合が出てきました。当初は、shellオブジェクトはターミナルと同等の機能を果たすものと思っていましたが、実はそうではないようです。例えば、ターミナルなら最初はユーザ・ディレクトリがカレント・ディレクトリになっていますが、shellオブジェクトではルート・ディレクトリです。これはpwdやlsを実行すると分かります。この程度はなんとかなりますが、ルート・ディレクトリからbinに移動(cd
bin)してlsを実行しても、ルート・ディレクトリの内容しか得られません。つまり、ディレクトリ移動が無効になっているわけです。使いたいコマンドが見つからない場合が多いし、環境変数を設定しても無視される...等々、なかなか思うようにコマンドが利用できません。
これじゃ使えないな〜と思い、仕方がないのでaka.shellオブジェクトを自作してみました。これは簡単に出来たのものの、その動作はshellオブジェクトと大差ありません。さらに調べて判明したことは、aka.shellオブジェクトはBSD
Unixのpopen()関数などを利用しているのですが、この関数では呼び出しごとにシェルを起動して、コマンドの実行が終われば、そのプロセスを閉じてしまうようです。これでは、直前のコマンドの状態が保持されていないのも当然ですね。shellオブジェクトも同じ事情で同じ結果になっていると想像されます。
これまた使えないな〜と思い、それじゃターミナルをAppleScriptでコントロールしようと調べているうちに、とっても有益な情報が見つかりました。AppleのTechnical
Note TN2065「do shell script in
AppleScript」です。
http://developer.apple.com/technotes/tn2002/tn2065.html
これはAppleScriptのdo
shell
scriptコマンドに関しての情報ですが、どうやら、このコマンドも同じメカニズムのようで、ここで説明されているテクニックがaka.shellオブジェクトでも使えることが判明しました。
さて、このテクニカル・ノートからいくつか紹介すると、まず、ターミナルはデフォルトではcshシェルを使用するのに対して、do
shell
scriptコマンド(とaka.shellオブジェクト)はshシェルを使用します。このため、シェルの違いによってコマンドの動作が異なります。同じコマンドが多いと思われますが、要注意ですね。PATHディレクトリのリストも違っているそうです。
異なるシェルのコマンドやPATHディレクトリにないコマンドを実行する場合は、ルート・ディレクトリからのフルパスとして記述すれば良いでしょう。例えば、cshコマンドなら、「/bin/csh
コマンド名
パラメータ...」のように記述します。
複数のコマンドを実行したい場合は、セミコロン(;)でコマンドを区切って一度の呼び出しで複数のコマンドを実行するようにします。例えば、「cd
bin」を実行してから「ls」を実行するのではなく、「cd
bin ;
ls」として実行すれば、binディレクトリの内容が得られるわけです。Maxではセミコロンは特殊文字なので、メッセージ・ボックスなどを用いる場合はバックスラッシュ(¥)を使って、「cd
bin ¥;
ls」のように記述する必要がありますね。
このように、Maxでシェル・コマンドを利用する時に役立つ情報や注意事項が説明されていますので、TN2065に一通り目を通すことをお勧めします。おそらく、shellオブジェクトでも同じテクニックが使えると思います。つまり、aka.shellオブジェクトを作る必要はなかったみたいです(自爆)。
aka.shellオブジェクトや他の自作オブジェクトは、以下のURLからダウンロードできます。
http://www.iamas.ac.jp/~aka/tme/gallery/
------------------------------------------------------------------------
■loadbangを止めろ!
パッチの初期設定を自動的に行うために、loadbangをよく使いますね。loadbangはパッチが開かれた時に自動的にbangを出力するので、これを利用してパラメータの数値設定などのメッセージを送り出すわけです。ことろが、初期設定が間違ったパッチを書いてしまい、パッチを開くと同時にフリーズしてしまうとか、Maxが異常終了するといった羽目になったことはありませんか? パッチを修正しようにも、パッチが開くと同時に自動実行されてしまうので、手の出しようがありません。
これを解決するには、パッチを開く時に、commandキーとshiftキーの両方を押しておきます。これで、loadbangの動作が抑制されるので、自動初期設定などが行われなくなります。この後は、通常通り、パッチを編集状態にして、間違った箇所を修正すれば良いわけですね。ちなみに、Max
3.x以前では、commandキーだけを押しながらパッチを開けば、loadbangは動作しないようになっています。
ただし、loadbangの動作を止めても、それでもフリーズや異常終了が起こる場合があるかもしれません。これは、loadbangの処理によるものではなく、オブジェクトのアーギュメントに間違いがあり、オブジェクトが異常な動作をしていることが考えられます。
このような場合には、どのオブジェクトが悪者か推測が付けば、パッチをテキストとして開きます(Fileメニューの「Open
As
Text...」を用いる)。テキストとして開いたパッチは、何も処理を行いませんから、異常動作も起こりません。そして、テキストの中から問題のオブジェクトを見つけ出し(Editメニューの「Find...」も利用できる)、適切なアーギュメントに変更します。あるいは、わざと存在しないオブジェクト名に書き換えても良いでしょう。この場合は、パッチを開いてもオブジェクトが見つからないので、誤動作も起こらないことになります。
大規模なパッチのテキスト編集は面倒ですが、いろいろと役立つ場面もあります。例えば、多くのshellオブジェクトを利用しているパッチで、それをaka.shellオブジェクトに換えたい場合は、テキストの全置換(Findウィンドウの「Replace
All」ボタン)で即完了ですね。テキストは一定のルールに従って記述されているので、テキストを眺めていると、なんとなく理解できそうですね。通常はオブジェクトとパッチ・コードを使ってグラフィカルに編集しているパッチでも、内部的にはテキストとして表現されている事実は、ちょっと楽しい気がします。
------------------------------------------------------------------------
■快適パッチングのススメ
オブジェクトを作ってパッチ・コードで繋ぐという簡単なプログラミング方法が特徴のMaxですが、大規模なパッチを作るには手間がかかり、グラフィカルな手法が面倒だと感じることもありますね。そこで、ここではパッチングに便利なテクニックをご紹介。特別なことではないのですが、意外と知られていないかも。
まず、オブジェクト・ボックスを作った時に自動的に現れるNew
Object
Listは、オブジェクトの名前を覚えたら、消してしまいましょう。これは、OptionsメニューのNew
Object
Listのチェックを外すだけです。これで、オブジェクト・ボックスを作れば、ただちに名前をタイプできる状態になります。空のオブジェクト・ボックスをoptionキーを押しながらクリックすれば、一時的にNew
Object
Listが表示されますので、オブジェクトの名前を忘れた時でも大丈夫です。ちなみに、このNew
Object
Listは初期のMaxから変わりないままなので、そろそろ、入力予測・補完機能あたりが欲しいところですね。
同じオブジェクトを数多く作る時は、shiftキーを押しながらクリックすれば、オブジェクト作成後に矢印カーソルに戻らないので、次々と同じオブジェクトを作ることができます。ただし、これはボタンやナンバー・ボックスなどのユーザ・インターフェース・オブジェクトに限っての話で、オブジェクト・ボックスやメッセージ・ボックス、それにコメントに関しては効果がありません。
既に作ったオブジェクトと同じオブジェクトをもうひとつ作るには、optionキーを押しながらオブジェクトをドラッグします。これでオブジェクトの複製が作られますので、そのまま適当な位置までドラッグして、マウスボタンを離せば良いでしょう。もちろん、optionキーを押しながら(ドラッグではなく)クリックした場合は、ヘルプ・パッチが開くので要注意。
オブジェクトの複製は、オブジェクトを選択してEditメニューの
Duplicateを選ぶ(またはcommand+Dをタイプする)ことでも可能です。この場合、元のオブジェクトの右下に複製されたオブジェクトが現れます。さらに、複製された直後のオブジェクトをドラッグして適当な位置まで移動した後で、さらに複製を作ってみてください。元のオブジェクトと複製したオブジェクトとの位置関係に応じて、新しいオブジェクトが作られます。つまり、等間隔に位置するようにオブジェクトを複製できるわけです。多少、位置がずれていても大丈夫。それらのオブジェクトを選択して、ObjectメニューのAlign(command+Y)を選べば、水平位置または垂直位置が揃います。
あるアウトレットから、複数のインレットに連続的にパッチ・コードを繋ぐこともできます。このためには、まず、OptionsメニューのSegmented
Patch
Cordsをチエックしておきます。そして、アウトレットをクリックした後,shiftキーを押しながらインレットをクリックします。これでパッチ・コードが繋がりますが、さらに新しいパッチ・コードが現れますので、さらに異なるインレットへパッチ・コードを繋ぐことができます。最後のインレットを繋ぐ時は、shiftキーを押さずにクリックします。あるいは、パッチ・コードを繋ぐ必要がなくなった時点で、パッチ・ウィンドウの内部以外(例えば、タイトルバー)をクリックすれば良いでしょう。
以上の他にもパッチ作成に役立つ機能がありますので、トランスMaxエクスプレス(p.151〜175)やExtrasメニューのTipsなども参考にしてください。
------------------------------------------------------------------------
メルマガの発行確認や購読中止は、DSPマガジンWEBサイトをご覧ください。
http://dspmag.iamas.ac.jp/
------------------------------------------------------------------------
Copyright(C)2003
DSP Magazine. All Rights Reserved.
転送・転載禁止
------------------------------------------------------------------------