raspberry pi zero based drum machine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

StatesProg.py 78KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925
  1. import random
  2. import time
  3. import pygame
  4. import sys
  5. import pyaudio
  6. import wave
  7. import glob
  8. import os
  9. from itertools import cycle
  10. from datetime import datetime
  11. from datetime import date
  12. import ast
  13. import random
  14. from pathlib import Path
  15. import socket
  16. import git
  17. #====================================
  18. State = type("State", (object,), {})
  19. #====================================
  20. class State(object):
  21. def __init__(self, FSM):
  22. self.FSM = FSM
  23. self.timer = 0
  24. self.startTime = 0
  25. def Enter(self):
  26. self.timer = 0
  27. self.startTime = 0
  28. def Execute(self):
  29. print('Executing')
  30. def Exit(self):
  31. print('Exiting')
  32. #====================================
  33. def play_seq(o, message):
  34. _id = 0
  35. o.clear_notes_on()
  36. for s in o.soundSlots:
  37. if s.notes[message[0]][message[1]][0] == 1:
  38. o.notes_on[_id] = 1
  39. o.soundSlots[_id].play(s.notes[message[0]][message[1]][1])
  40. _id += 1
  41. #print(o.notes_on)
  42. def draw_header(o):
  43. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  44. o.center_text(o.header_text, o.h1, o.width, 25, o.light_grey)
  45. o.center_text("----------------------", o.h2, o.width, 55, o.light_grey)
  46. def text_box1(o, a, b):
  47. w1 = 0
  48. w2 = (o.width / 2) - 50
  49. h1 = 45
  50. h2 = h1 + 10
  51. o.center_block(a, o.h2, [w1,h1,w2,h2], o.light_grey)
  52. o.center_block(b, o.h2, [w1,h1+10,w2,h2+25], o.light_grey)
  53. def text_box2(o, a, b):
  54. w1 = 0
  55. w2 = (o.width / 2) - 50
  56. h1 = 90
  57. h2 = h1 + 10
  58. o.center_block(a, o.h2, [w1,h1,w2,h2], o.light_grey)
  59. o.center_block(b, o.h2, [w1,h1+10,w2,h2+25], o.light_grey)
  60. def text_box3(o, a, b):
  61. w1 = (o.width / 2) + 40
  62. w2 = o.width
  63. h1 = 45
  64. h2 = h1 + 10
  65. o.center_block(a, o.h2, [w1,h1,w2,h2], o.light_grey)
  66. o.center_block(b, o.h2, [w1,h1+10,w2,h2+25], o.light_grey)
  67. def text_box4(o, a, b):
  68. w1 = (o.width / 2) + 40
  69. w2 = o.width
  70. h1 = 90
  71. h2 = h1 + 10
  72. o.center_block(a, o.h2, [w1,h1,w2,h2], o.light_grey)
  73. o.center_block(b, o.h2, [w1,h1+10,w2,h2+25], o.light_grey)
  74. def text_center(o, a, b):
  75. w1 = 0
  76. w2 = o.width
  77. h1 = 45
  78. h2 = h1 + 10
  79. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  80. o.center_block(a, o.h1, [w1,h1,w2,h2], o.light_grey)
  81. o.center_block(b, o.h1, [w1,h1+20,w2,h2+45], o.light_grey)
  82. #====================================
  83. def breakup_song_text(song):
  84. line1 = ""
  85. line2 = ""
  86. line3 = ""
  87. line4 = ""
  88. if len(song) < 9:
  89. for x in song:
  90. line1 += str(x) + '.'
  91. elif len(song) < 17:
  92. _iter = 0
  93. for x in song:
  94. if _iter < 8:
  95. line1 += str(x) + '.'
  96. else:
  97. line2 += str(x) + '.'
  98. _iter += 1
  99. elif len(song) < 25:
  100. _iter = 0
  101. for x in song:
  102. if _iter < 8:
  103. line1 += str(x) + '.'
  104. elif _iter < 16:
  105. line2 += str(x) + '.'
  106. else:
  107. line3 += str(x) + '.'
  108. _iter += 1
  109. elif len(song) < 33:
  110. _iter = 0
  111. for x in song:
  112. if _iter < 8:
  113. line1 += str(x) + '.'
  114. elif _iter < 16:
  115. line2 += str(x) + '.'
  116. elif _iter < 24:
  117. line3 += str(x) + '.'
  118. else:
  119. line4 += str(x) + '.'
  120. _iter += 1
  121. else:
  122. _iter = 0
  123. cur_id = len(song) - 1
  124. _iter = 0
  125. ns = song.copy()
  126. while len(ns) > 31:
  127. del ns[0]
  128. for x in ns:
  129. if _iter < 7:
  130. line1 += str(x) + '.'
  131. elif _iter < 15:
  132. line2 += str(x) + '.'
  133. elif _iter < 23:
  134. line3 += str(x) + '.'
  135. else:
  136. line4 += str(x) + '.'
  137. _iter += 1
  138. line1 = ".." + line1
  139. return [line1, line2, line3, line4]
  140. def draw_menu1(o):
  141. bpm_inc = 4
  142. x_size = o.width / 4
  143. y_size = o.height / 4
  144. og_x = 0
  145. o_x = og_x
  146. o_y = o.height
  147. text_padding = 6
  148. _id = 0
  149. while _id < 16:
  150. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.blue)
  151. if _id == 0:
  152. o.center_block("Main", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  153. if _id == 1:
  154. o.center_block("Note", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  155. if _id == 2:
  156. o.center_block("Patt", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  157. if _id == 3:
  158. o.center_block("Song", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  159. if _id == 4:
  160. o.center_block("File", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  161. if _id == 5:
  162. o.center_block("Util", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  163. # if _id == 6:
  164. # o.center_block("Bank-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  165. # if _id == 7:
  166. # o.center_block("Bank+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  167. if _id == 8:
  168. o.center_block("Vol-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  169. if _id == 9:
  170. o.center_block("Vol+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  171. if _id == 11:
  172. o.center_block("", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  173. if _id == 12:
  174. o.center_block("Play", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  175. if _id == 13:
  176. o.center_block("Stop", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  177. if _id == 14:
  178. o.center_block("BPM-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  179. if _id == 15:
  180. o.center_block("BPM+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  181. o_x = o_x + x_size
  182. _id += 1
  183. if _id % 4 == 0:
  184. o_y -= y_size
  185. o_x = og_x
  186. def draw_menu2_sample(o):
  187. bpm_inc = 4
  188. x_size = o.width / 4
  189. y_size = o.height / 4
  190. og_x = 0
  191. o_x = og_x
  192. o_y = o.height
  193. text_padding = 6
  194. _id = 0
  195. while _id < 16:
  196. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.dark_grey)
  197. if _id == 0:
  198. o.center_block("Copy", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  199. if _id == 1:
  200. o.center_block("Paste", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  201. if _id == 2:
  202. o.center_block("Del", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  203. if _id == 3:
  204. o.center_block("Load", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  205. if _id == 4:
  206. o.center_block("Vol-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  207. if _id == 5:
  208. o.center_block("Vol+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  209. if _id == 6:
  210. o.center_block("Bank-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  211. if _id == 7:
  212. o.center_block("Bank+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  213. if _id == 8:
  214. o.center_block("Pitch-", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  215. if _id == 9:
  216. o.center_block("Pitch+", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  217. if _id == 12:
  218. if o.odub == True:
  219. o.center_block("Odub", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.pink)
  220. else:
  221. o.center_block("Odub", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  222. if _id == 13:
  223. o.center_block("Undo", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  224. o_x = o_x + x_size
  225. _id += 1
  226. if _id % 4 == 0:
  227. o_y -= y_size
  228. o_x = og_x
  229. def draw_menu2_pattern(o):
  230. bpm_inc = 4
  231. x_size = o.width / 4
  232. y_size = o.height / 4
  233. og_x = 0
  234. o_x = og_x
  235. o_y = o.height
  236. text_padding = 6
  237. _id = 0
  238. while _id < 16:
  239. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.dark_grey)
  240. if _id == 0:
  241. o.center_block("Copy", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  242. if _id == 1:
  243. o.center_block("Paste", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  244. if _id == 2:
  245. o.center_block("Clear", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  246. if _id == 6:
  247. o.center_block("Bank -", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  248. if _id == 7:
  249. o.center_block("Bank +", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  250. o_x = o_x + x_size
  251. _id += 1
  252. if _id % 4 == 0:
  253. o_y -= y_size
  254. o_x = og_x
  255. def draw_menu2_note(o):
  256. bpm_inc = 4
  257. x_size = o.width / 4
  258. y_size = o.height / 4
  259. og_x = 0
  260. o_x = og_x
  261. o_y = o.height
  262. text_padding = 6
  263. _id = 0
  264. while _id < 16:
  265. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.dark_grey)
  266. if _id == 0:
  267. o.center_block("Vol -", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  268. elif _id == 1:
  269. o.center_block("Vol +", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  270. elif _id == 12:
  271. if o.patternFollow:
  272. o.center_block("Follow", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.pink)
  273. else:
  274. o.center_block("Follow", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  275. o_x = o_x + x_size
  276. _id += 1
  277. if _id % 4 == 0:
  278. o_y -= y_size
  279. o_x = og_x
  280. def draw_menu2_song(o):
  281. bpm_inc = 4
  282. x_size = o.width / 4
  283. y_size = o.height / 4
  284. og_x = 0
  285. o_x = og_x
  286. o_y = o.height
  287. text_padding = 6
  288. _id = 0
  289. while _id < 16:
  290. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.dark_grey)
  291. if _id == 6:
  292. o.center_block("Bank -", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  293. if _id == 7:
  294. o.center_block("Bank +", o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  295. o_x = o_x + x_size
  296. _id += 1
  297. if _id % 4 == 0:
  298. o_y -= y_size
  299. o_x = og_x
  300. def menu1_actions(self, o):
  301. if o.keyState[16] == 2:
  302. if o.keyState[0] == 1:
  303. self.FSM.ToTransition('toMain')
  304. elif o.keyState[1] == 1:
  305. self.FSM.ToTransition('toEditSoundSequence')
  306. elif o.keyState[2] == 1:
  307. self.FSM.ToTransition('toSelectPattern')
  308. elif o.keyState[3] == 1:
  309. self.FSM.ToTransition('toEditSong')
  310. elif o.keyState[4] == 1:
  311. self.FSM.ToTransition('toFile')
  312. elif o.keyState[5] == 1:
  313. self.FSM.ToTransition('toUtil')
  314. if o.keyState[12] == 1:
  315. o.start_playback()
  316. play_seq(o, [o.curPattern, 0])
  317. if o.keyState[13] == 1:
  318. o.stop_playback()
  319. # if o.keyState[6] == 1:
  320. # if o.note_bank > 0:
  321. # o.note_bank -= 1
  322. # if o.keyState[7] == 1:
  323. # if o.note_bank < 3:
  324. # o.note_bank += 1
  325. if o.keyState[8] == 1:
  326. if o.volume > 0:
  327. o.volume -= 1
  328. text_center(o, "Master Volume", str(o.volume))
  329. o.update_display(0)
  330. if o.keyState[9] == 1:
  331. if o.volume < 16:
  332. o.volume += 1
  333. text_center(o, "Master Volume", str(o.volume))
  334. o.update_display(0)
  335. if o.keyState[11] == 1:
  336. #o.save_song()
  337. pass
  338. if o.keyState[14] == 1:
  339. if o.bpm > 60:
  340. o.bpm = o.bpm - o.bpm_inc
  341. o.update_bpm()
  342. text_center(o, "Master BPM", str(o.bpm))
  343. o.update_display(0)
  344. if o.keyState[15] == 1:
  345. if o.bpm < 240:
  346. o.bpm = o.bpm + o.bpm_inc
  347. o.update_bpm()
  348. text_center(o, "Master BPM", str(o.bpm))
  349. o.update_display(0)
  350. def menu2_actions_sample(self, o):
  351. if o.keyState[17] == 2:
  352. if o.keyState[0] == 1:
  353. if o.soundSlots[o.eSound].volume > 0:
  354. print('copy')
  355. o.soundClipboard = [o.soundSlots[o.eSound].file, o.soundSlots[o.eSound].volume, o.soundSlots[o.eSound].pitch]
  356. print(o.soundClipboard)
  357. #text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
  358. #o.update_display(0)
  359. elif o.keyState[1] == 1:
  360. print('pasting ', o.soundClipboard)
  361. o.soundSlots[o.eSound].file = o.soundClipboard[0]
  362. o.soundSlots[o.eSound].volume = o.soundClipboard[1]
  363. o.soundSlots[o.eSound].pitch = o.soundClipboard[2]
  364. o.soundSlots[o.eSound].create_sound()
  365. o.soundSlots[o.eSound].set_pitch()
  366. #s = o.SoundSlot(o.soundClipboard[0], o.eSound, o)
  367. #s.volume = o.soundClipboard[1]
  368. #s.pitch = o.soundClipboard[2]
  369. #s.notes = s.init_notes()
  370. #o.soundSlots[o.eSound] = s
  371. elif o.keyState[2] == 1:
  372. print('delete sound ', o.eSound)
  373. o.soundSlots[o.eSound].file = None
  374. o.soundSlots[o.eSound].volume = 16
  375. o.soundSlots[o.eSound].pitch = 0
  376. elif o.keyState[3] == 1:
  377. print('load')
  378. o.FSM.FSM.ToTransition("toLoadSound")
  379. elif o.keyState[4] == 1:
  380. if o.soundSlots[o.eSound].volume > 0:
  381. o.soundSlots[o.eSound].volume -= 1
  382. text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
  383. o.update_display(0)
  384. elif o.keyState[5] == 1:
  385. if o.soundSlots[o.eSound].volume < 16:
  386. o.soundSlots[o.eSound].volume += 1
  387. text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
  388. o.update_display(0)
  389. elif o.keyState[6] == 1:
  390. if o.note_bank > 0:
  391. o.note_bank -= 1
  392. text_center(o, "Sound Bank", str(o.note_bank))
  393. o.update_display(0)
  394. elif o.keyState[7] == 1:
  395. if o.note_bank < 3:
  396. o.note_bank += 1
  397. text_center(o, "Sound Bank", str(o.note_bank))
  398. o.update_display(0)
  399. elif o.keyState[8] == 1:
  400. if o.soundSlots[o.eSound].pitch > -10:
  401. o.soundSlots[o.eSound].pitch -= 1
  402. text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
  403. o.soundSlots[o.eSound].set_pitch()
  404. o.update_display(0)
  405. elif o.keyState[9] == 1:
  406. if o.soundSlots[o.eSound].pitch < 10:
  407. o.soundSlots[o.eSound].pitch += 1
  408. text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
  409. o.soundSlots[o.eSound].set_pitch()
  410. o.update_display(0)
  411. elif o.keyState[12] == 1:
  412. o.odub = not o.odub
  413. o.undo_buf = []
  414. print('odub now is ', o.odub)
  415. draw_menu2_sample(o)
  416. o.update_display(0)
  417. elif o.keyState[13] == 1:
  418. print('undo something')
  419. for i in o.undo_buf:
  420. o.soundSlots[i[0]].notes[i[1]][i[2]][0] = 0
  421. o.soundSlots[i[0]].notes[i[1]][i[2]][1] = 0
  422. o.undo_buf = []
  423. def menu2_actions_pattern(self, o):
  424. if o.keyState[17] == 2:
  425. if o.keyState[0] == 1:
  426. print('copy')
  427. o.patternClipboard = []
  428. for s in o.soundSlots:
  429. notes = []
  430. for i in s.notes[o.ePattern]:
  431. notes.append([i[0], i[1]])
  432. #i[0] = 0
  433. #i[1] = 0
  434. o.patternClipboard.append(notes)
  435. print('adding to clip ', notes)
  436. # if o.soundSlots[o.eSound].volume > 0:
  437. # o.soundSlots[o.eSound].volume -= 1
  438. # text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
  439. # o.update_display(0)
  440. elif o.keyState[1] == 1:
  441. print('paste')
  442. if o.patternClipboard != []:
  443. p = 0
  444. for s in o.soundSlots:
  445. n = 0
  446. for i in s.notes[o.ePattern]:
  447. i[0] = o.patternClipboard[p][n][0]
  448. i[1] = o.patternClipboard[p][n][1]
  449. n += 1
  450. print('added ', o.patternClipboard[p])
  451. p += 1
  452. else:
  453. print('nothing to paste')
  454. # if o.soundSlots[o.eSound].volume < 16:
  455. # o.soundSlots[o.eSound].volume += 1
  456. # text_center(o, "Sample Volume", str(o.soundSlots[o.eSound].volume))
  457. # o.update_display(0)
  458. elif o.keyState[2] == 1:
  459. print('clear')
  460. print(o.soundSlots[o.eSound].notes[o.ePattern])
  461. for s in o.soundSlots:
  462. for i in s.notes[o.ePattern]:
  463. i[0] = 0
  464. i[1] = 0
  465. #print(o.soundSlots[o.eSound].notes[o.ePattern])
  466. # if o.soundSlots[o.eSound].pitch > -10:
  467. # o.soundSlots[o.eSound].pitch -= 1
  468. # text_center(o, "Sample Pitch", str(o.soundSlots[o.eSound].pitch))
  469. # o.soundSlots[o.eSound].set_pitch()
  470. # o.update_display(0)
  471. elif o.keyState[6] == 1:
  472. if o.pat_bank > 0:
  473. o.pat_bank -= 1
  474. text_center(o, "Pattern Bank", str(o.pat_bank))
  475. o.update_display(0)
  476. elif o.keyState[7] == 1:
  477. if o.pat_bank < 3:
  478. o.pat_bank += 1
  479. text_center(o, "Pattern Bank", str(o.pat_bank))
  480. o.update_display(0)
  481. def menu2_actions_song(self, o):
  482. if o.keyState[17] == 2:
  483. if o.keyState[6] == 1:
  484. if o.pat_bank > 0:
  485. o.pat_bank -= 1
  486. text_center(o, "Pattern Bank", str(o.pat_bank))
  487. o.update_display(0)
  488. elif o.keyState[7] == 1:
  489. if o.pat_bank < 3:
  490. o.pat_bank += 1
  491. text_center(o, "Pattern Bank", str(o.pat_bank))
  492. o.update_display(0)
  493. def menu2_actions_note(self, o):
  494. if o.keyState[17] == 2:
  495. if o.keyState[0] == 1:
  496. if o.note_vol > 0:
  497. o.note_vol -= 1
  498. text_center(o, "Note Volume", str(o.note_vol))
  499. o.update_display(0)
  500. elif o.keyState[1] == 1:
  501. if o.note_vol < 16:
  502. o.note_vol += 1
  503. text_center(o, "Note Volume", str(o.note_vol))
  504. o.update_display(0)
  505. elif o.keyState[12] == 1:
  506. if o.patternFollow:
  507. o.patternFollow = False
  508. else:
  509. o.patternFollow = True
  510. #o.patternFollow != o.patternFollow
  511. print('pattern follow is ', o.patternFollow)
  512. draw_menu2_note(o)
  513. o.update_display(0)
  514. def util_command(self, o, command):
  515. if command == "Clock":
  516. self.FSM.ToTransition('toClock')
  517. elif command == "Balls":
  518. self.FSM.ToTransition('toBall')
  519. elif command == "Defender":
  520. self.FSM.ToTransition('toDefender')
  521. elif command == "Exit":
  522. self.FSM.ToTransition('toExit')
  523. elif command == "Theme":
  524. self.FSM.ToTransition('toSelTheme')
  525. elif command == "Reboot":
  526. self.FSM.ToTransition('toReboot')
  527. elif command == "Update":
  528. self.FSM.ToTransition('toUpdate')
  529. #os.system("sudo reboot")
  530. elif command == "Shutdown":
  531. self.FSM.ToTransition('toShutdown')
  532. elif command == "Ping":
  533. self.FSM.ToTransition('toPing')
  534. elif command == "Wifi":
  535. self.FSM.ToTransition('toWifi')
  536. def file_command(self, o, command):
  537. if command == "Save":
  538. if o.sconf['title'] != "blank":
  539. o.save_song()
  540. else:
  541. print('cant save over blank')
  542. elif command == "Open":
  543. self.FSM.ToTransition('toOpenSong')
  544. elif command == "Save As":
  545. self.FSM.ToTransition('toEnterText')
  546. elif command == "New":
  547. #self.FSM.ToTransition('toEnterText')
  548. #o.title = '_blank'
  549. o.mconf['default_song'] = '_blank'
  550. o.load_song()
  551. #====================================
  552. class Example(State):
  553. def __init__(self,FSM):
  554. super(Example, self).__init__(FSM)
  555. def Enter(self):
  556. self.FSM.stateLife = 1
  557. super(Example, self).Enter()
  558. def Execute(self):
  559. self.FSM.stateLife += 1
  560. def Exit(self):
  561. pass
  562. #====================================
  563. class Startup(State):
  564. def __init__(self,FSM):
  565. super(Startup, self).__init__(FSM)
  566. def Enter(self):
  567. self.FSM.stateLife = 1
  568. self.birth = time.perf_counter()
  569. super(Startup, self).Enter()
  570. def Execute(self):
  571. self.FSM.stateLife += 1
  572. print('startup state')
  573. if hasattr(self, 'birth'):
  574. pass
  575. else:
  576. self.birth = time.perf_counter()
  577. self.FSM.ToTransition('toIntro')
  578. def Exit(self):
  579. pass
  580. #====================================
  581. class Intro(State):
  582. def __init__(self,FSM):
  583. super(Intro, self).__init__(FSM)
  584. def Enter(self):
  585. self.FSM.stateLife = 1
  586. o = self.FSM.owner
  587. o.header_text = "Starting up..."
  588. o.draw.rectangle((0, 0, self.FSM.owner.width, self.FSM.owner.height), outline=0, fill=o.blue)
  589. #draw_header(o)
  590. #o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  591. o.center_block("Starting up...", o.h2, [0, 0, o.width, o.height], o.light_grey)
  592. #o.display_thread.start()
  593. o.update_display(0)
  594. #o.update_display(0)
  595. super(Intro, self).Enter()
  596. def Execute(self):
  597. self.FSM.stateLife += 1
  598. o = self.FSM.owner
  599. self.FSM.ToTransition('toLoadDefault')
  600. def Exit(self):
  601. pass
  602. #====================================
  603. class LoadDefault(State):
  604. def __init__(self,FSM):
  605. super(LoadDefault, self).__init__(FSM)
  606. def Enter(self):
  607. self.FSM.stateLife = 1
  608. o = self.FSM.owner
  609. o.init_slots()
  610. o.load_song()
  611. self.bank = 0
  612. self.sounds = []
  613. self.globbed = glob.glob('/home/pi/skull/*.wav') + glob.glob('/home/pi/skull/*.mp3')
  614. self.globbed.sort()
  615. obj_id = 0
  616. # for s in o.sconf['sounds']:
  617. # p1 = self.FSM.owner.SoundSlot(s, obj_id, o)
  618. # self.FSM.owner.soundSlots.append(p1)
  619. # obj_id += 1
  620. # _iter = 0
  621. # lst = ast.literal_eval(o.sconf['notes'][0])
  622. # print('length ', len(lst))
  623. # for n in o.soundSlots:
  624. # m = []
  625. # if _iter < (len(o.sconf.as_list('notes')) - 1):
  626. # lst = ast.literal_eval(o.sconf.as_list('notes')[_iter])
  627. # n.notes = lst
  628. # _iter += 1
  629. super(LoadDefault, self).Enter()
  630. def Execute(self):
  631. self.FSM.stateLife += 1
  632. self.FSM.ToTransition('toMain')
  633. def Exit(self):
  634. pass
  635. #====================================
  636. #====================================
  637. class Main(State):
  638. def __init__(self,FSM):
  639. super(Main, self).__init__(FSM)
  640. def Enter(self):
  641. print('hello main')
  642. self.FSM.owner.pub.register("beat", self)
  643. self.FSM.stateLife = 1
  644. o = self.FSM.owner
  645. o.header_text = "Sound Select"
  646. if o.keyState[16] > 0 or o.keyState[17] > 0:
  647. pass
  648. else:
  649. draw_header(o)
  650. self.draw_square()
  651. text_box1(o, "Vol", str(o.soundSlots[o.eSound].volume))
  652. text_box2(o, "BPM", str(o.bpm))
  653. text_box4(o, "Bank", str(o.note_bank))
  654. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  655. o.update_display(0)
  656. #o.soundSlots[2].volume = 2
  657. self.recording = True
  658. self.record_queue = []
  659. self.undo_queue = []
  660. super(Main, self).Enter()
  661. def Execute(self):
  662. o = self.FSM.owner
  663. menu1_actions(self, o)
  664. menu2_actions_sample(self, o)
  665. #self.FSM.ToTransition('toClock')
  666. if o.keyState[16] == 1:
  667. draw_menu1(o)
  668. o.update_display(0)
  669. elif o.keyState[16] == 4:
  670. draw_header(o)
  671. self.draw_square()
  672. #print('esound ', o.eSound)
  673. #print('oss ', o.soundSlots[o.eSound].volume)
  674. text_box1(o, "Vol", str(o.soundSlots[o.eSound].volume))
  675. text_box2(o, "BPM", str(o.bpm))
  676. text_box4(o, "Bank", str(o.note_bank))
  677. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  678. o.update_display(0)
  679. if o.keyState[17] == 1:
  680. draw_menu2_sample(o)
  681. o.update_display(0)
  682. elif o.keyState[17] == 4:
  683. draw_header(o)
  684. self.draw_square()
  685. text_box1(o, "Vol", str(o.soundSlots[o.eSound].volume))
  686. text_box2(o, "BPM", str(o.bpm))
  687. text_box4(o, "Bank", str(o.note_bank))
  688. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  689. o.update_display(0)
  690. _id = 0
  691. for k in o.keyState:
  692. if _id > 15:
  693. pass
  694. else:
  695. if o.keyState[16] > 0 or o.keyState[17] > 0:
  696. pass
  697. else:
  698. if k == 1:
  699. note = _id + o.note_bank * 16
  700. self.record_queue = pygame.time.get_ticks()
  701. print('bpm is ', o.half_bpm, ' ', self.record_queue)
  702. o.soundSlots[note].play(o.note_vol)
  703. o.eSound = note
  704. print('now editing sound ', o.eSound)
  705. draw_header(o)
  706. #text_box1(o, "SVol", str(o.soundSlots[o.eSound].volume))
  707. text_box1(o, "SVol", str(o.slots[o.eSound].volume))
  708. text_box2(o, "BPM", str(o.bpm))
  709. text_box4(o, "Bank", str(o.note_bank))
  710. #text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  711. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  712. self.draw_square()
  713. o.update_display(0)
  714. _id += 1
  715. def ReceiveMessage(self, message):
  716. o = self.FSM.owner
  717. play_seq(o, message)
  718. if o.keyState[16] > 0 or o.keyState[17] > 0:
  719. pass
  720. else:
  721. draw_header(o)
  722. self.draw_square()
  723. text_box1(o, "SVol", str(o.soundSlots[o.eSound].volume))
  724. text_box2(o, "BPM", str(o.bpm))
  725. text_box4(o, "Bank", str(o.note_bank))
  726. text_box3(o, "Pitch", str(o.soundSlots[o.eSound].pitch))
  727. o.update_display(0)
  728. if self.record_queue != []:
  729. cur_time = pygame.time.get_ticks()
  730. note_pos = (cur_time - self.record_queue) - (o.half_bpm / 2)
  731. print(note_pos)
  732. if o.odub == True:
  733. if note_pos > (o.half_bpm):
  734. _note = 0
  735. if message[1] == 0:
  736. _note = 15
  737. else:
  738. _note = message[1] - 1
  739. if o.soundSlots[o.eSound].notes[message[0]][_note][0] != 1:
  740. o.soundSlots[o.eSound].notes[message[0]][_note][0] = 1
  741. o.soundSlots[o.eSound].notes[message[0]][_note][1] = o.note_vol
  742. o.undo_buf.append([o.eSound, message[0], _note])
  743. print(o.undo_buf)
  744. else:
  745. if o.soundSlots[o.eSound].notes[message[0]][message[1]][0] != 1:
  746. o.soundSlots[o.eSound].notes[message[0]][message[1]][0] = 1
  747. o.soundSlots[o.eSound].notes[message[0]][message[1]][1] = o.note_vol
  748. o.undo_buf.append([o.eSound, message[0], message[1]])
  749. print(o.undo_buf)
  750. self.record_queue = []
  751. def draw_square(self):
  752. o = self.FSM.owner
  753. size = 22
  754. og_x = (o.width / 2) - (size * 2)
  755. o_x = og_x
  756. o_y = 127
  757. _id = o.note_bank * 16
  758. while _id < ((o.note_bank * 16) + 16):
  759. if _id == o.eSound:
  760. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.light_grey, width=1)
  761. elif o.notes_on[_id] == 1:
  762. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.grey, width=1)
  763. #elif _id > (len(o.soundSlots) - 1):
  764. elif self.has_sample(o, _id) == False:
  765. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.dark_grey, width=1)
  766. else:
  767. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.blue, width=1)
  768. o_x = o_x + size
  769. _id += 1
  770. if _id % 4 == 0:
  771. o_y -= size
  772. o_x = og_x
  773. def has_sample(self, o, slot):
  774. if o.soundSlots[slot].file != None:
  775. return True
  776. else:
  777. return False
  778. def Exit(self):
  779. self.FSM.owner.pub.unregister("beat", self)
  780. #====================================
  781. #====================================
  782. class PadPlayer(State):
  783. def __init__(self,FSM):
  784. super(PadPlayer, self).__init__(FSM)
  785. def Enter(self):
  786. self.FSM.stateLife = 1
  787. print('entering pad player')
  788. super(PadPlayer, self).Enter()
  789. def Execute(self):
  790. self.FSM.stateLife += 1
  791. _id = 0
  792. for k in self.FSM.owner.keyState:
  793. if _id < 16 and k == 1:
  794. self.FSM.owner.soundSlots[_id].play()
  795. _id += 1
  796. if self.FSM.owner.keys:
  797. print("Pressed: ", self.FSM.owner.keys)
  798. #self.FSM.ToTransition('toLand')
  799. def Exit(self):
  800. pass
  801. #====================================
  802. class SeqPlayer(State):
  803. def __init__(self,FSM):
  804. super(SeqPlayer, self).__init__(FSM)
  805. def Enter(self):
  806. self.FSM.stateLife = 1
  807. self.beat = 0
  808. self.FSM.owner.pub.register("beat", self)
  809. print('entering seq player')
  810. o = self.FSM.owner
  811. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  812. o.draw.text((20, 0), 'SeqPlayer', font=o.h1, fill="#FFFFFF")
  813. o.update_display(0)
  814. super(SeqPlayer, self).Enter()
  815. def Execute(self):
  816. self.FSM.stateLife += 1
  817. o = self.FSM.owner
  818. if o.keyState[12] == 1:
  819. o.start_playback()
  820. play_seq(o, [o.curPattern, 0])
  821. if o.keyState[13] == 1:
  822. o.stop_playback()
  823. #self.beat = o.playhead
  824. #print('key0 ', o.keyState[16])
  825. if o.keyState[16] == 2:
  826. #print('key0 ', o.keyState[16])
  827. if o.keyState[0] == 1:
  828. print('to main')
  829. self.FSM.ToTransition('toMain')
  830. def ReceiveMessage(self, message):
  831. #print(self.name, 'got message', message)
  832. o = self.FSM.owner
  833. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  834. o.draw.text((20, 0), str(message[0]) + ' - ' + str(message[1]), font=o.h1, fill="#FFFFFF")
  835. o.update_display(0)
  836. play_seq(o, message)
  837. def Exit(self):
  838. self.FSM.owner.pub.unregister("beat", self)
  839. #====================================
  840. #====================================
  841. class SelectSound(State):
  842. def __init__(self,FSM):
  843. super(SelectSound, self).__init__(FSM)
  844. def Enter(self):
  845. self.FSM.stateLife = 1
  846. o = self.FSM.owner
  847. o.header_text = "SelSou"
  848. o.pub.register("beat", self)
  849. draw_header(o)
  850. self.draw_square()
  851. o.update_display(0)
  852. super(SelectSound, self).Enter()
  853. def Execute(self):
  854. o = self.FSM.owner
  855. if o.keyState[16] == 1:
  856. draw_menu1(o)
  857. o.update_display(0)
  858. elif o.keyState[16] == 4:
  859. draw_header(o)
  860. self.draw_square()
  861. o.update_display(0)
  862. if o.keyState[16] == 2:
  863. if o.keyState[0] == 1:
  864. self.FSM.ToTransition('toMain')
  865. else:
  866. _id = 0
  867. for k in o.keyState:
  868. if _id > 15:
  869. pass
  870. else:
  871. if k == 1:
  872. o.eSound = _id
  873. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  874. o.draw.text((0, 0), "SelSou", font=o.h1, fill=o.light_blue)
  875. o.draw.text((20, 60), str(o.eSound), font=o.h2, fill=o.light_grey)
  876. self.draw_square()
  877. o.update_display(0)
  878. self.FSM.owner.soundSlots[_id].play()
  879. #print('now editing sound ', _id)
  880. _id += 1
  881. def ReceiveMessage(self, message):
  882. _id = 0
  883. o = self.FSM.owner
  884. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=(0, 0, 0))
  885. o.draw.text((0, 0), "SelSou", font=o.h1, fill="#FFFFFF")
  886. o.draw.text((0, 20), str(o.eSound), font=o.h2, fill="#FFFFFF")
  887. o.update_display(0)
  888. play_seq(o, message)
  889. def draw_square(self):
  890. o = self.FSM.owner
  891. size = 32
  892. og_x = 110
  893. o_x = og_x
  894. o_y = 0
  895. _id = 0
  896. for n in o.soundSlots[o.eSound].notes[o.ePattern]:
  897. if _id == o.eSound:
  898. o.draw.rectangle((o_x, o_y, o_x + size, o_y + size), outline=0, fill=o.light_grey)
  899. else:
  900. o.draw.rectangle((o_x, o_y, o_x + size, o_y + size), outline=0, fill=o.dark_grey)
  901. o_x = o_x + size
  902. _id += 1
  903. if _id % 4 == 0:
  904. o_y += size
  905. o_x = og_x
  906. def Exit(self):
  907. self.FSM.owner.pub.unregister("beat", self)
  908. #====================================
  909. class SelectPattern(State):
  910. def __init__(self,FSM):
  911. super(SelectPattern, self).__init__(FSM)
  912. def Enter(self):
  913. self.FSM.stateLife = 1
  914. o = self.FSM.owner
  915. o.header_text = "Select Pattern"
  916. o.pub.register("beat", self)
  917. self.cur_playing = 0
  918. self.active_patterns = []
  919. self.get_active_patterns(o)
  920. if o.keyState[16] > 0 or o.keyState[17] > 0:
  921. pass
  922. else:
  923. draw_header(o)
  924. self.draw_square()
  925. text_box1(o, "Pat", str(o.ePattern))
  926. text_box4(o, "Bank", str(o.pat_bank))
  927. o.update_display(0)
  928. super(SelectPattern, self).Enter()
  929. def Execute(self):
  930. o = self.FSM.owner
  931. menu1_actions(self, o)
  932. menu2_actions_pattern(self, o)
  933. if o.keyState[16] == 1:
  934. draw_menu1(o)
  935. o.update_display(0)
  936. elif o.keyState[16] == 4:
  937. draw_header(o)
  938. self.draw_square()
  939. text_box1(o, "Pat", str(o.ePattern))
  940. text_box4(o, "Bank", str(o.pat_bank))
  941. o.update_display(0)
  942. if o.keyState[17] == 1:
  943. draw_menu2_pattern(o)
  944. o.update_display(0)
  945. elif o.keyState[17] == 4:
  946. draw_header(o)
  947. self.get_active_patterns(o)
  948. self.draw_square()
  949. text_box1(o, "Pat", str(o.ePattern))
  950. text_box4(o, "Bank", str(o.pat_bank))
  951. o.update_display(0)
  952. if o.keyState[16] > 0 or o.keyState[17] > 0:
  953. pass
  954. else:
  955. _id = 0
  956. for k in o.keyState:
  957. if _id > 15:
  958. pass
  959. else:
  960. if k == 1:
  961. o.ePattern = (o.pat_bank * 16) +_id
  962. draw_header(o)
  963. self.draw_square()
  964. text_box1(o, "Pat", str(o.ePattern))
  965. text_box4(o, "Bank", str(o.pat_bank))
  966. o.update_display(0)
  967. _id += 1
  968. def ReceiveMessage(self, message):
  969. o = self.FSM.owner
  970. play_seq(o, message)
  971. if message[0] != self.cur_playing:
  972. #print('playing ', message)
  973. self.cur_playing = message[0]
  974. if o.keyState[16] > 0 or o.keyState[17] > 0:
  975. pass
  976. else:
  977. draw_header(o)
  978. self.draw_square()
  979. text_box1(o, "Pat", str(o.ePattern))
  980. text_box4(o, "Bank", str(o.pat_bank))
  981. o.update_display(0)
  982. def draw_square(self):
  983. o = self.FSM.owner
  984. size = 22
  985. og_x = (o.width / 2) - (size * 2)
  986. o_x = og_x
  987. o_y = 127
  988. _id = 0
  989. for n in o.soundSlots[o.eSound].notes[o.ePattern]:
  990. if (_id + (o.pat_bank * 16)) == o.ePattern:
  991. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.olive, width=1)
  992. elif (_id + (o.pat_bank * 16)) == self.cur_playing:
  993. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.light_grey, width=1)
  994. elif self.active_patterns[_id] == 1:
  995. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.blue, width=1)
  996. else:
  997. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.dark_grey, width=1)
  998. o_x = o_x + size
  999. _id += 1
  1000. if _id % 4 == 0:
  1001. o_y -= size
  1002. o_x = og_x
  1003. def get_active_patterns(self, o):
  1004. #for n in o.soundSlots[o.eSound]
  1005. self.active_patterns = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
  1006. pat_iter = o.pat_bank * 16
  1007. _iter = 0
  1008. print('is this note on? ', o.soundSlots[0].notes[0][0][0])
  1009. while pat_iter < ((o.pat_bank * 16) + 16):
  1010. for s in o.soundSlots:
  1011. print('checking soundSlot ', s.id)
  1012. pat_used = 0
  1013. for p in s.notes[pat_iter]:
  1014. if self.active_patterns[_iter] == 1:
  1015. break
  1016. if p[0] == 1:
  1017. #pat_used = 1
  1018. self.active_patterns[_iter] = 1
  1019. print('found ', pat_iter, ' -- ', p[0])
  1020. break
  1021. #self.active_patterns.append(pat_used)
  1022. pat_iter += 1
  1023. _iter += 1
  1024. print('active patterns ', self.active_patterns)
  1025. def Exit(self):
  1026. self.FSM.owner.pub.unregister("beat", self)
  1027. #====================================
  1028. class EditSoundSequence(State):
  1029. def __init__(self,FSM):
  1030. super(EditSoundSequence, self).__init__(FSM)
  1031. def Enter(self):
  1032. self.FSM.stateLife = 1
  1033. o = self.FSM.owner
  1034. o.header_text = "Note Edit"
  1035. o.pub.register("beat", self)
  1036. self.curPattern = o.ePattern
  1037. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1038. pass
  1039. else:
  1040. draw_header(o)
  1041. self.draw_square()
  1042. text_box1(o, "Note Vol", str(o.note_vol))
  1043. text_box3(o, "Pat", str(self.curPattern))
  1044. o.update_display(0)
  1045. super(EditSoundSequence, self).Enter()
  1046. def Execute(self):
  1047. o = self.FSM.owner
  1048. menu1_actions(self, o)
  1049. menu2_actions_note(self, o)
  1050. if o.keyState[16] == 1:
  1051. draw_menu1(o)
  1052. o.update_display(0)
  1053. elif o.keyState[16] == 4:
  1054. draw_header(o)
  1055. self.draw_square()
  1056. text_box1(o, "Note Vol", str(o.note_vol))
  1057. text_box3(o, "Pat", str(self.curPattern))
  1058. o.update_display(0)
  1059. if o.keyState[17] == 1:
  1060. draw_menu2_note(o)
  1061. o.update_display(0)
  1062. elif o.keyState[17] == 4:
  1063. draw_header(o)
  1064. self.draw_square()
  1065. text_box1(o, "Note Vol", str(o.note_vol))
  1066. text_box3(o, "Pat", str(self.curPattern))
  1067. o.update_display(0)
  1068. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1069. pass
  1070. else:
  1071. _id = 0
  1072. for k in self.FSM.owner.keyState:
  1073. if _id < 16 and k == 1:
  1074. if o.soundSlots[o.eSound].notes[self.curPattern][_id][0] == 1:
  1075. print('turn note off')
  1076. o.soundSlots[o.eSound].notes[self.curPattern][_id][0] = 0
  1077. o.soundSlots[o.eSound].notes[self.curPattern][_id][1] = 0
  1078. else:
  1079. print('turn note on')
  1080. o.soundSlots[o.eSound].notes[self.curPattern][_id][0] = 1
  1081. o.soundSlots[o.eSound].notes[self.curPattern][_id][1] = o.note_vol
  1082. draw_header(o)
  1083. self.draw_square()
  1084. text_box1(o, "Note Vol", str(o.note_vol))
  1085. text_box3(o, "Pat", str(self.curPattern))
  1086. o.update_display(0)
  1087. _id += 1
  1088. def draw_square(self):
  1089. o = self.FSM.owner
  1090. size = 22
  1091. og_x = (o.width / 2) - (size * 2)
  1092. o_x = og_x
  1093. o_y = 127
  1094. _id = 0
  1095. for n in o.soundSlots[o.eSound].notes[self.curPattern]:
  1096. if _id == o.playhead and o.playing:
  1097. if o.curPattern == self.curPattern:
  1098. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.olive, width=1)
  1099. else:
  1100. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.pink, width=1)
  1101. elif n[0] == 1:
  1102. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.light_grey, width=1)
  1103. else:
  1104. o.draw.rectangle((o_x, o_y, o_x + size, o_y - size), outline=o.light_grey, fill=o.blue, width=1)
  1105. o_x = o_x + size
  1106. _id += 1
  1107. if _id % 4 == 0:
  1108. o_y -= size
  1109. o_x = og_x
  1110. def ReceiveMessage(self, message):
  1111. _id = 0
  1112. o = self.FSM.owner
  1113. play_seq(o, message)
  1114. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1115. pass
  1116. else:
  1117. draw_header(o)
  1118. self.draw_square()
  1119. text_box1(o, "Note Vol", str(o.note_vol))
  1120. text_box3(o, "Pat", str(self.curPattern))
  1121. if o.patternFollow:
  1122. self.curPattern = message[0]
  1123. else:
  1124. self.curPattern = o.ePattern
  1125. print('message ', message)
  1126. o.update_display(0)
  1127. def Exit(self):
  1128. self.FSM.owner.pub.unregister("beat", self)
  1129. class EditSong(State):
  1130. def __init__(self,FSM):
  1131. super(EditSong, self).__init__(FSM)
  1132. def Enter(self):
  1133. o = self.FSM.owner
  1134. o.header_text = "Edit Song"
  1135. o.pub.register("beat", self)
  1136. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1137. pass
  1138. else:
  1139. draw_header(o)
  1140. self.draw_main(o)
  1141. # o.draw.text((20, 30), "Current Song", font=o.h2, fill=o.light_grey)
  1142. # o.draw.text((20, 50), str(o.song), font=o.h2, fill=o.light_grey)
  1143. o.update_display(0)
  1144. self.new_song = []
  1145. super(EditSong, self).Enter()
  1146. def Execute(self):
  1147. o = self.FSM.owner
  1148. menu1_actions(self, o)
  1149. menu2_actions_song(self, o)
  1150. if o.keyState[16] == 1:
  1151. draw_menu1(o)
  1152. o.update_display(0)
  1153. elif o.keyState[16] == 4:
  1154. draw_header(o)
  1155. self.draw_main(o)
  1156. # if self.new_song == []:
  1157. # o.draw.text((20, 30), "Current Song", font=o.h2, fill=o.light_grey)
  1158. # o.draw.text((20, 50), str(o.song), font=o.h2, fill=o.light_grey)
  1159. # else:
  1160. # o.draw.text((20, 30), "New Song", font=o.h2, fill=o.pink)
  1161. # o.draw.text((20, 50), str(self.new_song), font=o.h2, fill=o.pink)
  1162. o.update_display(0)
  1163. if o.keyState[17] == 1:
  1164. draw_menu2_song(o)
  1165. o.update_display(0)
  1166. elif o.keyState[17] == 4:
  1167. draw_header(o)
  1168. self.draw_main(o)
  1169. o.update_display(0)
  1170. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1171. #if o.keyState[16] > 0:
  1172. pass
  1173. else:
  1174. _id = 0
  1175. for k in self.FSM.owner.keyState:
  1176. if k == 1 and _id < 16:
  1177. self.new_song.append((_id + (o.pat_bank * 16)))
  1178. draw_header(o)
  1179. self.draw_main(o)
  1180. #o.draw.text((20, 30), "New Song", font=o.h2, fill=o.pink)
  1181. #o.draw.text((20, 50), str(self.new_song), font=o.h2, fill=o.pink)
  1182. o.update_display(0)
  1183. _id += 1
  1184. def draw_main(self, o):
  1185. ypos = 35
  1186. ysize = 20
  1187. tmp_song = [8, 6, 7, 5, 3, 0, 9]
  1188. lines = breakup_song_text(o.song)
  1189. #lines = breakup_song_text(tmp_song)
  1190. if self.new_song != []:
  1191. #o.draw.text((20, 30), "New Song", font=o.h2, fill=o.pink)
  1192. lines = breakup_song_text(self.new_song)
  1193. o.center_block("New Song", o.h2, [0, ypos, o.width, ypos + ysize], o.pink)
  1194. else:
  1195. #o.draw.text((20, 30), "Current Song", font=o.h2, fill=o.light_grey)
  1196. o.center_block("Current Song", o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1197. ypos += ysize
  1198. o.center_block(lines[0], o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1199. ypos += ysize
  1200. o.center_block(lines[1], o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1201. ypos += ysize
  1202. o.center_block(lines[2], o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1203. ypos += ysize
  1204. o.center_block(lines[3], o.h2, [0, ypos, o.width, ypos + ysize], o.light_grey)
  1205. def ReceiveMessage(self, message):
  1206. _id = 0
  1207. o = self.FSM.owner
  1208. play_seq(o, message)
  1209. def Exit(self):
  1210. o = self.FSM.owner
  1211. self.FSM.owner.pub.unregister("beat", self)
  1212. if self.new_song != []:
  1213. o.song = self.new_song
  1214. o.songCycle = cycle(self.new_song)
  1215. self.curPattern = next(o.songCycle)
  1216. o.songStart = o.curPattern
  1217. #====================================
  1218. class File(State):
  1219. def __init__(self,FSM):
  1220. super(File, self).__init__(FSM)
  1221. def Enter(self):
  1222. self.FSM.stateLife = 1
  1223. o = self.FSM.owner
  1224. o.header_text = "File"
  1225. o.pub.register("beat", self)
  1226. self.cur_el = 0
  1227. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1228. pass
  1229. else:
  1230. draw_header(o)
  1231. self.draw_footer(o)
  1232. self.draw_main(o)
  1233. o.update_display(0)
  1234. self.menu = ["Save", "Save As", "Open", "New"]
  1235. super(File, self).Enter()
  1236. def Execute(self):
  1237. o = self.FSM.owner
  1238. menu1_actions(self, o)
  1239. if o.keyState[16] == 1:
  1240. draw_menu1(o)
  1241. #self.draw_footer(o)
  1242. o.update_display(0)
  1243. elif o.keyState[16] == 4:
  1244. draw_header(o)
  1245. self.draw_footer(o)
  1246. self.draw_main(o)
  1247. o.update_display(0)
  1248. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  1249. draw_header(o)
  1250. self.draw_footer(o)
  1251. self.draw_main(o)
  1252. o.update_display(0)
  1253. print('draw butt')
  1254. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1255. pass
  1256. else:
  1257. if o.keyState[0] == 1:
  1258. if self.cur_el > 0:
  1259. self.cur_el -= 1
  1260. print('cur el down is ', self.cur_el)
  1261. if o.keyState[1] == 1:
  1262. if self.cur_el < (len(self.menu) - 1):
  1263. self.cur_el += 1
  1264. print('cur el up is ', self.cur_el)
  1265. if o.keyState[3] == 1:
  1266. file_command(self, o, self.menu[self.cur_el])
  1267. pass
  1268. def draw_footer(self, o):
  1269. _iter = 0
  1270. width = o.width / 4
  1271. xpos = 0
  1272. yposa = 135 - 25
  1273. yposb = 135
  1274. opts = ["Up", "Down", "Esc", "OK"]
  1275. while _iter < 4:
  1276. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  1277. if o.keyState[_iter] == 1:
  1278. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  1279. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  1280. else:
  1281. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  1282. xpos += width
  1283. _iter += 1
  1284. def draw_main(self, o):
  1285. al = []
  1286. ypos = 30
  1287. if self.cur_el == 0:
  1288. _iter = 0
  1289. while len(al) < 4:
  1290. al.append(self.menu[_iter])
  1291. _iter += 1
  1292. elif self.cur_el == 1:
  1293. al.append(self.menu[self.cur_el - 1])
  1294. al.append(self.menu[self.cur_el])
  1295. al.append(self.menu[self.cur_el + 1])
  1296. al.append(self.menu[self.cur_el + 2])
  1297. elif self.cur_el == (len(self.menu) - 2):
  1298. al.append(self.menu[self.cur_el - 2])
  1299. al.append(self.menu[self.cur_el - 1])
  1300. al.append(self.menu[self.cur_el])
  1301. al.append(self.menu[self.cur_el + 1])
  1302. elif self.cur_el == (len(self.menu) - 1):
  1303. al.append(self.menu[self.cur_el - 3])
  1304. al.append(self.menu[self.cur_el - 2])
  1305. al.append(self.menu[self.cur_el - 1])
  1306. al.append(self.menu[self.cur_el])
  1307. else:
  1308. al.append(self.menu[self.cur_el - 1])
  1309. al.append(self.menu[self.cur_el])
  1310. al.append(self.menu[self.cur_el + 1])
  1311. al.append(self.menu[self.cur_el + 2])
  1312. _iter = 0
  1313. for i in al:
  1314. if i == self.menu[self.cur_el]:
  1315. #if _iter == self.cur_el:
  1316. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  1317. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  1318. else:
  1319. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  1320. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  1321. ypos += 20
  1322. _iter += 1
  1323. def ReceiveMessage(self, message):
  1324. o = self.FSM.owner
  1325. play_seq(o, message)
  1326. def Exit(self):
  1327. self.FSM.owner.pub.unregister("beat", self)
  1328. class Util(State):
  1329. def __init__(self,FSM):
  1330. super(Util, self).__init__(FSM)
  1331. def Enter(self):
  1332. o = self.FSM.owner
  1333. o.header_text = "Utilities"
  1334. o.pub.register("beat", self)
  1335. self.menu = ["Clock", "Balls", "Defender", "Exit", "Shutdown", "Reboot", "Theme", "Ping", "Wifi", "Update"]
  1336. self.cur_el = 0
  1337. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1338. pass
  1339. else:
  1340. draw_header(o)
  1341. self.draw_footer(o)
  1342. self.draw_main(o)
  1343. o.update_display(0)
  1344. super(Util, self).Enter()
  1345. def Execute(self):
  1346. o = self.FSM.owner
  1347. menu1_actions(self, o)
  1348. if o.keyState[16] == 1:
  1349. draw_menu1(o)
  1350. o.update_display(0)
  1351. elif o.keyState[16] == 4:
  1352. draw_header(o)
  1353. self.draw_footer(o)
  1354. self.draw_main(o)
  1355. o.update_display(0)
  1356. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  1357. draw_header(o)
  1358. self.draw_footer(o)
  1359. self.draw_main(o)
  1360. o.update_display(0)
  1361. print('draw butt')
  1362. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1363. pass
  1364. else:
  1365. if o.keyState[0] == 1:
  1366. if self.cur_el > 0:
  1367. self.cur_el -= 1
  1368. print('cur el down is ', self.cur_el)
  1369. if o.keyState[1] == 1:
  1370. if self.cur_el < (len(self.menu) - 1):
  1371. self.cur_el += 1
  1372. print('cur el up is ', self.cur_el)
  1373. if o.keyState[3] == 1:
  1374. util_command(self, o, self.menu[self.cur_el])
  1375. def ReceiveMessage(self, message):
  1376. _id = 0
  1377. o = self.FSM.owner
  1378. play_seq(o, message)
  1379. # if o.keyState[16] > 0 or o.keyState[17] > 0:
  1380. # pass
  1381. # else:
  1382. # draw_header(o)
  1383. # o.update_display(0)
  1384. def draw_main(self, o):
  1385. al = []
  1386. ypos = 30
  1387. if self.cur_el == 0:
  1388. _iter = 0
  1389. while len(al) < 4:
  1390. al.append(self.menu[_iter])
  1391. _iter += 1
  1392. elif self.cur_el == 1:
  1393. al.append(self.menu[self.cur_el - 1])
  1394. al.append(self.menu[self.cur_el])
  1395. al.append(self.menu[self.cur_el + 1])
  1396. al.append(self.menu[self.cur_el + 2])
  1397. elif self.cur_el == (len(self.menu) - 2):
  1398. al.append(self.menu[self.cur_el - 2])
  1399. al.append(self.menu[self.cur_el - 1])
  1400. al.append(self.menu[self.cur_el])
  1401. al.append(self.menu[self.cur_el + 1])
  1402. elif self.cur_el == (len(self.menu) - 1):
  1403. al.append(self.menu[self.cur_el - 3])
  1404. al.append(self.menu[self.cur_el - 2])
  1405. al.append(self.menu[self.cur_el - 1])
  1406. al.append(self.menu[self.cur_el])
  1407. else:
  1408. al.append(self.menu[self.cur_el - 1])
  1409. al.append(self.menu[self.cur_el])
  1410. al.append(self.menu[self.cur_el + 1])
  1411. al.append(self.menu[self.cur_el + 2])
  1412. _iter = 0
  1413. for i in al:
  1414. if i == self.menu[self.cur_el]:
  1415. #if _iter == self.cur_el:
  1416. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  1417. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  1418. else:
  1419. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  1420. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  1421. ypos += 20
  1422. _iter += 1
  1423. def draw_footer(self, o):
  1424. _iter = 0
  1425. width = o.width / 4
  1426. xpos = 0
  1427. yposa = 135 - 25
  1428. yposb = 135
  1429. opts = ["Up", "Down", "Esc", "OK"]
  1430. while _iter < 4:
  1431. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  1432. if o.keyState[_iter] == 1:
  1433. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  1434. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  1435. else:
  1436. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  1437. xpos += width
  1438. _iter += 1
  1439. def Exit(self):
  1440. self.FSM.owner.pub.unregister("beat", self)
  1441. class Ball(State):
  1442. def __init__(self,FSM):
  1443. super(Ball, self).__init__(FSM)
  1444. def Enter(self):
  1445. self.ball_size = 10
  1446. self.ballx = self.ball_size
  1447. self.bally = self.ball_size
  1448. self.ball_speed = 8
  1449. self.ball_x_dir = 1
  1450. self.ball_y_dir = 1
  1451. self.ball2x = self.ball_size + 180
  1452. self.ball2y = self.ball_size + 70
  1453. self.ball2_x_dir = -1
  1454. self.ball2_y_dir = -1
  1455. self.xmult = 1.0
  1456. o = self.FSM.owner
  1457. o.header_text = "Balls"
  1458. o.pub.register("beat", self)
  1459. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1460. pass
  1461. else:
  1462. draw_header(o)
  1463. o.update_display(0)
  1464. super(Ball, self).Enter()
  1465. def Execute(self):
  1466. o = self.FSM.owner
  1467. menu1_actions(self, o)
  1468. if o.keyState[16] == 1:
  1469. draw_menu1(o)
  1470. o.update_display(0)
  1471. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1472. pass
  1473. else:
  1474. now = datetime.now()
  1475. current_time = time.strftime("%-I:%M %p")
  1476. if self.ballx < (0 + self.ball_size):
  1477. self.ball_x_dir = 1
  1478. if self.ballx > (o.width - self.ball_size):
  1479. self.ball_x_dir = -1
  1480. if self.bally < (0 + self.ball_size):
  1481. self.ball_y_dir = 1
  1482. if self.bally > (o.height - self.ball_size):
  1483. self.ball_y_dir = -1
  1484. # if self.ballx > (o.width - self.ball_size) or self.ballx < (0 + self.ball_size):
  1485. # self.ball_x_dir *= -1
  1486. # if self.bally > (o.height - self.ball_size) or self.bally < (0 + self.ball_size):
  1487. # self.ball_y_dir *= -1
  1488. self.ballx += self.ball_speed * self.ball_x_dir
  1489. self.bally += self.ball_speed * self.ball_y_dir
  1490. if self.ball2x < (0 + self.ball_size):
  1491. self.ball2_x_dir = 1
  1492. self.xmult = random.uniform(.6, 1.2)
  1493. if self.ball2x > (o.width - self.ball_size):
  1494. self.ball2_x_dir = -1
  1495. self.xmult = random.uniform(.6, 1.2)
  1496. if self.ball2y < (0 + self.ball_size):
  1497. self.ball2_y_dir = 1
  1498. if self.ball2y > (o.height - self.ball_size):
  1499. self.ball2_y_dir = -1
  1500. # if self.ball2x > (o.width - self.ball_size) or self.ball2x < (0 + self.ball_size):
  1501. # self.ball2_x_dir *= -1
  1502. # self.xmult = random.uniform(.8, 1.2)
  1503. # if self.ball2y > (o.height - self.ball_size) or self.ball2y < (0 + self.ball_size):
  1504. # self.ball2_y_dir *= -1
  1505. self.ball2x += (self.ball_speed * self.ball2_x_dir) * self.xmult
  1506. self.ball2y += (self.ball_speed * self.ball2_y_dir)
  1507. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1508. o.draw.ellipse((self.ballx - self.ball_size, self.bally - self.ball_size, self.ballx + self.ball_size, self.bally + self.ball_size), fill = o.light_grey, outline =o.light_grey)
  1509. o.draw.ellipse((self.ball2x - self.ball_size, self.ball2y - self.ball_size, self.ball2x + self.ball_size, self.ball2y + self.ball_size), fill = o.light_grey, outline =o.light_grey)
  1510. #o.center_block(current_time, o.h3, [0,0,o.width,o.height], o.pink)
  1511. o.update_display(0)
  1512. def ReceiveMessage(self, message):
  1513. o = self.FSM.owner
  1514. play_seq(o, message)
  1515. def Exit(self):
  1516. self.FSM.owner.pub.unregister("beat", self)
  1517. #====================================
  1518. class Clock(State):
  1519. def __init__(self,FSM):
  1520. super(Clock, self).__init__(FSM)
  1521. def Enter(self):
  1522. o = self.FSM.owner
  1523. current_time = time.strftime("%-I:%M:%S")
  1524. self.ball_sizex, self.ball_sizey = o.h3.getsize("18:88:88")
  1525. self.ball_sizex /= 2
  1526. self.ball_sizey /= 2
  1527. #self.ball_sizey += 10
  1528. self.ballx = o.width / 2
  1529. self.bally = o.height / 2
  1530. self.ball_speed = .5
  1531. self.ball_x_dir = 1
  1532. self.ball_y_dir = 1
  1533. o.header_text = "Clock"
  1534. o.pub.register("beat", self)
  1535. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1536. pass
  1537. else:
  1538. pass
  1539. super(Clock, self).Enter()
  1540. def Execute(self):
  1541. o = self.FSM.owner
  1542. menu1_actions(self, o)
  1543. if o.keyState[16] == 1:
  1544. draw_menu1(o)
  1545. o.update_display(0)
  1546. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1547. pass
  1548. else:
  1549. current_time = time.strftime("%-I:%M:%S")
  1550. s = int(time.strftime("%S"))
  1551. if s % 2 == 0:
  1552. current_time = time.strftime("%-I:%M.%S")
  1553. if self.ballx > (o.width - self.ball_sizex) or self.ballx < (0 + self.ball_sizex):
  1554. self.ball_x_dir *= -1
  1555. if (self.bally > o.height - self.ball_sizey - 20) or (self.bally < 0 + self.ball_sizey):
  1556. self.ball_y_dir *= -1
  1557. x1 = self.ballx - self.ball_sizex
  1558. x2 = self.ballx + self.ball_sizex
  1559. y1 = self.bally - self.ball_sizey
  1560. y2 = self.bally + self.ball_sizey
  1561. self.ballx += self.ball_speed * self.ball_x_dir
  1562. self.bally += self.ball_speed * self.ball_y_dir
  1563. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1564. #o.draw.rectangle((x1, y1, x2, y2), outline=0, fill=o.dark_grey)
  1565. #o.draw.text((self.ballx - self.ball_sizex, self.bally - self.ball_sizey), current_time, align='center', font=o.h3, fill=o.light_grey)
  1566. o.center_block(current_time, o.h3, [x1, y1, x2, y2], o.light_grey)
  1567. today = date.today()
  1568. current_date = today.strftime('%A')
  1569. current_date += ', ' + today.strftime("%b %d, %Y")
  1570. #o.draw.text((self.ballx - self.ball_sizex, (self.bally + 45) - self.ball_sizey), current_date, align='center', font=o.h2, fill=o.light_grey)
  1571. o.center_block(current_date, o.h2, [x1, y1 + 35, x2, y2 + 35], o.light_grey)
  1572. o.update_display(0)
  1573. def ReceiveMessage(self, message):
  1574. o = self.FSM.owner
  1575. play_seq(o, message)
  1576. def Exit(self):
  1577. self.FSM.owner.pub.unregister("beat", self)
  1578. #====================================
  1579. class Exit(State):
  1580. def __init__(self,FSM):
  1581. super(Exit, self).__init__(FSM)
  1582. def Enter(self):
  1583. o = self.FSM.owner
  1584. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1585. o.center_block("goodbye", o.h2, [0, 0, o.width,o.height], o.light_grey)
  1586. o.update_display(0)
  1587. pygame.quit()
  1588. sys.exit()
  1589. super(Exit, self).Enter()
  1590. def Execute(self):
  1591. self.FSM.stateLife += 1
  1592. def Exit(self):
  1593. pass
  1594. #====================================
  1595. #====================================
  1596. class Reboot(State):
  1597. def __init__(self,FSM):
  1598. super(Reboot, self).__init__(FSM)
  1599. def Enter(self):
  1600. o = self.FSM.owner
  1601. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1602. o.center_block("rebooting", o.h2, [0, 0, o.width,o.height], o.light_grey)
  1603. o.update_display(0)
  1604. command = 'bash -c "sleep 5; sudo shutdown -r now"&'
  1605. os.system(command)
  1606. pygame.quit()
  1607. sys.exit()
  1608. super(Reboot, self).Enter()
  1609. def Execute(self):
  1610. pass
  1611. #self.FSM.stateLife += 1
  1612. #os.system('sudo shutdown -r now')
  1613. def Exit(self):
  1614. pass
  1615. #====================================
  1616. #====================================
  1617. class Shutdown(State):
  1618. def __init__(self,FSM):
  1619. super(Shutdown, self).__init__(FSM)
  1620. def Enter(self):
  1621. o = self.FSM.owner
  1622. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  1623. o.center_block("shutting down", o.h2, [0, 0, o.width,o.height - 20], o.light_grey)
  1624. o.center_block("(unplug in 20s)", o.h2, [0, 10, o.width,o.height+10], o.light_grey)
  1625. o.center_block("thank you for playing", o.h2, [0, 30, o.width,o.height+30], o.light_grey)
  1626. o.update_display(0)
  1627. command = 'bash -c "sleep 5; sudo shutdown -h now"&'
  1628. os.system(command)
  1629. pygame.quit()
  1630. sys.exit()
  1631. super(Shutdown, self).Enter()
  1632. def Execute(self):
  1633. pass
  1634. #self.FSM.stateLife += 1
  1635. #os.system('sudo shutdown -r now')
  1636. def Exit(self):
  1637. pass
  1638. #====================================
  1639. class SelTheme(State):
  1640. def __init__(self,FSM):
  1641. super(SelTheme, self).__init__(FSM)
  1642. def Enter(self):
  1643. o = self.FSM.owner
  1644. o.header_text = "Select Theme"
  1645. o.pub.register("beat", self)
  1646. self.cur_el = 0
  1647. self.globbed = glob.glob('/home/pi/zpc_ct/user/themes/*.thm')
  1648. self.globbed.sort()
  1649. self.names = [os.path.basename(x) for x in self.globbed]
  1650. self.names = [os.path.splitext(x)[0] for x in self.names]
  1651. if o.mconf['theme'] in self.names:
  1652. _id = self.names.index(o.mconf['theme'])
  1653. self.cur_el = _id
  1654. #print('found theme ', _id)
  1655. else:
  1656. print('nope ', o.mconf['theme'], ' - ', self.globbed)
  1657. #self.theme = ConfigObj("/home/pi/zpc_ct/themes/" + self.mconf['theme'])
  1658. #print(os.path.splitext(x)[0])
  1659. self.menu = self.names
  1660. #self.cur_el = 0
  1661. print('theme menu is ', self.menu)
  1662. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1663. pass
  1664. else:
  1665. draw_header(o)
  1666. self.draw_main(o)
  1667. o.update_display(0)
  1668. super(SelTheme, self).Enter()
  1669. def Execute(self):
  1670. o = self.FSM.owner
  1671. menu1_actions(self, o)
  1672. if o.keyState[16] == 1:
  1673. draw_menu1(o)
  1674. o.update_display(0)
  1675. elif o.keyState[16] == 4:
  1676. draw_header(o)
  1677. self.draw_footer(o)
  1678. self.draw_main(o)
  1679. o.update_display(0)
  1680. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  1681. draw_header(o)
  1682. self.draw_footer(o)
  1683. self.draw_main(o)
  1684. o.update_display(0)
  1685. print('draw butt')
  1686. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1687. pass
  1688. else:
  1689. if o.keyState[0] == 1:
  1690. if self.cur_el > 0:
  1691. self.cur_el -= 1
  1692. o.mconf['theme'] = self.menu[self.cur_el]
  1693. o.save_config()
  1694. o.load_config()
  1695. o.apply_theme()
  1696. print('cur el down is ', self.cur_el)
  1697. #o.applyTheme
  1698. if o.keyState[1] == 1:
  1699. if self.cur_el < (len(self.menu) - 1):
  1700. self.cur_el += 1
  1701. o.mconf['theme'] = self.menu[self.cur_el]
  1702. o.save_config()
  1703. o.load_config()
  1704. o.apply_theme()
  1705. print('cur el up is ', self.cur_el)
  1706. print('loading theme ', self.menu[self.cur_el], '-- ', o.mconf['theme'])
  1707. if o.keyState[3] == 1:
  1708. util_command(self, o, self.menu[self.cur_el])
  1709. def draw_main(self, o):
  1710. al = []
  1711. ypos = 30
  1712. if self.cur_el == 0:
  1713. _iter = 0
  1714. while len(al) < 4:
  1715. al.append(self.menu[_iter])
  1716. _iter += 1
  1717. elif self.cur_el == 1:
  1718. al.append(self.menu[self.cur_el - 1])
  1719. al.append(self.menu[self.cur_el])
  1720. al.append(self.menu[self.cur_el + 1])
  1721. al.append(self.menu[self.cur_el + 2])
  1722. elif self.cur_el == (len(self.menu) - 2):
  1723. al.append(self.menu[self.cur_el - 2])
  1724. al.append(self.menu[self.cur_el - 1])
  1725. al.append(self.menu[self.cur_el])
  1726. al.append(self.menu[self.cur_el + 1])
  1727. elif self.cur_el == (len(self.menu) - 1):
  1728. al.append(self.menu[self.cur_el - 3])
  1729. al.append(self.menu[self.cur_el - 2])
  1730. al.append(self.menu[self.cur_el - 1])
  1731. al.append(self.menu[self.cur_el])
  1732. else:
  1733. al.append(self.menu[self.cur_el - 1])
  1734. al.append(self.menu[self.cur_el])
  1735. al.append(self.menu[self.cur_el + 1])
  1736. al.append(self.menu[self.cur_el + 2])
  1737. _iter = 0
  1738. for i in al:
  1739. if i == self.menu[self.cur_el]:
  1740. #if _iter == self.cur_el:
  1741. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  1742. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  1743. else:
  1744. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  1745. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  1746. ypos += 20
  1747. _iter += 1
  1748. def draw_footer(self, o):
  1749. _iter = 0
  1750. width = o.width / 4
  1751. xpos = 0
  1752. yposa = 135 - 25
  1753. yposb = 135
  1754. opts = ["Up", "Down", "", ""]
  1755. while _iter < 4:
  1756. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  1757. if o.keyState[_iter] == 1:
  1758. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  1759. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  1760. else:
  1761. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  1762. xpos += width
  1763. _iter += 1
  1764. def ReceiveMessage(self, message):
  1765. o = self.FSM.owner
  1766. play_seq(o, message)
  1767. def Exit(self):
  1768. self.FSM.owner.pub.unregister("beat", self)
  1769. #====================================
  1770. class OpenSong(State):
  1771. def __init__(self,FSM):
  1772. super(OpenSong, self).__init__(FSM)
  1773. def Enter(self):
  1774. o = self.FSM.owner
  1775. o.header_text = "Open Song"
  1776. o.pub.register("beat", self)
  1777. self.cur_el = 0
  1778. self.globbed = glob.glob('/home/pi/zpc_ct/user/songs/*.sng')
  1779. self.globbed.sort()
  1780. if '/home/pi/zpc_ct/user/songs/_blank.sng' in self.globbed:
  1781. self.globbed.remove('/home/pi/zpc_ct/user/songs/_blank.sng')
  1782. #del self.globbed[0]
  1783. self.names = [os.path.basename(x) for x in self.globbed]
  1784. self.names = [os.path.splitext(x)[0] for x in self.names]
  1785. print('we got these songs ', self.names)
  1786. print('in these paths ', self.globbed)
  1787. if o.mconf['default_song'] in self.names:
  1788. _id = self.names.index(o.mconf['default_song'])
  1789. self.cur_el = _id
  1790. else:
  1791. print('nope ', o.mconf['default_song'], ' - ', self.globbed)
  1792. self.menu = self.names
  1793. #self.cur_el = 0
  1794. #print('theme menu is ', self.menu)
  1795. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1796. pass
  1797. else:
  1798. draw_header(o)
  1799. self.draw_main(o)
  1800. o.update_display(0)
  1801. super(OpenSong, self).Enter()
  1802. def Execute(self):
  1803. o = self.FSM.owner
  1804. menu1_actions(self, o)
  1805. if o.keyState[16] == 1:
  1806. draw_menu1(o)
  1807. o.update_display(0)
  1808. elif o.keyState[16] == 4:
  1809. draw_header(o)
  1810. self.draw_footer(o)
  1811. self.draw_main(o)
  1812. o.update_display(0)
  1813. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  1814. draw_header(o)
  1815. self.draw_footer(o)
  1816. self.draw_main(o)
  1817. o.update_display(0)
  1818. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1819. pass
  1820. else:
  1821. if o.keyState[0] == 1:
  1822. if self.cur_el > 0:
  1823. self.cur_el -= 1
  1824. # o.mconf['theme'] = self.menu[self.cur_el]
  1825. # o.save_config()
  1826. # o.load_config()
  1827. # o.apply_theme()
  1828. print('cur el down is ', self.cur_el)
  1829. #o.applyTheme
  1830. if o.keyState[1] == 1:
  1831. if self.cur_el < (len(self.menu) - 1):
  1832. self.cur_el += 1
  1833. # o.mconf['theme'] = self.menu[self.cur_el]
  1834. # o.save_config()
  1835. # o.load_config()
  1836. # o.apply_theme()
  1837. print('cur el up is ', self.cur_el)
  1838. #print('loading theme ', self.menu[self.cur_el], '-- ', o.mconf['theme'])
  1839. if o.keyState[3] == 1:
  1840. #open_command(self, o, self.menu[self.cur_el])
  1841. o.mconf['default_song'] = self.menu[self.cur_el]
  1842. o.save_config()
  1843. o.load_song()
  1844. #pass
  1845. def draw_main(self, o):
  1846. al = []
  1847. ypos = 30
  1848. if self.cur_el == 0:
  1849. _iter = 0
  1850. while len(al) < 4:
  1851. al.append(self.menu[_iter])
  1852. _iter += 1
  1853. elif self.cur_el == 1:
  1854. al.append(self.menu[self.cur_el - 1])
  1855. al.append(self.menu[self.cur_el])
  1856. al.append(self.menu[self.cur_el + 1])
  1857. al.append(self.menu[self.cur_el + 2])
  1858. elif self.cur_el == (len(self.menu) - 2):
  1859. al.append(self.menu[self.cur_el - 2])
  1860. al.append(self.menu[self.cur_el - 1])
  1861. al.append(self.menu[self.cur_el])
  1862. al.append(self.menu[self.cur_el + 1])
  1863. elif self.cur_el == (len(self.menu) - 1):
  1864. al.append(self.menu[self.cur_el - 3])
  1865. al.append(self.menu[self.cur_el - 2])
  1866. al.append(self.menu[self.cur_el - 1])
  1867. al.append(self.menu[self.cur_el])
  1868. else:
  1869. al.append(self.menu[self.cur_el - 1])
  1870. al.append(self.menu[self.cur_el])
  1871. al.append(self.menu[self.cur_el + 1])
  1872. al.append(self.menu[self.cur_el + 2])
  1873. _iter = 0
  1874. for i in al:
  1875. if i == self.menu[self.cur_el]:
  1876. #if _iter == self.cur_el:
  1877. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  1878. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  1879. else:
  1880. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  1881. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  1882. ypos += 20
  1883. _iter += 1
  1884. def draw_footer(self, o):
  1885. _iter = 0
  1886. width = o.width / 4
  1887. xpos = 0
  1888. yposa = 135 - 25
  1889. yposb = 135
  1890. opts = ["Up", "Down", "Esc", "Open"]
  1891. while _iter < 4:
  1892. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  1893. if o.keyState[_iter] == 1:
  1894. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  1895. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  1896. else:
  1897. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  1898. xpos += width
  1899. _iter += 1
  1900. def ReceiveMessage(self, message):
  1901. o = self.FSM.owner
  1902. play_seq(o, message)
  1903. def Exit(self):
  1904. self.FSM.owner.pub.unregister("beat", self)
  1905. class EnterText(State):
  1906. def __init__(self,FSM):
  1907. super(EnterText, self).__init__(FSM)
  1908. def Enter(self):
  1909. o = self.FSM.owner
  1910. menu1_actions(self, o)
  1911. if o.keyState[16] == 1:
  1912. draw_menu1(o)
  1913. o.update_display(0)
  1914. elif o.keyState[16] == 4:
  1915. draw_header(o)
  1916. self.draw_footer(o)
  1917. self.draw_main(o)
  1918. o.update_display(0)
  1919. self.input_string = ""
  1920. if o.sconf['title'] == 'blank':
  1921. self.input_string += str(datetime.today().strftime('%Y%m%d'))
  1922. else:
  1923. self.input_string += o.sconf['title']
  1924. #if
  1925. o.header_text = "EnterText"
  1926. o.pub.register("beat", self)
  1927. self.last_action = pygame.time.get_ticks()
  1928. self.caps = False
  1929. self.cur_but = 18
  1930. self.cur_letter = ""
  1931. if o.keyState[16] > 0 or o.keyState[17] > 0:
  1932. pass
  1933. else:
  1934. pass
  1935. self.skips = [7, 3, 11, 12, 13, 14, 15]
  1936. self.lc_labels = [["p", "q", "r", "s"], ["t", "u", "v"], ["w", "x", "y", "z"], ["C", "A", "P", "S"],
  1937. ["g", "h", "i"], ["j", "k", "l"], ["m", "n", "o"], ["D", "E", "L"],
  1938. ["_", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-"], ["a", "b", "c"], ["d", "e", "f"], ["O", "K"],
  1939. [], [], [], []]
  1940. self.uc_labels = [["P", "Q", "R", "S"], ["T", "U", "V"], ["W", "X", "Y", "Z"], ["C", "A", "P", "S"],
  1941. ["G", "H", "I"], ["J", "K", "L"], ["M", "N", "O"], ["D", "E", "L"],
  1942. ["_", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-"], ["A", "B", "C"], ["D", "E", "F"], ["O", "K"],
  1943. [], [], [], []]
  1944. self.labels = self.lc_labels
  1945. #self.songCycle = cycle(self.song)
  1946. #self.curPattern = next(self.songCycle)
  1947. self.cycles = []
  1948. for l in self.labels:
  1949. self.cycles.append(cycle(l))
  1950. self.draw(o)
  1951. o.update_display(0)
  1952. super(EnterText, self).Enter()
  1953. def Execute(self):
  1954. o = self.FSM.owner
  1955. y_size = o.height / 4
  1956. if o.keyState[11] == 1:
  1957. if self.input_string != 'blank':
  1958. o.title = self.input_string
  1959. #o.bpm = o.sconf['bpm']
  1960. o.sconf['title'] = self.input_string
  1961. print('fsm saving')
  1962. o.save_song()
  1963. self.FSM.ToTransition('toFile')
  1964. if o.keyState[16] > 0 and o.keyState[17] > 0:
  1965. pass
  1966. else:
  1967. _iter = 0
  1968. for k in o.keyState:
  1969. if k == 1:
  1970. cur_time = pygame.time.get_ticks()
  1971. print(cur_time - self.last_action)
  1972. #print('cur letter ', next(self.cycles[_iter]))
  1973. if _iter not in self.skips:
  1974. self.last_action = cur_time
  1975. self.cur_letter = next(self.cycles[_iter])
  1976. self.cur_but = _iter
  1977. self.draw(o)
  1978. o.center_block(self.input_string + self.cur_letter, o.h2, [0, 0, o.width, y_size], o.light_grey)
  1979. if _iter == 7:
  1980. self.input_string = self.input_string[:-1]
  1981. #self.input_string = self.input_string.rstrip(self.input_string[-1])
  1982. print('deleting')
  1983. self.last_action = 100000000
  1984. self.draw(o)
  1985. o.center_block(self.input_string, o.h2, [0, 0, o.width, y_size], o.light_grey)
  1986. elif _iter == 3:
  1987. print('caps')
  1988. if self.caps:
  1989. self.caps = False
  1990. self.labels = self.lc_labels
  1991. else:
  1992. self.caps = True
  1993. self.labels = self.uc_labels
  1994. self.draw(o)
  1995. o.center_block(self.input_string, o.h2, [0, 0, o.width, y_size], o.light_grey)
  1996. self.cycles = []
  1997. for l in self.labels:
  1998. self.cycles.append(cycle(l))
  1999. o.update_display(0)
  2000. _iter += 1
  2001. cur_time = pygame.time.get_ticks()
  2002. delay = cur_time - self.last_action
  2003. if delay > 1000 and delay < 100000:
  2004. self.input_string += self.cur_letter
  2005. self.last_action = 100000000
  2006. self.reset_cycles()
  2007. self.draw(o)
  2008. o.center_block(self.input_string, o.h2, [0, 0, o.width, y_size], o.light_grey)
  2009. o.update_display(0)
  2010. def ReceiveMessage(self, message):
  2011. o = self.FSM.owner
  2012. play_seq(o, message)
  2013. def draw(self, o):
  2014. x_size = o.width / 4
  2015. y_size = o.height / 4
  2016. og_x = 0
  2017. o_x = og_x
  2018. o_y = o.height
  2019. text_padding = 6
  2020. _id = 0
  2021. while _id < 16:
  2022. lab = ""
  2023. for i in self.labels[_id]:
  2024. lab += i
  2025. if _id == 8:
  2026. lab = "_12"
  2027. o.draw.rectangle((o_x, o_y, o_x + x_size, o_y - y_size), outline=0, fill=o.blue)
  2028. o.center_block(lab, o.h2, [o_x, o_y, o_x + x_size, o_y - y_size], o.light_grey)
  2029. o_x = o_x + x_size
  2030. _id += 1
  2031. if _id % 4 == 0:
  2032. o_y -= y_size
  2033. o_x = og_x
  2034. o.draw.rectangle((0, 0, o.width, y_size), outline=0, fill=o.blue)
  2035. def reset_cycles(self):
  2036. self.cycles = []
  2037. for l in self.labels:
  2038. self.cycles.append(cycle(l))
  2039. def Exit(self):
  2040. self.FSM.owner.pub.unregister("beat", self)
  2041. #====================================
  2042. class LoadSound(State):
  2043. def __init__(self,FSM):
  2044. super(LoadSound, self).__init__(FSM)
  2045. def Enter(self):
  2046. o = self.FSM.owner
  2047. o.header_text = "Load Sound"
  2048. o.pub.register("beat", self)
  2049. self.cur_el = 0
  2050. self.press_ticks_up = None
  2051. self.press_ticks_down = None
  2052. self.menu = []
  2053. self.menu.append("..")
  2054. self.menu += self.get_file_list(o)
  2055. if o.last_load_sound_id != None and o.last_load_sound_id <= len(self.menu):
  2056. self.cur_el = o.last_load_sound_id
  2057. print('setting cur_el ', self.cur_el)
  2058. self.last_preview = None
  2059. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2060. pass
  2061. else:
  2062. draw_header(o)
  2063. self.draw_main(o)
  2064. o.update_display(0)
  2065. super(LoadSound, self).Enter()
  2066. def Execute(self):
  2067. o = self.FSM.owner
  2068. menu1_actions(self, o)
  2069. if o.keyState[16] == 1:
  2070. draw_menu1(o)
  2071. o.update_display(0)
  2072. elif o.keyState[16] == 4:
  2073. draw_header(o)
  2074. self.draw_footer(o)
  2075. self.draw_main(o)
  2076. o.update_display(0)
  2077. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  2078. draw_header(o)
  2079. self.draw_footer(o)
  2080. self.draw_main(o)
  2081. o.update_display(0)
  2082. #print('draw butt')
  2083. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2084. pass
  2085. else:
  2086. since_up = 0
  2087. if o.keyState[0] == 2:
  2088. if self.press_ticks_up == None:
  2089. self.press_ticks_up = pygame.time.get_ticks()
  2090. since_up = pygame.time.get_ticks() - self.press_ticks_up
  2091. else:
  2092. self.press_ticks_up = None
  2093. self.press_ticks_up = pygame.time.get_ticks()
  2094. if o.keyState[0] == 1 or since_up > 250:
  2095. if self.cur_el > 0:
  2096. self.cur_el -= 1
  2097. self.draw_main(o)
  2098. o.update_display(0)
  2099. self.press_ticks_up = pygame.time.get_ticks()
  2100. since_down = 0
  2101. if o.keyState[1] == 2:
  2102. if self.press_ticks_down == None:
  2103. self.press_ticks_down = pygame.time.get_ticks()
  2104. since_down = pygame.time.get_ticks() - self.press_ticks_down
  2105. else:
  2106. self.press_ticks_down = None
  2107. self.press_ticks_down = pygame.time.get_ticks()
  2108. if o.keyState[1] == 1 or since_down > 250:
  2109. if self.cur_el < (len(self.menu) - 1):
  2110. self.cur_el += 1
  2111. self.draw_main(o)
  2112. o.update_display(0)
  2113. self.press_ticks_down = pygame.time.get_ticks()
  2114. if o.keyState[2] == 1:
  2115. if self.is_wav():
  2116. if self.last_preview == self.menu[self.cur_el]:
  2117. pass
  2118. else:
  2119. snd = pygame.mixer.Sound(o.load_song_dir + self.menu[self.cur_el])
  2120. pygame.mixer.Sound.play(snd)
  2121. #o.last_load_sound_id = self.cur_el
  2122. if o.keyState[3] == 1:
  2123. if self.menu[self.cur_el] == '..':
  2124. print('directory up')
  2125. o.last_load_sound_id = None
  2126. if o.load_song_dir == '/home/pi/zpc_ct/user/sounds/':
  2127. print('root dir - cant go up')
  2128. else:
  2129. o.load_song_dir = os.path.dirname(os.path.dirname(o.load_song_dir))
  2130. o.load_song_dir += '/'
  2131. print('new up dir is ', o.load_song_dir)
  2132. self.menu = []
  2133. self.menu.append("..")
  2134. self.menu += self.get_file_list(o)
  2135. self.cur_el = 0
  2136. elif os.path.isdir(o.load_song_dir + self.menu[self.cur_el]):
  2137. print('this is a directory ', o.load_song_dir + self.menu[self.cur_el])
  2138. o.load_song_dir = o.load_song_dir + self.menu[self.cur_el] + '/'
  2139. self.menu = []
  2140. self.menu.append("..")
  2141. self.menu += self.get_file_list(o)
  2142. self.cur_el = 0
  2143. else:
  2144. print('this is not a directory ', o.load_song_dir + self.menu[self.cur_el])
  2145. o.soundSlots[o.eSound].file = o.load_song_dir + self.menu[self.cur_el]
  2146. o.soundSlots[o.eSound].volume = 16
  2147. o.soundSlots[o.eSound].pitch = 0
  2148. o.soundSlots[o.eSound].create_sound()
  2149. o.soundSlots[o.eSound].set_pitch()
  2150. o.last_load_sound_id = self.cur_el
  2151. self.FSM.ToTransition('toMain')
  2152. def get_file_list(self, o):
  2153. dirs = os.listdir(o.load_song_dir)
  2154. dirs.sort()
  2155. return dirs
  2156. def draw_main(self, o):
  2157. al = []
  2158. ypos = 30
  2159. #print(self.menu)
  2160. if self.cur_el == 0:
  2161. _iter = 0
  2162. while len(al) < 4:
  2163. if _iter < len(self.menu):
  2164. #print('appending to al', _iter, ' ', len(self.menu))
  2165. al.append(self.menu[_iter])
  2166. else:
  2167. break
  2168. _iter += 1
  2169. elif self.cur_el == 1:
  2170. al.append(self.menu[self.cur_el - 1])
  2171. al.append(self.menu[self.cur_el])
  2172. if (self.cur_el + 1) < len(self.menu):
  2173. al.append(self.menu[self.cur_el + 1])
  2174. if (self.cur_el + 2) < len(self.menu):
  2175. al.append(self.menu[self.cur_el + 2])
  2176. elif self.cur_el == (len(self.menu) - 2):
  2177. al.append(self.menu[self.cur_el - 2])
  2178. al.append(self.menu[self.cur_el - 1])
  2179. al.append(self.menu[self.cur_el])
  2180. al.append(self.menu[self.cur_el + 1])
  2181. elif self.cur_el == (len(self.menu) - 1):
  2182. al.append(self.menu[self.cur_el - 3])
  2183. al.append(self.menu[self.cur_el - 2])
  2184. al.append(self.menu[self.cur_el - 1])
  2185. al.append(self.menu[self.cur_el])
  2186. else:
  2187. al.append(self.menu[self.cur_el - 1])
  2188. al.append(self.menu[self.cur_el])
  2189. al.append(self.menu[self.cur_el + 1])
  2190. al.append(self.menu[self.cur_el + 2])
  2191. _iter = 0
  2192. #print(al)
  2193. for i in al:
  2194. if i == self.menu[self.cur_el]:
  2195. #if _iter == self.cur_el:
  2196. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  2197. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  2198. else:
  2199. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  2200. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  2201. ypos += 20
  2202. _iter += 1
  2203. def draw_footer(self, o):
  2204. _iter = 0
  2205. width = o.width / 4
  2206. xpos = 0
  2207. yposa = 135 - 25
  2208. yposb = 135
  2209. opts = ["Up", "Down", "Play", "Open"]
  2210. while _iter < 4:
  2211. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  2212. if o.keyState[_iter] == 1:
  2213. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  2214. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  2215. else:
  2216. if _iter == 2:
  2217. if self.is_wav():
  2218. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  2219. else:
  2220. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.dark_grey)
  2221. else:
  2222. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  2223. xpos += width
  2224. _iter += 1
  2225. def is_wav(self):
  2226. if len(self.menu[self.cur_el]) > 3 and (self.menu[self.cur_el][-1] == 'V' or self.menu[self.cur_el][-1] == 'v') and (self.menu[self.cur_el][-2] == 'A' or self.menu[self.cur_el][-2] == 'a'):
  2227. return True
  2228. else:
  2229. return False
  2230. def ReceiveMessage(self, message):
  2231. o = self.FSM.owner
  2232. play_seq(o, message)
  2233. def Exit(self):
  2234. self.FSM.owner.pub.unregister("beat", self)
  2235. #====================================
  2236. class Ping(State):
  2237. def __init__(self,FSM):
  2238. super(Ping, self).__init__(FSM)
  2239. def Enter(self):
  2240. o = self.FSM.owner
  2241. o.header_text = "Ping"
  2242. o.pub.register("beat", self)
  2243. #o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  2244. #o.center_block("ping", o.h2, [0, 0, o.width,o.height], o.light_grey)
  2245. #o.update_display(0)
  2246. self.pinging = self.check_ping()
  2247. self.draw_main(o)
  2248. draw_header(o)
  2249. o.update_display(0)
  2250. super(Ping, self).Enter()
  2251. def Execute(self):
  2252. o = self.FSM.owner
  2253. menu1_actions(self, o)
  2254. if o.keyState[16] == 1:
  2255. draw_menu1(o)
  2256. o.update_display(0)
  2257. elif o.keyState[16] == 4:
  2258. draw_header(o)
  2259. #self.draw_footer(o)
  2260. self.draw_main(o)
  2261. o.update_display(0)
  2262. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  2263. draw_header(o)
  2264. #self.draw_footer(o)
  2265. self.draw_main(o)
  2266. o.update_display(0)
  2267. def draw_main(self, o):
  2268. o.center_block(self.pinging, o.h2, [0, 0, o.width, o.height], o.light_grey)
  2269. def check_ping(self):
  2270. hostname = "8.8.8.8"
  2271. response = os.system("ping -c 1 " + hostname)
  2272. # and then check the response...
  2273. if response == 0:
  2274. pingstatus = "Network Active "
  2275. else:
  2276. pingstatus = "Network Error "
  2277. return pingstatus
  2278. def ReceiveMessage(self, message):
  2279. o = self.FSM.owner
  2280. play_seq(o, message)
  2281. def Exit(self):
  2282. self.FSM.owner.pub.unregister("beat", self)
  2283. #====================================
  2284. class Wifi(State):
  2285. def __init__(self,FSM):
  2286. super(Wifi, self).__init__(FSM)
  2287. def Enter(self):
  2288. o = self.FSM.owner
  2289. o.header_text = "Wifi"
  2290. o.pub.register("beat", self)
  2291. self.ipad = self.extract_ip()
  2292. self.ssid = os.popen("sudo iwgetid -r").read()
  2293. o.center_block(self.ipad, o.h2, [0, 0, o.width,o.height], o.light_grey)
  2294. draw_header(o)
  2295. self.draw_main(o)
  2296. o.update_display(0)
  2297. super(Wifi, self).Enter()
  2298. def Execute(self):
  2299. o = self.FSM.owner
  2300. menu1_actions(self, o)
  2301. if o.keyState[16] == 1:
  2302. draw_menu1(o)
  2303. o.update_display(0)
  2304. elif o.keyState[16] == 4:
  2305. draw_header(o)
  2306. #self.draw_footer(o)
  2307. self.draw_main(o)
  2308. o.update_display(0)
  2309. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  2310. draw_header(o)
  2311. #self.draw_footer(o)
  2312. self.draw_main(o)
  2313. o.update_display(0)
  2314. def draw_main(self, o):
  2315. o.center_block(self.ipad, o.h2, [0, 0, o.width, o.height], o.light_grey)
  2316. o.center_block(self.ssid, o.h2, [0, 40, o.width, o.height+40], o.light_grey)
  2317. def extract_ip(self):
  2318. st = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  2319. try:
  2320. #st.connect(('10.255.255.255', 1))
  2321. st.connect(("8.8.8.8", 80))
  2322. IP = st.getsockname()[0]
  2323. except Exception:
  2324. IP = '127.0.0.1'
  2325. finally:
  2326. st.close()
  2327. return IP
  2328. #print(extract_ip())
  2329. def ReceiveMessage(self, message):
  2330. o = self.FSM.owner
  2331. play_seq(o, message)
  2332. def Exit(self):
  2333. self.FSM.owner.pub.unregister("beat", self)
  2334. #====================================
  2335. class Defender(State):
  2336. def __init__(self,FSM):
  2337. super(Defender, self).__init__(FSM)
  2338. def Enter(self):
  2339. self.ball_size = 10
  2340. self.ballx = self.ball_size
  2341. self.bally = self.ball_size
  2342. self.ball_speed = 8
  2343. self.ball_x_dir = 1
  2344. self.ball_y_dir = 1
  2345. self.ball2x = self.ball_size + 180
  2346. self.ball2y = self.ball_size + 70
  2347. self.ball2_x_dir = -1
  2348. self.ball2_y_dir = -1
  2349. self.xmult = 1.0
  2350. o = self.FSM.owner
  2351. o.header_text = "Balls"
  2352. o.pub.register("beat", self)
  2353. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2354. pass
  2355. else:
  2356. draw_header(o)
  2357. o.update_display(0)
  2358. super(Defender, self).Enter()
  2359. def Execute(self):
  2360. o = self.FSM.owner
  2361. menu1_actions(self, o)
  2362. if o.keyState[16] == 1:
  2363. draw_menu1(o)
  2364. o.update_display(0)
  2365. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2366. pass
  2367. else:
  2368. now = datetime.now()
  2369. current_time = time.strftime("%-I:%M %p")
  2370. if self.ballx < (0 + self.ball_size):
  2371. self.ball_x_dir = 1
  2372. if self.ballx > (o.width - self.ball_size):
  2373. self.ball_x_dir = -1
  2374. if self.bally < (0 + self.ball_size):
  2375. self.ball_y_dir = 1
  2376. if self.bally > (o.height - self.ball_size):
  2377. self.ball_y_dir = -1
  2378. # if self.ballx > (o.width - self.ball_size) or self.ballx < (0 + self.ball_size):
  2379. # self.ball_x_dir *= -1
  2380. # if self.bally > (o.height - self.ball_size) or self.bally < (0 + self.ball_size):
  2381. # self.ball_y_dir *= -1
  2382. self.ballx += self.ball_speed * self.ball_x_dir
  2383. self.bally += self.ball_speed * self.ball_y_dir
  2384. if self.ball2x < (0 + self.ball_size):
  2385. self.ball2_x_dir = 1
  2386. self.xmult = random.uniform(.6, 1.2)
  2387. if self.ball2x > (o.width - self.ball_size):
  2388. self.ball2_x_dir = -1
  2389. self.xmult = random.uniform(.6, 1.2)
  2390. if self.ball2y < (0 + self.ball_size):
  2391. self.ball2_y_dir = 1
  2392. if self.ball2y > (o.height - self.ball_size):
  2393. self.ball2_y_dir = -1
  2394. # if self.ball2x > (o.width - self.ball_size) or self.ball2x < (0 + self.ball_size):
  2395. # self.ball2_x_dir *= -1
  2396. # self.xmult = random.uniform(.8, 1.2)
  2397. # if self.ball2y > (o.height - self.ball_size) or self.ball2y < (0 + self.ball_size):
  2398. # self.ball2_y_dir *= -1
  2399. self.ball2x += (self.ball_speed * self.ball2_x_dir) * self.xmult
  2400. self.ball2y += (self.ball_speed * self.ball2_y_dir)
  2401. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  2402. o.draw.ellipse((self.ballx - self.ball_size, self.bally - self.ball_size, self.ballx + self.ball_size, self.bally + self.ball_size), fill = o.light_grey, outline =o.light_grey)
  2403. o.draw.ellipse((self.ball2x - self.ball_size, self.ball2y - self.ball_size, self.ball2x + self.ball_size, self.ball2y + self.ball_size), fill = o.light_grey, outline =o.light_grey)
  2404. #o.center_block(current_time, o.h3, [0,0,o.width,o.height], o.pink)
  2405. o.update_display(0)
  2406. def ReceiveMessage(self, message):
  2407. o = self.FSM.owner
  2408. play_seq(o, message)
  2409. def Exit(self):
  2410. self.FSM.owner.pub.unregister("beat", self)
  2411. #====================================
  2412. #====================================
  2413. class Update(State):
  2414. def __init__(self,FSM):
  2415. super(Update, self).__init__(FSM)
  2416. def Enter(self):
  2417. o = self.FSM.owner
  2418. o.header_text = "Update"
  2419. o.pub.register("beat", self)
  2420. g = git.cmd.Git("/home/pi/zpc_ct/")
  2421. self.msg = g.pull()
  2422. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2423. pass
  2424. else:
  2425. draw_header(o)
  2426. o.update_display(0)
  2427. super(Update, self).Enter()
  2428. def Execute(self):
  2429. o = self.FSM.owner
  2430. menu1_actions(self, o)
  2431. if o.keyState[16] == 1:
  2432. draw_menu1(o)
  2433. o.update_display(0)
  2434. elif o.keyState[16] == 4:
  2435. draw_header(o)
  2436. #self.draw_footer(o)
  2437. self.draw_main(o)
  2438. o.update_display(0)
  2439. if o.keyState[0] == 1 or o.keyState[0] == 3 or o.keyState[1] == 1 or o.keyState[1] == 3 or o.keyState[2] == 1 or o.keyState[2] == 3 or o.keyState[3] == 1 or o.keyState[3] == 3:
  2440. draw_header(o)
  2441. #self.draw_footer(o)
  2442. self.draw_main(o)
  2443. o.update_display(0)
  2444. if o.keyState[16] > 0 or o.keyState[17] > 0:
  2445. pass
  2446. else:
  2447. pass
  2448. #o.update_display(0)
  2449. def draw_main(self, o):
  2450. #o.center_text(self.msg, o.h1, o.width, 25, o.light_grey)
  2451. o.center_block(self.msg, o.h2, [0, 0, o.width, o.height], o.light_grey)
  2452. def ReceiveMessage(self, message):
  2453. o = self.FSM.owner
  2454. play_seq(o, message)
  2455. def Exit(self):
  2456. self.FSM.owner.pub.unregister("beat", self)
  2457. #====================================