zero_tracker.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. #include <furi.h>
  2. #include "zero_tracker.h"
  3. #include "tracker_engine/tracker.h"
  4. // Channel row = {
  5. // .notes =
  6. // {
  7. // //
  8. // ROW_MAKE(NOTE_A4, 0, 0),
  9. // ROW_MAKE(NOTE_C3, 0, 0),
  10. // ROW_MAKE(NOTE_F2, 0, 0),
  11. // ROW_MAKE(NOTE_C3, 0, 0),
  12. // //
  13. // ROW_MAKE(NOTE_E4, 0, 0),
  14. // ROW_MAKE(NOTE_C3, 0, 0),
  15. // ROW_MAKE(NOTE_E4, 0, 0),
  16. // ROW_MAKE(NOTE_OFF, 0, 0),
  17. // //
  18. // ROW_MAKE(NOTE_A4, 0, 0),
  19. // ROW_MAKE(NOTE_A4, 0, 0),
  20. // ROW_MAKE(NOTE_A4, 0, 0),
  21. // ROW_MAKE(NOTE_OFF, 0, 0),
  22. // //
  23. // ROW_MAKE(NOTE_E5, 0, 0),
  24. // ROW_MAKE(NOTE_E5, 0, 0),
  25. // ROW_MAKE(NOTE_E5, 0, 0),
  26. // ROW_MAKE(NOTE_OFF, 0, 0),
  27. // //
  28. // ROW_MAKE(NOTE_D5, 0, 0),
  29. // ROW_MAKE(NOTE_C3, 0, 0),
  30. // ROW_MAKE(NOTE_F2, 0, 0),
  31. // ROW_MAKE(NOTE_C3, 0, 0),
  32. // //
  33. // ROW_MAKE(NOTE_C5, 0, 0),
  34. // ROW_MAKE(NOTE_C3, 0, 0),
  35. // ROW_MAKE(NOTE_C5, 0, 0),
  36. // ROW_MAKE(NOTE_OFF, 0, 0),
  37. // //
  38. // ROW_MAKE(NOTE_A4, 0, 0),
  39. // ROW_MAKE(0, 0, 0),
  40. // ROW_MAKE(0, 0, 0),
  41. // ROW_MAKE(0, 0, 0),
  42. // //
  43. // ROW_MAKE(NOTE_A4, 0, 0),
  44. // ROW_MAKE(NOTE_A4, 0, 0),
  45. // ROW_MAKE(NOTE_A4, 0, 0),
  46. // ROW_MAKE(NOTE_OFF, 0, 0),
  47. // //
  48. // ROW_MAKE(NOTE_B4, 0, 0),
  49. // ROW_MAKE(NOTE_D3, 0, 0),
  50. // ROW_MAKE(NOTE_G2, 0, 0),
  51. // ROW_MAKE(NOTE_D3, 0, 0),
  52. // //
  53. // ROW_MAKE(NOTE_E4, 0, 0),
  54. // ROW_MAKE(NOTE_D3, 0, 0),
  55. // ROW_MAKE(NOTE_E4, 0, 0),
  56. // ROW_MAKE(NOTE_OFF, 0, 0),
  57. // //
  58. // ROW_MAKE(NOTE_A4, 0, 0),
  59. // ROW_MAKE(NOTE_A4, 0, 0),
  60. // ROW_MAKE(NOTE_A4, 0, 0),
  61. // ROW_MAKE(NOTE_OFF, 0, 0),
  62. // //
  63. // ROW_MAKE(NOTE_E5, 0, 0),
  64. // ROW_MAKE(NOTE_E5, 0, 0),
  65. // ROW_MAKE(NOTE_E5, 0, 0),
  66. // ROW_MAKE(NOTE_OFF, 0, 0),
  67. // //
  68. // ROW_MAKE(NOTE_D5, 0, 0),
  69. // ROW_MAKE(NOTE_D3, 0, 0),
  70. // ROW_MAKE(NOTE_G2, 0, 0),
  71. // ROW_MAKE(NOTE_D3, 0, 0),
  72. // //
  73. // ROW_MAKE(NOTE_C5, 0, 0),
  74. // ROW_MAKE(NOTE_D3, 0, 0),
  75. // ROW_MAKE(NOTE_C5, 0, 0),
  76. // ROW_MAKE(NOTE_OFF, 0, 0),
  77. // //
  78. // ROW_MAKE(NOTE_A4, 0, 0),
  79. // ROW_MAKE(0, 0, 0),
  80. // ROW_MAKE(0, 0, 0),
  81. // ROW_MAKE(0, 0, 0),
  82. // //
  83. // ROW_MAKE(NOTE_A4, 0, 0),
  84. // ROW_MAKE(NOTE_A4, 0, 0),
  85. // ROW_MAKE(NOTE_A4, 0, 0),
  86. // ROW_MAKE(NOTE_OFF, 0, 0),
  87. // },
  88. // };
  89. Channel p_0_channels[] = {
  90. {
  91. .rows =
  92. {
  93. // 1/4
  94. ROW_MAKE(NOTE_C3, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  95. ROW_MAKE(0, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  96. ROW_MAKE(NOTE_C4, EffectSlideToNote, 0x20),
  97. ROW_MAKE(0, EffectSlideToNote, 0x20),
  98. //
  99. ROW_MAKE(0, EffectSlideToNote, 0x20),
  100. ROW_MAKE(0, EffectSlideToNote, 0x20),
  101. ROW_MAKE(0, EffectSlideToNote, 0x20),
  102. ROW_MAKE(0, EffectSlideToNote, 0x20),
  103. //
  104. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  105. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  106. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  107. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  108. //
  109. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  110. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  111. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  112. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  113. // 2/4
  114. ROW_MAKE(NOTE_C3, EffectSlideDown, 0x20),
  115. ROW_MAKE(0, EffectSlideDown, 0x20),
  116. ROW_MAKE(NOTE_C4, EffectVibrato, EFFECT_DATA_2(3, 3)),
  117. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  118. //
  119. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  120. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  121. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  122. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  123. //
  124. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  125. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  126. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  127. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  128. //
  129. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  130. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  131. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(3, 3)),
  132. ROW_MAKE(NOTE_OFF, EffectVibrato, EFFECT_DATA_2(3, 3)),
  133. // 3/4
  134. ROW_MAKE(NOTE_C3, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  135. ROW_MAKE(0, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  136. ROW_MAKE(NOTE_OFF, 0, 0),
  137. ROW_MAKE(0, 0, 0),
  138. //
  139. ROW_MAKE(0, 0, 0),
  140. ROW_MAKE(0, 0, 0),
  141. ROW_MAKE(0, 0, 0),
  142. ROW_MAKE(0, 0, 0),
  143. //
  144. ROW_MAKE(NOTE_C2, EffectPWM, 60),
  145. ROW_MAKE(0, EffectPWM, 32),
  146. ROW_MAKE(0, EffectPWM, 12),
  147. ROW_MAKE(NOTE_OFF, 0, 0),
  148. //
  149. ROW_MAKE(0, 0, 0),
  150. ROW_MAKE(0, 0, 0),
  151. ROW_MAKE(0, 0, 0),
  152. ROW_MAKE(0, 0, 0),
  153. // 4/4
  154. ROW_MAKE(NOTE_C3, EffectSlideDown, 0x20),
  155. ROW_MAKE(0, EffectSlideDown, 0x20),
  156. ROW_MAKE(0, EffectSlideDown, 0x20),
  157. ROW_MAKE(NOTE_OFF, 0, 0),
  158. //
  159. ROW_MAKE(0, 0, 0),
  160. ROW_MAKE(0, 0, 0),
  161. ROW_MAKE(0, 0, 0),
  162. ROW_MAKE(0, 0, 0),
  163. //
  164. ROW_MAKE(NOTE_C2, EffectPWM, 60),
  165. ROW_MAKE(0, EffectPWM, 32),
  166. ROW_MAKE(0, EffectPWM, 12),
  167. ROW_MAKE(NOTE_OFF, 0, 0),
  168. //
  169. ROW_MAKE(0, 0, 0),
  170. ROW_MAKE(0, 0, 0),
  171. ROW_MAKE(0, 0, 0),
  172. ROW_MAKE(0, 0, 0),
  173. },
  174. },
  175. };
  176. Channel p_1_channels[] = {
  177. {
  178. .rows =
  179. {
  180. //
  181. ROW_MAKE(NOTE_A4, 0, 0),
  182. ROW_MAKE(NOTE_C3, 0, 0),
  183. ROW_MAKE(NOTE_F2, 0, 0),
  184. ROW_MAKE(NOTE_C3, 0, 0),
  185. //
  186. ROW_MAKE(NOTE_E4, 0, 0),
  187. ROW_MAKE(NOTE_C3, 0, 0),
  188. ROW_MAKE(NOTE_E4, 0, 0),
  189. ROW_MAKE(NOTE_OFF, 0, 0),
  190. //
  191. ROW_MAKE(NOTE_A4, 0, 0),
  192. ROW_MAKE(NOTE_A4, 0, 0),
  193. ROW_MAKE(NOTE_A4, 0, 0),
  194. ROW_MAKE(NOTE_OFF, 0, 0),
  195. //
  196. ROW_MAKE(NOTE_E5, 0, 0),
  197. ROW_MAKE(NOTE_E5, 0, 0),
  198. ROW_MAKE(NOTE_E5, 0, 0),
  199. ROW_MAKE(NOTE_OFF, 0, 0),
  200. //
  201. ROW_MAKE(NOTE_D5, 0, 0),
  202. ROW_MAKE(NOTE_C3, 0, 0),
  203. ROW_MAKE(NOTE_F2, 0, 0),
  204. ROW_MAKE(NOTE_C3, 0, 0),
  205. //
  206. ROW_MAKE(NOTE_C5, 0, 0),
  207. ROW_MAKE(NOTE_C3, 0, 0),
  208. ROW_MAKE(NOTE_C5, 0, 0),
  209. ROW_MAKE(NOTE_OFF, 0, 0),
  210. //
  211. ROW_MAKE(NOTE_A4, 0, 0),
  212. ROW_MAKE(0, 0, 0),
  213. ROW_MAKE(0, 0, 0),
  214. ROW_MAKE(0, 0, 0),
  215. //
  216. ROW_MAKE(NOTE_A4, 0, 0),
  217. ROW_MAKE(NOTE_A4, 0, 0),
  218. ROW_MAKE(NOTE_A4, 0, 0),
  219. ROW_MAKE(NOTE_OFF, 0, 0),
  220. //
  221. ROW_MAKE(NOTE_B4, 0, 0),
  222. ROW_MAKE(NOTE_D3, 0, 0),
  223. ROW_MAKE(NOTE_G2, 0, 0),
  224. ROW_MAKE(NOTE_D3, 0, 0),
  225. //
  226. ROW_MAKE(NOTE_E4, 0, 0),
  227. ROW_MAKE(NOTE_D3, 0, 0),
  228. ROW_MAKE(NOTE_E4, 0, 0),
  229. ROW_MAKE(NOTE_OFF, 0, 0),
  230. //
  231. ROW_MAKE(NOTE_A4, 0, 0),
  232. ROW_MAKE(NOTE_A4, 0, 0),
  233. ROW_MAKE(NOTE_A4, 0, 0),
  234. ROW_MAKE(NOTE_OFF, 0, 0),
  235. //
  236. ROW_MAKE(NOTE_E5, 0, 0),
  237. ROW_MAKE(NOTE_E5, 0, 0),
  238. ROW_MAKE(NOTE_E5, 0, 0),
  239. ROW_MAKE(NOTE_OFF, 0, 0),
  240. //
  241. ROW_MAKE(NOTE_D5, 0, 0),
  242. ROW_MAKE(NOTE_D3, 0, 0),
  243. ROW_MAKE(NOTE_G2, 0, 0),
  244. ROW_MAKE(NOTE_D3, 0, 0),
  245. //
  246. ROW_MAKE(NOTE_C5, 0, 0),
  247. ROW_MAKE(NOTE_D3, 0, 0),
  248. ROW_MAKE(NOTE_C5, 0, 0),
  249. ROW_MAKE(NOTE_OFF, 0, 0),
  250. //
  251. ROW_MAKE(NOTE_A4, 0, 0),
  252. ROW_MAKE(0, 0, 0),
  253. ROW_MAKE(0, 0, 0),
  254. ROW_MAKE(0, 0, 0),
  255. //
  256. ROW_MAKE(NOTE_A4, 0, 0),
  257. ROW_MAKE(NOTE_A4, 0, 0),
  258. ROW_MAKE(NOTE_A4, 0, 0),
  259. ROW_MAKE(NOTE_OFF, 0, 0),
  260. },
  261. },
  262. };
  263. Pattern patterns[] = {
  264. {
  265. .channels = p_0_channels,
  266. },
  267. {
  268. .channels = p_1_channels,
  269. },
  270. };
  271. uint8_t order_list[] = {
  272. 0,
  273. 0,
  274. 1,
  275. 0,
  276. };
  277. Song song = {
  278. .channels_count = 1,
  279. .patterns_count = 2,
  280. .patterns = patterns,
  281. .order_list_size = 4,
  282. .order_list = order_list,
  283. .ticks_per_second = 60,
  284. };
  285. void tracker_message(TrackerMessage message, void* context) {
  286. FuriMessageQueue* queue = context;
  287. furi_assert(queue);
  288. furi_message_queue_put(queue, &message, 0);
  289. }
  290. int32_t zero_tracker_app(void* p) {
  291. UNUSED(p);
  292. FuriMessageQueue* queue = furi_message_queue_alloc(8, sizeof(TrackerMessage));
  293. Tracker* tracker = tracker_alloc();
  294. tracker_set_message_callback(tracker, tracker_message, queue);
  295. tracker_set_song(tracker, &song);
  296. tracker_start(tracker);
  297. while(1) {
  298. TrackerMessage message;
  299. FuriStatus status = furi_message_queue_get(queue, &message, portMAX_DELAY);
  300. if(status == FuriStatusOk) {
  301. if(message.type == TrackerPositionChanged) {
  302. uint8_t order_list_index = message.data.position.order_list_index;
  303. uint8_t row = message.data.position.row;
  304. uint8_t pattern = song.order_list[order_list_index];
  305. FURI_LOG_I("Tracker", "O:%d P:%d R:%d", order_list_index, pattern, row);
  306. } else if(message.type == TrackerEndOfSong) {
  307. FURI_LOG_I("Tracker", "End of song");
  308. break;
  309. }
  310. }
  311. }
  312. tracker_stop(tracker);
  313. tracker_free(tracker);
  314. furi_message_queue_free(queue);
  315. return 0;
  316. }