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.

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)