raspberry pi zero based drum machine
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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)