Просмотр исходного кода

formatting, Exy effects, small fixes

LTVA1 3 лет назад
Родитель
Сommit
38dc9cc5e3

+ 2 - 2
audio_modes.c

@@ -1,7 +1,7 @@
-#include <stdint.h>
 #include <stdbool.h>
+#include <stdint.h>
 
-char* audio_modes_text[2] = {
+char *audio_modes_text[2] = {
     "Internal",
     "External",
 };

+ 13 - 13
diskop.c

@@ -138,11 +138,11 @@ bool load_song_util(FlizzerTrackerApp *tracker, FuriString *filepath)
     return result;
 }
 
-void save_config(FlizzerTrackerApp* tracker)
+void save_config(FlizzerTrackerApp *tracker)
 {
-    //stream_read_line
-    FuriString* filepath = furi_string_alloc();
-    FuriString* config_line = furi_string_alloc();
+    // stream_read_line
+    FuriString *filepath = furi_string_alloc();
+    FuriString *config_line = furi_string_alloc();
     furi_string_cat_printf(filepath, "%s/%s", FLIZZER_TRACKER_FOLDER, CFG_FILENAME);
 
     bool open_file = file_stream_open(tracker->stream, furi_string_get_cstr(filepath), FSAM_WRITE, FSOM_OPEN_ALWAYS);
@@ -156,10 +156,10 @@ void save_config(FlizzerTrackerApp* tracker)
     furi_string_free(config_line);
 }
 
-void load_config(FlizzerTrackerApp* tracker)
+void load_config(FlizzerTrackerApp *tracker)
 {
-    FuriString* filepath = furi_string_alloc();
-    FuriString* config_line = furi_string_alloc();
+    FuriString *filepath = furi_string_alloc();
+    FuriString *config_line = furi_string_alloc();
     furi_string_cat_printf(filepath, "%s/%s", FLIZZER_TRACKER_FOLDER, CFG_FILENAME);
 
     bool open_file = file_stream_open(tracker->stream, furi_string_get_cstr(filepath), FSAM_READ, FSOM_OPEN_ALWAYS);
@@ -169,22 +169,22 @@ void load_config(FlizzerTrackerApp* tracker)
 
     sscanf(furi_string_get_cstr(config_line), "%s%s%s", tracker->param, tracker->eq, tracker->value);
 
-    if(strcmp(tracker->param, "external_audio") == 0)
+    if (strcmp(tracker->param, "external_audio") == 0)
     {
-        if(strcmp(tracker->value, "false") == 0)
+        if (strcmp(tracker->value, "false") == 0)
         {
             tracker->external_audio = false;
-            //strcpy(tracker->value, "false_");
+            // strcpy(tracker->value, "false_");
         }
 
-        if(strcmp(tracker->value, "true") == 0)
+        if (strcmp(tracker->value, "true") == 0)
         {
             tracker->external_audio = true;
-            //strcpy(tracker->value, "true_");
+            // strcpy(tracker->value, "true_");
         }
 
         sound_engine_init(&tracker->sound_engine, tracker->sound_engine.sample_rate, tracker->external_audio, tracker->sound_engine.audio_buffer_size);
-        //sound_engine_set_audio_output(tracker->external_audio);
+        // sound_engine_set_audio_output(tracker->external_audio);
     }
 
     file_stream_close(tracker->stream);

+ 2 - 2
diskop.h

@@ -9,5 +9,5 @@ bool save_song(FlizzerTrackerApp *tracker, FuriString *filepath);
 
 bool load_song_util(FlizzerTrackerApp *tracker, FuriString *filepath);
 
-void save_config(FlizzerTrackerApp* tracker);
-void load_config(FlizzerTrackerApp* tracker);
+void save_config(FlizzerTrackerApp *tracker);
+void load_config(FlizzerTrackerApp *tracker);

+ 2 - 3
flizzer_tracker.c

@@ -231,7 +231,7 @@ int32_t flizzer_tracker_app(void *p)
         {
             stop_song(tracker);
 
-            tracker->tracker_engine.sequence_position = tracker->tracker_engine.pattern_position = 0;
+            tracker->tracker_engine.sequence_position = tracker->tracker_engine.pattern_position = tracker->current_instrument = 0;
 
             tracker->dialogs = furi_record_open(RECORD_DIALOGS);
             tracker->is_loading = true;
@@ -261,9 +261,8 @@ int32_t flizzer_tracker_app(void *p)
             }
         }
 
