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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import random
  2. import time
  3. import pygame
  4. import sys
  5. import pyaudio
  6. import wave
  7. import glob
  8. import os
  9. from itertools import cycle
  10. from datetime import datetime
  11. from datetime import date
  12. import ast
  13. import random
  14. from pathlib import Path
  15. #import socket
  16. import FSM
  17. import utils as u
  18. import menus as m
  19. #states
  20. from sMain import Main
  21. from sSelectSound import SelectSound
  22. from sSelectPattern import SelectPattern
  23. from sEditSong import EditSong
  24. from sEditSoundSequence import EditSoundSequence
  25. from sFile import File
  26. from sUtil import Util
  27. from sBall import Ball
  28. from sExit import Exit
  29. from sReboot import Reboot
  30. from sClock import Clock
  31. from sShutdown import Shutdown
  32. from sSelTheme import SelTheme
  33. from sOpenSong import OpenSong
  34. from sEnterText import EnterText
  35. from sLoadSound import LoadSound
  36. from sPing import Ping
  37. from sWifi import Wifi
  38. from sDefender import Defender
  39. from sCalculator import Calculator
  40. from sAbout import About
  41. from sUpdate import Update
  42. from sSelectFolder import SelectFolder
  43. from sNewDir import NewDir
  44. from sWifiSSID import WifiSSID
  45. #====================================
  46. State = type("State", (object,), {})
  47. #====================================
  48. class State(object):
  49. def __init__(self, FSM):
  50. self.FSM = FSM
  51. self.timer = 0
  52. self.startTime = 0
  53. def Enter(self):
  54. self.timer = 0
  55. self.startTime = 0
  56. def Execute(self):
  57. print('Executing')
  58. def Exit(self):
  59. print('Exiting')
  60. #====================================
  61. class Example(State):
  62. def __init__(self,FSM):
  63. super(Example, self).__init__(FSM)
  64. def Enter(self):
  65. self.FSM.stateLife = 1
  66. super(Example, self).Enter()
  67. def Execute(self):
  68. self.FSM.stateLife += 1
  69. def Exit(self):
  70. pass
  71. #====================================
  72. class Startup(State):
  73. def __init__(self,FSM):
  74. super(Startup, self).__init__(FSM)
  75. def Enter(self):
  76. self.FSM.stateLife = 1
  77. self.birth = time.perf_counter()
  78. super(Startup, self).Enter()
  79. def Execute(self):
  80. self.FSM.stateLife += 1
  81. print('startup state')
  82. if hasattr(self, 'birth'):
  83. pass
  84. else:
  85. self.birth = time.perf_counter()
  86. self.FSM.ToTransition('toIntro')
  87. def Exit(self):
  88. pass
  89. #====================================
  90. class Intro(State):
  91. def __init__(self,FSM):
  92. super(Intro, self).__init__(FSM)
  93. def Enter(self):
  94. self.FSM.stateLife = 1
  95. o = self.FSM.owner
  96. o.header_text = "Starting up..."
  97. o.draw.rectangle((0, 0, self.FSM.owner.width, self.FSM.owner.height), outline=0, fill=o.blue)
  98. #u.draw_header(o)
  99. #o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  100. o.center_block("zpc_ct", o.h4, [0, 0, o.width, o.height-40], o.light_grey)
  101. o.center_block("Starting up...", o.h2, [0, 0, o.width, o.height+60], o.light_grey)
  102. #o.display_thread.start()
  103. o.update_display(0)
  104. #o.update_display(0)
  105. super(Intro, self).Enter()
  106. def Execute(self):
  107. self.FSM.stateLife += 1
  108. o = self.FSM.owner
  109. self.FSM.ToTransition('toLoadDefault')
  110. def Exit(self):
  111. pass
  112. #====================================
  113. class LoadDefault(State):
  114. def __init__(self,FSM):
  115. super(LoadDefault, self).__init__(FSM)
  116. def Enter(self):
  117. self.FSM.stateLife = 1
  118. o = self.FSM.owner
  119. o.init_slots()
  120. o.load_song()
  121. self.bank = 0
  122. self.sounds = []
  123. self.globbed = glob.glob('/home/pi/skull/*.wav') + glob.glob('/home/pi/skull/*.mp3')
  124. self.globbed.sort()
  125. obj_id = 0
  126. # for s in o.sconf['sounds']:
  127. # p1 = self.FSM.owner.SoundSlot(s, obj_id, o)
  128. # self.FSM.owner.soundSlots.append(p1)
  129. # obj_id += 1
  130. # _iter = 0
  131. # lst = ast.literal_eval(o.sconf['notes'][0])
  132. # print('length ', len(lst))
  133. # for n in o.soundSlots:
  134. # m = []
  135. # if _iter < (len(o.sconf.as_list('notes')) - 1):
  136. # lst = ast.literal_eval(o.sconf.as_list('notes')[_iter])
  137. # n.notes = lst
  138. # _iter += 1
  139. super(LoadDefault, self).Enter()
  140. def Execute(self):
  141. self.FSM.stateLife += 1
  142. self.FSM.ToTransition('toMain')
  143. def Exit(self):
  144. pass
  145. #====================================
  146. #====================================
  147. class PadPlayer(State):
  148. def __init__(self,FSM):
  149. super(PadPlayer, self).__init__(FSM)
  150. def Enter(self):
  151. self.FSM.stateLife = 1
  152. print('entering pad player')
  153. super(PadPlayer, self).Enter()
  154. def Execute(self):
  155. self.FSM.stateLife += 1
  156. _id = 0
  157. for k in self.FSM.owner.keyState:
  158. if _id < 16 and k == 1:
  159. self.FSM.owner.soundSlots[_id].play()
  160. _id += 1
  161. if self.FSM.owner.keys:
  162. print("Pressed: ", self.FSM.owner.keys)
  163. #self.FSM.ToTransition('toLand')
  164. def Exit(self):
  165. pass
  166. #====================================
  167. class SeqPlayer(State):
  168. def __init__(self,FSM):
  169. super(SeqPlayer, self).__init__(FSM)
  170. def Enter(self):
  171. self.FSM.stateLife = 1
  172. self.beat = 0
  173. self.FSM.owner.pub.register("beat", self)
  174. print('entering seq player')
  175. o = self.FSM.owner
  176. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  177. o.draw.text((20, 0), 'SeqPlayer', font=o.h1, fill="#FFFFFF")
  178. o.update_display(0)
  179. super(SeqPlayer, self).Enter()
  180. def Execute(self):
  181. self.FSM.stateLife += 1
  182. o = self.FSM.owner
  183. if o.keyState[12] == 1:
  184. o.start_playback()
  185. u.play_seq(o, [o.curPattern, 0])
  186. if o.keyState[13] == 1:
  187. o.stop_playback()
  188. #self.beat = o.playhead
  189. #print('key0 ', o.keyState[16])
  190. if o.keyState[16] == 2:
  191. #print('key0 ', o.keyState[16])
  192. if o.keyState[0] == 1:
  193. print('to main')
  194. self.FSM.ToTransition('toMain')
  195. def ReceiveMessage(self, message):
  196. #print(self.name, 'got message', message)
  197. o = self.FSM.owner
  198. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  199. o.draw.text((20, 0), str(message[0]) + ' - ' + str(message[1]), font=o.h1, fill="#FFFFFF")
  200. o.update_display(0)
  201. u.play_seq(o, message)
  202. def Exit(self):
  203. self.FSM.owner.pub.unregister("beat", self)
  204. #====================================