いまどきのicnsファイル

macOSの場合、Appのパッケージの中にある「ほにゃらら.icns」ファイルがAppのアイコンの元になっています。名前はAppによって様々ですが、AppleScriptのアプレット場合は、Resourcesの階層の中にあります。

 

 

 

いまどきのicnsファイルは、高密度ディスプレイのRetina対応のため、12ファイルも画像ファイルを用意する必要があるようです。

 

 

手作業だと面倒ですが、今はあえて手作業で。

 

段取りや工程は、一度だけでも手作業でやると、道理も手間も実感できるので、その後の改善のヒントになります。自動化でsipsやImage Eventsを使うにしても、何をどうすれば良いのか、具体的にわかります。

 

 

 

元の画像自体は、好きなAppで描けば大丈夫です。

 

ただし、背景を透明にできる機能が必要です。‥‥と言っても、おもむろに新規レイヤーを作って絵を描いて、背景の下地をオフにして、PSD形式で書き出せば良いだけです。

 

Procreateなら手頃なサイズで描きやすい2880px四方にすれば良いですネ。最初から小さいサイズ(規定の1024pxとか)で描くと、ドットが粗くて描きにくいですもんネ。

*1024pxでドットが粗い‥‥なんて、DVDや「地アナ」の面目は遙か忘却の彼方‥‥ですネ。

 

とりあえず、iPadで自分の描き慣れたサイズで描けば良いです。アイコン用のリサイズとファイル形式は、macOS標準添付の「プレビュー.app」で可能です。

 

 

迸るゲシンスキーインクの筆致にて、お肉を描きました。(前に描いたヤツですが)

 

 

必ず、背景が透明な状態(背景色レイヤーを非表示)で、PSDで書き出します。

 

 

 

絵さえ描ければ、あとはルーチンワーク。定型の画像変換&書き出し作業だけです。

 

アイコン用の画像へと変換するために、macOSのプレビュー.appで、ProcreateからAir Dropで送ったファイルを開きます。

 

 

そしたら、サイズを変更します。

 

Retina用の画像は、1024pxで144dpiで始めて、512、256、128、64、32と6種類のピクセル寸法を順次作ります。解像度は144ppiのままです。

 

 

書き出し先は、新規フォルダを作って、一箇所にまとめます。

 

 

 

これを繰り返して、アイコンの画像セットを作ります。

 

ややこしいですが、「icon_512x512@2x.png」など「@2x」の画像は、表記は512でも実際は1024pxです。そして解像度は72ppiではなく144ppiです。

 

一方、「非Retina」の「@2x」がない「icon_512x512.png」などの画像は、512なら、512pxのままで、解像度は72ppiです。

 

う〜ん、いかにも、間違えそう。‥‥なので、手作業の場合は慎重に。

 

 

フォルダの中に12個のファイルが揃ったら、フォルダに拡張子を付けます。

 

拡張子を手動でつけると、警告されますが、無視してOKです。

 

 

 

 

 

これでアイコンの画像セットが完成しました。

 

フォルダにフォーカスを入れて、スペースキーでプレビューすると、シームレスにサイズが変化するアイコンの様子が見れます。

 

 

このアイコンセットをicnsファイルに変換する場合は、ターミナルのコマンドで変換します。

 

iconutil -c icns アイコンセットのフォルダのパス(ターミナルにドラッグ&ドロップすれば自動で入力されます)

 

 

 

ちなみに。

 

アイコンの拡大縮小って、どんな仕組みなんだろうと思いまして、実験してみました。

 

どんなふうに、拡大縮小時に画像を処理してるんでしょう?

 

三毛猫さんのアイコン画像の1枚に印をつけて、プレビューしたら、こんな感じになりました。

 

 

 

 

 

 

なるほど。

 

拡大縮小の区間を、各解像度の画像で分担しているようですね。

 

 

 


ピクセル数を計算.app

前々前回くらいに書いたピクセル寸法計算のApp。

 

どうせなら、16:9の計算もできるようにちょっとだけ機能を追加しました。

 

property appVersion : "0.1.1"

property cm : "26"

property dpi : "150"

 

repeat

    display dialog "横幅をセンチで入力してください." default answer cm with icon note

    

    set res to text returned of result

    

    try

        set res to res as number

        exit repeat

    on error

        beep

        display dialog "入力可能な文字は、半角数字とドットのみです." with icon stop buttons "やり直し..."

    end try

    

end repeat

 

set cm to res as Unicode text

 

repeat

    display dialog "DPIを入力してください" default answer dpi with icon note

    

    set res to text returned of result

    

    try

        set res to res as number

        exit repeat

    on error

        beep

        display dialog "入力可能な文字は、半角数字とドットのみです" with icon stop buttons "やり直し..."

    end try

    