-        if(event.type == EventTypeSetAudioMode)
+        if (event.type == EventTypeSetAudioMode)
         {
-            sound_engine_set_audio_output(tracker->external_audio);
             sound_engine_PWM_timer_init(tracker->external_audio);
 
             tracker->sound_engine.external_audio_output = tracker->external_audio;

+ 1 - 1
flizzer_tracker.h

@@ -169,7 +169,7 @@ typedef struct
     DialogsApp *dialogs;
     Submenu *pattern_submenu;
     Submenu *instrument_submenu;
-    VariableItemList* settings_list;
+    VariableItemList *settings_list;
     Widget *overwrite_file_widget;
     char filename[FILE_NAME_LEN + 1];
     bool was_it_back_keypress;

+ 5 - 5
flizzer_tracker_hal.c

@@ -60,7 +60,7 @@ void sound_engine_PWM_timer_init(bool external_audio_output) // external audio o
     {
         furi_hal_gpio_init_ex(&gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedLow, GpioAltFn14TIM16);
 
-        if(furi_hal_speaker_is_mine())
+        if (furi_hal_speaker_is_mine())
         {
             furi_hal_speaker_release();
         }
@@ -68,12 +68,12 @@ void sound_engine_PWM_timer_init(bool external_audio_output) // external audio o
 
     else
     {
-        if(!(furi_hal_speaker_is_mine()))
+        if (!(furi_hal_speaker_is_mine()))
         {
             bool unu = furi_hal_speaker_acquire(1000);
             UNUSED(unu);
         }
-        
+
         furi_hal_gpio_init(&gpio_ext_pa6, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
     }
 
@@ -87,7 +87,7 @@ void sound_engine_set_audio_output(bool external_audio_output)
     {
         furi_hal_gpio_init_ex(&gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedLow, GpioAltFn14TIM16);
 
-        if(furi_hal_speaker_is_mine())
+        if (furi_hal_speaker_is_mine())
         {
             furi_hal_speaker_release();
         }
@@ -95,7 +95,7 @@ void sound_engine_set_audio_output(bool external_audio_output)
 
     else
     {
-        if(!(furi_hal_speaker_is_mine()))
+        if (!(furi_hal_speaker_is_mine()))
         {
             bool unu = furi_hal_speaker_acquire(1000);
             UNUSED(unu);

+ 1 - 0
flizzer_tracker_hal.h

@@ -24,6 +24,7 @@
 void sound_engine_dma_isr(void *ctx);
 void tracker_engine_timer_isr(void *ctx);
 void sound_engine_init_hardware(uint32_t sample_rate, bool external_audio_output, uint16_t *audio_buffer, uint32_t audio_buffer_size);
+void sound_engine_dma_init(uint32_t address, uint32_t size);
 void sound_engine_PWM_timer_init(bool external_audio_output);
 void sound_engine_set_audio_output(bool external_audio_output);
 void tracker_engine_init_hardware(uint8_t rate);

+ 5 - 5
init_deinit.c

@@ -25,13 +25,13 @@ void tracker_view_free(TrackerView *tracker_view)
     free(tracker_view);
 }
 
-uint8_t my_value_index_bool(const bool value, const bool values[], uint8_t values_count) //why the fuck it gives unresolved symbol if I include it from toolbox???!!!
+uint8_t my_value_index_bool(const bool value, const bool values[], uint8_t values_count) // why the fuck it gives unresolved symbol if I include it from toolbox???!!!
 {
     uint8_t index = 0;
 
-    for(uint8_t i = 0; i < values_count; i++)
+    for (uint8_t i = 0; i < values_count; i++)
     {
-        if(value == values[i])
+        if (value == values[i])
         {
             index = i;
             break;
@@ -94,10 +94,10 @@ FlizzerTrackerApp *init_tracker(uint32_t sample_rate, uint8_t rate, bool externa
     load_config(tracker);
 
     tracker->settings_list = variable_item_list_alloc();
-    View* view = variable_item_list_get_view(tracker->settings_list);
+    View *view = variable_item_list_get_view(tracker->settings_list);
     view_set_previous_callback(view, submenu_settings_exit_callback);
 
-    VariableItem* item;
+    VariableItem *item;
     uint8_t value_index;
 
     item = variable_item_list_add(tracker->settings_list, "Audio output", AUDIO_MODES_COUNT, audio_output_changed_callback, tracker);

+ 1 - 1
init_deinit.h

@@ -4,7 +4,7 @@
 #include "flizzer_tracker_hal.h"
 
 extern bool audio_modes_values[];
-extern char* audio_modes_text[];
+extern char *audio_modes_text[];
 
 FlizzerTrackerApp *init_tracker(uint32_t sample_rate, uint8_t rate, bool external_audio_output, uint32_t audio_buffer_size);
 void deinit_tracker(FlizzerTrackerApp *tracker);

+ 2 - 2
input/songinfo.c

@@ -20,7 +20,7 @@ void edit_songinfo_param(FlizzerTrackerApp *tracker, uint8_t selected_param, int
                 new_length += delta;
                 change_pattern_length(&tracker->song, new_length);
 
-                if(tracker->tracker_engine.pattern_position >= new_length)
+                if (tracker->tracker_engine.pattern_position >= new_length)
                 {
                     tracker->tracker_engine.pattern_position = new_length - 1;
                 }
@@ -35,7 +35,7 @@ void edit_songinfo_param(FlizzerTrackerApp *tracker, uint8_t selected_param, int
             {
                 tracker->song.num_sequence_steps += delta;
 
-                if(tracker->tracker_engine.sequence_position >= tracker->song.num_sequence_steps)
+                if (tracker->tracker_engine.sequence_position >= tracker->song.num_sequence_steps)
                 {
                     tracker->tracker_engine.sequence_position = tracker->song.num_sequence_steps - 1;
                 }

+ 7 - 7
input_event.c

@@ -108,13 +108,13 @@ void overwrite_file_widget_no_input_callback(GuiButtonType result, InputType typ
     }
 }
 
-uint32_t submenu_settings_exit_callback(void* context)
+uint32_t submenu_settings_exit_callback(void *context)
 {
     UNUSED(context);
     return VIEW_SUBMENU_PATTERN;
 }
 
-uint32_t submenu_exit_callback(void* context)
+uint32_t submenu_exit_callback(void *context)
 {
     UNUSED(context);
     return VIEW_TRACKER;
@@ -201,20 +201,20 @@ void submenu_callback(void *context, uint32_t index)
     }
 }
 
-void audio_output_changed_callback(VariableItem* item)
+void audio_output_changed_callback(VariableItem *item)
 {
-    FlizzerTrackerApp* tracker = (FlizzerTrackerApp*)variable_item_get_context(item);
+    FlizzerTrackerApp *tracker = (FlizzerTrackerApp *)variable_item_get_context(item);
     uint8_t index = variable_item_get_current_value_index(item);
     variable_item_set_current_value_text(item, audio_modes_text[(index > 1 ? 1 : index)]);
 
-    if(tracker)
+    if (tracker)
     {
         tracker->external_audio = (bool)index;
 
         tracker->external_audio = audio_modes_values[(index > 1 ? 1 : index)];
 
-        //sound_engine_init(&tracker->sound_engine, tracker->sound_engine.sample_rate, tracker->external_audio, tracker->sound_engine.audio_buffer_size);
-        //sound_engine_init_hardware(tracker->sound_engine.sample_rate, tracker->external_audio, tracker->sound_engine.audio_buffer, tracker->sound_engine.audio_buffer_size);
+        // sound_engine_init(&tracker->sound_engine, tracker->sound_engine.sample_rate, tracker->external_audio, tracker->sound_engine.audio_buffer_size);
+        // sound_engine_init_hardware(tracker->sound_engine.sample_rate, tracker->external_audio, tracker->sound_engine.audio_buffer, tracker->sound_engine.audio_buffer_size);
 
         FlizzerTrackerEvent event = {.type = EventTypeSetAudioMode, .input = {0}, .period = 0};
         furi_message_queue_put(tracker->event_queue, &event, FuriWaitForever);

+ 4 - 4
input_event.h

@@ -16,15 +16,15 @@
 #include "input/songinfo.h"
 
 extern bool audio_modes_values[];
-extern char* audio_modes_text[];
+extern char *audio_modes_text[];
 
 void return_from_keyboard_callback(void *ctx);
 
 void overwrite_file_widget_yes_input_callback(GuiButtonType result, InputType type, void *ctx);
 void overwrite_file_widget_no_input_callback(GuiButtonType result, InputType type, void *ctx);
 
-uint32_t submenu_exit_callback(void* context);
-uint32_t submenu_settings_exit_callback(void* context);
+uint32_t submenu_exit_callback(void *context);
+uint32_t submenu_settings_exit_callback(void *context);
 void submenu_callback(void *context, uint32_t index);
-void audio_output_changed_callback(VariableItem* item);
+void audio_output_changed_callback(VariableItem *item);
 void process_input_event(FlizzerTrackerApp *tracker, FlizzerTrackerEvent *event);

+ 1 - 1
sound_engine/sound_engine.c

@@ -46,7 +46,7 @@ void sound_engine_deinit(SoundEngine *sound_engine)
 
     if (!(sound_engine->external_audio_output))
     {
-        if(furi_hal_speaker_is_mine())
+        if (furi_hal_speaker_is_mine())
         {
             furi_hal_speaker_release();
         }

+ 98 - 0
tracker_engine/do_effects.c

@@ -2,6 +2,7 @@
 #include <furi.h>
 
 #include "../sound_engine/sound_engine_filter.h"
+#include "tracker_engine.h"
 
 void do_command(uint16_t opcode, TrackerEngine *tracker_engine, uint8_t channel, uint8_t tick, bool from_program)
 {
@@ -191,6 +192,103 @@ void do_command(uint16_t opcode, TrackerEngine *tracker_engine, uint8_t channel,
             break;
         }
 
+        case TE_EFFECT_EXT:
+        {
+            switch (opcode & 0x7ff0)
+            {
+                case TE_EFFECT_EXT_PORTA_DN:
+                {
+                    if (tick == 0)
+                    {
+                        int32_t prev = te_channel->note;
+
+                        te_channel->note -= opcode & 0xf;
+                        if (prev < te_channel->note)
+                            te_channel->note = 0;
+
+                        te_channel->target_note = te_channel->note;
+                    }
+
+                    break;
+                }
+
+                case TE_EFFECT_EXT_PORTA_UP:
+                {
+                    if (tick == 0)
+                    {
+                        uint32_t prev = te_channel->note;
+
+                        te_channel->note += opcode & 0xf;
+                        if (prev > te_channel->note)
+                            te_channel->note = 0xffff;
+
+                        te_channel->target_note = te_channel->note;
+                    }
+
+                    break;
+                }
+
+                case TE_EFFECT_EXT_RETRIGGER:
+                {
+                    if ((opcode & 0xf) > 0 && (tick % (opcode & 0xf)) == 0)
+                    {
+                        uint8_t prev_vol_tr = te_channel->volume;
+                        uint8_t prev_vol_cyd = se_channel->adsr.volume;
+                        tracker_engine_trigger_instrument_internal(tracker_engine, channel, te_channel->instrument, te_channel->last_note);
+                        te_channel->volume = prev_vol_tr;
+                        se_channel->adsr.volume = prev_vol_cyd;
+                    }
+
+                    break;
+                }
+
+                case TE_EFFECT_EXT_FINE_VOLUME_DOWN:
+                {
+                    if (tick == 0)
+                    {
+                        te_channel->volume -= opcode & 0xf;
+
+                        if (te_channel->volume > MAX_ADSR_VOLUME)
+                            te_channel->volume = 0;
+
+                        se_channel->adsr.volume = (int32_t)se_channel->adsr.volume * (int32_t)te_channel->volume / MAX_ADSR_VOLUME * (int32_t)te_channel->instrument->adsr.volume / MAX_ADSR_VOLUME;
+                        se_channel->adsr.volume = (int32_t)se_channel->adsr.volume * (int32_t)tracker_engine->master_volume / MAX_ADSR_VOLUME;
+                    }
+
+                    break;
+                }
+
+                case TE_EFFECT_EXT_FINE_VOLUME_UP:
+                {
+                    if (tick == 0)
+                    {
+                        te_channel->volume += opcode & 0xf;
+
+                        if (te_channel->volume > MAX_ADSR_VOLUME)
+                            te_channel->volume = MAX_ADSR_VOLUME;
+
+                        se_channel->adsr.volume = (int32_t)se_channel->adsr.volume * (int32_t)te_channel->volume / MAX_ADSR_VOLUME * (int32_t)te_channel->instrument->adsr.volume / MAX_ADSR_VOLUME;
+                        se_channel->adsr.volume = (int32_t)se_channel->adsr.volume * (int32_t)tracker_engine->master_volume / MAX_ADSR_VOLUME;
+                    }
+
+                    break;
+                }
+
+                case TE_EFFECT_EXT_NOTE_CUT:
+                {
+                    if ((opcode & 0xf) <= tick)
+                    {
+                        se_channel->adsr.volume = 0;
+                        te_channel->volume = 0;
+                    }
+
+                    break;
+                }
+            }
+
+            break;
+        }
+
         case TE_EFFECT_SET_SPEED_PROG_PERIOD:
         {
             if (tick == 0)

+ 6 - 0
tracker_engine/tracker_engine_defs.h

@@ -66,6 +66,12 @@ typedef enum
     TE_EFFECT_SKIP_PATTERN = 0x0d00,
     TE_EFFECT_EXT = 0x0e00,
     /* TODO: add 0exy effects here */
+    TE_EFFECT_EXT_PORTA_UP = 0x0e10,
+    TE_EFFECT_EXT_PORTA_DN = 0x0e20,
+    TE_EFFECT_EXT_RETRIGGER = 0x0e90,
+    TE_EFFECT_EXT_FINE_VOLUME_DOWN = 0x0ea0,
+    TE_EFFECT_EXT_FINE_VOLUME_UP = 0x0eb0,
+    TE_EFFECT_EXT_NOTE_CUT = 0x0ec0,
     TE_EFFECT_EXT_NOTE_DELAY = 0x0ed0,
     TE_EFFECT_SET_SPEED_PROG_PERIOD = 0x0f00,
     /* These effects work only in instrument program */

+ 2 - 0
util.c

@@ -12,6 +12,8 @@ void play_song(FlizzerTrackerApp *tracker, bool from_cursor)
 {
     reset_buffer(&tracker->sound_engine);
 
+    sound_engine_dma_init((uint32_t)tracker->sound_engine.audio_buffer, tracker->sound_engine.audio_buffer_size);
+
     tracker->tracker_engine.playing = true;
     tracker->was_editing = tracker->editing;
     tracker->editing = false;

+ 8 - 0
view/opcode_description.c

@@ -19,7 +19,15 @@ static const OpcodeDescription opcode_desc[] =
         {TE_EFFECT_SET_WAVEFORM, 0x7f00, "SET WAVEFORM", "S.WAVE"},
         {TE_EFFECT_SET_VOLUME, 0x7f00, "SET VOLUME", "VOLUME"},
         {TE_EFFECT_SKIP_PATTERN, 0x7f00, "SKIP PATTERN", "P.SKIP"},
+
+        {TE_EFFECT_EXT_PORTA_UP, 0x7ff0, "FINE PORTAMENTO UP", "PUP F."},
+        {TE_EFFECT_EXT_PORTA_DN, 0x7ff0, "FINE PORTAMENTO DOWN", "PDN F."},
+        {TE_EFFECT_EXT_RETRIGGER, 0x7ff0, "RETRIGGER AT TICK X (X>0)", "RETRIG"},
+        {TE_EFFECT_EXT_FINE_VOLUME_DOWN, 0x7ff0, "FINE VOLUME DOWN", "VDN F."},
+        {TE_EFFECT_EXT_FINE_VOLUME_UP, 0x7ff0, "FINE VOLUME UP", "VUP F."},
+        {TE_EFFECT_EXT_NOTE_CUT, 0x7ff0, "NOTE CUT", "N.CUT"},
         {TE_EFFECT_EXT_NOTE_DELAY, 0x7ff0, "NOTE DELAY", "N.DEL."},
+
         {TE_EFFECT_SET_SPEED_PROG_PERIOD, 0x7f00, "SET SPEED (PROG.PER.IN PROGRAM)", "P.PER."},
         {TE_PROGRAM_LOOP_BEGIN, 0x7f00, "PROGRAM LOOP BEGIN", "L.BEG."},
         {TE_PROGRAM_LOOP_END, 0x7f00, "PROGRAM LOOP END", "L.END"},