util.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "util.h"
  2. void reset_buffer(SoundEngine *sound_engine)
  3. {
  4. for (uint16_t i = 0; i < sound_engine->audio_buffer_size; i++)
  5. {
  6. sound_engine->audio_buffer[i] = 512;
  7. }
  8. }
  9. void play_song(FlizzerTrackerApp *tracker, bool from_cursor)
  10. {
  11. reset_buffer(&tracker->sound_engine);
  12. tracker->tracker_engine.playing = true;
  13. tracker->was_editing = tracker->editing;
  14. tracker->editing = false;
  15. if (!(from_cursor))
  16. {
  17. tracker->tracker_engine.pattern_position = 0;
  18. }
  19. tracker_engine_set_rate(tracker->song.rate);
  20. tracker_engine_set_song(&tracker->tracker_engine, &tracker->song);
  21. play();
  22. }
  23. void stop_song(FlizzerTrackerApp *tracker)
  24. {
  25. tracker->tracker_engine.playing = false;
  26. tracker->editing = tracker->was_editing;
  27. stop();
  28. }
  29. bool is_pattern_empty(TrackerSong *song, uint8_t pattern)
  30. {
  31. TrackerSongPattern song_pattern = song->pattern[pattern];
  32. for (int i = 0; i < song->pattern_length; i++)
  33. {
  34. TrackerSongPatternStep *step = &song_pattern.step[i];
  35. if (tracker_engine_get_note(step) != MUS_NOTE_NONE ||
  36. tracker_engine_get_instrument(step) != MUS_NOTE_INSTRUMENT_NONE ||
  37. tracker_engine_get_volume(step) != MUS_NOTE_VOLUME_NONE ||
  38. tracker_engine_get_command(step) != 0)
  39. {
  40. return false;
  41. }
  42. }
  43. return true;
  44. }
  45. bool check_and_allocate_pattern(TrackerSong *song, uint8_t pattern)
  46. {
  47. if (pattern < song->num_patterns) // we can set this pattern since it already exists
  48. {
  49. return true;
  50. }
  51. else
  52. {
  53. if (song->pattern[pattern - 1].step == NULL)
  54. return false; // if we hop through several patterns (e.g. editing upper digit)
  55. if (!(is_pattern_empty(song, pattern - 1))) // don't let the user flood the song with empty patterns
  56. {
  57. song->pattern[pattern].step = malloc(sizeof(TrackerSongPatternStep) * song->pattern_length);
  58. set_empty_pattern(&song->pattern[pattern], song->pattern_length);
  59. song->num_patterns++;
  60. return true;
  61. }
  62. else
  63. {
  64. return false;
  65. }
  66. }
  67. }
  68. void resize_pattern(TrackerSongPattern *pattern, uint16_t old_length, uint16_t new_length)
  69. {
  70. TrackerSongPattern temp;
  71. temp.step = malloc((new_length) * sizeof(TrackerSongPatternStep));
  72. set_empty_pattern(&temp, new_length);
  73. memcpy(temp.step, pattern->step, fmin(old_length, new_length) * sizeof(TrackerSongPatternStep));
  74. free(pattern->step);
  75. pattern->step = temp.step;
  76. }
  77. void change_pattern_length(TrackerSong *song, uint16_t new_length)
  78. {
  79. for (int i = 0; i < MAX_PATTERNS; i++)
  80. {
  81. if (song->pattern[i].step)
  82. {
  83. resize_pattern(&song->pattern[i], song->pattern_length, new_length);
  84. }
  85. }
  86. song->pattern_length = new_length;
  87. }
  88. bool is_default_instrument(Instrument* inst)
  89. {
  90. Instrument* ref = malloc(sizeof(Instrument));
  91. set_default_instrument(ref);
  92. bool is_default = memcmp(ref, inst, sizeof(Instrument)) != 0 ? false : true;
  93. free(ref);
  94. return is_default;
  95. }
  96. bool check_and_allocate_instrument(TrackerSong *song, uint8_t inst)
  97. {
  98. if (inst < song->num_instruments) // we can go to this instrument since it already exists
  99. {
  100. return true;
  101. }
  102. else
  103. {
  104. if(inst >= MAX_INSTRUMENTS) return false;
  105. if (!(is_default_instrument(song->instrument[inst - 1]))) // don't let the user flood the song with default instrument
  106. {
  107. song->instrument[inst] = malloc(sizeof(Instrument));
  108. set_default_instrument(song->instrument[inst]);
  109. song->num_instruments++;
  110. return true;
  111. }
  112. else
  113. {
  114. return false;
  115. }
  116. }
  117. }