end repeat

 

set dpi to res as Unicode text

 

 

set px to (cm as number) / 2.54 * (dpi as number)

set rpx to (round ((round px) / 2)) * 2

set rhpx to (round ((round (px / 16 * 9)) / 2)) * 2

 

display dialog cm & "センチで" & dpi & "DPIの計算結果は以下です." default answer "計算結果:" & (px as Unicode text) & return & "推奨値:" & (rpx as Unicode text) & return & "16:9の推奨値:" & (rpx as Unicode text) & "x" & (rhpx as Unicode text) buttons "終了" with icon note

 

 

 

「with icon note」で三毛猫アイコンを表示するようにも変更。‥‥どうでもいい変更点ですが。

 

動作の様子は以下です。

 

これで、いつでも任意のフレーム寸法ピクセル数が解ります。最後の結果ウィンドウのテキスト欄はコピーできますので、数値を書き写さなくても、どこかにペーストできます。

 

今さらAppleScriptの解説をしてもアレなので控えますが、前に書いたDPIの計算をそのままAppleScript言語で表現しただけの内容です。

 

行のほとんどはユーザーとの対話に関する部分で、ピクセル数計算は3行のみ。

 

以下に編集可能なAppleScriptのアプリケーション形式ファイルをリンクしておきます。macOSカタリナで作ったので、カタリナ以前のmacOSで動くはわかりません。

 

ピクセル数を計算〜サンプルスクリプト(macOSのみで動作します)

 

今どきのmacOSは警戒が厳しいので、こうしてブログからダウンロードしたスクリプトは実行するのを拒否られるかも知れません。

 

「ピクセル数を計算.app」を右クリックで開いて、許可してもらうと、使えます。

 

 

 

最近はスクリプトを共有するのも、信用が必要です。

 

なので、あまり不特定多数に向けて共有して公開するのは避けているのですが、スクリプト文の通り、Finderも何も必要としない自己完結のスクリプトですので、このくらいなら公開しても良さそうですネ。

 

AppleScriptのエディタのアプリケーションアイコンに、「ピクセル数を計算.app」をそのままドロップすれば、エディタが開いてスクリプト文が表示されます。

 

自分でAppを作るきっかけになれば幸いです。

 

 

 

私なんて‥‥、最初の頃はコンピュータの決まりも知らず、1996年の頃は「01.psd」とか恐ろしい名前の付け方をしてましたしネ。全角の拡張子!! ‥‥まあ、当時のMacには拡張子は不要でしたので(リソースで管理)。

 

PICTファイルを「.psd」とか違う拡張子をつけたりネ。

 

みな、最初は初心者。

 

特にアニメ業界は学ぶ場面がほとんどないでしょ。コンピュータの一般知識や画像データの仕組みを知る場所なんてアニメ制作現場のどこかにあるかい? 理屈もわからず、暗記ものにしていることがほとんどじゃないか。

 

その辺も変えていきたいですネ。私と同じ遠い道を歩む必要はないですもん。

 

 


Macのプチツール

前回紹介した「ちょっとした内容」のツールは、ネットで探すよりも自分で作ったほうが、手早く大袈裟にもならず、必要な時にすぐに使えるので良いです。

 

AppleSctiptエディタで作ったスクリプトは、メニュー右部分のプルダウンから呼び出すことが可能です。

 

*「_NAComponents」とは共有ライブラリです。AppleScriptには存在しない「split()」「slice()」「join()」「replace()」などのサブルーチンを貯めておいて、各ツールが共有して使用します。そうすることで、機能の拡張や更新が一括で容易になります。

 

 

 

いちいちアプリケーションフォルダなどを開いてアクセスする必要がありませんので手軽です。

 

また、右クリックで呼び出せる「クイックメニュー」からも呼び出せます。

 

*もともと存在したアクションに加えて、「PSD原画から画像セットを出力」なんていう、いかにもアニメ制作現場的なアクションも追加可能です。

 

 

 

こうして、自分のMac環境をプチツールで補強すれば、最短の段取りでちょっとした処理が可能になります。

 

After Effectsのスクリプトもプチツール的なスクリプトを用意しておくことで、手作業だと2〜3分はかかる段取りが2〜3秒で終了します。

 

 

 

プチツールの有用性は、時短〜時間の節約というよりは、集中力の節約なんですよネ。

 

コンピュータのソフトウェアが欲する様々な手作業の段取りを消化するうちに、本来絵作りに使うべき集中力が、徐々に、そして確実に、削がれていくのはできるだけ避けたいものです。

 

