sequencer_tests.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  1. /* Copyright 2020 Rodolphe Belouin
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "gtest/gtest.h"
  17. extern "C" {
  18. #include "sequencer.h"
  19. #include "midi_mock.h"
  20. #include "quantum/quantum_keycodes.h"
  21. }
  22. extern "C" {
  23. void set_time(uint32_t t);
  24. void advance_time(uint32_t ms);
  25. }
  26. class SequencerTest : public ::testing::Test {
  27. protected:
  28. void SetUp() override {
  29. config_copy.enabled = sequencer_config.enabled;
  30. for (int i = 0; i < SEQUENCER_STEPS; i++) {
  31. config_copy.steps[i] = sequencer_config.steps[i];
  32. }
  33. for (int i = 0; i < SEQUENCER_TRACKS; i++) {
  34. config_copy.track_notes[i] = sequencer_config.track_notes[i];
  35. }
  36. config_copy.tempo = sequencer_config.tempo;
  37. config_copy.resolution = sequencer_config.resolution;
  38. state_copy.active_tracks = sequencer_internal_state.active_tracks;
  39. state_copy.current_track = sequencer_internal_state.current_track;
  40. state_copy.current_step = sequencer_internal_state.current_step;
  41. state_copy.timer = sequencer_internal_state.timer;
  42. last_noteon = 0;
  43. last_noteoff = 0;
  44. set_time(0);
  45. }
  46. void TearDown() override {
  47. sequencer_config.enabled = config_copy.enabled;
  48. for (int i = 0; i < SEQUENCER_STEPS; i++) {
  49. sequencer_config.steps[i] = config_copy.steps[i];
  50. }
  51. for (int i = 0; i < SEQUENCER_TRACKS; i++) {
  52. sequencer_config.track_notes[i] = config_copy.track_notes[i];
  53. }
  54. sequencer_config.tempo = config_copy.tempo;
  55. sequencer_config.resolution = config_copy.resolution;
  56. sequencer_internal_state.active_tracks = state_copy.active_tracks;
  57. sequencer_internal_state.current_track = state_copy.current_track;
  58. sequencer_internal_state.current_step = state_copy.current_step;
  59. sequencer_internal_state.timer = state_copy.timer;
  60. }
  61. sequencer_config_t config_copy;
  62. sequencer_state_t state_copy;
  63. };
  64. TEST_F(SequencerTest, TestOffByDefault) { EXPECT_EQ(is_sequencer_on(), false); }
  65. TEST_F(SequencerTest, TestOn) {
  66. sequencer_config.enabled = false;
  67. sequencer_on();
  68. EXPECT_EQ(is_sequencer_on(), true);
  69. // sequencer_on is idempotent
  70. sequencer_on();
  71. EXPECT_EQ(is_sequencer_on(), true);
  72. }
  73. TEST_F(SequencerTest, TestOff) {
  74. sequencer_config.enabled = true;
  75. sequencer_off();
  76. EXPECT_EQ(is_sequencer_on(), false);
  77. // sequencer_off is idempotent
  78. sequencer_off();
  79. EXPECT_EQ(is_sequencer_on(), false);
  80. }
  81. TEST_F(SequencerTest, TestToggle) {
  82. sequencer_config.enabled = false;
  83. sequencer_toggle();
  84. EXPECT_EQ(is_sequencer_on(), true);
  85. sequencer_toggle();
  86. EXPECT_EQ(is_sequencer_on(), false);
  87. }
  88. TEST_F(SequencerTest, TestNoActiveTrackByDefault) {
  89. for (int i = 0; i < SEQUENCER_TRACKS; i++) {
  90. EXPECT_EQ(is_sequencer_track_active(i), false);
  91. }
  92. }
  93. TEST_F(SequencerTest, TestGetActiveTracks) {
  94. sequencer_internal_state.active_tracks = (1 << 7) + (1 << 6) + (1 << 3) + (1 << 1) + (1 << 0);
  95. EXPECT_EQ(is_sequencer_track_active(0), true);
  96. EXPECT_EQ(is_sequencer_track_active(1), true);
  97. EXPECT_EQ(is_sequencer_track_active(2), false);
  98. EXPECT_EQ(is_sequencer_track_active(3), true);
  99. EXPECT_EQ(is_sequencer_track_active(4), false);
  100. EXPECT_EQ(is_sequencer_track_active(5), false);
  101. EXPECT_EQ(is_sequencer_track_active(6), true);
  102. EXPECT_EQ(is_sequencer_track_active(7), true);
  103. }
  104. TEST_F(SequencerTest, TestGetActiveTracksOutOfBound) {
  105. sequencer_set_track_activation(-1, true);
  106. sequencer_set_track_activation(8, true);
  107. EXPECT_EQ(is_sequencer_track_active(-1), false);
  108. EXPECT_EQ(is_sequencer_track_active(8), false);
  109. }
  110. TEST_F(SequencerTest, TestToggleTrackActivation) {
  111. sequencer_internal_state.active_tracks = (1 << 7) + (1 << 6) + (1 << 3) + (1 << 1) + (1 << 0);
  112. sequencer_toggle_track_activation(6);
  113. EXPECT_EQ(is_sequencer_track_active(0), true);
  114. EXPECT_EQ(is_sequencer_track_active(1), true);
  115. EXPECT_EQ(is_sequencer_track_active(2), false);
  116. EXPECT_EQ(is_sequencer_track_active(3), true);
  117. EXPECT_EQ(is_sequencer_track_active(4), false);
  118. EXPECT_EQ(is_sequencer_track_active(5), false);
  119. EXPECT_EQ(is_sequencer_track_active(6), false);
  120. EXPECT_EQ(is_sequencer_track_active(7), true);
  121. }
  122. TEST_F(SequencerTest, TestToggleSingleTrackActivation) {
  123. sequencer_internal_state.active_tracks = (1 << 7) + (1 << 6) + (1 << 3) + (1 << 1) + (1 << 0);
  124. sequencer_toggle_single_active_track(2);
  125. EXPECT_EQ(is_sequencer_track_active(0), false);
  126. EXPECT_EQ(is_sequencer_track_active(1), false);
  127. EXPECT_EQ(is_sequencer_track_active(2), true);
  128. EXPECT_EQ(is_sequencer_track_active(3), false);
  129. EXPECT_EQ(is_sequencer_track_active(4), false);
  130. EXPECT_EQ(is_sequencer_track_active(5), false);
  131. EXPECT_EQ(is_sequencer_track_active(6), false);
  132. EXPECT_EQ(is_sequencer_track_active(7), false);
  133. }
  134. TEST_F(SequencerTest, TestStepOffByDefault) {
  135. for (int i = 0; i < SEQUENCER_STEPS; i++) {
  136. EXPECT_EQ(is_sequencer_step_on(i), false);
  137. }
  138. }
  139. TEST_F(SequencerTest, TestIsStepOffWithNoActiveTracks) {
  140. sequencer_config.steps[3] = 0xFF;
  141. EXPECT_EQ(is_sequencer_step_on(3), false);
  142. }
  143. TEST_F(SequencerTest, TestIsStepOffWithGivenActiveTracks) {
  144. sequencer_set_track_activation(2, true);
  145. sequencer_set_track_activation(3, true);
  146. sequencer_config.steps[3] = (1 << 0) + (1 << 1);
  147. // No active tracks have the step enabled, so it is off
  148. EXPECT_EQ(is_sequencer_step_on(3), false);
  149. }
  150. TEST_F(SequencerTest, TestIsStepOnWithGivenActiveTracks) {
  151. sequencer_set_track_activation(2, true);
  152. sequencer_set_track_activation(3, true);
  153. sequencer_config.steps[3] = (1 << 2);
  154. // Track 2 has the step enabled, so it is on
  155. EXPECT_EQ(is_sequencer_step_on(3), true);
  156. }
  157. TEST_F(SequencerTest, TestIsStepOffForGivenTrack) {
  158. sequencer_config.steps[3] = 0x00;
  159. EXPECT_EQ(is_sequencer_step_on_for_track(3, 5), false);
  160. }
  161. TEST_F(SequencerTest, TestIsStepOnForGivenTrack) {
  162. sequencer_config.steps[3] = (1 << 5);
  163. EXPECT_EQ(is_sequencer_step_on_for_track(3, 5), true);
  164. }
  165. TEST_F(SequencerTest, TestSetStepOn) {
  166. sequencer_internal_state.active_tracks = (1 << 6) + (1 << 3) + (1 << 2);
  167. sequencer_config.steps[2] = (1 << 5) + (1 << 2);
  168. sequencer_set_step(2, true);
  169. EXPECT_EQ(sequencer_config.steps[2], (1 << 6) + (1 << 5) + (1 << 3) + (1 << 2));
  170. }
  171. TEST_F(SequencerTest, TestSetStepOff) {
  172. sequencer_internal_state.active_tracks = (1 << 6) + (1 << 3) + (1 << 2);
  173. sequencer_config.steps[2] = (1 << 5) + (1 << 2);
  174. sequencer_set_step(2, false);
  175. EXPECT_EQ(sequencer_config.steps[2], (1 << 5));
  176. }
  177. TEST_F(SequencerTest, TestToggleStepOff) {
  178. sequencer_internal_state.active_tracks = (1 << 6) + (1 << 3) + (1 << 2);
  179. sequencer_config.steps[2] = (1 << 5) + (1 << 2);
  180. sequencer_toggle_step(2);
  181. EXPECT_EQ(sequencer_config.steps[2], (1 << 5));
  182. }
  183. TEST_F(SequencerTest, TestToggleStepOn) {
  184. sequencer_internal_state.active_tracks = (1 << 6) + (1 << 3) + (1 << 2);
  185. sequencer_config.steps[2] = 0;
  186. sequencer_toggle_step(2);
  187. EXPECT_EQ(sequencer_config.steps[2], (1 << 6) + (1 << 3) + (1 << 2));
  188. }
  189. TEST_F(SequencerTest, TestSetAllStepsOn) {
  190. sequencer_internal_state.active_tracks = (1 << 6) + (1 << 3) + (1 << 2);
  191. sequencer_config.steps[2] = (1 << 7) + (1 << 6);
  192. sequencer_config.steps[4] = (1 << 3) + (1 << 1);
  193. sequencer_set_all_steps(true);
  194. EXPECT_EQ(sequencer_config.steps[2], (1 << 7) + (1 << 6) + (1 << 3) + (1 << 2));
  195. EXPECT_EQ(sequencer_config.steps[4], (1 << 6) + (1 << 3) + (1 << 2) + (1 << 1));
  196. }
  197. TEST_F(SequencerTest, TestSetAllStepsOff) {
  198. sequencer_internal_state.active_tracks = (1 << 6) + (1 << 3) + (1 << 2);
  199. sequencer_config.steps[2] = (1 << 7) + (1 << 6);
  200. sequencer_config.steps[4] = (1 << 3) + (1 << 1);
  201. sequencer_set_all_steps(false);
  202. EXPECT_EQ(sequencer_config.steps[2], (1 << 7));
  203. EXPECT_EQ(sequencer_config.steps[4], (1 << 1));
  204. }
  205. TEST_F(SequencerTest, TestSetTempoZero) {
  206. sequencer_config.tempo = 123;
  207. sequencer_set_tempo(0);
  208. EXPECT_EQ(sequencer_config.tempo, 123);
  209. }
  210. TEST_F(SequencerTest, TestIncreaseTempoMax) {
  211. sequencer_config.tempo = UINT8_MAX;
  212. sequencer_increase_tempo();
  213. EXPECT_EQ(sequencer_config.tempo, UINT8_MAX);
  214. }
  215. TEST_F(SequencerTest, TestSetResolutionLowerBound) {
  216. sequencer_config.resolution = SQ_RES_4;
  217. sequencer_set_resolution((sequencer_resolution_t)-1);
  218. EXPECT_EQ(sequencer_config.resolution, SQ_RES_4);
  219. }
  220. TEST_F(SequencerTest, TestSetResolutionUpperBound) {
  221. sequencer_config.resolution = SQ_RES_4;
  222. sequencer_set_resolution(SEQUENCER_RESOLUTIONS);
  223. EXPECT_EQ(sequencer_config.resolution, SQ_RES_4);
  224. }
  225. TEST_F(SequencerTest, TestGetBeatDuration) {
  226. EXPECT_EQ(get_beat_duration(60), 1000);
  227. EXPECT_EQ(get_beat_duration(120), 500);
  228. EXPECT_EQ(get_beat_duration(240), 250);
  229. EXPECT_EQ(get_beat_duration(0), 1000);
  230. }
  231. TEST_F(SequencerTest, TestGetStepDuration60) {
  232. /**
  233. * Resolution cheatsheet:
  234. * 1/2 => 2 steps per 4 beats
  235. * 1/2T => 3 steps per 4 beats
  236. * 1/4 => 4 steps per 4 beats
  237. * 1/4T => 6 steps per 4 beats
  238. * 1/8 => 8 steps per 4 beats
  239. * 1/8T => 12 steps per 4 beats
  240. * 1/16 => 16 steps per 4 beats
  241. * 1/16T => 24 steps per 4 beats
  242. * 1/32 => 32 steps per 4 beats
  243. *
  244. * The number of steps for binary resolutions follows the powers of 2.
  245. * The ternary variants are simply 1.5x faster.
  246. */
  247. EXPECT_EQ(get_step_duration(60, SQ_RES_2), 2000);
  248. EXPECT_EQ(get_step_duration(60, SQ_RES_4), 1000);
  249. EXPECT_EQ(get_step_duration(60, SQ_RES_8), 500);
  250. EXPECT_EQ(get_step_duration(60, SQ_RES_16), 250);
  251. EXPECT_EQ(get_step_duration(60, SQ_RES_32), 125);
  252. EXPECT_EQ(get_step_duration(60, SQ_RES_2T), 1333);
  253. EXPECT_EQ(get_step_duration(60, SQ_RES_4T), 666);
  254. EXPECT_EQ(get_step_duration(60, SQ_RES_8T), 333);
  255. EXPECT_EQ(get_step_duration(60, SQ_RES_16T), 166);
  256. }
  257. TEST_F(SequencerTest, TestGetStepDuration120) {
  258. /**
  259. * Resolution cheatsheet:
  260. * 1/2 => 2 steps per 4 beats
  261. * 1/2T => 3 steps per 4 beats
  262. * 1/4 => 4 steps per 4 beats
  263. * 1/4T => 6 steps per 4 beats
  264. * 1/8 => 8 steps per 4 beats
  265. * 1/8T => 12 steps per 4 beats
  266. * 1/16 => 16 steps per 4 beats
  267. * 1/16T => 24 steps per 4 beats
  268. * 1/32 => 32 steps per 4 beats
  269. *
  270. * The number of steps for binary resolutions follows the powers of 2.
  271. * The ternary variants are simply 1.5x faster.
  272. */
  273. EXPECT_EQ(get_step_duration(30, SQ_RES_2), 4000);
  274. EXPECT_EQ(get_step_duration(30, SQ_RES_4), 2000);
  275. EXPECT_EQ(get_step_duration(30, SQ_RES_8), 1000);
  276. EXPECT_EQ(get_step_duration(30, SQ_RES_16), 500);
  277. EXPECT_EQ(get_step_duration(30, SQ_RES_32), 250);
  278. EXPECT_EQ(get_step_duration(30, SQ_RES_2T), 2666);
  279. EXPECT_EQ(get_step_duration(30, SQ_RES_4T), 1333);
  280. EXPECT_EQ(get_step_duration(30, SQ_RES_8T), 666);
  281. EXPECT_EQ(get_step_duration(30, SQ_RES_16T), 333);
  282. }
  283. void setUpMatrixScanSequencerTest(void) {
  284. sequencer_config.enabled = true;
  285. sequencer_config.tempo = 120;
  286. sequencer_config.resolution = SQ_RES_16;
  287. // Configure the notes for each track
  288. sequencer_config.track_notes[0] = MI_C;
  289. sequencer_config.track_notes[1] = MI_D;
  290. sequencer_config.track_notes[2] = MI_E;
  291. sequencer_config.track_notes[3] = MI_F;
  292. sequencer_config.track_notes[4] = MI_G;
  293. sequencer_config.track_notes[5] = MI_A;
  294. sequencer_config.track_notes[6] = MI_B;
  295. sequencer_config.track_notes[7] = MI_C;
  296. // Turn on some steps
  297. sequencer_config.steps[0] = (1 << 0);
  298. sequencer_config.steps[2] = (1 << 1) + (1 << 0);
  299. }
  300. TEST_F(SequencerTest, TestMatrixScanSequencerShouldAttackFirstTrackOfFirstStep) {
  301. setUpMatrixScanSequencerTest();
  302. sequencer_task();
  303. EXPECT_EQ(last_noteon, MI_C);
  304. EXPECT_EQ(last_noteoff, 0);
  305. }
  306. TEST_F(SequencerTest, TestMatrixScanSequencerShouldAttackSecondTrackAfterFirstTrackOfFirstStep) {
  307. setUpMatrixScanSequencerTest();
  308. sequencer_task();
  309. EXPECT_EQ(sequencer_internal_state.current_step, 0);
  310. EXPECT_EQ(sequencer_internal_state.current_track, 1);
  311. EXPECT_EQ(sequencer_internal_state.phase, SEQUENCER_PHASE_ATTACK);
  312. }
  313. TEST_F(SequencerTest, TestMatrixScanSequencerShouldNotAttackInactiveTrackFirstStep) {
  314. setUpMatrixScanSequencerTest();
  315. sequencer_internal_state.current_step = 0;
  316. sequencer_internal_state.current_track = 1;
  317. // Wait some time after the first track has been attacked
  318. advance_time(SEQUENCER_TRACK_THROTTLE);
  319. sequencer_task();
  320. EXPECT_EQ(last_noteon, 0);
  321. EXPECT_EQ(last_noteoff, 0);
  322. }
  323. TEST_F(SequencerTest, TestMatrixScanSequencerShouldAttackThirdTrackAfterSecondTrackOfFirstStep) {
  324. setUpMatrixScanSequencerTest();
  325. sequencer_internal_state.current_step = 0;
  326. sequencer_internal_state.current_track = 1;
  327. // Wait some time after the second track has been attacked
  328. advance_time(2 * SEQUENCER_TRACK_THROTTLE);
  329. sequencer_task();
  330. EXPECT_EQ(sequencer_internal_state.current_step, 0);
  331. EXPECT_EQ(sequencer_internal_state.current_track, 2);
  332. EXPECT_EQ(sequencer_internal_state.phase, SEQUENCER_PHASE_ATTACK);
  333. }
  334. TEST_F(SequencerTest, TestMatrixScanSequencerShouldEnterReleasePhaseAfterLastTrackHasBeenProcessedFirstStep) {
  335. setUpMatrixScanSequencerTest();
  336. sequencer_internal_state.current_step = 0;
  337. sequencer_internal_state.current_track = SEQUENCER_TRACKS - 1;
  338. // Wait until all notes have been attacked
  339. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  340. sequencer_task();
  341. EXPECT_EQ(last_noteon, 0);
  342. EXPECT_EQ(last_noteoff, 0);
  343. EXPECT_EQ(sequencer_internal_state.current_step, 0);
  344. EXPECT_EQ(sequencer_internal_state.current_track, SEQUENCER_TRACKS - 1);
  345. EXPECT_EQ(sequencer_internal_state.phase, SEQUENCER_PHASE_RELEASE);
  346. }
  347. TEST_F(SequencerTest, TestMatrixScanSequencerShouldReleaseBackwards) {
  348. setUpMatrixScanSequencerTest();
  349. sequencer_internal_state.current_step = 0;
  350. sequencer_internal_state.current_track = SEQUENCER_TRACKS - 1;
  351. sequencer_internal_state.phase = SEQUENCER_PHASE_RELEASE;
  352. // Wait until all notes have been attacked
  353. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  354. // + the release timeout
  355. advance_time(SEQUENCER_PHASE_RELEASE_TIMEOUT);
  356. sequencer_task();
  357. EXPECT_EQ(sequencer_internal_state.current_step, 0);
  358. EXPECT_EQ(sequencer_internal_state.current_track, SEQUENCER_TRACKS - 2);
  359. EXPECT_EQ(sequencer_internal_state.phase, SEQUENCER_PHASE_RELEASE);
  360. }
  361. TEST_F(SequencerTest, TestMatrixScanSequencerShouldNotReleaseInactiveTrackFirstStep) {
  362. setUpMatrixScanSequencerTest();
  363. sequencer_internal_state.current_step = 0;
  364. sequencer_internal_state.current_track = SEQUENCER_TRACKS - 1;
  365. sequencer_internal_state.phase = SEQUENCER_PHASE_RELEASE;
  366. // Wait until all notes have been attacked
  367. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  368. // + the release timeout
  369. advance_time(SEQUENCER_PHASE_RELEASE_TIMEOUT);
  370. sequencer_task();
  371. EXPECT_EQ(last_noteon, 0);
  372. EXPECT_EQ(last_noteoff, 0);
  373. }
  374. TEST_F(SequencerTest, TestMatrixScanSequencerShouldReleaseFirstTrackFirstStep) {
  375. setUpMatrixScanSequencerTest();
  376. sequencer_internal_state.current_step = 0;
  377. sequencer_internal_state.current_track = 0;
  378. sequencer_internal_state.phase = SEQUENCER_PHASE_RELEASE;
  379. // Wait until all notes have been attacked
  380. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  381. // + the release timeout
  382. advance_time(SEQUENCER_PHASE_RELEASE_TIMEOUT);
  383. // + all the other notes have been released
  384. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  385. sequencer_task();
  386. EXPECT_EQ(last_noteon, 0);
  387. EXPECT_EQ(last_noteoff, MI_C);
  388. }
  389. TEST_F(SequencerTest, TestMatrixScanSequencerShouldEnterPausePhaseAfterRelease) {
  390. setUpMatrixScanSequencerTest();
  391. sequencer_internal_state.current_step = 0;
  392. sequencer_internal_state.current_track = 0;
  393. sequencer_internal_state.phase = SEQUENCER_PHASE_RELEASE;
  394. // Wait until all notes have been attacked
  395. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  396. // + the release timeout
  397. advance_time(SEQUENCER_PHASE_RELEASE_TIMEOUT);
  398. // + all the other notes have been released
  399. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  400. sequencer_task();
  401. EXPECT_EQ(sequencer_internal_state.current_step, 0);
  402. EXPECT_EQ(sequencer_internal_state.current_track, 0);
  403. EXPECT_EQ(sequencer_internal_state.phase, SEQUENCER_PHASE_PAUSE);
  404. }
  405. TEST_F(SequencerTest, TestMatrixScanSequencerShouldProcessFirstTrackOfSecondStepAfterPause) {
  406. setUpMatrixScanSequencerTest();
  407. sequencer_internal_state.current_step = 0;
  408. sequencer_internal_state.current_track = 0;
  409. sequencer_internal_state.phase = SEQUENCER_PHASE_PAUSE;
  410. // Wait until all notes have been attacked
  411. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  412. // + the release timeout
  413. advance_time(SEQUENCER_PHASE_RELEASE_TIMEOUT);
  414. // + all the other notes have been released
  415. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  416. // + the step duration (one 16th at tempo=120 lasts 125ms)
  417. advance_time(125);
  418. sequencer_task();
  419. EXPECT_EQ(sequencer_internal_state.current_step, 1);
  420. EXPECT_EQ(sequencer_internal_state.current_track, 1);
  421. EXPECT_EQ(sequencer_internal_state.phase, SEQUENCER_PHASE_ATTACK);
  422. }
  423. TEST_F(SequencerTest, TestMatrixScanSequencerShouldProcessSecondTrackTooEarly) {
  424. setUpMatrixScanSequencerTest();
  425. sequencer_internal_state.current_step = 2;
  426. sequencer_internal_state.current_track = 1;
  427. sequencer_task();
  428. EXPECT_EQ(last_noteon, 0);
  429. EXPECT_EQ(last_noteoff, 0);
  430. }
  431. TEST_F(SequencerTest, TestMatrixScanSequencerShouldProcessSecondTrackOnTime) {
  432. setUpMatrixScanSequencerTest();
  433. sequencer_internal_state.current_step = 2;
  434. sequencer_internal_state.current_track = 1;
  435. // Wait until first track has been attacked
  436. advance_time(SEQUENCER_TRACK_THROTTLE);
  437. sequencer_task();
  438. EXPECT_EQ(last_noteon, MI_D);
  439. EXPECT_EQ(last_noteoff, 0);
  440. }
  441. TEST_F(SequencerTest, TestMatrixScanSequencerShouldLoopOnceSequenceIsOver) {
  442. setUpMatrixScanSequencerTest();
  443. sequencer_internal_state.current_step = SEQUENCER_STEPS - 1;
  444. sequencer_internal_state.current_track = 0;
  445. sequencer_internal_state.phase = SEQUENCER_PHASE_PAUSE;
  446. // Wait until all notes have been attacked
  447. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  448. // + the release timeout
  449. advance_time(SEQUENCER_PHASE_RELEASE_TIMEOUT);
  450. // + all the other notes have been released
  451. advance_time((SEQUENCER_TRACKS - 1) * SEQUENCER_TRACK_THROTTLE);
  452. // + the step duration (one 16th at tempo=120 lasts 125ms)
  453. advance_time(125);
  454. sequencer_task();
  455. EXPECT_EQ(sequencer_internal_state.current_step, 0);
  456. EXPECT_EQ(sequencer_internal_state.current_track, 1);
  457. EXPECT_EQ(sequencer_internal_state.phase, SEQUENCER_PHASE_ATTACK);
  458. }