Przeglądaj źródła

retrigger on slide, portamento semitones effects

LTVA1 2 lat temu
rodzic
commit
ea44830262

+ 4 - 1
flizzer_tracker.c

@@ -226,7 +226,9 @@ int32_t flizzer_tracker_app(void *p)
 
             furi_record_close(RECORD_DIALOGS);
 
-            if (ret)
+            const char *cpath = furi_string_get_cstr(path);
+
+            if (ret && strcmp(&cpath[strlen(cpath) - 4], SONG_FILE_EXT) == 0)
             {
                 bool result = load_song_util(tracker, path);
                 UNUSED(result);
@@ -235,6 +237,7 @@ int32_t flizzer_tracker_app(void *p)
             else
             {
                 furi_string_free(path);
+                tracker->is_loading = false;
             }
         }
 

+ 24 - 0
tracker_engine/do_effects.c

@@ -485,6 +485,30 @@ void do_command(uint16_t opcode, TrackerEngine *tracker_engine, uint8_t channel,
             break;
         }
 
+        case TE_EFFECT_PORTA_UP_SEMITONE:
+        {
+            uint32_t prev = te_channel->note;
+
+            te_channel->note += ((opcode & 0xff) << 8);
+            if (prev > te_channel->note)
+                te_channel->note = 0xffff;
+
+            te_channel->target_note = te_channel->note;
+            break;
+        }
+
+        case TE_EFFECT_PORTA_DOWN_SEMITONE:
+        {
+            int32_t prev = te_channel->note;
+
+            te_channel->note -= ((opcode & 0xff) << 8);
+            if (prev < te_channel->note)
+                te_channel->note = 0;
+
+            te_channel->target_note = te_channel->note;
+            break;
+        }
+
         case TE_EFFECT_ARPEGGIO_ABS:
         {
             te_channel->arpeggio_note = 0;

+ 7 - 0
tracker_engine/tracker_engine.c

@@ -571,6 +571,13 @@ void tracker_engine_advance_tick(TrackerEngine *tracker_engine)
 
                     if ((opcode & 0x7f00) == TE_EFFECT_SLIDE)
                     {
+                        if (pinst->flags & TE_RETRIGGER_ON_SLIDE)
+                        {
+                            uint16_t temp_note = te_channel->note;
+                            tracker_engine_trigger_instrument_internal(tracker_engine, chan, pinst, note << 8);
+                            te_channel->note = temp_note;
+                        }
+
                         te_channel->target_note = ((note + pinst->base_note - MIDDLE_C) << 8) + pinst->finetune;
                         te_channel->slide_speed = (opcode & 0xff);
                     }

+ 2 - 2
tracker_engine/tracker_engine_defs.h

@@ -97,9 +97,9 @@ typedef enum
     TE_EFFECT_SET_RING_MOD_SRC = 0x1b00,  // Rxx
     TE_EFFECT_SET_HARD_SYNC_SRC = 0x1c00, // Sxx
 
+    TE_EFFECT_PORTA_UP_SEMITONE = 0x1d00,   // Txx
+    TE_EFFECT_PORTA_DOWN_SEMITONE = 0x1e00, // Uxx
     /*
-    TE_EFFECT_ = 0x1d00, //Txx
-    TE_EFFECT_ = 0x1e00, //Uxx
     TE_EFFECT_ = 0x1f00, //Vxx
     TE_EFFECT_ = 0x2000, //Wxx
     */

+ 2 - 0
view/opcode_description.c

@@ -45,6 +45,8 @@ static const OpcodeDescription opcode_desc[] =
         {TE_EFFECT_PROGRAM_RESTART, 0x7f00, "RESTART INSTRUMENT PROGRAM", "P.RES."},
         {TE_EFFECT_SET_RING_MOD_SRC, 0x7f00, "SET RING MODULATION SOURCE CH.", "R.SRC"},
         {TE_EFFECT_SET_HARD_SYNC_SRC, 0x7f00, "SET HARD SYNC SOURCE CHANNEL", "S.SRC"},
+        {TE_EFFECT_PORTA_UP_SEMITONE, 0x7f00, "PORTAMENTO UP (SEMITONES)", "PU.SEM"},
+        {TE_EFFECT_PORTA_DOWN_SEMITONE, 0x7f00, "PORTAMENTO DOWN (SEMITONES)", "PD.SEM"},
         {TE_EFFECT_LEGATO, 0x7f00, "LEGATO", "LEGATO"},
         {TE_EFFECT_ARPEGGIO_ABS, 0x7f00, "ABSOLUTE ARPEGGIO NOTE", ""},
         {TE_EFFECT_TRIGGER_RELEASE, 0x7f00, "TRIGGER RELEASE", "TR.REL"},