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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. files_trimmed = [os.path.basename(x) for x in files]
  32. files_trimmed = [os.path.splitext(x)[0] for x in files_trimmed]
  33. if '/home/pi/zpc_ct/user/songs/_blank.sng' in self.globbed:
  34. self.globbed.remove('/home/pi/zpc_ct/user/songs/_blank.sng')
  35. self.names = [os.path.basename(x) for x in self.globbed]
  36. self.names = [os.path.splitext(x)[0] for x in self.names]
  37. print('we got these songs ', self.names)
  38. print('in these paths ', self.globbed)
  39. self.menu = self.names
  40. files_trimmed.insert(0, '..')
  41. self.menu = files_trimmed
  42. if '_blank' in self.menu:
  43. self.menu.remove('_blank')
  44. if o.keyState[16] > 0 or o.keyState[17] > 0:
  45. pass
  46. else:
  47. u.draw_header(o)
  48. self.draw_main(o)
  49. o.update_display(0)
  50. super(OpenSong, self).Enter()
  51. def Execute(self):
  52. o = self.FSM.owner
  53. m.menu1_actions(self, o)
  54. if o.keyState[16] == 1:
  55. m.draw_menu1(o)
  56. o.update_display(0)
  57. elif o.keyState[16] == 4:
  58. u.draw_header(o)
  59. self.draw_footer(o)
  60. self.draw_main(o)
  61. o.update_display(0)
  62. 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:
  63. u.draw_header(o)
  64. self.draw_footer(o)
  65. self.draw_main(o)
  66. o.update_display(0)
  67. if o.keyState[16] > 0 or o.keyState[17] > 0:
  68. pass
  69. else:
  70. u.scroll_ud(o, self)
  71. if o.keyState[3] == 1:
  72. if self.menu[self.cur_el] == '..':
  73. if o.song_dir == o.base_song_dir:
  74. pass
  75. else:
  76. o.song_dir = os.path.dirname(os.path.dirname(o.song_dir))
  77. o.song_dir += '/'
  78. files = u.get_files(o.song_dir, '.sng')
  79. files_trimmed = [os.path.basename(x) for x in files]
  80. files_trimmed = [os.path.splitext(x)[0] for x in files_trimmed]
  81. files_trimmed.insert(0, '..')
  82. self.menu = files_trimmed
  83. if '_blank' in self.menu:
  84. self.menu.remove('_blank')
  85. u.draw_header(o)
  86. self.draw_footer(o)
  87. self.draw_main(o)
  88. o.update_display(0)
  89. elif os.path.isdir(o.song_dir + self.menu[self.cur_el]):
  90. o.song_dir += self.menu[self.cur_el] + '/'
  91. files = u.get_files(o.song_dir, '.sng')
  92. files_trimmed = [os.path.basename(x) for x in files]
  93. files_trimmed = [os.path.splitext(x)[0] for x in files_trimmed]
  94. self.names = [os.path.basename(x) for x in self.globbed]
  95. self.names = [os.path.splitext(x)[0] for x in self.names]
  96. self.menu = self.names
  97. files_trimmed.insert(0, '..')
  98. self.menu = files_trimmed
  99. if '_blank' in self.menu:
  100. self.menu.remove('_blank')
  101. u.draw_header(o)
  102. self.draw_footer(o)
  103. self.draw_main(o)
  104. o.update_display(0)
  105. else:
  106. o.mconf['default_song'] = self.menu[self.cur_el]
  107. o.save_config()
  108. o.load_song()
  109. def draw_main(self, o):
  110. al = []
  111. ypos = 30
  112. if self.cur_el > (len(self.menu) - 1):
  113. self.cur_el = 0
  114. if self.cur_el == 0:
  115. _iter = 0
  116. while _iter < 4:
  117. if _iter < (len(self.menu)):
  118. al.append(self.menu[_iter])
  119. _iter += 1
  120. elif self.cur_el == 1:
  121. al.append(self.menu[self.cur_el - 1])
  122. al.append(self.menu[self.cur_el])
  123. al.append(self.menu[self.cur_el + 1])
  124. al.append(self.menu[self.cur_el + 2])
  125. elif self.cur_el == (len(self.menu) - 2):
  126. al.append(self.menu[self.cur_el - 2])
  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. elif self.cur_el == (len(self.menu) - 1):
  131. al.append(self.menu[self.cur_el - 3])
  132. al.append(self.menu[self.cur_el - 2])
  133. al.append(self.menu[self.cur_el - 1])
  134. al.append(self.menu[self.cur_el])
  135. else:
  136. al.append(self.menu[self.cur_el - 1])
  137. al.append(self.menu[self.cur_el])
  138. al.append(self.menu[self.cur_el + 1])
  139. al.append(self.menu[self.cur_el + 2])
  140. _iter = 0
  141. for i in al:
  142. if i == self.menu[self.cur_el]:
  143. if os.path.isdir(o.song_dir + i):
  144. i += "/"
  145. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.light_grey)
  146. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.blue)
  147. else:
  148. if os.path.isdir(o.song_dir + i):
  149. i += "/"
  150. o.draw.rectangle((0, ypos, o.width, ypos + 20), outline=0, fill=o.blue)
  151. o.center_block(i, o.h2, [0, ypos, o.width,ypos + 20], o.light_grey)
  152. ypos += 20
  153. _iter += 1
  154. def draw_footer(self, o):
  155. _iter = 0
  156. width = o.width / 4
  157. xpos = 0
  158. yposa = 135 - 25
  159. yposb = 135
  160. opts = ["Up", "Down", "Esc", "Open"]
  161. while _iter < 4:
  162. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.blue)
  163. if o.keyState[_iter] == 1:
  164. o.draw.rectangle((xpos, yposa, xpos + width, yposb), outline=0, fill=o.light_grey)
  165. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.blue)
  166. else:
  167. o.center_block(opts[_iter], o.h2, [xpos,yposa,xpos + width,yposb], o.light_grey)
  168. xpos += width
  169. _iter += 1
  170. def ReceiveMessage(self, message):
  171. o = self.FSM.owner
  172. u.play_seq(o, message)
  173. def Exit(self):
  174. self.FSM.owner.pub.unregister("beat", self)