例えば、レイヤーシーケンスを下から順に時間軸にIN/OUT点で並べる‥‥なんて、手作業でやるのは避けたいです。

 

そういうことに人間の集中力を浪費するのはもったいないです。

 

しかも、集中力が途切れて、1フレームでも配置をミスしようものなら、人間の責任になります。

 

その他、Z軸の値でレイヤーの並びを整頓したりとか、膨大なキーフレームに対してイージーイーズでピンポンループするとか、無機質な段取り作業は、コンピュータが一番得意とすることですから、コンピュータに任せちゃえば良いのです。コンピュータなら集中力が途切れてケアレスミスなど発生しませんもんネ。

 

 

*並びだけでなく、コンポの尺も自動調整します。

*この段取り‥‥。手作業でやったら、0.1秒じゃ終わりませんよね。ミスも出やすいし。

 

 

 

Appがなんでもネットに手に入るわけじゃないです。無い時は、探しても見つかりません。

 

自分が欲しい、自分たちの作業スタイルに必要な、ちょっとしたツールの数々は、自分で作れるのが一番です。

 

Macには、アプリケーションフォルダに入っているソフトウェアの他に、なんとも素敵なターミナルのコマンドがいっぱい用意されています。それを使えば、画像の変換(sips)や、アイコンの管理(iconutil)、ディスクのメンテ(diskutil)すら可能です。

 

iOSでも、Windowsでもない、macOSを使っているのなら、macOSならではの作業性・利便性を活用するのは、せっかくお高めのApple製品を所有しているのですから、見逃す手はないですヨ。

*AdobeのAfter EffectsやPhotoshop関連のスクリプトは、Mac/Win共通で使えます。

 

 


あなたのMacでDPI計算App

アニメ業界の現場では、あまりにもMacは少数派。

 

しかし、実はプライベートでMacを常用している人は、かなり多いです。iPadまで含めてAppleユーザで数えると、そこらじゅうAppleユーザだらけです。

 

Macユーザなら、前回のピクセル数計算を、App化できます。もちろん、自分自身で、今すぐに‥‥です。

 

 

 

Macには、大昔からAppleScriptというスクリプト環境がついており、簡単なアプリだけでなく、そこそこ大掛かりなものも作れます。

 

まあ正直なところ、AppleScriptは「風前の灯感」が凄いので、今からAppleScriptの習得をするのはお勧めしませんが、実はAppleScriptのエディタではJavaScriptの言語でもスクリプトが書けますので、まだまだ使い道はあります。

 

センチとDPIをピクセルに換算するAppなど、数分で作れます。

 

以下、スクリプト文です。

 

property cm : "26"

property dpi : "150"

 

repeat

    display dialog "横幅を入力してください." default answer cm

    

    set res to text returned of result

    

    try

        set res to res as number

        exit repeat

    on error

        beep

        display dialog "入力可能な文字は、半角数字とドットのみです." with icon stop buttons "やり直し..."

    end try

    

end repeat

 

set cm to res as Unicode text

 

repeat

    display dialog "DPIを入力してください" default answer dpi

    

    set res to text returned of result

    

    try

        set res to res as number

        exit repeat

    on error

        beep

        display dialog "入力可能な文字は、半角数字とドットのみです" with icon stop buttons "やり直し..."

    end try

    

end repeat

 

set dpi to res as Unicode text

 

 

set px to (cm as number) / 2.54 * (dpi as number)

set rpx to (round ((round px) / 2)) * 2

 

display dialog cm & "センチで" & dpi & "DPIの計算結果は以下です." default answer "計算結果:" & (px as Unicode text) & return & "推奨値:" & (rpx as Unicode text) buttons "終了" with icon note

 

 

 

単に換算するだけのスクリプトなのに随分と長い文に感じますが、実は換算の重要な部分は2行だけで、他はみな、ユーザへのインタフェース絡みです。

 

set px to (cm as number) / 2.54 * (dpi as number)

set rpx to (round ((round px) / 2)) * 2

 

 

小型商品をアマゾンで買うようなもので、梱包のほうがデカいのです。

 

偶数化は、1を2で割ると0.5になることを利用して計算します。四捨五入が奇数の場合(例えば1535)は、2で割ると端数が「x.5」生じますから(767.5)、もう1度四捨五入した後(768)で2を掛けて元に戻せば(1536)、偶数化できます。もともと偶数だと数値の変更は生じません。‥‥IFなんか使うなや。

*小数点切り上げだと、1536.2の場合は1537になってしまうので、round up, Math.ceil()を無条件に使うわけにはいかんのです。

 

 

 

