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 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)