Jelajahi Sumber

small fixes, new folder for songs and settings cfg

why UI starts lagging after playing the song several times?
LTVA1 2 tahun lalu
induk
melakukan
f4e0416971
8 mengubah file dengan 76 tambahan dan 79 penghapusan
  1. 2 75
      flizzer_tracker.c
  2. 2 1
      flizzer_tracker.h
  3. 2 0
      init_deinit.c
  4. 0 1
      input_event.c
  5. 15 0
      tracker_engine/do_effects.c
  6. 6 1
      tracker_engine/tracker_engine.c
  7. 47 0
      util.c
  8. 2 1
      util.h

+ 2 - 75
flizzer_tracker.c

@@ -99,7 +99,8 @@ int32_t flizzer_tracker_app(void *p)
     UNUSED(p);
 
     Storage *storage = furi_record_open(RECORD_STORAGE);
-    bool st = storage_simply_mkdir(storage, FLIZZER_TRACKER_FOLDER);
+    bool st = storage_simply_mkdir(storage, APPSDATA_FOLDER);
+    st = storage_simply_mkdir(storage, FLIZZER_TRACKER_FOLDER);
     UNUSED(st);
     furi_record_close(RECORD_STORAGE);
 
@@ -108,80 +109,6 @@ int32_t flizzer_tracker_app(void *p)
     // Текущее событие типа кастомного типа FlizzerTrackerEvent
     FlizzerTrackerEvent event;
 
-    tracker->tracker_engine.master_volume = 0x80;
-
-    tracker->song.speed = 5;
-    tracker->song.rate = tracker->tracker_engine.rate;
-    tracker->song.num_instruments = 2;
-    tracker->song.num_patterns = 3;
-    tracker->song.num_sequence_steps = 4;
-    tracker->song.pattern_length = 64;
-
-    tracker->song.sequence.sequence_step[0].pattern_indices[0] = 0;
-    tracker->song.sequence.sequence_step[0].pattern_indices[1] = 1;
-    tracker->song.sequence.sequence_step[0].pattern_indices[2] = 2;
-    tracker->song.sequence.sequence_step[0].pattern_indices[3] = 2;
-
-    tracker->song.pattern[0].step = malloc(64 * sizeof(TrackerSongPatternStep));
-    tracker->song.pattern[1].step = malloc(64 * sizeof(TrackerSongPatternStep));
-    tracker->song.pattern[2].step = malloc(64 * sizeof(TrackerSongPatternStep));
-
-    memset(tracker->song.pattern[0].step, 0, 64 * sizeof(TrackerSongPatternStep));
-    memset(tracker->song.pattern[1].step, 0, 64 * sizeof(TrackerSongPatternStep));
-    memset(tracker->song.pattern[2].step, 0, 64 * sizeof(TrackerSongPatternStep));
-
-    tracker->song.instrument[0] = malloc(sizeof(Instrument));
-    tracker->song.instrument[1] = malloc(sizeof(Instrument));
-
-    for (int i = 0; i < 64; ++i)
-    {
-        set_note(&tracker->song.pattern[0].step[i], MUS_NOTE_NONE);
-        set_note(&tracker->song.pattern[1].step[i], MUS_NOTE_NONE);
-        set_note(&tracker->song.pattern[2].step[i], MUS_NOTE_NONE);
-
-        set_instrument(&tracker->song.pattern[0].step[i], MUS_NOTE_INSTRUMENT_NONE);
-        set_instrument(&tracker->song.pattern[1].step[i], MUS_NOTE_INSTRUMENT_NONE);
-        set_instrument(&tracker->song.pattern[2].step[i], MUS_NOTE_INSTRUMENT_NONE);
-
-        set_volume(&tracker->song.pattern[0].step[i], MUS_NOTE_VOLUME_NONE);
-        set_volume(&tracker->song.pattern[1].step[i], MUS_NOTE_VOLUME_NONE);
-        set_volume(&tracker->song.pattern[2].step[i], MUS_NOTE_VOLUME_NONE);
-    }
-
-    for (int i = 0; i < 64; i += 8)
-    {
-        set_note(&tracker->song.pattern[0].step[0 + i], 12 * 5);
-        set_note(&tracker->song.pattern[0].step[2 + i], 12 * 5 + 2);
-        set_note(&tracker->song.pattern[0].step[4 + i], 12 * 5 - 2);
-        set_note(&tracker->song.pattern[0].step[6 + i], 12 * 5 + 4);
-
-        set_instrument(&tracker->song.pattern[0].step[0 + i], 0);
-        set_instrument(&tracker->song.pattern[0].step[2 + i], 0);
-        set_instrument(&tracker->song.pattern[0].step[4 + i], 0);
-        set_instrument(&tracker->song.pattern[0].step[6 + i], 0);
-    }
-
-    for (int i = 0; i < 64; i++)
-    {
-        set_note(&tracker->song.pattern[1].step[i], 12 * 7 + 11);
-
-        set_instrument(&tracker->song.pattern[1].step[i], 1);
-    }
-
-    set_default_instrument(tracker->song.instrument[0]);
-    set_default_instrument(tracker->song.instrument[1]);
-
-    tracker->song.instrument[0]->adsr.a = 0x2;
-    tracker->song.instrument[0]->adsr.d = 0x9;
-    tracker->song.instrument[0]->adsr.volume = 0x80;
-    tracker->song.instrument[0]->waveform = SE_WAVEFORM_TRIANGLE;
-
-    tracker->song.instrument[1]->adsr.a = 0x0;
-    tracker->song.instrument[1]->adsr.d = 0x3;
-    tracker->song.instrument[1]->adsr.volume = 0x18;
-    tracker->song.instrument[1]->waveform = SE_WAVEFORM_NOISE;
-
-    tracker->tracker_engine.playing = false;
     play();
 
     view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);