AppleScriptのエディタにスクリプトを書いたら、App形式で保存します。とりあえず、それだけで、いつでも使えるAppが出来上がります。

 

 

 

 

 

まあ、せっかくを絵を描く職業ですから、アイコンも作って変更しましょう。このあたりの段取りは「icns 作り方」あたりでネットを検索してください。

 

以前遊びで描いたミケ猫ちゃんを流用しました。iPadのProcreateで描いたもので、背景は透明にして(背景レイヤーをオフにして)、PSD形式で書き出したファイルです。

 

 

 

以前に比べて、アイコンを作るのは面倒になりましたネ。Retinaの高解像度にも対応するため、2倍の解像度のアイコンを作るようになっています。

 

オリジナルの大きなサイズのPSDさえあれば、どんどん小さくしてPNGで書き出せば作れます。この辺はバッチ化できますネ。

 

そうすると、いっちょまえに、他のソフトと同じようにドックにもオリジナルアイコンで登録できます。

 

 

 

 

実際に、オリジナルのAppを使ってみましょう。

 

対話式で進行する、素朴なAppです。

 

ウィンドウのアイコンも自分のオリジナルが反映されます。地味に嬉しい機能ですネ。

 

 

 

20年前のMacでも全く問題なく動作する、軽〜い内容です。

 

なので、最近のMacBookやiMacで難なく自作できます。

 

スクリプトの内容を理解するのは、ひとまず置いておいて、ネットで探すだけのAppを、自分でも作れることも知っておくと、もしかしたら、後で役に立つかも知れませんヨ。

 

ちなみに、自分で作ったアイコンは、下図のようにアレンジされて表示されることもあります。

 

 

 

数値計算程度の簡単なAppは、プログラム習得のきっかけとして、チャレンジしてみても良いですよ。

 

私が生まれて初めて作ったドロップレットは、リネームのスクリプトでした。あと、クリエータタイプとファイルタイプの変更‥‥。(今となっては、タイプ変更の必要性がわからない人も多そうですネ)

 

 

 

そういえば、アップルシリコン。リンス成分みたいな響きですが、次期マシンの数々で、AppleScriptって動くんかな‥‥。

 

今から予測してもなんですが、なんか、ダメポな雰囲気はするなあ‥‥。

 

そしたら、全部、他の言語へと、書き直しかえ。

 

でもまあ、それも新しい時代に慣れるためのエクササイズみたいなもんだね。

 

 


表計算

表計算で1週を行ごとに表記したい時‥‥

 

2020/05/04〜2020/05/10

2020/05/11〜2020/05/17

2020/05/18〜2020/05/24

2020/05/25〜2020/05/31

2020/06/01〜2020/06/07

2020/06/08〜2020/06/14

2020/06/15〜2020/06/21

2020/06/22〜2020/06/28

2020/06/29〜2020/07/05

 

‥‥というのを、まさか、1行ずつ手書きで書き込むようでは、表計算コンピュータプログラムを使っている意味がないです。

 

たかだか、週の期間の表記ですが、「表を計算するコンピュータ」の機能を活用したいですネ。

 

 

 

定数として基点となる日付「DATE(2020,5,4)」を決めたら、以下のように、行番号で自動計算するように仕込めます。

 

DATE(2020,5,4)+(7×(ROW()−2))&"〜"&DATE(2020,5,4)+(7×(ROW()−1)−1)

 

表計算の式は、変数も使えないし改行もできないので読みにくいですが、とりあえず、これで自動で行ごとに1週で更新されます。

*ヘッダ行を考慮して、2行目から計算する仕組みです。

 

月ごとに比べて、1週は必ず7日なので、計算が楽です。

 

もっと、スマートな方法があるかも知れませんが、コロナウィルスの集計表はこうして作っております。

 

 

 

表計算のNumbersやExcelやGoogleスプレッドシートは、作表ソフトではなく、表計算ソフトなので、計算を組み込んで本領を発揮します。

 

個人規模の小規模な集計表でも、表計算の計算式をバンバン使いましょう。そうすれば、いつしかプログラムやスクリプトを常用する感覚に慣れます。

 

 


タイムシートの枚数を組み込む

作画作業でも時間表記は必要です。

 

だからと言って、前回書いたのと同じく、タイムコードを1スタートにするのはトラブルの元なので避けねばなりません。

 

何よりも、ぶっちゃけ、タイムコードで1スタートにしているのは、経験の幅が狭い状態を晒しているようなものなので、かっこ悪いです。

 

タイムコードはタイムコード。タイムシートはタイムシート。コマ番号はコマ番号。

 

別に扱えば良いです。

 

 

 

前回紹介したテキストレイヤーとエクスプレッションによる各種時間表記を、アニメの作画用途に改造しましょう。

 

