はじめに
The Signal Stateでは、パズル内の入出力データをLua言語による簡易スクリプトで記述できます。Lua言語のコードには、以下に示す3つの処理を記述します。
1) SRCとOUTのチャンネル数および総ステップ数を定義
2) ステップごとの各SRCおよびOUTチャンネルの値を定義
3) Luaテーブルとしてデータをゲームに返す
The Signal Stateのストーリー最初のパズルから、基本的な例を以下に示します。
sstate.setSignalSpecs(1,2,50)
for i=0, 49
do
sstate.setSrc(0,i,i+1)
sstate.setOut(0,i,i+1)
sstate.setOut(1,i,i+1)
end
return sstate.signals()
sstate.setSignalSpecs(1,2,50)
は、このパズルが1つのSRCチャンネルと2つのOUTチャンネルを持つことを示します。コードにはSRCとOUTチャンネルの数、およびステップ数が定義されている必要があります。
ループ内のsState.setSrc(0,i,i+1)
は、SRC 1(コードでは0始まりのインデックスで指定します)のステップi
における値がi+1
になることを示します。
ループの最後にあるreturn sstate.signals()
で、データをゲームに返します。コードの最後には必ずこの行を記述しなければなりません。
sstate
はゲーム内のLuaインタプリターに含まれており、信号データのコードを記述するのに便利な関数を提供しています。これらの関数の詳細は以下を参照してください。
ゲーム内のLuaコードはMoonsharpインタプリターによるサンドボックス内で実行されることから、すべてのLuaの標準ライブラリを利用することができません。mathライブラリをはじめ基本的なライブラリは利用可能です。Lua言語についての更なる情報はhttps://www.lua.org/manual/5.2/を参照してください。
sstate.setSignalSpecs(srcCount, outCount, timesteps)
SRC、OUTチャネル数およびステップ数を定義します。SRC、OUTのチャンネル数はそれぞれ4を超えてはならず、SRCとOUTの総数は4を超えてはいけません。ステップ数は150を超えてはいけません。
sstate.setSrcCount(srcCount)
SRCチャンネル数を定義します。SRCチャンネル数は4を超えてはいけません。
sstate.setOutCount(outCount)
OUTチャンネル数を定義します。OUTチャンネル数は4を超えてはいけません。
sstate.setSignalLength(length)
総ステップ数を定義します。ステップ数は150を超えてはいけません。
sstate.getSrcCount()
SRCチャンネル数を返します。値は既に定義されている必要があります。
sstate.getOutCount()
OUTチャンネル数を返します。値は既に定義されている必要があります。
sstate.getSrc(srcChannel, timestep)
指定されたSRCチャンネルおよびステップにおける値を返します。値は既に定義されている必要があります。
sstate.getOut(srcChannel, timestep)
指定されたOUTチャンネルおよびステップにおける値を返します。値は既に定義されている必要があります。
sstate.getSignalLength()
総ステップ数を返します。値は既に定義されている必要があります。
sstate.signals()
信号のデータ定義を含んだテーブルを返します。コードの最後には必ずreturn sstate.signals()
を記述しなければなりません。
sstate.setSrc(channel, timestep, value)
指定したSRCチャンネルとステップにおける値を設定します。値は-100から100の間である必要があります。
sstate.setOut(channel, timestep, value)
指定したOUTチャンネルとステップにおける値を設定します。値は-100から100の間である必要があります。
sstate.attenuator(input, attValue)
減衰器モジュールの動作をシミュレートし、結果を出力します。入力値は-100から100の間の整数である必要があります。attValue
は-1から1までの値である必要があります。ゲーム中の減衰器モジュールでは、減衰値は10%きざみとなることに注意してください。
sstate.vca(input,cv)
VCAモジュールの動作をシミュレートし、結果を出力します。入力値とCVの値は-100から100までの整数である必要があります。
sstate.andGate(in1,in2)
ANDモジュールの動作をシミュレートし、結果を出力します。入力値は-100から100まで整数である必要があります。
sstate.orGate(in1,in2)
ORモジュールの動作をシミュレートし、結果を出力します。入力値は-100から100までの整数である必要があります。
sstate.notGate(in)
NOTモジュールの動作をシミュレートし、結果を出力します。入力値は-100から100までの整数である必要があります。
sstate.xorGate(in1,in2)
XORモジュールの動作をシミュレートし、結果を出力します。入力値は-100から100までの整数である必要があります。
sstate.toBool(input)
入力値が0より大きい場合trueを返し、それ以外の場合falseを返します。
sstate.sign(input)
入力値が0より小さい場合は-1を、0より大きい場合は1を、0に等しい場合は0を返します。
コード例
VCAのテスト
sstate.setSignalSpecs(2,1,50)
for i=0, 49
do
val = math.random(-16,16)*5
val2 = math.random(0,5)*20
sstate.setSrc(0,i,val)
sstate.setSrc(1,i,val2)
sstate.setOut(0,i,sstate.vca(val,val2))
end
return sstate.signals()
ドローンの経路探索
sstate.setSignalSpecs(1,1,50)
val1 = 0
val2 = 0
for i=0, 49
do
val3 = math.random(-30,30)
sstate.setSrc(0,i,val3)
if val3 > val2 and val3 > val1 then
sstate.setOut(0,i,val3)
elseif val2 > val1 and val2 > val3 then
sstate.setOut(0,i,val2)
else
sstate.setOut(0,i,val1)
end
val1 = val2
val2 = val3
end
return sstate.signals()
サンプラー
sstate.setSignalSpecs(1,1,50)
ctr = 0
for i=0, 49
do
if 7 >= i then
sstate.setSrc(0,i,math.random(25,80))
else
sstate.setSrc(0,i,0)
end
sstate.setOut(0,i,sstate.getSrc(0,ctr))
ctr = ctr + 1
if ctr >= 8 then
ctr = 0
end
end
return sstate.signals()