LTVA1 před 2 roky
rodič
revize
e13503ee12

+ 7 - 2
flizzer_tracker.c

@@ -30,6 +30,13 @@ void draw_callback(Canvas *canvas, void *ctx)
 
     canvas_set_custom_u8g2_font(canvas, u8g2_font_tom_thumb_4x6_tr);
 
+    /*char buffer[33];
+    snprintf(buffer, sizeof(buffer), "%ld", (tracker->sound_engine.counter & 8191));
+    canvas_draw_str(canvas, 0, 29, buffer);
+
+    snprintf(buffer, sizeof(buffer), "%ld", (tracker->tracker_engine.counter & 8191));
+    canvas_draw_str(canvas, 18, 29, buffer);*/
+
     switch (tracker->mode)
     {
         case PATTERN_VIEW:
@@ -109,8 +116,6 @@ int32_t flizzer_tracker_app(void *p)
     // Текущее событие типа кастомного типа FlizzerTrackerEvent
     FlizzerTrackerEvent event;
 
-    play();
-
     view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
 
     // Бесконечный цикл обработки очереди событий

+ 7 - 5
flizzer_tracker_hal.c

@@ -5,6 +5,8 @@ void sound_engine_dma_isr(void *ctx)
 {
     SoundEngine *sound_engine = (SoundEngine *)ctx;
 
+    // sound_engine->counter++;
+
     // half of transfer
     if (LL_DMA_IsActiveFlag_HT1(DMA1))
     {
@@ -26,16 +28,16 @@ void sound_engine_dma_isr(void *ctx)
     }
 }
 
-void tracker_engine_timer_isr(void *ctx)
+void tracker_engine_timer_isr(void *ctx) // the tracker engine interrupt is of higher priority than sound engine one so it can run at the middle of filling the buffer, thus allowing sample-accurate tight effect timing
 {
+    TrackerEngine *tracker_engine = (TrackerEngine *)ctx;
+    // tracker_engine->counter++;
+
     if (LL_TIM_IsActiveFlag_UPDATE(TRACKER_ENGINE_TIMER))
     {
         LL_TIM_ClearFlag_UPDATE(TRACKER_ENGINE_TIMER);
+        tracker_engine_advance_tick(tracker_engine);
     }
-
-    TrackerEngine *tracker_engine = (TrackerEngine *)ctx;
-
-    tracker_engine_advance_tick(tracker_engine);
 }
 
 void sound_engine_PWM_timer_init(bool external_audio_output) // external audio on pin PA6

+ 14 - 1
input/pattern.c

@@ -310,6 +310,11 @@ void pattern_edit_event(FlizzerTrackerApp *tracker, FlizzerTrackerEvent *event)
     if (event->input.key == InputKeyOk && event->input.type == InputTypeShort && !tracker->tracker_engine.playing)
     {
         tracker->editing = !tracker->editing;
+
+        if (tracker->editing)
+        {
+            // stop_song(tracker);
+        }
     }
 
     if (event->input.key == InputKeyOk && event->input.type == InputTypeLong)
@@ -323,7 +328,15 @@ void pattern_edit_event(FlizzerTrackerApp *tracker, FlizzerTrackerEvent *event)
 
             else
             {
-                play_song(tracker, true);
+                if (tracker->tracker_engine.pattern_position == tracker->song.pattern_length - 1 && tracker->tracker_engine.sequence_position == tracker->song.num_sequence_steps - 1) // if we are at the very end of the song
+                {
+                    stop_song(tracker);
+                }
+
+                else
+                {
+                    play_song(tracker, true);
+                }
             }
         }
 

+ 2 - 0
sound_engine/sound_engine_defs.h

@@ -102,4 +102,6 @@ typedef struct
     uint32_t audio_buffer_size;
     bool external_audio_output;
     uint8_t sine_lut[SINE_LUT_SIZE];
+
+    // uint32_t counter; //for debug
 } SoundEngine;

+ 16 - 0
tracker_engine/tracker_engine.c

@@ -681,6 +681,20 @@ void tracker_engine_advance_tick(TrackerEngine *tracker_engine)
                     tracker_engine->pattern_position = 0;
 
                     flag = false;
+
+                    if (tracker_engine->sequence_position >= song->num_sequence_steps)
+                    {
+                        tracker_engine->playing = false;
+                        tracker_engine->sequence_position--;
+                        tracker_engine->pattern_position = song->pattern_length - 1;
+
+                        for (int i = 0; i < SONG_MAX_CHANNELS; i++)
+                        {
+                            sound_engine_enable_gate(tracker_engine->sound_engine, &tracker_engine->sound_engine->channel[i], false);
+                        }
+
+                        goto end_process;
+                    }
                 }
             }
 
@@ -727,4 +741,6 @@ void tracker_engine_advance_tick(TrackerEngine *tracker_engine)
             }
         }
     }
+
+end_process:;
 }

+ 2 - 0
tracker_engine/tracker_engine_defs.h

@@ -234,4 +234,6 @@ typedef struct
 
     bool in_loop; // for E6X (pattern loop) command
     uint8_t loops_left;
+
+    // uint32_t counter; //for debug
 } TrackerEngine;