meta.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. #!/usr/bin/python3
  2. def cb_dummy(options={}):
  3. print("cb_dummy",options)
  4. return options
  5. def ValueBuffer_create_data(val=2,_min=0,_max=255,_inc=1,cycle=[0,127,255]):
  6. data = {}
  7. data["value"] = val
  8. data["init_value"] = val
  9. data["state"] = 1
  10. data["inc"] = _inc
  11. data["min"] = _min
  12. data["max"] = _max
  13. data["cycle"] = cycle
  14. data["cycle_idx"] = 0
  15. data["format"] = "<format>{}"
  16. data["name"] = "<name>"
  17. data["callback"] = cb_dummy
  18. return data
  19. def Buffer_clean(data,default={}):
  20. #print( "ValueBuffer_clean(data)" )
  21. a = ValueBuffer_create_data()
  22. #for k,v in data.items():
  23. # print(" ",id(data),[k,v])
  24. for k,v in a.items():
  25. #print(" ",id(data),[k,v])
  26. if k not in data:
  27. print(" ValueBuffer_clear key does not exist; adding key ",[k]," !")
  28. data[k] = v
  29. def ValueBuffer_clean(data):
  30. default=ValueBuffer_create_data()
  31. return Buffer_clean(data,default)
  32. def ValueBuffer_check(data):
  33. ValueBuffer_clean(data)
  34. #print(":::",data["value"],data["min"],data["max"])
  35. if data["value"] < data["min"]:
  36. data["value"] = data["min"]
  37. print("MIN !")
  38. if data["value"] > data["max"]:
  39. data["value"] = data["max"]
  40. print("MAX !")
  41. def TextBuffer_cycle(data,_dir=1):
  42. #ValueBuffer_clean(data)
  43. _max = len(data["cycle"])-1
  44. idx=data["cycle_idx"]
  45. if _dir > 0:
  46. idx += 1
  47. else:
  48. idx -= 1
  49. if idx > _max:
  50. idx = _max
  51. if idx < 0:
  52. idx=0
  53. print( len(data["cycle"]),idx)
  54. data["cycle_idx"]=idx
  55. data["value"] = data["cycle"][idx]
  56. return data["value"]
  57. def ValueBuffer_cycle(data): # middel mouse click
  58. ValueBuffer_clean(data)
  59. _len = len(data["cycle"])
  60. idx=data["cycle_idx"]
  61. if idx >= _len:
  62. idx = _len-1
  63. else:
  64. idx += 1
  65. data["cycle_idx"]=idx
  66. data["value"] = data["cycle"][idx]
  67. ValueBuffer_check(data)
  68. return data["value"]
  69. def ValueBuffer_dec(data,value=None): #Mouse Wheel down
  70. ValueBuffer_clean(data)
  71. if value is None:
  72. value = data["inc"]
  73. if type(value) is float:
  74. value = round(value,4)
  75. data["value"] -= value
  76. ValueBuffer_check(data)
  77. return data["value"]
  78. def ValueBuffer_inc(data,value=None): #Mouse Wheel up
  79. ValueBuffer_clean(data)
  80. if value is None:
  81. value = data["inc"]
  82. if type(value) is float:
  83. value = round(value,4)
  84. data["value"] += value
  85. ValueBuffer_check(data)
  86. return data["value"]
  87. def ValueBuffer_val(data,value=None): # get or set value
  88. ValueBuffer_clean(data)
  89. if value is None:
  90. return float(data["value"])
  91. if type(value) is float:
  92. data["value"] = round(value,4)
  93. data["value"] = value
  94. ValueBuffer_check(data)
  95. return float(data["value"])
  96. def ValueBuffer_reset(data): # right click
  97. ValueBuffer_clean(data)
  98. data["value"] = data["init_value"]
  99. ValueBuffer_check(data)
  100. return 1
  101. def ValueBuffer_on(data): # left click
  102. ValueBuffer_clean(data)
  103. data["state"] = 1
  104. def ValueBuffer_off(data): # left click
  105. ValueBuffer_clean(data)
  106. data["state"] = 0
  107. def ValueBuffer_toggle(data):
  108. ValueBuffer_clean(data)
  109. v = data["state"]
  110. if v:v = 0
  111. else:v = 1
  112. data["state"] = v
  113. return v
  114. def ValueBuffer_invert(data):
  115. ValueBuffer_clean(data)
  116. data["value"] *=-1
  117. ValueBuffer_check(data)
  118. def ValueBuffer_is(data):
  119. ValueBuffer_clean(data)
  120. if data["state"]:
  121. return 1
  122. return 0
  123. def ValueBuffer_format(data):
  124. ValueBuffer_clean(data)
  125. fm = data["format"]
  126. print("ValueBuffer_format", fm,data)
  127. try:
  128. if "{val" in fm and "{state" in fm:
  129. return fm.format(val=data["value"],state=data["state"])
  130. if "{val" in fm:
  131. return fm.format(val=data["value"])
  132. if "{state" in fm:
  133. return fm.format(state=data["state"])
  134. return
  135. except Exception as e:
  136. print(fm,data)
  137. raise e
  138. # warp function to object
  139. class TextCycleBuffer():
  140. def __init__(self,cycle=["a","b","c"]):
  141. self.data = ValueBuffer_create_data(val=cycle[0],cycle=cycle)
  142. def cycle(self,_dir=1): # middel mouse click
  143. print(self.data)
  144. return TextBuffer_cycle(self.data,_dir=_dir)
  145. def check(self):
  146. pass
  147. def dec(self,value=None): #Mouse Wheel down
  148. pass
  149. def inc(self,value=None): #Mouse Wheel up
  150. pass
  151. def val(self,value=None): # get or set value
  152. return self.data["value"]
  153. def reset(self): # right click
  154. self.data["cycle_idx"] = 0
  155. self.data["value"] = self.data["cycle"][0]
  156. def on(self): # left click
  157. return ValueBuffer_on(self.data)
  158. def off(self): # left click
  159. return ValueBuffer_off(self.data)
  160. def toggle(self):
  161. return ValueBuffer_toggle(self.data)
  162. def invert(self):
  163. return 0
  164. def _is(self):
  165. return ValueBuffer_is(self.data)
  166. def format(self):
  167. return ValueBuffer_format(self.data)
  168. # warp function to object
  169. class ValueBuffer():
  170. def __init__(self,val=2,_min=0,_max=255,_inc=1,cycle=[0,127,255]):
  171. self.data = ValueBuffer_create_data(val=val,_min=_min,_max=_max,_inc=_inc,cycle=cycle)
  172. def cycle(self): # middel mouse click
  173. return ValueBuffer_cycle(self.data)
  174. def check(self):
  175. return ValueBuffer_check(self.data)
  176. def dec(self,value=None): #Mouse Wheel down
  177. return ValueBuffer_dec(self.data,value)
  178. def inc(self,value=None): #Mouse Wheel up
  179. return ValueBuffer_inc(self.data,value)
  180. def val(self,value=None): # get or set value
  181. return ValueBuffer_val(self.data,value)
  182. def reset(self): # right click
  183. return ValueBuffer_reset(self.data)
  184. def on(self): # left click
  185. return ValueBuffer_on(self.data)
  186. def off(self): # left click
  187. return ValueBuffer_off(self.data)
  188. def toggle(self):
  189. return ValueBuffer_toggle(self.data)
  190. def invert(self):
  191. return ValueBuffer_invert(self.data)
  192. def _is(self):
  193. return ValueBuffer_is(self.data)
  194. def format(self):
  195. return ValueBuffer_format(self.data)
  196. def __repr__(self):
  197. return "<ValueBuffer \tON:{} \tVAL:{}>".format(self._is(),self.val())
  198. def create_default_FadeBuffer():
  199. return ValueBuffer(val=2,_min=0,_max=20,_inc=0.1)
  200. def create_default_DelayBuffer():
  201. #return ValueBuffer(val=0.04,_min=-1,_max=1,_inc=0.01,cycle=[0.1,0.2,0.3,0.4,0.5])
  202. return ValueBuffer(val=50,_min=0,_max=200,_inc=5,cycle=[50]) #0.1,0.2,0.3,0.4,0.5])
  203. def save_meta(save_as="",new=""):
  204. global FADE,DELAY, ALIGN,FADE_move,FADE_move_delay
  205. out = {}
  206. v = FADE.val()
  207. on = FADE._is()
  208. out["1"] = {"NAME":"FADE","VAL":v,"ON":on}
  209. v=FADE_move.val()
  210. on=FADE_move._is()
  211. out["4"] = {"NAME":"FADE_move","VAL":v,"ON":on}
  212. v=FADE_move_delay.val()
  213. on=FADE_move_delay._is()
  214. out["5"] = {"NAME":"FADE_move_delay","VAL":v,"ON":on}
  215. v=DELAY.val()
  216. on=DELAY._is()
  217. out["2"] = {"NAME":"DELAY","VAL":v,"ON":on}
  218. v=ALIGN.val()
  219. on=ALIGN._is()
  220. out["3"] = {"NAME":"ALIGN","VAL":v,"ON":on}
  221. filename = "meta"
  222. import lib.showlib as showlib
  223. base = showlib.Base()
  224. x =base._backup(filename,out,labels=[],save_as=save_as)
  225. print(x)
  226. print_meta()
  227. def print_meta():
  228. global FADE,DELAY, ALIGN,FADE_move,FADE_move_delay
  229. tmp = FADE
  230. print(tmp) #,tmp.val(),tmp._is())
  231. tmp = DELAY
  232. print(tmp) #,tmp.val(),tmp._is())
  233. tmp = ALIGN
  234. print(tmp) #,tmp.val(),tmp._is())
  235. tmp = FADE_move
  236. print(tmp) #,tmp.val(),tmp._is())
  237. tmp = FADE_move_delay
  238. print(tmp) #,tmp.val(),tmp._is())
  239. def load_meta(show_path=""):
  240. global FADE,DELAY, ALIGN,FADE_move,FADE_move_delay
  241. print("LOAD meta",show_path)
  242. filename = "meta"
  243. import lib.showlib as showlib
  244. base = showlib.Base()
  245. try:
  246. x = base._load(filename)
  247. #print(d,l)
  248. #print(x)
  249. lines = x[0]
  250. for k in lines:
  251. line = lines[k]
  252. print(k,line)
  253. try:
  254. pass
  255. tmp = None
  256. ok = 0
  257. if line["NAME"] == "FADE":
  258. tmp = FADE
  259. ok = 1
  260. elif line["NAME"] == "DELAY":
  261. tmp = DELAY
  262. ok = 1
  263. elif line["NAME"] == "ALIGN":
  264. tmp = ALIGN
  265. ok = 1
  266. elif line["NAME"] == "FADE_move":
  267. tmp = FADE_move
  268. ok = 1
  269. elif line["NAME"] == "FADE_move_delay":
  270. tmp = FADE_move_delay
  271. ok = 1
  272. if ok == 1:
  273. v = line["VAL"]
  274. on = line["ON"]
  275. print(" - ", line["NAME"],v,on)
  276. tmp.val(v)
  277. tmp.off()
  278. if on != 0:
  279. tmp.on()
  280. except Exception as e:
  281. print("EXCEPTION 1 load_meta error",e)
  282. #exit()
  283. finally:pass
  284. #except Exception as e:
  285. # print("EXCEPTION 2 load_meta error",e)
  286. #exit()
  287. # {"NAME":"FADE","VAL":12.3,"ON":0}
  288. print_meta()
  289. FADE = create_default_FadeBuffer()
  290. FADE.data["name"] = "FADE"
  291. FADE.data["format"] = "FADE:\n{val:0.2f}"
  292. DELAY = create_default_DelayBuffer()
  293. DELAY.data["name"] = "DELAY"
  294. DELAY.data["format"] = "DELAY:\n{val:0.0f} %"
  295. DELAY.off()
  296. #class TextCycleBuffer():
  297. ALIGN = TextCycleBuffer(cycle=["<>","><",">","<","rnd"])
  298. ALIGN.data["name"] = "ALIGN"
  299. ALIGN.data["format"] = "ALIGN:\n{val:}"
  300. ALIGN.on()
  301. FADE_move = create_default_FadeBuffer()
  302. FADE_move.data["name"] = "FADE_move"
  303. FADE_move.data["format"] = "PAN/TILT\nFADE:{val:0.2f}"
  304. FADE_move.data["init_value"] = 4.0
  305. FADE_move.reset()
  306. FADE_move_delay = create_default_DelayBuffer()
  307. FADE_move.data["name"] = "FADE_move_delay"
  308. FADE_move.data["format"] = "PAN/TILT\nD:{val:0.2f}"
  309. def OptionBuffer_create_data(val="",options=None):
  310. if not options:
  311. options = ["option1","option2"]
  312. data = {}
  313. data["options"] = options
  314. data["init_idx"] = 0
  315. data["idx"] = 0
  316. data["wrap"] = 0 #start from begining
  317. OptionBuffer_set_init(data,val)
  318. return data
  319. def OptionBuffer_set_init(data,val):
  320. idx=0
  321. if val in data:
  322. idx = data.index(val)
  323. data["init_idx"] = idx
  324. def ValueBuffer_clean(data):
  325. default=OptionBuffer_create_data()
  326. return Buffer_clean(data,default)
  327. def OptionBuffer_check(data):
  328. _len = len(data["options"])
  329. if data["wrap"]:
  330. if data["idx"] >= _len:
  331. data["idx"] = 0
  332. if data["idx"] < 0:
  333. data["idx"] = _len-1
  334. else:
  335. if data["idx"] >= _len:
  336. data["idx"] = _len-1
  337. if data["idx"] < 0:
  338. data["idx"] = 0
  339. def OptionBuffer_reset(data):
  340. ValueBuffer_clean(data)
  341. data["idx"] = data["init_idx"]
  342. OptionBuffer_check(data)
  343. def OptionBuffer_inc(data):
  344. ValueBuffer_clean(data)
  345. data["idx"] += 1
  346. OptionBuffer_check(data)
  347. def OptionBuffer_dec(data):
  348. ValueBuffer_clean(data)
  349. data["idx"] -= 1
  350. OptionBuffer_check(data)
  351. def OptionBuffer_val(data,val=None):
  352. ValueBuffer_clean(data)
  353. OptionBuffer_check(data)
  354. #val = "RGB"
  355. if val in data["options"]:
  356. print("set",val)
  357. idx = data["options"].index(val)
  358. data["idx"] = idx
  359. idx= data["idx"]
  360. return data["options"][idx]
  361. class OptionBuffer():# wrap function to object
  362. def __init__(self,val="",options=[]):
  363. self.data = OptionBuffer_create_data(val="",options=options)
  364. #self._rep = self.__repr__()
  365. def reset(self):
  366. return OptionBuffer_reset(self.data)
  367. def inc(self):
  368. return OptionBuffer_inc(self.data)
  369. def __repr__(self):
  370. return "<lib.meta.OptionBuffer {} '{}'>".format(id(self),self.val())
  371. def dec(self):
  372. return OptionBuffer_dec(self.data)
  373. def val(self,val=None):
  374. #self.data["callback"]({"val":val})
  375. return OptionBuffer_val(self.data,val=val)
  376. def set_init(self,val):
  377. return OptionBuffer_set_init(self.data,val)
  378. class Elem_Container():
  379. def __init__(self):
  380. #self.commands = []
  381. self.labels = []
  382. self.val = {}
  383. self.elem = {}
  384. ATTR_GRP = {}
  385. ATTR_GRP[" "] = [" "]
  386. ATTR_GRP["POS"] = ["PAN","TILT"]
  387. ATTR_GRP["RGB"] = ["RED","GREEN","BLUE","AMBER","WHITE"]
  388. #ATTR_GRP["CMY"] = ["CYAN","MAGENTA","YELLOW"]
  389. ATTR_GRP["BEAM"] = ["DIM","FOCUS","ZOOM","IRIS"] # GOBO1
  390. def Optionbuffer_create_ATTR_GRP(val=""):
  391. options = list(ATTR_GRP.keys())
  392. return OptionBuffer(val,options)
  393. FX_FUNC = ["SIN","COS","RAMP","RAMP2","FD","ON","STATIC","-","255"]
  394. FX_FUNC = ["sinus","cosinus","ramp","ramp2","fade","on","static","-","255"]
  395. def Optionbuffer_create_FX_FUNC(val=""):
  396. options = FX_FUNC
  397. return OptionBuffer(val,options)
  398. def Optionbuffer_create_ATTR(attr_grp="",val=""):
  399. options = ["none1","none2"]
  400. if attr_grp in ATTR_GRP:
  401. options = ATTR_GRP[attr_grp]
  402. #options.append(" ")
  403. if " " not in options:
  404. options.insert(0," ")
  405. ob = OptionBuffer(val,options)
  406. #ob.set_init(" ")
  407. ob.reset()
  408. return ob
  409. #fx_func_grp = Optionbuffer_create_ATTR_GRP()
  410. #fx_func_attr = Optionbuffer_create_ATTR("POS")
  411. #fx_func_func = Optionbuffer_create_FX_FUNC()
  412. fx_prm_main = {}
  413. fx_prm_move = {"SIZE":40,"SPEED":8,"OFFSET":100,"BASE":"0","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"SHUFFLE":0,"WING":2,"WIDTH":100}
  414. live_prm = Elem_Container()
  415. live_prm.labels = ["FADE","DELAY","PAN/TILT\nFADE","PAN/TILT\nDELAY","-","-"]
  416. live_prm.labels = ["LIVE1","LIVE2","LIVE3","LIVE4","LIVE5","LIVE6"]
  417. live_prm.labels = ["FADE","-","PAN/TILT\nFADE","-","DELAY","ALIGN"]
  418. #fx_color = {"A":"red","B":"blue"}
  419. fx_prm = {"SIZE":255,"SPEED":10,"OFFSET":100,"BASE":"-","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":1,"SHUFFLE":0,"WING":2,"WIDTH":25,"2D-X":1,"2D:MODE":0}
  420. fx_x_modes = ["spiral","left","right","up","down","left_right","up_down"]
  421. fx_modes = ["RED","GREEN","BLUE","MAG","YELLOW","CYAN"]
  422. fx_mo = ["fade","on","rnd","ramp","ramp2","cosinus","sinus","static"]
  423. # MASTER --------
  424. setup = Elem_Container()
  425. #setup.labels = ["SAVE\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS","SAVE &\nRESTART","DRAW\nGUI","PRO\nMODE"]
  426. setup.labels = ["SAVE\nSHOW","LOAD\nSHOW","NEW\nSHOW","SAVE\nSHOW AS","SAVE &\nRESTART","PRO\nMODE"]
  427. fx_main = Elem_Container()
  428. fx_main.labels =["REC-FX","FX OFF","\n"]
  429. fx_moves = Elem_Container()
  430. fx_moves.labels =[
  431. "FX:CIR","FX:PAN","FX:TILT", "WIDTH:\n100","DIR:\n0","INVERT:\n0","\n",
  432. "SHUFFLE:\n0","SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","\n"
  433. ]
  434. fx3 = Elem_Container()
  435. fx3_prm = {}
  436. fx3_grid = {}
  437. #{"SIZE":40,"SPEED":8,"OFFSET":100,"BASE":"0","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"WING":2,"WIDTH":100}
  438. fx3_grid_cfg = {}
  439. fx3_grid_cfg["GRP:"] = Optionbuffer_create_ATTR_GRP
  440. fx3_grid_cfg["ATTR:"] = Optionbuffer_create_ATTR #("POS")
  441. fx3_grid_cfg["TYPE:"] = Optionbuffer_create_FX_FUNC #()
  442. fx3_grid_cfg["WIDTH:"] = ValueBuffer #(val=2,_min=0,_max=20,_inc=0.1)
  443. fx3_grid_cfg["SIZE:"] = ValueBuffer
  444. fx3_grid_cfg["SPEED:"] = ValueBuffer
  445. fx3_grid_cfg["OFFSET:"] = ValueBuffer
  446. fx3_grid_cfg["START:"] = ValueBuffer
  447. fx3_grid_cfg["SHUFFLE:"] = ValueBuffer
  448. fx3_grid_cfg["DIR:"] = ValueBuffer
  449. fx3_grid_cfg["INVERT:"] = ValueBuffer
  450. fx3_grid_cfg["WING:"] = ValueBuffer
  451. fx3_grid_cfg["BASE:"] = ValueBuffer
  452. fx3.labels =[]
  453. for i,f in fx3_grid_cfg.items():
  454. x=[]
  455. x.append(i)
  456. for j in range(6):
  457. k="{}{}".format(i,j+1)
  458. x.append(k)
  459. fx3_grid[k] = f()
  460. fx3_grid[k].data["name"] = k #f()
  461. x.append("\n")
  462. print(":",x)
  463. fx3.labels.extend(x)
  464. def change_grp(name,val):
  465. t,i = name.split(":",1)
  466. print("--- change_grp",name,val,t,i)
  467. k2 = "ATTR:"+i
  468. print("change_grp:",(name,val),(t,i),k2,val)
  469. fx3_grid[k2] = Optionbuffer_create_ATTR(val) #,val)
  470. fx3_grid[k2].data["name"] = "ATTR:"+i
  471. #fx3_grid[k2].val(val)
  472. print(" ",k2,fx3_grid[k2].data)
  473. #print("__ "*22)
  474. #fx3_grid["GRP:1"].val("RGB")
  475. #print([fx3_grid["GRP:1"].val()])
  476. #print("_ _ "*22)
  477. #fx3_grid["ATTR:1"].val("PAN")
  478. #print([fx3_grid["ATTR:1"].val()])
  479. #print("__ "*22)
  480. fx3.labels.extend([" ","\n"])
  481. fx3.labels.extend(["\n"])
  482. fx3.labels.extend([" ","START","OFF"," ","STOP"," "," ","\n"])
  483. fx3.labels.extend(["DIM","CIRCLE","PAN","TILT","FLAY","STREET"," ","\n"])
  484. fx3.labels.extend([" ","RED","GREEN","BLUE","MAGENTA","CYAN","YELLOW","\n"])
  485. fx3.labels.extend(["SIZE:","MINI","SMALL","NORMAL","BIG"," "," ","\n"])
  486. fx3.labels.extend(["SPEED:","SLOW","MID","FAST","TURBO"," "," ","\n"])
  487. fx_cfg = Elem_Container()
  488. fx_cfg.labels =[
  489. "FX:DIM"," ", "WIDTH:\n25","WING:\n2","DIR:\n1","INVERT:\n1","\n","SHUFFLE:\n0"
  490. ,"SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","BASE:\n-","2D-X:\n-","2D:MODE"
  491. ]
  492. fx_generic = Elem_Container()
  493. fx_generic.labels =["FX:SIN","FX:COS","FX:RAMP","FX:RAMP2","FX:FD","FX:ON","FX:STATIC"]
  494. fx_color = Elem_Container()
  495. fx_color.labels =["FX:RED","FX-C:A","FX-C:B"]
  496. commands = Elem_Container()
  497. commands.labels =["\n","ESC","CFG-BTN","LABEL","-","DEL","-","\n"
  498. ,"SELECT","FLASH","GO","-","MOVE","S-KEY","\n"
  499. ,"BLIND","CLEAR","REC","EDIT","COPY",".","\n"
  500. ]