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.

sOpenSong.py 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import FSM
  2. import utils as u
  3. import menus as m
  4. import pygame
  5. from itertools import cycle
  6. import glob
  7. import os
  8. #====================================
  9. State = type("State", (object,), {})
  10. #====================================
  11. class State(object):
  12. def __init__(self, FSM):
  13. self.FSM = FSM
  14. def Enter(self):
  15. pass
  16. def Execute(self):
  17. pass
  18. def Exit(self):
  19. pass
  20. class OpenSong(State):
  21. def __init__(self,FSM):
  22. super(OpenSong, self).__init__(FSM)
  23. def Enter(self):
  24. o = self.FSM.owner
  25. o.header_text = "Open Song"
  26. o.pub.register("beat", self)
  27. self.cur_el = 0
  28. self.globbed = glob.glob('/home/pi/zpc_ct/user/songs/*.sng')
  29. self.globbed.sort()
  30. files = u.get_files(o.song_dir, '.sng')
  31. print('---new')
  32. print(files)
  33. files_trimmed = [os.path.basename(x) for x in files]
  34. files_trimmed = [os.path.splitext(x)[0] for x in files_trimmed]
  35. print('files trimmed ', files_trimmed)
  36. if '/home/pi/zpc_ct/user/songs/_blank.sng' in self.globbed:
  37. self.globbed.remove('/home/pi/zpc_ct/user/songs/_blank.sng')
  38. #del self.globbed[0]
  39. self.names = [os.path.basename(x) for x in self.globbed]
  40. self.names = [os.path.splitext(x)[0] for x in self.names]
  41. print('we got these songs ', self.names)
  42. print('in these paths ', self.globbed)
  43. #go to last selected
  44. # if o.mconf['default_song'] in self.names:
  45. # _id = self.names.index(o.mconf['default_song'])
  46. # self.cur_el = _id
  47. # else:
  48. # print('nope ', o.mconf['default_song'], ' - ', self.globbed)
  49. self.menu = self.names
  50. files_trimmed.insert(0, '..')
  51. self.menu = files_trimmed
  52. if '_blank' in self.menu:
  53. self.menu.remove('_blank')
  54. if o.keyState[16] > 0 or o.keyState[17] > 0:
  55. pass
  56. else:
  57. u.draw_header(o)
  58. self.draw_main(o)
  59. o.update_display(0)
  60. super(OpenSong, self).Enter()
  61. def Execute(self):
  62. o = self.FSM.owner
  63. m.menu1_actions(self, o)
  64. if o.keyState[16] == 1:
  65. m.draw_menu1(o)
  66. o.update_display(0)
  67. elif o.keyState[16] == 4:
  68. u.draw_header(o)
  69. self.draw_footer(o)
  70. self.draw_main(o)
  71. o.update_display(0)
  72. 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:
  73. u.draw_header(o)
  74. self.draw_footer(o)
  75. self.draw_main(o)
  76. o.update_display(0)
  77. if o.keyState[16] > 0 or o.keyState[17] > 0:
  78. pass
  79. else:
  80. if o.keyState[0] == 1:
  81. if self.cur_el > 0:
  82. self.cur_el -= 1
  83. # o.mconf['theme'] = self.menu[self.cur_el]
  84. # o.save_config()
  85. # o.load_config()
  86. # o.apply_theme()
  87. print('cur el down is ', self.cur_el)
  88. #o.applyTheme
  89. if o.keyState[1] == 1:
  90. if self.cur_el < (len(self.menu) - 1):
  91. self.cur_el += 1
  92. # o.mconf['theme'] = self.menu[self.cur_el]
  93. # o.save_config()
  94. # o.load_config()
  95. # o.apply_theme()
  96. print('cur el up is ', self.cur_el)
  97. #print('loading theme ', self.menu[self.cur_el], '-- ', o.mconf['theme'])
  98. if o.keyState[3] == 1:
  99. #open_command(self, o, self.menu[self.cur_el])
  100. if self.menu[self.cur_el] == '..':
  101. print('move up dir')
  102. if o.song_dir == o.base_song_dir:
  103. print('what the fuck')
  104. else:
  105. print('old song dir ', o.song_dir)
  106. o.song_dir = os.path.dirname(os.path.dirname(o.song_dir))
  107. o.song_dir += '/'
  108. print('new song dir ', o.song_dir)
  109. files = u.get_files(o.song_dir, '.sng')
  110. print('---new')
  111. print(files)
  112. files_trimmed = [os.path.basename(x) for x in files]
  113. files_trimmed = [os.path.splitext(x)[0] for x in files_trimmed]
  114. print('files trimmed ', files_trimmed)
  115. #self.names = [os.path.basename(x) for x in self.globbed]
  116. #self.names = [os.path.splitext(x)[0] for x in self.names]
  117. #self.menu = self.names
  118. files_trimmed.insert(0, '..')
  119. self.menu = files_trimmed
  120. if '_blank' in self.menu:
  121. self.menu.remove('_blank')
  122. u.draw_header(o)
  123. self.draw_footer(o)
  124. self.draw_main(o)
  125. o.update_display(0)
  126. elif os.path.isdir(o.song_dir + self.menu[self.cur_el]):
  127. o.song_dir += self.menu[self.cur_el] + '/'
  128. print('new song dir is ', o.song_dir)
  129. files = u.get_files(o.song_dir, '.sng')
  130. print('---new')
  131. print(files)
  132. files_trimmed = [os.path.basename(x) for x in files]
  133. files_trimmed = [os.path.splitext(x)[0] for x in files_trimmed]
  134. print('files trimmed ', files_trimmed)
  135. self.names = [os.path.basename(x) for x in self.globbed]
  136. self.names = [os.path.splitext(x)[0] for x in self.names]
  137. self.menu = self.names
  138. files_trimmed.insert(0, '..')
  139. self.menu = files_trimmed
  140. if '_blank' in self.menu:
  141. self.menu.remove('_blank')
  142. u.draw_header(o)
  143. self.draw_footer(o)
  144. self.draw_main(o)
  145. o.update_display(0)
  146. else:
  147. o.mconf['default_song'] = self.menu[self.cur_el]
  148. o.save_config()
  149. o.load_song()
  150. def draw_main(self, o):
  151. al = []
  152. ypos = 30
  153. print('cur el ', self.cur_el)
  154. if self.cur_el > (len(self.menu) - 1):
  155. self.cur_el = 0
  156. if self.cur_el == 0:
  157. _iter = 0
  158. while _iter < 4:
  159. if _iter < (len(self.menu)):
  160. al.append(self.menu[_iter])
  161. _iter += 1
  162. # print('cur el ', self.cur_el)
  163. # if self.cur_el == 0:
  164. # _iter = 0
  165. # while len(al) < 4:
  166. # al.append(self.menu[_iter])
  167. # _iter += 1
  168. elif self.cur_el == 1:
  169. al.append(self.menu[self.cur_el - 1])
  170. al.append(self.menu[self.cur_el])
  171. al.append(self.menu[self.cur_el + 1])
  172. al.append(self.menu[self.cur_el + 2])
  173. elif self.cur_el == (len(self.menu) - 2):
  174. al.append(self.menu[self.cur_el - 2])
  175. al.append(self.menu[self.cur_el - 1])
  176. al.append(self.menu[self.cur_el])
  177. al.append(self.menu[self.cur_el + 1])
  178. elif self.cur_el == (len(self.menu) - 1):
  179. al.append(self.menu[self.cur_el - 3])
  180. al.append(self.menu[self.cur_el - 2])
  181. al.append(self.menu[self.cur_el - 1])
  182. al.append(self.menu[self.cur_el])
  183. else:
  184. al.append(self.menu[self.cur_el - 1])
  185. al.append(self.menu[self.cur_el])
  186. al.append(self.menu[self.cur_el + 1])
  187. al.append(self.menu[self.cur_el + 2])
  188. _iter = 0
  189. for i in al:
  190. if i == self.menu[self.cur_el]:
  191. #if _iter == self.cur_el:
  192. if os.path.isdir(o.song_dir + i):
  193. i += "/"
  194. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  195. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  196. else:
  197. if os.path.isdir(o.song_dir + i):
  198. i += "/"
  199. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  200. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  201. ypos += 20
  202. _iter += 1
  203. def draw_footer(self, o):
  204. _iter = 0
  205. width = o.width / 4
  206. xpos = 0
  207. yposa = 135 - 25
  208. yposb = 135
  209. opts = ["Up", "Down", "Esc", "Open"]
  210. while _iter < 4:
  211. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  212. if o.keyState[_iter] == 1:
  213. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  214. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  215. else:
  216. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  217. xpos += width
  218. _iter += 1
  219. def ReceiveMessage(self, message):
  220. o = self.FSM.owner
  221. u.play_seq(o, message)
  222. def Exit(self):
  223. self.FSM.owner.pub.unregister("beat", self)