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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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.menu = []
  28. self.menu.append("..")
  29. self.menu += self.get_file_list(o)
  30. dirs = u.get_folders(o.load_sound_dir)
  31. files = u.get_files(o.load_sound_dir, '.wav')
  32. if o.last_load_sound_id != None and o.last_load_sound_id <= len(self.menu):
  33. self.cur_el = o.last_load_sound_id
  34. self.last_preview = None
  35. if o.keyState[16] > 0 or o.keyState[17] > 0:
  36. pass
  37. else:
  38. u.draw_header(o)
  39. self.draw_main(o)
  40. o.update_display(0)
  41. super(LoadSound, self).Enter()
  42. def Execute(self):
  43. o = self.FSM.owner
  44. m.menu1_actions(self, o)
  45. if o.keyState[16] == 1:
  46. m.draw_menu1(o)
  47. o.update_display(0)
  48. elif o.keyState[16] == 4:
  49. u.draw_header(o)
  50. self.draw_footer(o)
  51. self.draw_main(o)
  52. o.update_display(0)
  53. 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:
  54. u.draw_header(o)
  55. self.draw_footer(o)
  56. self.draw_main(o)
  57. o.update_display(0)
  58. if o.keyState[16] > 0 or o.keyState[17] > 0:
  59. pass
  60. else:
  61. u.scroll_ud(o, self)
  62. if o.keyState[2] == 1:
  63. if self.is_wav():
  64. if self.last_preview == self.menu[self.cur_el]:
  65. pass
  66. else:
  67. snd = pygame.mixer.Sound(o.load_sound_dir + self.menu[self.cur_el])
  68. pygame.mixer.Sound.play(snd)
  69. if o.keyState[3] == 1:
  70. if self.menu[self.cur_el] == '..':
  71. o.last_load_sound_id = None
  72. if o.load_sound_dir == '/home/pi/zpc_ct/user/sounds/':
  73. pass
  74. else:
  75. o.load_sound_dir = os.path.dirname(os.path.dirname(o.load_sound_dir))
  76. o.load_sound_dir += '/'
  77. self.menu = []
  78. self.menu.append("..")
  79. self.menu += self.get_file_list(o)
  80. self.cur_el = 0
  81. elif os.path.isdir(o.load_sound_dir + self.menu[self.cur_el]):
  82. o.load_sound_dir = o.load_sound_dir + self.menu[self.cur_el] + '/'
  83. self.menu = []
  84. self.menu.append("..")
  85. self.menu += self.get_file_list(o)
  86. self.cur_el = 0
  87. else:
  88. o.soundSlots[o.eSound].file = o.load_sound_dir + self.menu[self.cur_el]
  89. o.soundSlots[o.eSound].volume = 16
  90. o.soundSlots[o.eSound].pitch = 0
  91. o.soundSlots[o.eSound].create_sound()
  92. o.soundSlots[o.eSound].set_pitch()
  93. o.last_load_sound_id = self.cur_el
  94. self.FSM.ToTransition('toMain')
  95. def get_file_list(self, o):
  96. dirs = u.get_files(o.load_sound_dir, '.wav')
  97. return dirs
  98. def draw_main(self, o):
  99. al = []
  100. ypos = 30
  101. if self.cur_el == 0:
  102. _iter = 0
  103. while len(al) < 4:
  104. if _iter < len(self.menu):
  105. al.append(self.menu[_iter])
  106. else:
  107. break
  108. _iter += 1
  109. elif self.cur_el == 1:
  110. al.append(self.menu[self.cur_el - 1])
  111. al.append(self.menu[self.cur_el])
  112. if (self.cur_el + 1) < len(self.menu):
  113. al.append(self.menu[self.cur_el + 1])
  114. if (self.cur_el + 2) < len(self.menu):
  115. al.append(self.menu[self.cur_el + 2])
  116. elif self.cur_el == (len(self.menu) - 2):
  117. al.append(self.menu[self.cur_el - 2])
  118. al.append(self.menu[self.cur_el - 1])
  119. al.append(self.menu[self.cur_el])
  120. al.append(self.menu[self.cur_el + 1])
  121. elif self.cur_el == (len(self.menu) - 1):
  122. al.append(self.menu[self.cur_el - 3])
  123. al.append(self.menu[self.cur_el - 2])
  124. al.append(self.menu[self.cur_el - 1])
  125. al.append(self.menu[self.cur_el])
  126. else:
  127. al.append(self.menu[self.cur_el - 1])
  128. al.append(self.menu[self.cur_el])
  129. al.append(self.menu[self.cur_el + 1])
  130. al.append(self.menu[self.cur_el + 2])
  131. _iter = 0
  132. for i in al:
  133. if i == self.menu[self.cur_el]:
  134. if os.path.isdir(o.load_sound_dir + i):
  135. i += "/"
  136. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  137. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  138. else:
  139. if os.path.isdir(o.load_sound_dir + i):
  140. i += "/"
  141. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  142. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  143. ypos += 20
  144. _iter += 1
  145. def draw_footer(self, o):
  146. _iter = 0
  147. width = o.width / 4
  148. xpos = 0
  149. yposa = 135 - 25
  150. yposb = 135
  151. opts = ["Up", "Down", "Play", "Open"]
  152. while _iter < 4:
  153. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  154. if o.keyState[_iter] == 1:
  155. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  156. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  157. else:
  158. if _iter == 2:
  159. if self.is_wav():
  160. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  161. else:
  162. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.dark_grey)
  163. else:
  164. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  165. xpos += width
  166. _iter += 1
  167. def is_wav(self):
  168. 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'):
  169. return True
  170. else:
  171. return False
  172. def ReceiveMessage(self, message):
  173. o = self.FSM.owner
  174. u.play_seq(o, message)
  175. def Exit(self):
  176. self.FSM.owner.pub.unregister("beat", self)