+ 2 - 1
flizzer_tracker.h

@@ -22,7 +22,8 @@
 #include "sound_engine/sound_engine_filter.h"
 #include "tracker_engine/tracker_engine_defs.h"
 
-#define FLIZZER_TRACKER_FOLDER "/ext/flizzer_tracker"
+#define APPSDATA_FOLDER "/ext/apps_data"
+#define FLIZZER_TRACKER_FOLDER "/ext/apps_data/flizzer_tracker"
 #define FILE_NAME_LEN 64
 
 typedef enum

+ 2 - 0
init_deinit.c

@@ -129,6 +129,8 @@ FlizzerTrackerApp *init_tracker(uint32_t sample_rate, uint8_t rate, bool externa
     tracker->notification = furi_record_open(RECORD_NOTIFICATION);
     notification_message(tracker->notification, &sequence_display_backlight_enforce_on);
 
+    set_default_song(tracker);
+
     return tracker;
 }
 

+ 0 - 1
input_event.c

@@ -306,7 +306,6 @@ void process_input_event(FlizzerTrackerApp *tracker, FlizzerTrackerEvent *event)
         return;
     }
 
-    // Если нажата кнопка "назад", то выходим из цикла, а следовательно и из приложения
     if (event->input.key == InputKeyBack && event->input.type == InputTypeLong)
     {
         switch (tracker->mode)

+ 15 - 0
tracker_engine/do_effects.c

@@ -437,6 +437,11 @@ void do_command(uint16_t opcode, TrackerEngine *tracker_engine, uint8_t channel,
             if (tick == 0)
             {
                 se_channel->adsr.a = (opcode & 0xff);
+
+                if (se_channel->adsr.envelope_state == ATTACK)
+                {
+                    se_channel->adsr.envelope_speed = envspd(tracker_engine->sound_engine, se_channel->adsr.a);
+                }
             }
 
             break;
@@ -447,6 +452,11 @@ void do_command(uint16_t opcode, TrackerEngine *tracker_engine, uint8_t channel,
             if (tick == 0)
             {
                 se_channel->adsr.d = (opcode & 0xff);
+
+                if (se_channel->adsr.envelope_state == DECAY)
+                {
+                    se_channel->adsr.envelope_speed = envspd(tracker_engine->sound_engine, se_channel->adsr.d);
+                }
             }
 
             break;
@@ -467,6 +477,11 @@ void do_command(uint16_t opcode, TrackerEngine *tracker_engine, uint8_t channel,
             if (tick == 0)
             {
                 se_channel->adsr.r = (opcode & 0xff);
+
+                if (se_channel->adsr.envelope_state == RELEASE)
+                {
+                    se_channel->adsr.envelope_speed = envspd(tracker_engine->sound_engine, se_channel->adsr.r);
+                }
             }
 
             break;

+ 6 - 1
tracker_engine/tracker_engine.c

@@ -715,9 +715,14 @@ void tracker_engine_advance_tick(TrackerEngine *tracker_engine)
 
                 if (tracker_engine->sequence_position >= song->num_sequence_steps)
                 {
-                    tracker_engine->playing = false; // TODO: add song loop handling
+                    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);
+                    }
                 }
             }
         }