アニメーターでAfter Effectsを併用している人は少ないとは思いますが、未来のアニメーターはコンポジットにも関わって、あらゆる作画要素をコントロールしたほうが良いですから(表現面でもコスト面でも)、After EffectsのTIPSとして紹介します。

 

After Effects内部の小数点付き秒数を、まずはタイムコードに変換します。ついでに、fpsも取得しておきます。

 

fps=1/thisComp.frameDuration;

tc=timeToTimecode(t = time + thisComp.displayStartTime, fps, true);

 

秒数は、単純に秒の小数点を切り下げた数字で取得します。

 

sec=String(Number(Math.floor(time)+1000)).slice(1);

 

1秒間のコマ番号は、タイムコードのフレーム番号から、取得して1を足すだけです。せっかくタイムコードを変数「tc」に格納したので、利用するわけです。JavaScriptの「暗黙の型変換」ではなく、お行儀よくString()やNumber()で明示的に、文字と数を相互に変換しています。

 

koma=String(Number(tc.split(":")[3])+101).slice(1);

 

1を足すのに、101を足しているのは、表示上の桁数を揃えるためです。01は数値では1になるので、先頭の0を保つために、「101という文字の2文字目以降を取得」するのです。

 

"101".slice(1);

 →"01"

 

After Effectsの時間をフレームにするには、小数点付き秒数から地道に算出する方法もありますし、タイムコードの各桁から算出する方法もありますが、After Effectsビルトインの「timeToFrames()」が手っ取り早いです。

 

komaNumber=String(Number(timeToFrames(t = time + thisComp.displayStartTime, fps, true))+100001).slice(1);

 

 

さらに、どうせなので、何枚目のタイムシートでも読みやすく表記をプラスしましょう。

 

10+9コマって、2枚目の6秒シートの何秒何コマ目でしょう? 2枚目の6秒シートの通し番号の何コマ目でしょう?

 

まずタイムシートには、3秒シートや6秒シートがありますので、タイムシートの長さを定義します。

 

sheetLength=144;

 

144はお馴染みの数字ですね。6秒シートです。

 

この「sheetLength」で、タイムシートの秒と通しのコマを割れば良いです。

 

currentSec=Number(sec)%(sheetLength/fps);

currentKomaNumber=String(Number(komaNumber)%sheetLength+10000).slice(1);

 

さらに現在のタイムシートが何枚目かも計算しておきましょう。シートは「0枚目」と言う呼び方はしないので、二桁に揃えつつ1を足しておきます。

 

currentSheetNumber=String(Math.floor(time/(sheetLength/fps))+101).slice(1);

 

以上で、時間の情報取得は終了です。

 

あとはまとめて表示‥‥ですが、情報量が多いので、改行を混ぜましょう。

 

tc+"¥r"+sec+"+"+koma+" | "+currentSec+"+"+koma+"["+currentSheetNumber+"]¥r"+komaNumber+" | "+currentKomaNumber+"["+currentSheetNumber+"]";

 

 

以上を、テキストレイヤーのソーステキストのエクスプレッションに書き込みます。

 

//基本設定

sheetLength=144;

fps=1/thisComp.frameDuration;

 

//基本情報

tc=timeToTimecode(t = time + thisComp.displayStartTime, fps, true);

sec=String(Number(Math.floor(time)+1000)).slice(1);

koma=String(Number(tc.split(":")[3])+101).slice(1);

komaNumber=String(Number(timeToFrames(t = time + thisComp.displayStartTime, fps, true))+100001).slice(1);

 

//タイムシートの複数枚に対応

currentSec=Number(sec)%(sheetLength/fps);

currentKomaNumber=String(Number(komaNumber)%sheetLength+10000).slice(1);

currentSheetNumber=String(Math.floor(time/(sheetLength/fps))+101).slice(1);

 

//結果表示

"TC "+tc+"¥r"+sec+"+"+koma+" | "+currentSec+"+"+koma+"["+currentSheetNumber+"]¥r"+komaNumber+" | "+currentKomaNumber+"["+currentSheetNumber+"]";

 

以下のように映像に表示されます。

 

 

 

タイムコードはいつもの0スタートの「00:00:00:00」表示。

 

タイムシートの表記は、カット全体の000+00書式(999秒まで対応)と通し番号の00000書式(99999コマまで対応)の他に、タイムシート何枚目の「何秒何コマか」「通し番号何コマ目か」を表示します。

 

まあ、ありえないでしょうけど、シートは99枚まで対応してます。‥‥表示が2桁なので。

 

これで、全体の時間位置と、タイムシート何枚目の時間位置も表示されます。

 

