diff options
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | generate_fx.py | 8 | ||||
| -rw-r--r-- | generate_params.py | 6 | ||||
| -rw-r--r-- | generate_utils.py | 4 | ||||
| -rw-r--r-- | osc_ctrl.py | 42 |
5 files changed, 39 insertions, 25 deletions
@@ -69,5 +69,9 @@ There are roughly 4 important pieces here: 3. General usability features. 3.1. Error detection & correction. 3.2. Text-to-text interface. Type in terminal, show in game. +4. Optimization +4.1. Utilize the avatar 3.0 SDK's ability to drive parameters to reduce the + total # of parameters (and therefore OSC messages & sync events). Note + that the parameter memory usage may not decrease. Made with love by yum\_food. diff --git a/generate_fx.py b/generate_fx.py index 33a1a73..0075de6 100644 --- a/generate_fx.py +++ b/generate_fx.py @@ -133,6 +133,9 @@ def genAnimator(state): params["ANIMATOR_PARAMETER_NAME"] = generate_utils.getResize1Param() print(replaceMacros(ANIMATOR_PARAMETER_BOOL, params)) + params["ANIMATOR_PARAMETER_NAME"] = getEnableParam() + print(replaceMacros(ANIMATOR_PARAMETER_BOOL, params)) + for i in range(0, NUM_LAYERS): params["ANIMATOR_PARAMETER_NAME"] = getLayerParam(i) print(replaceMacros(ANIMATOR_PARAMETER_INT, params)) @@ -146,9 +149,6 @@ def genAnimator(state): params["ANIMATOR_PARAMETER_NAME"] = getSelectParam(i, 2) print(replaceMacros(ANIMATOR_PARAMETER_BOOL, params)) - params["ANIMATOR_PARAMETER_NAME"] = getEnableParam(i) - print(replaceMacros(ANIMATOR_PARAMETER_BOOL, params)) - print(replaceMacros(ANIMATOR_LAYER_HEADER, params)) @@ -510,7 +510,7 @@ def genTasttLayer(state, which_layer): print(replaceMacros(TASTT_ANIM_STATE, params)) # Active state transition. - params["BOOL_PARAM"] = getEnableParam(which_layer) + params["BOOL_PARAM"] = getEnableParam() params["THRESHOLD"] = str(1) params["MODE"] = str(1) # See comment above TASTT_BOOL_STATE_UNARY_TRANSITION. params["ACTIVE_STATE_U2"] = get_u2("1102", state) diff --git a/generate_params.py b/generate_params.py index bb7fcdf..0da8cdf 100644 --- a/generate_params.py +++ b/generate_params.py @@ -51,6 +51,9 @@ print(generate_utils.replaceMacros(BOOL_PARAM, params)) params["PARAM_NAME"] = generate_utils.getResize1Param() print(generate_utils.replaceMacros(BOOL_PARAM, params)) +params["PARAM_NAME"] = generate_utils.getEnableParam() +print(generate_utils.replaceMacros(BOOL_PARAM, params)) + for i in range(0, generate_utils.NUM_LAYERS): params["PARAM_NAME"] = generate_utils.getLayerParam(i) print(generate_utils.replaceMacros(INT_PARAM, params)) @@ -63,6 +66,3 @@ for i in range(0, generate_utils.NUM_LAYERS): params["PARAM_NAME"] = generate_utils.getSelectParam(i, 2) print(generate_utils.replaceMacros(BOOL_PARAM, params)) - - params["PARAM_NAME"] = generate_utils.getEnableParam(i) - print(generate_utils.replaceMacros(BOOL_PARAM, params)) diff --git a/generate_utils.py b/generate_utils.py index 74fd095..85d6298 100644 --- a/generate_utils.py +++ b/generate_utils.py @@ -41,8 +41,8 @@ def getLayerParam(which_layer): def getSelectParam(which_layer, which_select): return "TaSTT_L%02d_S%02d" % (which_layer, which_select) -def getEnableParam(which_layer): - return "TaSTT_L%02d_E" % which_layer +def getEnableParam(): + return "TaSTT_Enable" def getBoardIndex(which_layer, s0, s1, s2): # Because we divide the board into a multiple of 8 cells, some cells may diff --git a/osc_ctrl.py b/osc_ctrl.py index a1e5c6c..221333e 100644 --- a/osc_ctrl.py +++ b/osc_ctrl.py @@ -18,8 +18,8 @@ from generate_utils import BOARD_ROWS from generate_utils import BOARD_COLS #CELL_TX_TIME_S=3.0 -CELL_TX_TIME_S=1.0 -#CELL_TX_TIME_S=0.7 +#CELL_TX_TIME_S=1.0 +CELL_TX_TIME_S=0.3 def usage(): print("python3 -m pip install python-osc") @@ -79,14 +79,12 @@ def updateCell(cell_idx, letter_encoded, s0, s1, s2): client.send_message(addr, s2) def enable(): - for i in range(0, NUM_LAYERS): - addr="/avatar/parameters/" + getEnableParam(i) - client.send_message(addr, True) + addr="/avatar/parameters/" + getEnableParam() + client.send_message(addr, True) def disable(): - for i in range(0, NUM_LAYERS): - addr="/avatar/parameters/" + getEnableParam(i) - client.send_message(addr, False) + addr="/avatar/parameters/" + getEnableParam() + client.send_message(addr, False) # Send a cell all at once. # `which_cell` is an integer in the range [0,8). @@ -94,7 +92,7 @@ def sendMessageCellDiscrete(msg_cell, which_cell): # Disable each layer. disable() - time.sleep(CELL_TX_TIME_S / 2.0) + time.sleep(CELL_TX_TIME_S / 3.0) # Really long messages just wrap back around. which_cell = (which_cell % 8) @@ -109,7 +107,7 @@ def sendMessageCellDiscrete(msg_cell, which_cell): updateCell(i, msg_cell[i], s0, s1, s2) # Wait for convergence. - time.sleep(CELL_TX_TIME_S / 4.0) + time.sleep(CELL_TX_TIME_S / 3.0) # Enable each layer. # TODO(yum_food) for some reason, if we don't active every layer, the @@ -117,7 +115,7 @@ def sendMessageCellDiscrete(msg_cell, which_cell): enable() # Wait for convergence. - time.sleep(CELL_TX_TIME_S / 4.0) + time.sleep(CELL_TX_TIME_S / 3.0) # Send a cell smoothly spread out over the course of CELL_TX_TIME_S. # `which_cell` is an integer in the range [0,8). @@ -128,7 +126,7 @@ def sendMessageCellContinuous(msg_cell, which_cell): s1 = ((floor(which_cell / 2) % 2) == 1) s2 = ((floor(which_cell / 1) % 2) == 1) - time_quanta = 100 + time_quanta = 20 dt = CELL_TX_TIME_S / (time_quanta * 1.0) # key: time quantum \elem [0, 100) @@ -146,22 +144,31 @@ def sendMessageCellContinuous(msg_cell, which_cell): enable_times[enable_time] = i disable_times[disable_time] = i + begin = time.time_ns() + for t in range(0, time_quanta): if t in update_times: + #print("update cell: {}".format(which_cell)) which_cell = update_times[t] - print("which cell: {}".format(which_cell)) updateCell(which_cell, msg_cell[which_cell], s0, s1, s2) if t in enable_times: + #print("enable cell: {}".format(which_cell)) which_cell = enable_times[t] addr="/avatar/parameters/" + getEnableParam(which_cell) client.send_message(addr, True) if t in disable_times: + #print("disable cell: {}".format(which_cell)) which_cell = disable_times[t] addr="/avatar/parameters/" + getEnableParam(which_cell) client.send_message(addr, False) time.sleep(dt) + end = time.time_ns() + delta_t_s = (end - begin) / (1000.0 * 1000.0 * 1000.0) + if delta_t_s < CELL_TX_TIME_S: + time.sleep(CELL_TX_TIME_S - delta_t_s) + # The board is broken down into contiguous collections of characters called # cells. Each cell contains `NUM_LAYERS` characters. We can update one cell # every ~1.0 seconds. Going faster causes the board to display garbage to @@ -214,6 +221,7 @@ def sendMessage(msg): cell_msg = msg[cell_begin:cell_end] print("Send cell {}".format(cell)) sendMessageCellDiscrete(cell_msg, cell) + #sendMessageCellContinuous(cell_msg, cell) #closeBoard() @@ -263,9 +271,11 @@ def closeBoard(): if __name__ == "__main__": generateEncoding(state) - #openBoard() - #clear() - for line in fileinput.input(): + clear() sendMessage(line) + time.sleep(1) + #with open("lorum_ipsum.txt", "r") as f: + # for line in f: + # sendMessage(line) |
