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.

sLoadSound.py 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. import FSM
  2. import utils as u
  3. import menus as m
  4. import os
  5. import pygame
  6. #====================================
  7. State = type("State", (object,), {})
  8. #====================================
  9. class State(object):
  10. def __init__(self, FSM):
  11. self.FSM = FSM
  12. def Enter(self):
  13. pass
  14. def Execute(self):
  15. pass
  16. def Exit(self):
  17. pass
  18. #====================================
  19. class LoadSound(State):
  20. def __init__(self,FSM):
  21. super(LoadSound, self).__init__(FSM)
  22. def Enter(self):
  23. o = self.FSM.owner
  24. o.header_text = "Load Sound"
  25. o.pub.register("beat", self)
  26. self.cur_el = 0
  27. self.press_ticks_up = None
  28. self.press_ticks_down = None
  29. self.menu = []
  30. self.menu.append("..")
  31. self.menu += self.get_file_list(o)
  32. dirs = u.get_folders(o.load_sound_dir)
  33. files = u.get_files(o.load_sound_dir, '.wav')
  34. print('directory is ', o.load_sound_dir)
  35. print('dirs are ', dirs)
  36. print('files are ', files)
  37. if o.last_load_sound_id != None and o.last_load_sound_id <= len(self.menu):
  38. self.cur_el = o.last_load_sound_id
  39. print('setting cur_el ', self.cur_el)
  40. self.last_preview = None
  41. if o.keyState[16] > 0 or o.keyState[17] > 0:
  42. pass
  43. else:
  44. u.draw_header(o)
  45. self.draw_main(o)
  46. o.update_display(0)
  47. super(LoadSound, self).Enter()
  48. def Execute(self):
  49. o = self.FSM.owner
  50. m.menu1_actions(self, o)
  51. if o.keyState[16] == 1:
  52. m.draw_menu1(o)
  53. o.update_display(0)
  54. elif o.keyState[16] == 4:
  55. u.draw_header(o)
  56. self.draw_footer(o)
  57. self.draw_main(o)
  58. o.update_display(0)
  59. 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:
  60. u.draw_header(o)
  61. self.draw_footer(o)
  62. self.draw_main(o)
  63. o.update_display(0)
  64. if o.keyState[16] > 0 or o.keyState[17] > 0:
  65. pass
  66. else:
  67. since_up = 0
  68. if o.keyState[0] == 2:
  69. if self.press_ticks_up == None:
  70. self.press_ticks_up = pygame.time.get_ticks()
  71. since_up = pygame.time.get_ticks() - self.press_ticks_up
  72. else:
  73. self.press_ticks_up = None
  74. self.press_ticks_up = pygame.time.get_ticks()
  75. if o.keyState[0] == 1 or since_up > 250:
  76. if self.cur_el > 0:
  77. self.cur_el -= 1
  78. self.draw_main(o)
  79. o.update_display(0)
  80. self.press_ticks_up = pygame.time.get_ticks()
  81. since_down = 0
  82. if o.keyState[1] == 2:
  83. if self.press_ticks_down == None:
  84. self.press_ticks_down = pygame.time.get_ticks()
  85. since_down = pygame.time.get_ticks() - self.press_ticks_down
  86. else:
  87. self.press_ticks_down = None
  88. self.press_ticks_down = pygame.time.get_ticks()
  89. if o.keyState[1] == 1 or since_down > 250:
  90. if self.cur_el < (len(self.menu) - 1):
  91. self.cur_el += 1
  92. self.draw_main(o)
  93. o.update_display(0)
  94. self.press_ticks_down = pygame.time.get_ticks()
  95. if o.keyState[2] == 1:
  96. if self.is_wav():
  97. if self.last_preview == self.menu[self.cur_el]:
  98. pass
  99. else:
  100. snd = pygame.mixer.Sound(o.load_sound_dir + self.menu[self.cur_el])
  101. pygame.mixer.Sound.play(snd)
  102. if o.keyState[3] == 1:
  103. if self.menu[self.cur_el] == '..':
  104. print('directory up')
  105. o.last_load_sound_id = None
  106. if o.load_sound_dir == '/home/pi/zpc_ct/user/sounds/':
  107. print('root dir - cant go up')
  108. else:
  109. o.load_sound_dir = os.path.dirname(os.path.dirname(o.load_sound_dir))
  110. o.load_sound_dir += '/'
  111. print('new up dir is ', o.load_sound_dir)
  112. self.menu = []
  113. self.menu.append("..")
  114. self.menu += self.get_file_list(o)
  115. self.cur_el = 0
  116. elif os.path.isdir(o.load_sound_dir + self.menu[self.cur_el]):
  117. print('this is a directory ', o.load_sound_dir + self.menu[self.cur_el])
  118. o.load_sound_dir = o.load_sound_dir + self.menu[self.cur_el] + '/'
  119. self.menu = []
  120. self.menu.append("..")
  121. self.menu += self.get_file_list(o)
  122. self.cur_el = 0
  123. else:
  124. print('this is not a directory ', o.load_sound_dir + self.menu[self.cur_el])
  125. o.soundSlots[o.eSound].file = o.load_sound_dir + self.menu[self.cur_el]
  126. o.soundSlots[o.eSound].volume = 16
  127. o.soundSlots[o.eSound].pitch = 0
  128. o.soundSlots[o.eSound].create_sound()
  129. o.soundSlots[o.eSound].set_pitch()
  130. o.last_load_sound_id = self.cur_el
  131. self.FSM.ToTransition('toMain')
  132. def get_file_list(self, o):
  133. dirs = os.listdir(o.load_sound_dir)
  134. dirs.sort()
  135. for i in dirs:
  136. if os.path.isdir(o.load_sound_dir + i):
  137. i += "/asdfasdfasf"
  138. print(i, ' is a directory')
  139. else:
  140. print(i, ' is not a directory')
  141. print(dirs)
  142. return dirs
  143. def draw_main(self, o):
  144. al = []
  145. ypos = 30
  146. if self.cur_el == 0:
  147. _iter = 0
  148. while len(al) < 4:
  149. if _iter < len(self.menu):
  150. al.append(self.menu[_iter])
  151. else:
  152. break
  153. _iter += 1
  154. elif self.cur_el == 1:
  155. al.append(self.menu[self.cur_el - 1])
  156. al.append(self.menu[self.cur_el])
  157. if (self.cur_el + 1) < len(self.menu):
  158. al.append(self.menu[self.cur_el + 1])
  159. if (self.cur_el + 2) < len(self.menu):
  160. al.append(self.menu[self.cur_el + 2])
  161. elif self.cur_el == (len(self.menu) - 2):
  162. al.append(self.menu[self.cur_el - 2])
  163. al.append(self.menu[self.cur_el - 1])
  164. al.append(self.menu[self.cur_el])
  165. al.append(self.menu[self.cur_el + 1])
  166. elif self.cur_el == (len(self.menu) - 1):
  167. al.append(self.menu[self.cur_el - 3])
  168. al.append(self.menu[self.cur_el - 2])
  169. al.append(self.menu[self.cur_el - 1])
  170. al.append(self.menu[self.cur_el])
  171. else:
  172. al.append(self.menu[self.cur_el - 1])
  173. al.append(self.menu[self.cur_el])
  174. al.append(self.menu[self.cur_el + 1])
  175. al.append(self.menu[self.cur_el + 2])
  176. _iter = 0
  177. for i in al:
  178. if i == self.menu[self.cur_el]:
  179. if os.path.isdir(o.load_sound_dir + i):
  180. i += "/"
  181. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  182. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  183. else:
  184. if os.path.isdir(o.load_sound_dir + i):
  185. i += "/"
  186. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  187. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  188. ypos += 20
  189. _iter += 1
  190. def draw_footer(self, o):
  191. _iter = 0
  192. width = o.width / 4
  193. xpos = 0
  194. yposa = 135 - 25
  195. yposb = 135
  196. opts = ["Up", "Down", "Play", "Open"]
  197. while _iter < 4:
  198. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  199. if o.keyState[_iter] == 1:
  200. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  201. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  202. else:
  203. if _iter == 2:
  204. if self.is_wav():
  205. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  206. else:
  207. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.dark_grey)
  208. else:
  209. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  210. xpos += width
  211. _iter += 1
  212. def is_wav(self):
  213. 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') and (self.menu[self.cur_el][-3] == 'W' or self.menu[self.cur_el][-3] == 'w'):
  214. return True
  215. else:
  216. return False
  217. def ReceiveMessage(self, message):
  218. o = self.FSM.owner
  219. u.play_seq(o, message)
  220. def Exit(self):
  221. self.FSM.owner.pub.unregister("beat", self)