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 77KB

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