上の映像をみれば、左側は秒数が6秒後もどんどん加算されますが、右側は0秒に表示リセットされます。

 

こうした仕組みが、ユーザのスクリプト(エクスプレッション)でいくらでも自作できるのは、After Effectsの強みです。

 

クリスタにもこうした機能=エクスプレッションやスクリプトがあれば良いのにネ。

 

 

 

 


splitとjoinとsliceで。

文字列から任意の部分を取り出す際に、その文字列に規則性がある場合は、JavaScriptのスプリットとジョインとスライスでほとんどのことが可能です。

 

例えば、

 

XY08_055_T1

 

から、T=本撮を表す文字を取り出す場合は、

 

"XY08_055_T1".split("_")[2].slice(0,1);

 

‥‥で可能です。

 

xy_08_055_t1

 

から「t」を取り出すなら、

 

"xy_08_055_t1".split("_")[3].slice(0,1);

 

です。

 

charAt()を使うのも良いですが、sliceだけでも可能です。

 

テイクの後の数字を取り出す場合は、それぞれ、

 

"XY08_055_T1".split("_")[2].slice(1);

"xy_08_055_t1".split("_")[3].slice(1);

 

です。sliceは範囲指定も「以降全部」も可能なので、色々と使えるのです。

 

ちなみに、文字を1文字ずつバラバラにしたい場合は、

 

"XY08_055_T1".slice("");

 

‥‥で可能です。私はこのあたりの知識はAppleScriptから流用しました。「AppleScript's text item delimiters」というヤツです。1つの言語をつっこんで習得すると、別の言語でも応用が可能になりますヨ。

 

 

 

アンダースコアを日本語の接続詞「の」に変えたい場合は、それぞれ、

 

"XY08_055_T1".split("_").join("の");

"xy_08_055_t1".split("_").join("の");

 

これは、「変換」しているのではなく、一旦アンダースコアで分解したのちに、「の」という文字で連結しているのです。

 

XY08の055のT1

xyの08の055のt1

 

この方法を転用すれば、変換にも使えます。‥‥AppleScriptでは常套手段ですが、JavaScriptでも可能です。

 

"今日の三鷹は雨です。".split("三鷹").join("高円寺");

結果:"今日の高円寺は雨です。"

 

普通はreplaceを使うでしょうが、こういう方法もあります。

 

なので、ファイル名から拡張子だけを除外したい時にも使えます。

 

XY01.03.128.T1.MOV

 

なんていう名前(まあ、こういう名前はないですけどネ)は、普通にドットで区切ると、拡張子の.MOV以外も全てバラバラに分解されちゃいますが、

 

XY01, 03, 128, T1, MOV

 

「.MOV」で区切れば、ファイル名のカット名部分だけを取り出せます。

 

"XY01.03.128.T1.MOV".split(".MOV")[0];

結果:"XY01.03.128.T1"

 

"XY08_055_T1.mov".split(".mov")[0];

結果:"XY08_055_T1"

 

 

 

大文字小文字が混在していて、いちいち分割する文字列の条件を変えなければならない場合は、いっそのこと、全て大文字か小文字に変換したあとで処理するのも手です。

 

"XY08_055_T1.mov".toUpperCase().split(".MOV")[0];

結果:"XY08_055_T1"

 

 

 

いずれの場合にせよ、事前の「名前の規則」が整然と規定されていることが必須です。

 

そして、人間の目視による運用と、プログラムにおける処理の利便性の、両方をいい感じで兼ね備えた名前を規定できれば、ベストですネ。

 

私の思想だけで言えば、作品、話数(パート)、カット番号、種別、バージョン番号は、全て同じ文字列で分割していたほうが、人の目にもコンピュータの処理にも、両方に優しいと思います。

 

xy_01_001_vfx_t2

zz_a_032_gen_t1

→ 頭から順に読んでいけば、命名規則を詳しく知らなくても、内容が伝わります。

 

でもまあ、まずは整然とした名前の規定をおこなうことが先決です。

 

しかし、今のアニメ制作現場は、名前の規定すら曖昧で、各セクションが別々の規定で運用するほど、連携が希薄です。

 

中々、未来のオンライン運用への道は険しい‥‥ですネ。

 

 

 


連想配列を使おう

アニメ業界の撮影さんのエクスプレッションは、ifやmatchは使う一方で、連想配列はあまり活用していません。

 

this_comp‥‥という表記を最近見かけましたので(現在はthisComp)、相当古いバージョンのAfter Effectsからエクスプレッションを受け継いでいることもありましょう。

 

私もそうでしたが、言語を覚えたての頃は、結構まわりくどい書き方をしているものです。

 