+ 47 - 0
util.c

@@ -36,6 +36,12 @@ void stop_song(FlizzerTrackerApp *tracker)
 {
     tracker->tracker_engine.playing = false;
     tracker->editing = tracker->was_editing;
+
+    for (int i = 0; i < SONG_MAX_CHANNELS; i++)
+    {
+        tracker->sound_engine.channel[i].adsr.volume = 0;
+    }
+
     stop();
 }
 
@@ -145,4 +151,45 @@ bool check_and_allocate_instrument(TrackerSong *song, uint8_t inst)
             return false;
         }
     }
+}
+
+void set_default_song(FlizzerTrackerApp *tracker)
+{
+    tracker->tracker_engine.master_volume = 0x80;
+
+    tracker->song.speed = 6;
+    tracker->song.rate = tracker->tracker_engine.rate;
+    tracker->song.num_instruments = 1;
+    tracker->song.num_patterns = 5;
+    tracker->song.num_sequence_steps = 1;
+    tracker->song.pattern_length = 64;
+
+    tracker->song.sequence.sequence_step[0].pattern_indices[0] = 1;
+    tracker->song.sequence.sequence_step[0].pattern_indices[1] = 2;
+    tracker->song.sequence.sequence_step[0].pattern_indices[2] = 3;
+    tracker->song.sequence.sequence_step[0].pattern_indices[3] = 4;
+
+    for (int i = 0; i < 5; i++)
+    {
+        tracker->song.pattern[i].step = malloc(64 * sizeof(TrackerSongPatternStep));
+        memset(tracker->song.pattern[i].step, 0, 64 * sizeof(TrackerSongPatternStep));
+    }
+
+    for (int i = 0; i < 64; ++i)
+    {
+        for (int j = 0; j < 5; j++)
+        {
+            set_note(&tracker->song.pattern[j].step[i], MUS_NOTE_NONE);
+
+            set_instrument(&tracker->song.pattern[j].step[i], MUS_NOTE_INSTRUMENT_NONE);
+
+            set_volume(&tracker->song.pattern[j].step[i], MUS_NOTE_VOLUME_NONE);
+        }
+    }
+
+    tracker->song.instrument[0] = malloc(sizeof(Instrument));
+
+    set_default_instrument(tracker->song.instrument[0]);
+
+    tracker->tracker_engine.playing = false;
 }

+ 2 - 1
util.h

@@ -24,4 +24,5 @@ bool is_pattern_empty(TrackerSong *song, uint8_t pattern);
 bool check_and_allocate_pattern(TrackerSong *song, uint8_t pattern);
 void change_pattern_length(TrackerSong *song, uint16_t new_length);
 
-bool check_and_allocate_instrument(TrackerSong *song, uint8_t inst);
+bool check_and_allocate_instrument(TrackerSong *song, uint8_t inst);
+void set_default_song(FlizzerTrackerApp *tracker);