zero_tracker.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #include <furi.h>
  2. #include "zero_tracker.h"
  3. #include "tracker_engine/tracker.h"
  4. Channel p_0_channels[] = {
  5. {
  6. .rows =
  7. {
  8. // 1/4
  9. ROW_MAKE(NOTE_C3, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  10. ROW_MAKE(0, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  11. ROW_MAKE(NOTE_C4, EffectSlideToNote, 0x20),
  12. ROW_MAKE(0, EffectSlideToNote, 0x20),
  13. //
  14. ROW_MAKE(0, EffectSlideToNote, 0x20),
  15. ROW_MAKE(0, EffectSlideToNote, 0x20),
  16. ROW_MAKE(0, EffectSlideToNote, 0x20),
  17. ROW_MAKE(0, EffectSlideToNote, 0x20),
  18. //
  19. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  20. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  21. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  22. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  23. //
  24. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  25. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  26. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  27. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  28. // 2/4
  29. ROW_MAKE(NOTE_C3, EffectSlideDown, 0x20),
  30. ROW_MAKE(0, EffectSlideDown, 0x20),
  31. ROW_MAKE(NOTE_C4, EffectVibrato, EFFECT_DATA_2(3, 3)),
  32. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  33. //
  34. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  35. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  36. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  37. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  38. //
  39. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  40. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  41. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  42. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  43. //
  44. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  45. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  46. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  47. ROW_MAKE(NOTE_OFF, EffectVibrato, EFFECT_DATA_2(3, 3)),
  48. // 3/4
  49. ROW_MAKE(NOTE_C3, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  50. ROW_MAKE(0, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  51. ROW_MAKE(NOTE_OFF, 0, 0),
  52. ROW_MAKE(0, 0, 0),
  53. //
  54. ROW_MAKE(0, 0, 0),
  55. ROW_MAKE(0, 0, 0),
  56. ROW_MAKE(0, 0, 0),
  57. ROW_MAKE(0, 0, 0),
  58. //
  59. ROW_MAKE(NOTE_C2, EffectPWM, 60),
  60. ROW_MAKE(0, EffectPWM, 32),
  61. ROW_MAKE(0, EffectPWM, 12),
  62. ROW_MAKE(NOTE_OFF, 0, 0),
  63. //
  64. ROW_MAKE(0, 0, 0),
  65. ROW_MAKE(0, 0, 0),
  66. ROW_MAKE(0, 0, 0),
  67. ROW_MAKE(0, 0, 0),
  68. // 4/4
  69. ROW_MAKE(NOTE_C3, EffectSlideDown, 0x20),
  70. ROW_MAKE(0, EffectSlideDown, 0x20),
  71. ROW_MAKE(0, EffectSlideDown, 0x20),
  72. ROW_MAKE(NOTE_OFF, 0, 0),
  73. //
  74. ROW_MAKE(0, 0, 0),
  75. ROW_MAKE(0, 0, 0),
  76. ROW_MAKE(0, 0, 0),
  77. ROW_MAKE(0, 0, 0),
  78. //
  79. ROW_MAKE(NOTE_C2, EffectPWM, 60),
  80. ROW_MAKE(0, EffectPWM, 32),
  81. ROW_MAKE(0, EffectPWM, 12),
  82. ROW_MAKE(NOTE_OFF, 0, 0),
  83. //
  84. ROW_MAKE(0, 0, 0),
  85. ROW_MAKE(0, 0, 0),
  86. ROW_MAKE(0, 0, 0),
  87. ROW_MAKE(0, 0, 0),
  88. },
  89. },
  90. };
  91. Channel p_1_channels[] = {
  92. {
  93. .rows =
  94. {
  95. //
  96. ROW_MAKE(NOTE_A4, 0, 0),
  97. ROW_MAKE(NOTE_C3, 0, 0),
  98. ROW_MAKE(NOTE_F2, 0, 0),
  99. ROW_MAKE(NOTE_C3, 0, 0),
  100. //
  101. ROW_MAKE(NOTE_E4, 0, 0),
  102. ROW_MAKE(NOTE_C3, 0, 0),
  103. ROW_MAKE(NOTE_E4, 0, 0),
  104. ROW_MAKE(NOTE_OFF, 0, 0),
  105. //
  106. ROW_MAKE(NOTE_A4, 0, 0),
  107. ROW_MAKE(NOTE_A4, 0, 0),
  108. ROW_MAKE(NOTE_A4, 0, 0),
  109. ROW_MAKE(NOTE_OFF, 0, 0),
  110. //
  111. ROW_MAKE(NOTE_E5, 0, 0),
  112. ROW_MAKE(NOTE_E5, 0, 0),
  113. ROW_MAKE(NOTE_E5, 0, 0),
  114. ROW_MAKE(NOTE_OFF, 0, 0),
  115. //
  116. ROW_MAKE(NOTE_D5, 0, 0),
  117. ROW_MAKE(NOTE_C3, 0, 0),
  118. ROW_MAKE(NOTE_F2, 0, 0),
  119. ROW_MAKE(NOTE_C3, 0, 0),
  120. //
  121. ROW_MAKE(NOTE_C5, 0, 0),
  122. ROW_MAKE(NOTE_C3, 0, 0),
  123. ROW_MAKE(NOTE_C5, 0, 0),
  124. ROW_MAKE(NOTE_OFF, 0, 0),
  125. //
  126. ROW_MAKE(NOTE_A4, 0, 0),
  127. ROW_MAKE(0, 0, 0),
  128. ROW_MAKE(0, 0, 0),
  129. ROW_MAKE(0, 0, 0),
  130. //
  131. ROW_MAKE(NOTE_A4, 0, 0),
  132. ROW_MAKE(NOTE_A4, 0, 0),
  133. ROW_MAKE(NOTE_A4, 0, 0),
  134. ROW_MAKE(NOTE_OFF, 0, 0),
  135. //
  136. ROW_MAKE(NOTE_B4, 0, 0),
  137. ROW_MAKE(NOTE_D3, 0, 0),
  138. ROW_MAKE(NOTE_G2, 0, 0),
  139. ROW_MAKE(NOTE_D3, 0, 0),
  140. //
  141. ROW_MAKE(NOTE_E4, 0, 0),
  142. ROW_MAKE(NOTE_D3, 0, 0),
  143. ROW_MAKE(NOTE_E4, 0, 0),
  144. ROW_MAKE(NOTE_OFF, 0, 0),
  145. //
  146. ROW_MAKE(NOTE_A4, 0, 0),
  147. ROW_MAKE(NOTE_A4, 0, 0),
  148. ROW_MAKE(NOTE_A4, 0, 0),
  149. ROW_MAKE(NOTE_OFF, 0, 0),
  150. //
  151. ROW_MAKE(NOTE_E5, 0, 0),
  152. ROW_MAKE(NOTE_E5, 0, 0),
  153. ROW_MAKE(NOTE_E5, 0, 0),
  154. ROW_MAKE(NOTE_OFF, 0, 0),
  155. //
  156. ROW_MAKE(NOTE_D5, 0, 0),
  157. ROW_MAKE(NOTE_D3, 0, 0),
  158. ROW_MAKE(NOTE_G2, 0, 0),
  159. ROW_MAKE(NOTE_D3, 0, 0),
  160. //
  161. ROW_MAKE(NOTE_C5, 0, 0),
  162. ROW_MAKE(NOTE_D3, 0, 0),
  163. ROW_MAKE(NOTE_C5, 0, 0),
  164. ROW_MAKE(NOTE_OFF, 0, 0),
  165. //
  166. ROW_MAKE(NOTE_A4, 0, 0),
  167. ROW_MAKE(0, 0, 0),
  168. ROW_MAKE(0, 0, 0),
  169. ROW_MAKE(0, 0, 0),
  170. //
  171. ROW_MAKE(NOTE_A4, 0, 0),
  172. ROW_MAKE(NOTE_A4, 0, 0),
  173. ROW_MAKE(NOTE_A4, 0, 0),
  174. ROW_MAKE(NOTE_OFF, 0, 0),
  175. },
  176. },
  177. };
  178. Pattern patterns[] = {
  179. {
  180. .channels = p_0_channels,
  181. },
  182. {
  183. .channels = p_1_channels,
  184. },
  185. };
  186. uint8_t order_list[] = {
  187. 0,
  188. 0,
  189. 1,
  190. 0,
  191. };
  192. Song song = {
  193. .channels_count = 1,
  194. .patterns_count = 2,
  195. .patterns = patterns,
  196. .order_list_size = 4,
  197. .order_list = order_list,
  198. .ticks_per_second = 60,
  199. };
  200. void tracker_message(TrackerMessage message, void* context) {
  201. FuriMessageQueue* queue = context;
  202. furi_assert(queue);
  203. furi_message_queue_put(queue, &message, 0);
  204. }
  205. int32_t zero_tracker_app(void* p) {
  206. UNUSED(p);
  207. FuriMessageQueue* queue = furi_message_queue_alloc(8, sizeof(TrackerMessage));
  208. Tracker* tracker = tracker_alloc();
  209. tracker_set_message_callback(tracker, tracker_message, queue);
  210. tracker_set_song(tracker, &song);
  211. tracker_start(tracker);
  212. while(1) {
  213. TrackerMessage message;
  214. FuriStatus status = furi_message_queue_get(queue, &message, portMAX_DELAY);
  215. if(status == FuriStatusOk) {
  216. if(message.type == TrackerPositionChanged) {
  217. uint8_t order_list_index = message.data.position.order_list_index;
  218. uint8_t row = message.data.position.row;
  219. uint8_t pattern = song.order_list[order_list_index];
  220. FURI_LOG_I("Tracker", "O:%d P:%d R:%d", order_list_index, pattern, row);
  221. } else if(message.type == TrackerEndOfSong) {
  222. FURI_LOG_I("Tracker", "End of song");
  223. break;
  224. }
  225. }
  226. }
  227. tracker_stop(tracker);
  228. tracker_free(tracker);
  229. furi_message_queue_free(queue);
  230. return 0;
  231. }