zero_tracker.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  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_0_channels[] = {
  92. {
  93. .rows =
  94. {
  95. //
  96. ROW_MAKE(NOTE_A4, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  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, EffectPWM, 50),
  104. ROW_MAKE(NOTE_OFF, 0, 0),
  105. //
  106. ROW_MAKE(NOTE_A4, 0, 0),
  107. ROW_MAKE(0, EffectPWM, 55),
  108. ROW_MAKE(0, EffectPWM, 45),
  109. ROW_MAKE(NOTE_OFF, 0, 0),
  110. //
  111. ROW_MAKE(NOTE_E5, 0, 0),
  112. ROW_MAKE(0, EffectPWM, 55),
  113. ROW_MAKE(0, EffectPWM, 45),
  114. ROW_MAKE(NOTE_OFF, 0, 0),
  115. //
  116. ROW_MAKE(NOTE_D5, 0, 0),
  117. ROW_MAKE(NOTE_C3, EffectSlideDown, 0x30),
  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, EffectVibrato, EFFECT_DATA_2(1, 1)),
  130. //
  131. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  132. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  133. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  134. ROW_MAKE(NOTE_OFF, 0, 0),
  135. //
  136. ROW_MAKE(NOTE_B4, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  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, EffectPWM, 50),
  144. ROW_MAKE(NOTE_OFF, 0, 0),
  145. //
  146. ROW_MAKE(NOTE_A4, 0, 0),
  147. ROW_MAKE(0, EffectPWM, 55),
  148. ROW_MAKE(0, EffectPWM, 45),
  149. ROW_MAKE(NOTE_OFF, 0, 0),
  150. //
  151. ROW_MAKE(NOTE_E5, 0, 0),
  152. ROW_MAKE(0, EffectPWM, 55),
  153. ROW_MAKE(0, EffectPWM, 45),
  154. ROW_MAKE(NOTE_OFF, 0, 0),
  155. //
  156. ROW_MAKE(NOTE_D5, 0, 0),
  157. ROW_MAKE(NOTE_D3, EffectSlideDown, 0x3F),
  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, EffectVibrato, EFFECT_DATA_2(1, 1)),
  170. //
  171. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  172. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  173. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  174. ROW_MAKE(NOTE_OFF, 0, 0),
  175. },
  176. },
  177. };
  178. Channel p_1_channels[] = {
  179. {
  180. .rows =
  181. {
  182. //
  183. ROW_MAKE(NOTE_C5, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  184. ROW_MAKE(NOTE_E3, 0, 0),
  185. ROW_MAKE(NOTE_A2, 0, 0),
  186. ROW_MAKE(NOTE_E3, 0, 0),
  187. //
  188. ROW_MAKE(NOTE_B4, 0, 0),
  189. ROW_MAKE(NOTE_E3, 0, 0),
  190. ROW_MAKE(NOTE_B4, EffectPWM, 50),
  191. ROW_MAKE(NOTE_OFF, 0, 0),
  192. //
  193. ROW_MAKE(NOTE_G4, 0, 0),
  194. ROW_MAKE(0, EffectPWM, 55),
  195. ROW_MAKE(0, EffectPWM, 45),
  196. ROW_MAKE(NOTE_OFF, 0, 0),
  197. //
  198. ROW_MAKE(NOTE_C5, 0, 0),
  199. ROW_MAKE(0, EffectPWM, 55),
  200. ROW_MAKE(0, EffectPWM, 45),
  201. ROW_MAKE(NOTE_OFF, 0, 0),
  202. //
  203. ROW_MAKE(NOTE_C6, 0, 0),
  204. ROW_MAKE(NOTE_E3, EffectSlideDown, 0x30),
  205. ROW_MAKE(NOTE_A2, 0, 0),
  206. ROW_MAKE(NOTE_E3, 0, 0),
  207. //
  208. ROW_MAKE(NOTE_B4, 0, 0),
  209. ROW_MAKE(NOTE_E3, 0, 0),
  210. ROW_MAKE(NOTE_B4, EffectPWM, 50),
  211. ROW_MAKE(NOTE_OFF, 0, 0),
  212. //
  213. ROW_MAKE(NOTE_G4, 0, 0),
  214. ROW_MAKE(0, 0, 0),
  215. ROW_MAKE(0, 0, 0),
  216. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  217. //
  218. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  219. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  220. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  221. ROW_MAKE(NOTE_OFF, 0, 0),
  222. //
  223. ROW_MAKE(NOTE_C5, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  224. ROW_MAKE(NOTE_E3, 0, 0),
  225. ROW_MAKE(NOTE_A2, 0, 0),
  226. ROW_MAKE(NOTE_E3, 0, 0),
  227. //
  228. ROW_MAKE(NOTE_B4, 0, 0),
  229. ROW_MAKE(NOTE_E3, 0, 0),
  230. ROW_MAKE(NOTE_B4, EffectPWM, 50),
  231. ROW_MAKE(NOTE_OFF, 0, 0),
  232. //
  233. ROW_MAKE(NOTE_G4, 0, 0),
  234. ROW_MAKE(0, EffectPWM, 55),
  235. ROW_MAKE(0, EffectPWM, 45),
  236. ROW_MAKE(NOTE_OFF, 0, 0),
  237. //
  238. ROW_MAKE(NOTE_D5, 0, 0),
  239. ROW_MAKE(0, EffectPWM, 55),
  240. ROW_MAKE(0, EffectPWM, 45),
  241. ROW_MAKE(NOTE_OFF, 0, 0),
  242. //
  243. ROW_MAKE(NOTE_C6, 0, 0),
  244. ROW_MAKE(NOTE_E3, EffectSlideDown, 0x30),
  245. ROW_MAKE(NOTE_A2, 0, 0),
  246. ROW_MAKE(NOTE_E3, 0, 0),
  247. //
  248. ROW_MAKE(NOTE_B4, 0, 0),
  249. ROW_MAKE(NOTE_E3, 0, 0),
  250. ROW_MAKE(NOTE_B4, EffectPWM, 50),
  251. ROW_MAKE(NOTE_OFF, 0, 0),
  252. //
  253. ROW_MAKE(NOTE_G4, 0, 0),
  254. ROW_MAKE(0, 0, 0),
  255. ROW_MAKE(0, 0, 0),
  256. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  257. //
  258. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(1, 1)),
  259. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  260. ROW_MAKE(0, EffectVibrato, EFFECT_DATA_2(2, 2)),
  261. ROW_MAKE(NOTE_OFF, 0, 0),
  262. },
  263. },
  264. };
  265. Channel p_2_channels[] = {
  266. {
  267. .rows =
  268. {
  269. //
  270. ROW_MAKE(NOTE_C5, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  271. ROW_MAKE(NOTE_E3, 0, 0),
  272. ROW_MAKE(NOTE_A2, 0, 0),
  273. ROW_MAKE(NOTE_E3, 0, 0),
  274. //
  275. ROW_MAKE(NOTE_C5, 0, 0),
  276. ROW_MAKE(NOTE_A4, 0, 0),
  277. ROW_MAKE(NOTE_C5, 0, 0),
  278. ROW_MAKE(NOTE_A4, 0, 0),
  279. //
  280. ROW_MAKE(NOTE_C5, EffectPWM, 55),
  281. ROW_MAKE(NOTE_A4, EffectPWM, 45),
  282. ROW_MAKE(NOTE_C5, EffectPWM, 35),
  283. ROW_MAKE(NOTE_OFF, 0, 0),
  284. //
  285. ROW_MAKE(NOTE_C5, 0, 0),
  286. ROW_MAKE(NOTE_A4, 0, 0),
  287. ROW_MAKE(NOTE_C5, EffectPWM, 55),
  288. ROW_MAKE(NOTE_OFF, 0, 0),
  289. //
  290. ROW_MAKE(NOTE_D5, 0, 0),
  291. ROW_MAKE(NOTE_E3, EffectSlideDown, 0x30),
  292. ROW_MAKE(NOTE_A2, 0, 0),
  293. ROW_MAKE(NOTE_E3, 0, 0),
  294. //
  295. ROW_MAKE(NOTE_OFF, 0, 0),
  296. ROW_MAKE(NOTE_E3, 0, 0),
  297. ROW_MAKE(NOTE_B4, EffectPWM, 55),
  298. ROW_MAKE(NOTE_OFF, 0, 0),
  299. //
  300. ROW_MAKE(NOTE_D5, 0, 0),
  301. ROW_MAKE(NOTE_B4, 0, 0),
  302. ROW_MAKE(NOTE_D5, EffectPWM, 55),
  303. ROW_MAKE(NOTE_B4, EffectPWM, 55),
  304. //
  305. ROW_MAKE(NOTE_D5, EffectPWM, 45),
  306. ROW_MAKE(NOTE_B4, EffectPWM, 45),
  307. ROW_MAKE(NOTE_D5, EffectPWM, 35),
  308. ROW_MAKE(NOTE_OFF, 0, 0),
  309. //
  310. ROW_MAKE(NOTE_D5, EffectArpeggio, EFFECT_DATA_2(4, 7)),
  311. ROW_MAKE(NOTE_E3, 0, 0),
  312. ROW_MAKE(NOTE_A2, 0, 0),
  313. ROW_MAKE(NOTE_E3, 0, 0),
  314. //
  315. ROW_MAKE(NOTE_E5, 0, 0),
  316. ROW_MAKE(NOTE_C5, 0, 0),
  317. ROW_MAKE(NOTE_E5, 0, 0),
  318. ROW_MAKE(NOTE_C5, 0, 0),
  319. //
  320. ROW_MAKE(NOTE_E5, EffectPWM, 55),
  321. ROW_MAKE(NOTE_C5, EffectPWM, 45),
  322. ROW_MAKE(NOTE_E5, EffectPWM, 35),
  323. ROW_MAKE(NOTE_OFF, 0, 0),
  324. //
  325. ROW_MAKE(NOTE_E5, 0, 0),
  326. ROW_MAKE(NOTE_C5, 0, 0),
  327. ROW_MAKE(NOTE_E5, EffectPWM, 55),
  328. ROW_MAKE(NOTE_OFF, 0, 0),
  329. //
  330. ROW_MAKE(NOTE_D5, 0, 0),
  331. ROW_MAKE(NOTE_E3, EffectSlideDown, 0x30),
  332. ROW_MAKE(NOTE_A2, 0, 0),
  333. ROW_MAKE(NOTE_E3, 0, 0),
  334. //
  335. ROW_MAKE(NOTE_OFF, 0, 0),
  336. ROW_MAKE(NOTE_E3, 0, 0),
  337. ROW_MAKE(NOTE_B4, EffectPWM, 55),
  338. ROW_MAKE(NOTE_OFF, 0, 0),
  339. //
  340. ROW_MAKE(NOTE_D5, 0, 0),
  341. ROW_MAKE(NOTE_B4, 0, 0),
  342. ROW_MAKE(NOTE_D5, EffectPWM, 55),
  343. ROW_MAKE(NOTE_B4, EffectPWM, 55),
  344. //
  345. ROW_MAKE(NOTE_D5, EffectPWM, 45),
  346. ROW_MAKE(NOTE_B4, EffectPWM, 45),
  347. ROW_MAKE(NOTE_D5, EffectPWM, 35),
  348. ROW_MAKE(NOTE_OFF, 0, 0),
  349. },
  350. },
  351. };
  352. Channel p_3_channels[] = {
  353. {
  354. .rows =
  355. {
  356. //
  357. ROW_MAKE(NOTE_Ds5, EffectArpeggio, EFFECT_DATA_2(4, 6)),
  358. ROW_MAKE(NOTE_C5, 0, 0),
  359. ROW_MAKE(NOTE_Ds5, 0, 0),
  360. ROW_MAKE(NOTE_C5, EffectPWM, 55),
  361. //
  362. ROW_MAKE(NOTE_Ds5, EffectPWM, 45),
  363. ROW_MAKE(NOTE_C5, EffectPWM, 35),
  364. ROW_MAKE(NOTE_Ds5, EffectPWM, 30),
  365. ROW_MAKE(NOTE_OFF, 0, 0),
  366. //
  367. ROW_MAKE(NOTE_D5, 0, 0),
  368. ROW_MAKE(NOTE_B4, 0, 0),
  369. ROW_MAKE(NOTE_D5, 0, 0),
  370. ROW_MAKE(NOTE_B4, EffectPWM, 55),
  371. //
  372. ROW_MAKE(NOTE_D5, EffectPWM, 45),
  373. ROW_MAKE(NOTE_B4, EffectPWM, 35),
  374. ROW_MAKE(NOTE_D5, EffectPWM, 30),
  375. ROW_MAKE(NOTE_OFF, 0, 0),
  376. //
  377. ROW_MAKE(NOTE_Cs5, EffectArpeggio, EFFECT_DATA_2(4, 6)),
  378. ROW_MAKE(NOTE_As4, 0, 0),
  379. ROW_MAKE(NOTE_Cs5, 0, 0),
  380. ROW_MAKE(NOTE_As4, EffectPWM, 55),
  381. //
  382. ROW_MAKE(NOTE_Cs5, EffectPWM, 45),
  383. ROW_MAKE(NOTE_As4, EffectPWM, 35),
  384. ROW_MAKE(NOTE_Cs5, EffectPWM, 30),
  385. ROW_MAKE(NOTE_OFF, 0, 0),
  386. //
  387. ROW_MAKE(NOTE_C5, 0, 0),
  388. ROW_MAKE(NOTE_A4, 0, 0),
  389. ROW_MAKE(NOTE_C5, 0, 0),
  390. ROW_MAKE(NOTE_A4, EffectPWM, 55),
  391. //
  392. ROW_MAKE(NOTE_C5, EffectPWM, 45),
  393. ROW_MAKE(NOTE_A4, EffectPWM, 35),
  394. ROW_MAKE(NOTE_C5, EffectPWM, 30),
  395. ROW_MAKE(NOTE_OFF, 0, 0),
  396. //
  397. ROW_MAKE(NOTE_B4, EffectArpeggio, EFFECT_DATA_2(4, 6)),
  398. ROW_MAKE(NOTE_Gs4, 0, 0),
  399. ROW_MAKE(NOTE_B4, 0, 0),
  400. ROW_MAKE(NOTE_Gs4, EffectPWM, 55),
  401. //
  402. ROW_MAKE(NOTE_B4, EffectPWM, 45),
  403. ROW_MAKE(NOTE_Gs4, EffectPWM, 35),
  404. ROW_MAKE(NOTE_B4, EffectPWM, 30),
  405. ROW_MAKE(NOTE_OFF, 0, 0),
  406. //
  407. ROW_MAKE(NOTE_C5, 0, 0),
  408. ROW_MAKE(NOTE_A4, 0, 0),
  409. ROW_MAKE(NOTE_C5, 0, 0),
  410. ROW_MAKE(NOTE_A4, EffectPWM, 55),
  411. //
  412. ROW_MAKE(NOTE_C5, EffectPWM, 45),
  413. ROW_MAKE(NOTE_A4, EffectPWM, 35),
  414. ROW_MAKE(NOTE_C5, EffectPWM, 30),
  415. ROW_MAKE(NOTE_OFF, 0, 0),
  416. //
  417. ROW_MAKE(NOTE_Cs5, EffectArpeggio, EFFECT_DATA_2(4, 6)),
  418. ROW_MAKE(NOTE_As4, 0, 0),
  419. ROW_MAKE(NOTE_Cs5, 0, 0),
  420. ROW_MAKE(NOTE_As4, EffectPWM, 55),
  421. //
  422. ROW_MAKE(NOTE_Cs5, EffectPWM, 45),
  423. ROW_MAKE(NOTE_As4, EffectPWM, 35),
  424. ROW_MAKE(NOTE_Cs5, EffectPWM, 30),
  425. ROW_MAKE(NOTE_OFF, 0, 0),
  426. //
  427. ROW_MAKE(NOTE_D5, 0, 0),
  428. ROW_MAKE(NOTE_B4, 0, 0),
  429. ROW_MAKE(NOTE_D5, 0, 0),
  430. ROW_MAKE(NOTE_B4, EffectPWM, 55),
  431. //
  432. ROW_MAKE(NOTE_D5, EffectPWM, 45),
  433. ROW_MAKE(NOTE_B4, EffectPWM, 35),
  434. ROW_MAKE(NOTE_D5, EffectPWM, 30),
  435. ROW_MAKE(NOTE_OFF, 0, 0),
  436. },
  437. },
  438. };
  439. Pattern patterns[] = {
  440. {.channels = p_0_channels},
  441. {.channels = p_1_channels},
  442. {.channels = p_2_channels},
  443. {.channels = p_3_channels},
  444. };
  445. uint8_t order_list[] = {
  446. 0,
  447. 1,
  448. 0,
  449. 2,
  450. 0,
  451. 1,
  452. 0,
  453. 3,
  454. };
  455. Song song = {
  456. .channels_count = 1,
  457. .patterns_count = sizeof(patterns) / sizeof(patterns[0]),
  458. .patterns = patterns,
  459. .order_list_size = sizeof(order_list) / sizeof(order_list[0]),
  460. .order_list = order_list,
  461. .ticks_per_second = 60,
  462. };
  463. void tracker_message(TrackerMessage message, void* context) {
  464. FuriMessageQueue* queue = context;
  465. furi_assert(queue);
  466. furi_message_queue_put(queue, &message, 0);
  467. }
  468. int32_t zero_tracker_app(void* p) {
  469. UNUSED(p);
  470. FuriMessageQueue* queue = furi_message_queue_alloc(8, sizeof(TrackerMessage));
  471. Tracker* tracker = tracker_alloc();
  472. tracker_set_message_callback(tracker, tracker_message, queue);
  473. tracker_set_song(tracker, &song);
  474. tracker_start(tracker);
  475. while(1) {
  476. TrackerMessage message;
  477. FuriStatus status = furi_message_queue_get(queue, &message, portMAX_DELAY);
  478. if(status == FuriStatusOk) {
  479. if(message.type == TrackerPositionChanged) {
  480. uint8_t order_list_index = message.data.position.order_list_index;
  481. uint8_t row = message.data.position.row;
  482. uint8_t pattern = song.order_list[order_list_index];
  483. FURI_LOG_I("Tracker", "O:%d P:%d R:%d", order_list_index, pattern, row);
  484. } else if(message.type == TrackerEndOfSong) {
  485. FURI_LOG_I("Tracker", "End of song");
  486. break;
  487. }
  488. }
  489. }
  490. tracker_stop(tracker);
  491. tracker_free(tracker);
  492. furi_message_queue_free(queue);
  493. return 0;
  494. }