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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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. #====================================
  45. State = type("State", (object,), {})
  46. #====================================
  47. class State(object):
  48. def __init__(self, FSM):
  49. self.FSM = FSM
  50. self.timer = 0
  51. self.startTime = 0
  52. def Enter(self):
  53. self.timer = 0
  54. self.startTime = 0
  55. def Execute(self):
  56. print('Executing')
  57. def Exit(self):
  58. print('Exiting')
  59. #====================================
  60. class Example(State):
  61. def __init__(self,FSM):
  62. super(Example, self).__init__(FSM)
  63. def Enter(self):
  64. self.FSM.stateLife = 1
  65. super(Example, self).Enter()
  66. def Execute(self):
  67. self.FSM.stateLife += 1
  68. def Exit(self):
  69. pass
  70. #====================================
  71. class Startup(State):
  72. def __init__(self,FSM):
  73. super(Startup, self).__init__(FSM)
  74. def Enter(self):
  75. self.FSM.stateLife = 1
  76. self.birth = time.perf_counter()
  77. super(Startup, self).Enter()
  78. def Execute(self):
  79. self.FSM.stateLife += 1
  80. print('startup state')
  81. if hasattr(self, 'birth'):
  82. pass
  83. else:
  84. self.birth = time.perf_counter()
  85. self.FSM.ToTransition('toIntro')
  86. def Exit(self):
  87. pass
  88. #====================================
  89. class Intro(State):
  90. def __init__(self,FSM):
  91. super(Intro, self).__init__(FSM)
  92. def Enter(self):
  93. self.FSM.stateLife = 1
  94. o = self.FSM.owner
  95. o.header_text = "Starting up..."
  96. o.draw.rectangle((0, 0, self.FSM.owner.width, self.FSM.owner.height), outline=0, fill=o.blue)
  97. #u.draw_header(o)
  98. #o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  99. o.center_block("zpc_ct", o.h4, [0, 0, o.width, o.height-40], o.light_grey)
  100. o.center_block("Starting up...", o.h2, [0, 0, o.width, o.height+60], o.light_grey)
  101. #o.display_thread.start()
  102. o.update_display(0)
  103. #o.update_display(0)
  104. super(Intro, self).Enter()
  105. def Execute(self):
  106. self.FSM.stateLife += 1
  107. o = self.FSM.owner
  108. self.FSM.ToTransition('toLoadDefault')
  109. def Exit(self):
  110. pass
  111. #====================================
  112. class LoadDefault(State):
  113. def __init__(self,FSM):
  114. super(LoadDefault, self).__init__(FSM)
  115. def Enter(self):
  116. self.FSM.stateLife = 1
  117. o = self.FSM.owner
  118. o.init_slots()
  119. o.load_song()
  120. self.bank = 0
  121. self.sounds = []
  122. self.globbed = glob.glob('/home/pi/skull/*.wav') + glob.glob('/home/pi/skull/*.mp3')
  123. self.globbed.sort()
  124. obj_id = 0
  125. # for s in o.sconf['sounds']:
  126. # p1 = self.FSM.owner.SoundSlot(s, obj_id, o)
  127. # self.FSM.owner.soundSlots.append(p1)
  128. # obj_id += 1
  129. # _iter = 0
  130. # lst = ast.literal_eval(o.sconf['notes'][0])
  131. # print('length ', len(lst))
  132. # for n in o.soundSlots:
  133. # m = []
  134. # if _iter < (len(o.sconf.as_list('notes')) - 1):
  135. # lst = ast.literal_eval(o.sconf.as_list('notes')[_iter])
  136. # n.notes = lst
  137. # _iter += 1
  138. super(LoadDefault, self).Enter()
  139. def Execute(self):
  140. self.FSM.stateLife += 1
  141. self.FSM.ToTransition('toMain')
  142. def Exit(self):
  143. pass
  144. #====================================
  145. #====================================
  146. class PadPlayer(State):
  147. def __init__(self,FSM):
  148. super(PadPlayer, self).__init__(FSM)
  149. def Enter(self):
  150. self.FSM.stateLife = 1
  151. print('entering pad player')
  152. super(PadPlayer, self).Enter()
  153. def Execute(self):
  154. self.FSM.stateLife += 1
  155. _id = 0
  156. for k in self.FSM.owner.keyState:
  157. if _id < 16 and k == 1:
  158. self.FSM.owner.soundSlots[_id].play()
  159. _id += 1
  160. if self.FSM.owner.keys:
  161. print("Pressed: ", self.FSM.owner.keys)
  162. #self.FSM.ToTransition('toLand')
  163. def Exit(self):
  164. pass
  165. #====================================
  166. class SeqPlayer(State):
  167. def __init__(self,FSM):
  168. super(SeqPlayer, self).__init__(FSM)
  169. def Enter(self):
  170. self.FSM.stateLife = 1
  171. self.beat = 0
  172. self.FSM.owner.pub.register("beat", self)
  173. print('entering seq player')
  174. o = self.FSM.owner
  175. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  176. o.draw.text((20, 0), 'SeqPlayer', font=o.h1, fill="#FFFFFF")
  177. o.update_display(0)
  178. super(SeqPlayer, self).Enter()
  179. def Execute(self):
  180. self.FSM.stateLife += 1
  181. o = self.FSM.owner
  182. if o.keyState[12] == 1:
  183. o.start_playback()
  184. u.play_seq(o, [o.curPattern, 0])
  185. if o.keyState[13] == 1:
  186. o.stop_playback()
  187. #self.beat = o.playhead
  188. #print('key0 ', o.keyState[16])
  189. if o.keyState[16] == 2:
  190. #print('key0 ', o.keyState[16])
  191. if o.keyState[0] == 1:
  192. print('to main')
  193. self.FSM.ToTransition('toMain')
  194. def ReceiveMessage(self, message):
  195. #print(self.name, 'got message', message)
  196. o = self.FSM.owner
  197. o.draw.rectangle((0, 0, o.width, o.height), outline=0, fill=o.blue)
  198. o.draw.text((20, 0), str(message[0]) + ' - ' + str(message[1]), font=o.h1, fill="#FFFFFF")
  199. o.update_display(0)
  200. u.play_seq(o, message)
  201. def Exit(self):
  202. self.FSM.owner.pub.unregister("beat", self)
  203. #====================================