instrument_editor.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include "instrument_editor.h"
  2. #include "pattern_editor.h"
  3. #include <flizzer_tracker_icons.h>
  4. void draw_inst_flag(FlizzerTrackerApp *tracker, Canvas *canvas, uint8_t focus, uint8_t param, const char *text, uint8_t x, uint8_t y, uint16_t flags, uint16_t mask)
  5. {
  6. canvas_draw_icon(canvas, x, y - 5, ((flags & mask) ? &I_checkbox_checked : &I_checkbox_empty));
  7. canvas_draw_str(canvas, x + 6, y, text);
  8. if (tracker->focus == focus && tracker->selected_param == param && tracker->editing)
  9. {
  10. if (text[strlen(text) - 1] == ':')
  11. {
  12. canvas_draw_box(canvas, x + 5, y - 6, strlen(text) * 4 - 1, 7);
  13. }
  14. else
  15. {
  16. canvas_draw_box(canvas, x + 5, y - 6, strlen(text) * 4 + 1, 7);
  17. }
  18. }
  19. }
  20. void draw_inst_text_one_digit(FlizzerTrackerApp *tracker, Canvas *canvas, uint8_t focus, uint8_t param, const char *text, uint8_t x, uint8_t y, uint8_t value) // text MUST end with semicolon
  21. {
  22. canvas_draw_str(canvas, x, y, text);
  23. char buffer[4];
  24. snprintf(buffer, sizeof(buffer), "%01X", (value & 0xF));
  25. canvas_draw_str(canvas, x + strlen(text) * 4 - 2, y, buffer);
  26. if (tracker->focus == focus && tracker->selected_param == param && tracker->editing)
  27. {
  28. canvas_draw_box(canvas, x + strlen(text) * 4 - 3, y - 6, 5, 7);
  29. }
  30. }
  31. void draw_inst_text_two_digits(FlizzerTrackerApp *tracker, Canvas *canvas, uint8_t focus, uint8_t param, const char *text, uint8_t x, uint8_t y, uint8_t value) // text MUST end with semicolon
  32. {
  33. canvas_draw_str(canvas, x, y, text);
  34. char buffer[4];
  35. snprintf(buffer, sizeof(buffer), "%02X", value);
  36. canvas_draw_str(canvas, x + strlen(text) * 4 - 2, y, buffer);
  37. if (tracker->focus == focus && tracker->selected_param == param && tracker->editing)
  38. {
  39. canvas_draw_box(canvas, x + strlen(text) * 4 + 4 * tracker->current_digit - 3, y - 6, 5, 7);
  40. }
  41. }
  42. static const char *filter_types[] =
  43. {
  44. "NONE",
  45. "LOW",
  46. "HIGH",
  47. "BAND",
  48. };
  49. static const char *instrument_editor_params_description[] =
  50. {
  51. "CURRENT INSTRUMENT",
  52. "CURRENT INSTRUMENT NAME",
  53. "INSTRUMENT BASE NOTE",
  54. "INSTRUMENT FINETUNE",
  55. "SLIDE SPEED",
  56. "SET PULSE WIDTH ON KEYDOWN",
  57. "PULSE WIDTH",
  58. "SET FILTER PARAMETERS ON KEYDOWN",
  59. "NOISE WAVEFORM",
  60. "PULSE WAVEFORM",
  61. "TRIANGLE WAVEFORM",
  62. "SAWTOOTH WAVEFORM",
  63. "METALLIC NOISE WAVEFORM",
  64. "SINE WAVEFORM",
  65. "ENVELOPE ATTACK",
  66. "ENVELOPE DECAY",
  67. "ENVELOPE SUSTAIN",
  68. "ENVELOPE RELEASE",
  69. "ENVELOPE VOLUME",
  70. "ENABLE FILTER",
  71. "FILTER CUTOFF FREQUENCY",
  72. "FILTER RESONANCE",
  73. "FILTER TYPE (NONE=OFF)",
  74. "ENABLE RING MODULATION",
  75. "RINGMOD SOURCE CHANNEL (F=SELF)",
  76. "ENABLE HARD SYNC",
  77. "HARDSYNC SOURCE CHANNEL (F=SELF)",
  78. "RETRIGGER INSTRUMENT ON SLIDE",
  79. "SYNC OSCLLATORS ON KEYDOWN",
  80. "ENABLE VIBRATO",
  81. "VIBRATO SPEED",
  82. "VIBRATO DEPTH",
  83. "VIBRATO DELAY (IN TICKS)",
  84. "ENABLE PWM",
  85. "PWM SPEED",
  86. "PWM DEPTH",
  87. "PWM DELAY (IN TICKS)",
  88. "PROG.PERIOD (00 ACTS SAME AS 01)",
  89. };
  90. void draw_instrument_view(Canvas *canvas, FlizzerTrackerApp *tracker)
  91. {
  92. SoundEngineChannel *se_channel = &tracker->sound_engine.channel[0];
  93. if (!(se_channel->flags & SE_ENABLE_GATE) && tracker->tracker_engine.song == NULL)
  94. {
  95. stop();
  96. tracker->tracker_engine.playing = false;
  97. tracker_engine_set_song(&tracker->tracker_engine, &tracker->song);
  98. }
  99. char buffer[30];
  100. Instrument *inst = tracker->song.instrument[tracker->current_instrument];
  101. uint8_t shift = tracker->inst_editor_shift;
  102. if (shift == 0)
  103. {
  104. snprintf(buffer, sizeof(buffer), "INST:%c", to_char(tracker->current_instrument));
  105. draw_generic_n_digit_field(tracker, canvas, EDIT_INSTRUMENT, INST_CURRENTINSTRUMENT, buffer, 0, 5 - shift, 1);
  106. snprintf(buffer, sizeof(buffer), "%s", tracker->song.instrument[tracker->current_instrument]->name);
  107. draw_generic_n_digit_field(tracker, canvas, EDIT_INSTRUMENT, INST_INSTRUMENTNAME, buffer, 4 * 7, 5 - shift, 1);
  108. }
  109. snprintf(buffer, sizeof(buffer), "NOTE:%s", notename(inst->base_note));
  110. canvas_draw_str(canvas, 0, 11 - shift, buffer);
  111. if (tracker->editing && tracker->focus == EDIT_INSTRUMENT && tracker->selected_param == INST_CURRENT_NOTE)
  112. {
  113. if (tracker->current_digit)
  114. {
  115. canvas_draw_box(canvas, 19 + 2 * 4, 5 - shift, 5, 7);
  116. }
  117. else
  118. {
  119. canvas_draw_box(canvas, 19, 5 - shift, 5 + 4, 7);
  120. }
  121. }
  122. snprintf(buffer, sizeof(buffer), "FINE:%+02d", inst->finetune);
  123. canvas_draw_str(canvas, 37, 11 - shift, buffer);
  124. if (tracker->editing && tracker->focus == EDIT_INSTRUMENT && tracker->selected_param == INST_FINETUNE)
  125. {
  126. if (tracker->current_digit)
  127. {
  128. canvas_draw_box(canvas, 60 + 4, 5 - shift, 5, 7);
  129. }
  130. else
  131. {
  132. canvas_draw_box(canvas, 60, 5 - shift, 5, 7);
  133. }
  134. }
  135. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_SLIDESPEED, "SL.SPD:", 0, 17 - shift, inst->slide_speed);
  136. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_SETPW, "PW:", 36, 17 - shift, inst->flags, TE_SET_PW);
  137. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_PW, "", 54, 17 - shift, inst->pw);
  138. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_SETCUTOFF, "CUT", 62, 17 - shift, inst->flags, TE_SET_CUTOFF);
  139. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_NOISE, "N", 0, 23 - shift, inst->waveform, SE_WAVEFORM_NOISE);
  140. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_PULSE, "P", 10, 23 - shift, inst->waveform, SE_WAVEFORM_PULSE);
  141. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_TRIANGLE, "T", 20, 23 - shift, inst->waveform, SE_WAVEFORM_TRIANGLE);
  142. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_SAWTOOTH, "S", 30, 23 - shift, inst->waveform, SE_WAVEFORM_SAW);
  143. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_NOISE_METAL, "M", 40, 23 - shift, inst->waveform, SE_WAVEFORM_NOISE_METAL);
  144. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_SINE, "SINE", 50, 23 - shift, inst->waveform, SE_WAVEFORM_SINE);
  145. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_ATTACK, "A:", 0, 29 - shift, inst->adsr.a);
  146. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_DECAY, "D:", 16, 29 - shift, inst->adsr.d);
  147. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_SUSTAIN, "S:", 32, 29 - shift, inst->adsr.s);
  148. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_RELEASE, "R:", 48, 29 - shift, inst->adsr.r);
  149. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_VOLUME, "V:", 64, 29 - shift, inst->adsr.volume);
  150. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_ENABLEFILTER, "FIL", 0, 35 - shift, inst->sound_engine_flags, SE_ENABLE_FILTER);
  151. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_FILTERCUTOFF, "CUT:", 20, 35 - shift, inst->filter_cutoff);
  152. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_FILTERRESONANCE, "RES:", 44, 35 - shift, inst->filter_resonance);
  153. snprintf(buffer, sizeof(buffer), "TYPE:%s", filter_types[inst->filter_type]);
  154. canvas_draw_str(canvas, 0, 41 - shift, buffer);
  155. if (tracker->editing && tracker->focus == EDIT_INSTRUMENT && tracker->selected_param == INST_FILTERTYPE)
  156. {
  157. canvas_draw_box(canvas, 19, 35 - shift, strlen(filter_types[inst->filter_type]) * 4 + 1, 7);
  158. }
  159. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_ENABLERINGMOD, "R:", 38, 41 - shift, inst->sound_engine_flags, SE_ENABLE_RING_MOD);
  160. draw_inst_text_one_digit(tracker, canvas, EDIT_INSTRUMENT, INST_RINGMODSRC, "", 52, 41 - shift, inst->ring_mod);
  161. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_ENABLEHARDSYNC, "H:", 56, 41 - shift, inst->sound_engine_flags, SE_ENABLE_HARD_SYNC);
  162. draw_inst_text_one_digit(tracker, canvas, EDIT_INSTRUMENT, INST_HARDSYNCSRC, "", 70, 41 - shift, inst->hard_sync);
  163. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_RETRIGGERONSLIDE, "SL.RETRIG", 0, 47 - shift, inst->flags, TE_RETRIGGER_ON_SLIDE);
  164. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_ENABLEKEYSYNC, "KSYNC", 44, 47 - shift, inst->sound_engine_flags, SE_ENABLE_KEYDOWN_SYNC);
  165. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_ENABLEVIBRATO, "VIB", 0, 53 - shift, inst->flags, TE_ENABLE_VIBRATO);
  166. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_VIBRATOSPEED, "S:", 20, 53 - shift, inst->vibrato_speed);
  167. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_VIBRATODEPTH, "D:", 36, 53 - shift, inst->vibrato_depth);
  168. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_VIBRATODELAY, "DEL:", 52, 53 - shift, inst->vibrato_delay);
  169. if (shift >= 6)
  170. {
  171. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_ENABLEPWM, "PWM", 0, 59 - shift, inst->flags, TE_ENABLE_PWM);
  172. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_PWMSPEED, "S:", 20, 59 - shift, inst->pwm_speed);
  173. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_PWMDEPTH, "D:", 36, 59 - shift, inst->pwm_depth);
  174. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_PWMDELAY, "DEL:", 52, 59 - shift, inst->pwm_delay);
  175. }
  176. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_PROGRAMEPERIOD, "P.PERIOD:", 84, 56, inst->program_period);
  177. canvas_draw_line(canvas, 0, 57, 127, 57);
  178. canvas_draw_line(canvas, 82, 0, 82, 56);
  179. canvas_draw_line(canvas, 83, 49, 127, 49);
  180. if (tracker->focus == EDIT_INSTRUMENT)
  181. {
  182. canvas_draw_str(canvas, 0, 64, instrument_editor_params_description[tracker->selected_param]);
  183. }
  184. }
  185. void draw_instrument_program_view(Canvas *canvas, FlizzerTrackerApp *tracker)
  186. {
  187. UNUSED(canvas);
  188. UNUSED(tracker);
  189. }