JavaScriptの場合、いちいち「何らか==trueだったら」「何らかが0以外ならば」という書き方をしなくても、「何らかだったら」というシンプルな書き方でOKです。

 

AppleScriptは明確に真偽値でない場合はNGですが、JavaScriptは、false、0、""、以外は真とみなされるので、書き方が短くて済みます。

 

2020年になった今、雛形を点検して整頓してみるのも良いですヨ。

 

 

 

「何撮か?」というボールドの表示で、今でもifを見かけます。

 

ifで延々と改行して条件分けする方法は、初心の頃にはやりがちです。

 

例えば、「XY」という作品略号で、

 

XY04_012_T2 → 作品「XY」4話 Cut12 本撮テイク2

XY11_201_K1 → 作品「XY」11話 Cut201 タイミング撮テイク1

 

‥‥という書式の場合、撮影の種別を示すTやKなどを、コンポジション名から取り出す流れは、

 

compType=thisComp.name.split("_")[2].charAt(0);

 

‥‥のようになりましょう。

 

TやKやSを「何撮」という文字列に関連づけて生成する際に、ifを使うと、

 

if(compType=="T"){

typeText="本撮":

}else if(compType=="K"){

typeText="タイミング撮":

}else if(compType=="S"){

typeText="線撮":

}else if(compType=="Y"){

typeText="予告":

}

 

‥‥となりますが、何回もelse ifやtypeText=を書くのは、正直、野暮ったいです。

 

なので、連想配列の出番。

 

typeList={T:"本撮",K:"タイミング撮",S:"線撮",Y:"予告"};

 

‥‥のような連想配列を記述して、キーワードで呼び出します。

 

typeList[compType];

 

ifとelseに比べて、たったの2行で済みます。

 

typeList={Y:"予告",S:"線撮",K:"タイミング撮",T:"本撮"};

typeText=typeList[compType];

 

 

if文より明解で簡潔、メンテもしやすいです。

 

もし「何撮」かが増えた場合は、連想配列の内容を増やせば良いだけです。elseで行を増やすより、扱いやすいです。行をスクロールせずに1行で判読できます。

 

 

 

連想配列を複合化して、辞書のようなものを作ることもできます。

 

