はじめに

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()