instrument_editor.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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);
  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. void draw_instrument_view(Canvas *canvas, FlizzerTrackerApp *tracker)
  50. {
  51. SoundEngineChannel *se_channel = &tracker->sound_engine.channel[0];
  52. if (!(se_channel->flags & SE_ENABLE_GATE))
  53. {
  54. stop();
  55. tracker->tracker_engine.playing = false;
  56. tracker_engine_set_song(&tracker->tracker_engine, &tracker->song);
  57. }
  58. char buffer[20];
  59. Instrument *inst = tracker->song.instrument[tracker->current_instrument];
  60. uint8_t shift = tracker->inst_editor_shift;
  61. if (shift < 6)
  62. {
  63. snprintf(buffer, sizeof(buffer), "INST:%c", to_char(tracker->current_instrument));
  64. draw_generic_n_digit_field(tracker, canvas, EDIT_INSTRUMENT, INST_CURRENTINSTRUMENT, buffer, 0, 5 - shift, 1);
  65. snprintf(buffer, sizeof(buffer), "%s", tracker->song.instrument[tracker->current_instrument]->name);
  66. draw_generic_n_digit_field(tracker, canvas, EDIT_INSTRUMENT, INST_INSTRUMENTNAME, buffer, 4 * 7, 5 - shift, 1);
  67. }
  68. snprintf(buffer, sizeof(buffer), "NOTE:%s", notename(inst->base_note));
  69. canvas_draw_str(canvas, 0, 11, buffer);
  70. if (tracker->editing && tracker->focus == EDIT_INSTRUMENT && tracker->selected_param == INST_CURRENT_NOTE)
  71. {
  72. if (tracker->current_digit)
  73. {
  74. canvas_draw_box(canvas, 19 + 2 * 4, 5 - shift, 5, 7);
  75. }
  76. else
  77. {
  78. canvas_draw_box(canvas, 19, 5 - shift, 5 + 4, 7);
  79. }
  80. }
  81. snprintf(buffer, sizeof(buffer), "FINE:%+02d", inst->finetune);
  82. canvas_draw_str(canvas, 37, 11, buffer);
  83. if (tracker->editing && tracker->focus == EDIT_INSTRUMENT && tracker->selected_param == INST_FINETUNE)
  84. {
  85. if (tracker->current_digit)
  86. {
  87. canvas_draw_box(canvas, 60 + 4, 5 - shift, 5, 7);
  88. }
  89. else
  90. {
  91. canvas_draw_box(canvas, 60, 5 - shift, 5, 7);
  92. }
  93. }
  94. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_SLIDESPEED, "SL.SPD:", 0, 17 - shift, inst->slide_speed);
  95. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_SETPW, "PW:", 36, 17 - shift, inst->flags, TE_SET_PW);
  96. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_PW, "", 54, 17 - shift, inst->pw);
  97. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_SETCUTOFF, "CUT", 62, 17 - shift, inst->flags, TE_SET_CUTOFF);
  98. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_NOISE, "N", 0, 23 - shift, inst->waveform, SE_WAVEFORM_NOISE);
  99. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_PULSE, "P", 10, 23 - shift, inst->waveform, SE_WAVEFORM_PULSE);
  100. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_TRIANGLE, "T", 20, 23 - shift, inst->waveform, SE_WAVEFORM_TRIANGLE);
  101. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_SAWTOOTH, "S", 30, 23 - shift, inst->waveform, SE_WAVEFORM_SAW);
  102. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_NOISE_METAL, "M", 40, 23 - shift, inst->waveform, SE_WAVEFORM_NOISE_METAL);
  103. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_WAVE_SINE, "SINE", 50, 23 - shift, inst->waveform, SE_WAVEFORM_SINE);
  104. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_ATTACK, "A:", 0, 29 - shift, inst->adsr.a);
  105. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_DECAY, "D:", 16, 29 - shift, inst->adsr.d);
  106. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_SUSTAIN, "S:", 32, 29 - shift, inst->adsr.s);
  107. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_RELEASE, "R:", 48, 29 - shift, inst->adsr.r);
  108. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_VOLUME, "V:", 64, 29 - shift, inst->adsr.volume);
  109. draw_inst_flag(tracker, canvas, EDIT_INSTRUMENT, INST_ENABLEFILTER, "FIL", 0, 35 - shift, inst->sound_engine_flags, SE_ENABLE_FILTER);
  110. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_FILTERCUTOFF, "CUT:", 20, 35 - shift, inst->filter_cutoff);
  111. draw_inst_text_two_digits(tracker, canvas, EDIT_INSTRUMENT, INST_FILTERRESONANCE, "RES:", 44, 35 - shift, inst->filter_resonance);
  112. snprintf(buffer, sizeof(buffer), "TYPE:%s", filter_types[inst->filter_type]);
  113. canvas_draw_str(canvas, 0, 41 - shift, buffer);
  114. if (tracker->editing && tracker->focus == EDIT_INSTRUMENT && tracker->selected_param == INST_FILTERTYPE)
  115. {
  116. canvas_draw_box(canvas, 19, 35 - shift, strlen(filter_types[inst->filter_type]) * 4 + 1, 7);
  117. }
  118. }
  119. void draw_instrument_program_view(Canvas *canvas, FlizzerTrackerApp *tracker)
  120. {
  121. UNUSED(canvas);
  122. UNUSED(tracker);
  123. }