typeDic={T:{jp:"本撮",en:"FINAL",summ_jp:"本番撮影",summ_kana:"ファイナルテイク",sect:"撮影工程",cont:"撮影工程における本番素材を用いた作業"};

 

Tというキーワードで、本撮にまつわる様々な情報を引き出せます。‥‥まあ、ここまで細かくする必要はないでしょうが、一例として。

 

typeDic[T][sect];

=結果は「撮影工程」

 

typeDic[T][cont];

=結果は「撮影工程における本番素材を用いた作業」

 

‥‥まあ、ここまで凝る必要もないとは思いますが、ifしか使わない時に比べて、格段にできることが広がります。

 

 

 

連想配列‥‥という言葉の「響き」は、聴き慣れないので難しく感じますが、要は「ラベル付きのリスト項目」です。

 

無作為に箱の中に詰めるより、1つ1つにラベルを貼っておけば、判別しやすくなって取り出しやすくなりますよネ。

 

聞けば「なんだ、そんなことだったのか。日常生活でも普通にあることだね。」と納得できることなんですが、「連想配列」などと言われるとなんだか難しく感じます。

 

クラス型オブジェクト、インスタンス、インヘリタンス‥‥とか聞くと、「ちんぷんかんぷん」と敬遠しがちです。

 

しかし、「型をあらかじめ作る」「型から実体を作る」「違う型を作る際に、元の型から要素を継承する」と言われれば、「あー、あるよね、そういうやり方」と思えるわけです。

 

プログラムは、「難しげな用語」に怖気付いたら負けです。

 

難しげな用語を、どういう意味か調べれば、さほど怖くはありません。恐ろしく難解な物事だったら、こんなに世界中にプログラマなんて溢れていませんよネ。

 

アニメ制作だって同じです。「密着マルチ」「付けパン」なんて聞くと、何のことか部外者はわかりませんが、現場で用語の意味と内容を知れば、普通に扱えるようになります。

 

言葉の響きに物怖じするなかれ。

 

 

 

連想配列は、エクスプレッションでも自動処理でも使えます。

 

Adobe CCなら、PhotoshopやAfter Effects、macOSなら様々なAppで、活用可能です。

 

JavaScriptに限らず、他の言語でも、「キーとバリュー」、つまりキーワードと項目の内容を関連付けるリスト(配列)は用意されていますので、考え方さえ覚えたら、様々に応用できるようになります。

 

 


ミュージック(旧iTunes)の曲の時間合計・2

今さらAppleScriptを覚える気にはなれない。‥‥まあ、そうですよね。私は20年以上AppleScriptを使い続けていますが、2020年の今なら、そう思います。

 

なので、JavaScript。

 

前回書いたAppleScriptによるスクリプトは、JavaScriptで同じことが記述できます。内容を翻訳できます。

 

実はAppleScriptのエディタは、言語を切り替えてJavaScriptでも書けるんです。

 

 

 

After Effectsのエクスプレッションや自動処理でおなじみの書式が通用します。

 

なので、Music.appの選択項目の合計時間を表示するスクリプトはJavaScriptとAutomatorで作ったほうが、今は実用性があるでしょうネ。

 

クイックアクション書類を作って保存すれば、ミュージックの「サービスメニュー」に自作のアクションがリストされます。

 

 

 

 

「JavaScriptを実行」を追加して、JavaScript文を書きます‥‥が、なんだこれは。

 

エディタ部分の配色がまっくらで読めませんネ。

 

なので、スクリプト文を以下に。ただ実行するだけなので、入力もパラメータも不要です。

 

function run() {

    

var app=Application("Music");

app.includeStandardAdditions=true;

var w=app.windows[0];

var td=0;

for(var i=0;i<w.selection().length;i++){

td=td+w.selection()[i].duration();

}

app.displayDialog((Math.floor(td/60))+"分"+(Math.round(td%60))+"秒");

return true;

}

 

 

曲の時間(duration)は秒単位(小数点付き)で扱うので、単純に足した後で読みやすいように整形すれば良いです。何のヒネりもないシンプルな内容なのは、前回と同じ‥‥というか、前回のAppleScriptの内容をJavaScriptに翻訳しただけなので、includeStandardAdditionsなどの独特な追加部分以外は、書き方の作法こそ違いますが内容は同じです。

 

for文とか、Math.floorやroundは、After Effectsのスクリプトでもおなじみですネ。

 

After Effectsでエクスプレッションやスクリプトを覚えておけば、ミュージックにも応用できる‥‥というわけです。

 

まあ、alertではなく、displayDialogだったりと、癖は多少ありますが、基本的な書式はいつものJavaScriptでOK。

 

制御について知りたい人は、英文だけどコレを読めば大体概要は掴めます。

 

OS X 10.10 Release Notes

https://developer.apple.com/library/archive/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/Articles/OSX10-10.html#//apple_ref/doc/uid/TP40014508-CH109-SW1

 

 

 

スクリプトやプログラムを覚えておけば、「性能としては存在するのに、表立った機能として存在しない」、コンピュータのポテンシャルを引き出せます。

 

曲のそれぞれの秒数を合計する‥‥なんて、コンピュータができないわけがない‥‥のに、機能として存在しなければ、分単位までしかユーザは情報を取得できません。

 

‥‥それとも、電卓で手作業で各曲の合計秒数を算出します?‥‥いやいや、そんな無駄な時間は人生がもったいない。

 

PhotoshopやAfter EffectsのJavaScriptに馴染んだら、他でも応用が効くようになりますから、まだスクリプトに着手していない人はチャレンジすることを強くお勧めします。

 

 


ミュージック(旧iTunes)の曲の時間合計

ミュージック.appで、プレイリストの細かい秒数まで知りたい場合、どうすれば良いんでしょう。何か、秒数まで表示できるオプションがあるでしょうか?

 

あるかも知れませんが、私は知らないので、スクリプトでちょちょいと処理します。

 

以下のAppleScriptを実行すれば、現在選択中の曲(トラック)のデュレーション合計がわかります。

 

 

スクリプト文は以下。

 

tell application "Music"

    set td to 0

    tell front window

        repeat with i in selection

            set td to td + (duration of i)

        end repeat

    end tell

    display dialog ((td div 60) as text) & "分" & ((td mod 60) as integer as text) & "秒"

end tell

 

 

 

現在表示されているウィンドウの選択項目を順々に調べて、曲の時間を集計します。凝ったところは何もない、シンプルなスクリプトですネ。

 

AppleScriptがわからなくても、文面を読めば、なんとなくでもやっていることが解りますよネ。

 

 

 

これで90分カセットの片面にギリギリ入る合計時間を調整できます。もちろん、曲のチョイスは手作業ですけどネ。

 

片面45分だからといって、44分でプレイリストを組むと、最後の曲が終わった後で、最大で2分の無音が続きます。実際の片面の長さは46分くらいなので、曲が終わったらすぐにテープを巻ききってパタンと再生が終わるように組むと、快適ですヨ。

 

 



calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
27282930   
<< September 2020 >>

selected entries

categories

archives

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM