変数

grandMA3 ユーザマニュアル » マクロ » 変数 Version 2.3

変数は、マクロやコマンドライン入力で使用できます。

変数にはユーザが定義した名前があり、コマンド実行時にその内容が置き換えられます。

変数には、以下の3種類のデータ型を格納できます。

  • Integer: 符号付き整数
  • Double: 小数部6桁の符号付き固定小数点数
  • Text: 文字列

符号付きの数値は、例えば -7 のような負数にもなり得ることを意味します。

変数には型指定がありません。既存の変数は、別の型に変換可能です。

変数名には、任意の文字を使えます。大文字と小文字は区別されます。

ヒント
必須ではありませんが、変数名には空白を入れない方がよいでしょう。代わりに、キャメルケース(例: myName)やパスカルケース(例: MyName)を用いることをお勧めします。

変数には2種類のスコープがあります。

変数は、ユーザに対してスコープを設定することも、グローバル変数にすることも可能です。

ユーザ変数は、それらを作成したユーザプロファイルによってのみ参照・使用できますが、グローバル変数はセッション内のすべてのユーザが参照・使用できます。


SetGlobalVariable と SetUserVariable

グローバル変数でもユーザ変数でも作成方法は同様ですが、それぞれに使用するキーワードは、SetGlobalVariableSetUserVariable になります。

構文は以下の通りです。

SetGlobalVariable ["変数名"] ["Text (空白文字も使用可)"]

SetGlobalVariable ["変数名"] [Integer または Double]

SetUserVariable ["変数名"] ["Text (空白文字も使用可)"]

SetUserVariable ["変数名"] [Integer または Double]

重要
変数名に空白が含まれている場合、引用符が必要です。空白が含まれていない場合は省略できます。
変数内容の文字列についても同様です。確実に Text 型として保存するには、変数内容を引用符で囲んでください。

User name[Fixture]>SetUserVariable MyFavoriteNumber 9
User name[Fixture]>SetUserVariable MyFavoriteText "9"

これら2つコマンド例は同じように見えるかもしれませんが、作成される変数は異なります。最初の例は数値、2番目の例は引用符が使われているため文字列になります。

シングル・クォーテーションとダブル・クォーテーション

引用符で囲まれたテキストを含む文字列を変数に格納したい場合があります。このとき、ソフトウェアが入力をどのように解釈し、実行時に呼び出された変数がどのように解釈されるかが問題になります。

変数システムでは、シングル・クォーテーションとダブル・クォーテーションのペアに対応しています。

異なる引用符が使われている場合、文字列は引用符で囲まれたテキストを含むことができます。

特定の名前のグループ("Spots Grid")をさまざまな状況で操作したいとします。以下のようにして、"Group" と名前を含む内容を、変数に格納できます。

User name[Fixture]>SetUserVariable MySpecialGroup "Group 'Spots Grid' "

変数のテキスト文字列全体がダブル・クォーテーションで、グループ名がシングル・クォーテーションで囲まれていることに注目してください。これら2種類の引用符を逆にしても、同じ結果になります。

これで、変数によってグループをアドレス指定できます。

User name[Fixture]>$MySpecialGroup At 80

変数を呼び出せるように、コマンドの前に $ を付けます。

ソフトウェアからの応答は以下のようになります。

OK: Group "Spots Grid" At 80

GetGlobalVariable と GetUserVariable

変数の内容と型は、GetGlobalVariableGetUserVariable キーワードを用いて一覧表示できます。

これらのキーワードでは、表示したい変数を指定します。構文は以下の通りです。

GetGlobalVariable ["変数名"]

GetUserVariable ["変数名"]

これらのコマンドは、変数名、型、および内容に関する情報を Command Line History ウィンドウ に表示します。

GetGlobalVariable ではグローバル変数のみが、GetUserVariable ではユーザ変数のみが表示されます。

この構文では、変数名が既知であることを前提としています。

ワイルドカードの * (アスタリスク) 記号 を用いると、すべての変数を表示したり、名前をフィルタリングして一覧表示したりできます。

"MySpecialGroup" という変数の現在の内容は、以下のコマンドで表示できます。

User name[Fixture]>GetUserVariable MySpecialGroup

Command Line History ウィンドウには、以下のように表示されます。

"MySpecialGroup": Type = Text, Value = "Group 'Spots Grid' "
OK: GetUserVariable "MySpecialGroup"

以下の例は、名前に "Our" という語が含まれるすべてのグローバル変数を一覧表示します。

User name[Fixture]>GetUserVariable *ur*

"O" はアスタリスクにマッチするため、"Our" で始まる変数も表示されます。先頭にあるワイルドカードのアスタリスクは、指定文字の前に何らかの文字が必要であることを示しています。この例では、"Hour" で始まる変数や、名前のどこかに "ur" が含まれる変数も表示されます。"Our" で始まる変数を指定するには、以下のように入力します。

User name[Fixture]>GetUserVariable Our*

この例は、すべてのユーザ変数を表示します。

User name[Fixture]>GetUserVariable *

変数の使用

変数は、その内容が必要な場所で用いられます。

前の例では、以下のように変数が使われました。

User name[Fixture]>$MySpecialGroup At 80

$MySpecialGroupが、変数の文字列内容("Group 'Spots Grid' ")に置き換わります。変数にはコマンドを表す文字列が含まれているため、これが動作します。

重要
変数を用いる際の引用符は重要で、その有無によって大きな違いが生じます。

以下のように引用符を付けて変数を用いると、その内容が具体的な文字列として呼び出されるため、正しく動作しません。

User name[Fixture]>$"MySpecialGroup" At 80

変数内容が文字列として明示的に呼び出されるため、以下のような結果になって失敗します。

Illegal object: Fixture "Group 'Spots Grid'" At 80

変数内容を文字列として用いようとし、コマンドとして解釈されません。

他の場合では、これが役立つことがあります。変数に文字列として使いたい内容が含まれている場合、変数名を引用符で囲む必要があります。以下の例を見てください。

この例では、グループ名を含む変数を使用しています。

User name[Fixture]>SetUserVariable MyGroupName "Spots Grid"

これで、この変数は、以下のように文字列が使われる場所で使用できます。

User name[Fixture]>Group $"MyGroupName" At 80

以下のように引用符を省くと失敗します。

User name[Fixture]>Group $MyGroupName At 80
Illegal object: Group "Spots" Grid At 80

この文字列はコマンドとして解釈されます。

タイムコードに基づいて複数の曲が演奏されるミュージカルを行っているとします。
以下のマクロ例では、各曲に合わせて卓を準備するための変数を作成します。

開くウィンドウの必要条件:

  • Macro プール
  • Pages プール
  • Timecode プール
  • Sequence プール
  • Playbacks
  • Timecode Viewer
  • Sequence Sheet

画面は、以下のようになります。


この例では、以下の操作が必要です。

  • 2つのシーケンスを保存します。1つは FirstSong、もう1つは SecondSong という名前を付けてください。どちらのシーケンスも、最初のキューは1にします。詳しくは キューとシーケンス を参照してください。
  • 2つのタイムコード・ショーを保存します。1つは FirstSong という名前のタイムコード・ショーで、トラックのターゲットは FirstSong という名前のシーケンスです。もう1つは SecondSong という名前のタイムコード・ショーで、トラックのターゲットは SecondSong という名前のシーケンスです。詳しくは Timecode Viewer を参照してください。
  • FirstSong という名前のシーケンスをページ3のエクゼキュータ201に割り当て、SecondSong という名前のシーケンスをページ4のエクゼキュータ201に割り当てます。
  • FirstSong という名前のマクロを保存します。
  • SongSetup という名前のマクロを保存します。

ワークフローは以下の通りです。

  1. FirstSong という名前のマクロを編集します。
  2. 2つのマクロ行を挿入します。
  • マクロ1行目: まず、新しい変数を作成する必要があります。マクロ1行目のコマンドを編集し、以下のように入力します。

これは、コマンドが実行されたときの Command Line ウィンドウのフィードバックです。

OK:SetGlobalVariable   "currentsong" "FirstSong"

  • マクロ2行目: ここでは、SongSetup という名前のマクロを呼び出します。マクロ2行目のコマンドを編集し、以下のように入力します。


マクロは以下のようになります。


次に、ショー全体で使用されるマクロを構築し、曲ごとにデスクを準備します。

  1. SongSetup という名前のマクロを編集します。
  2. 8行のマクロを挿入します。
  • マクロ1行目: 新しい変数 "currentsong" を使って、ソフトウェアにどのページを選択するかを指示します。マクロ1行目のコマンドを編集し、以下のように入力します。

これは、コマンドが実行されたときの Command History ウィンドウのフィードバックです。

OKPage "FirstSong"

ここでは、変数 "current song" が内容が "FirstSong" に置き換えられていることが分かります。

  • マクロ2行目: 次に、ソフトウェアにどの実行プログラムを選択するかを指示する必要があります。マクロ2行目のコマンドを編集し、以下のように入力します。

これは、コマンドが実行されたときの Command History ウィンドウのフィードバックです。

OK: Select Page  "FirstSong"  Executor  201

 

  • マクロ3行目: 実行中のタイムコードを停止することをお勧めします。これを行うには、マクロ3行目のコマンドを編集し、以下のように入力します。

これは、コマンドが実行されたときの Command History ウィンドウのフィードバックです。

OK::Off Timecode  Thru

  • マクロ4行目: ここでは、すべてのタイムコードを 00h00m00.0 に巻き戻します。マクロ4行目のコマンドを編集し、以下のように入力します。

これは、コマンドが実行されたときの Command History ウィンドウのフィードバックです。

OK: <<< Timecode 1 Thru

マクロ5行目: タイムコード・ショーを選択するには、マクロ5行目のコマンドを編集し、以下のように入力します。

これは、コマンドが実行されたときの Command History ウィンドウのフィードバックです。

OK: Select Timecode  "FirstSong"

マクロ6行目: ここで、ソフトウェアにどのタイムコード・ショーを実行するかを指示します。マクロ6行目のコマンドを編集し、以下のように入力します。

これは、コマンドが実行されたときの Command History ウィンドウのフィードバックです。

OK: Go+ Timecode  "FirstSong"

  • マクロ7行目: マクロ7行目のコマンドを編集し、以下のように入力します。ここでは、FirstSong というシーケンスを実行しているエクゼキュータを除く、ページ2からページ100までの実行中の全エクゼキュータをオフにするようソフトウェアに指示しています。通常、実行中のタイムコード・シーケンス以外で手動で操作する必要のあるシーケンスには、ページ1を残しておくのがよいでしょう。そのため、このコマンドではページ1で実行中のシーケンスも除外されます。


これは Command Line ウィンドウのフィードバックです。

OK: Off Page  2 Thru  100  "FirstSong"

  • マクロ8行目: 最後に、タイムコードがキュー1をトリガーする場合でも、以下のコマンドを追加しても問題ありません。マクロ8行目のコマンドを編集し、以下を入力します。

これは Command Line ウィンドウのフィードバックです。

OK: Go+ Cue  1

マクロは以下のようになります。


ここからが面白いところです。次の曲に対するマクロを作成するには、以下のようにします。

  1. 作成した FirstSong という名前のマクロを、空の Macro プール・オブジェクトにコピーします。
  2. 新しいマクロを編集し、SecondSong という名前を付けます。
  3. マクロ1行目 のコマンドを編集して、変数の内容 "FirstSong" を "SecondSong" に置き換えます。

マクロ SecondSong は、以下のようになります。


変更されたのは、マクロ1行目の変数の内容だけです(SetGlobalVariable "currentsong" "SecondSong")。そのため、変数が呼び出されるたびに、新しい内容が参照されます。この方法は、ショー内のすべての曲に対して繰り返すことができます。


変数とハンドルの組み合わせ

変数はハンドルと組み合わせて使用できます。ハンドルについては、#[オブジェクト] キーワード および Command Editor を参照してください。

以下は、マクロでハンドルと変数を用いる方法の例です。



DeleteGlobalVariable と DeleteUserVariable

変数は、DeleteGlobalVariable および DeleteUserVariable キーワードによって削除できます。

構文は以下のようになります。

DeleteGlobalVariable ["変数名"]

DeleteUserVariable ["変数名"]

重要
変数の削除は取り消せません。変数の削除については、他に付け加えることはありません。削除された変数は、もう存在しません。

変数の連結

変数は、新しい変数に格納することで連結できます。

ここで求めているのは、連結された変数を含む複合文字列の作成です。出力は常に文字列です。数値変数の算術的加算については、後述を参照してください。

構文は以下のようになります。

SetGlobalVariable [MyConcatResult] $[変数名]$[変数名]

SetUserVariable [MyConcatResult] $[変数名]$[変数名]

連結する変数間や、連結の一部となる他の文字列との間に、空白を入れてはいけません。

文字列を変数に連結するには、引用符で囲み、それらの末尾と先頭の引用符との間に空白を入れずに追加します。引用符の内側には空白があってもかまいません。後述の例を参照してください。

以下の例では、3つの変数を用います。

変数名 内容
MyInteger Integer 9
MyKeyword Text Group
MyGroupName Text Perfect Macro

目標は、これらの変数を、グループを保存するためのコマンド文字列に連結することです。

1つのコマンドでも可能ですが、ここでは別の機能を見るために分割しています。

最初に、キーワードと整数を連結して新しい変数にします。

User name[Fixture]>SetUserVariable MyCommandString $"MyKeyword"" "$MyInteger

このコマンドには多くの引用符があります。変数名を引用符で囲むと、その内容が文字列として解釈されます。これは、Integer 型の変数が Text 型に変換されることも意味しています。

また、2つの変数の間には、空白を挿入するための " " があります。

以下のコマンドで結果を確認します。

User name[Fixture]>GetUserVariable MyCommandString

次に、マクロ名を文字列に追加します。

User name[Fixture]>SetUserVariable MyCommandString $"MyCommandString"" '"$"MyGroupName""'"

これも分かりにくいかもしれません。2つの変数名は引用符で囲まれています。両者の間には、引用符で囲まれた空白とシングルクォーテーションがあります。そして、最後の変数名の後には、引用符で囲まれたシングルクォーテーションと空白があります。

Here you can spot them better: SetUserVariable MyCommandString $"MyCommandString"" ' "$"MyGroupName"" ' "

このコマンドの引用符を取ると、SetUserVariable MyCommandString $MyCommandString '$MyGroupName' になります。

MyCommandString の既存内容が MyCommandString に代入され、さらに MyGroupName の内容がシングルクォーテーションで囲まれて追加されます。

結果として、MyCommandString が Group 9 'Perfect Macro' という文字列になります。

これで、いくつかのフィクスチャを選択して、以下のようにコマンドを実行できます。

User name[Fixture]>Store $MyCommandString

そして、その名前を持つグループがグループ9に保存されます。このコマンドでは、引用符は使用されません。

変数の加算

Integer/Double 型の変数を連結すると、算術演算の加算になります。この場合、引用符は使いません。

結果は変数に格納する必要があります。

この例では、以下の3つの変数を用います。

変数名 内容
MyInteger Integer 9
MySignedInteger Integer -2
MyDouble Double 6.500000

最初の2つの変数は、以下のコマンドで互いに加算できます。

User name[Fixture]>SetUserVariable MyResult $MyInteger$MySignedInteger

結果は、Command Line History で確認できます。変数に7という値が格納されていることが分かります。

Double と Integer を加算することもできます。データの損失を避けるため、結果は Double になります。

User name[Fixture]>SetUserVariableMyResult $MyInteger$MyDouble

MyResult には、15.500000 という値が格納されます。

型変換

上の例では、型変換が行われています。

Integer または Double は、変数名を引用符で囲むことによって Text に変換できます。コマンドを実行すると変換が行われます。

引用符を付けず変数を設定すると、Text を Integer に変換できます。

Integer は、0.000000 という値の Double に加算することで Double に変換できます。

Double を Integer に変換することはできません。

この例では、以下の変数を用います。

変数名 内容
MyInteger Integer 9
MyEmptyDouble Double 0.000000
MyText Text Hello

この例では、Integer を Text に変換しています。

User name[Fixture]>SetUserVariable MyInteger $"MyInteger"

これを Integer に戻すには、以下のコマンドを用います。

User name[Fixture]>SetUserVariable MyInteger $MyInteger

Integer を Double に変換するには、以下のコマンドを用います。

User name[Fixture]>SetUserVariable MyResult $MyInteger$MyEmptyDouble