Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,3 @@ ui_design_480x320land/cache
ui_design_480x320land/autosave



2 changes: 2 additions & 0 deletions MidiCommands.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,6 @@ This project uses a low-cost embedded controller (Espressif ESP32-S3) to form a
| Cab Sim Bypass | 117 | On: 127, Off: 0 |
| Global Tempo Source | 118 | Global: 127, Local: 0 |
| Global Tuning Reference | 119 | 0-127 |
| Load Preset to Slot A | 120 | 0-19 |
| Load Preset to Slot B | 121 | 0-19 |
| Select Preset | 127 | 0-19 |
30 changes: 24 additions & 6 deletions source/main/midi_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -1229,16 +1229,34 @@ esp_err_t midi_helper_adjust_param_via_midi(uint8_t change_num, uint8_t midi_val

case 120:
{
// reserved for setting preset in slot A
ESP_LOGW(TAG, "CC Not implemented yet %d", change_num);
return ESP_FAIL;
// Load preset to Slot A without switching to it
if (midi_value >= (usb_get_max_presets_for_connected_modeller()))
{
ESP_LOGW(TAG, "Unsupported Midi CC 120 value %d (max %d)", midi_value, usb_get_max_presets_for_connected_modeller() - 1);
}
else
{
usb_load_preset_to_slot_a(midi_value);
}

// no param change needed
return ESP_OK;
} break;

case 121:
{
// reserved for setting preset in slot B
ESP_LOGW(TAG, "CC Not implemented yet %d", change_num);
return ESP_FAIL;
// Load preset to Slot B without switching to it
if (midi_value >= (usb_get_max_presets_for_connected_modeller()))
{
ESP_LOGW(TAG, "Unsupported Midi CC 121 value %d (max %d)", midi_value, usb_get_max_presets_for_connected_modeller() - 1);
}
else
{
usb_load_preset_to_slot_b(midi_value);
}

// no param change needed
return ESP_OK;
} break;

case 122:
Expand Down
56 changes: 56 additions & 0 deletions source/main/usb_comms.c
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,62 @@ void usb_modify_parameter(uint16_t index, float value)
}
}

/****************************************************************************
* NAME:
* DESCRIPTION:
* PARAMETERS:
* RETURN:
* NOTES:
*****************************************************************************/
void usb_load_preset_to_slot_a(uint32_t preset)
{
tUSBMessage message;

if (usb_input_queue == NULL)
{
ESP_LOGE(TAG, "usb_load_preset_to_slot_a queue null");
}
else
{
message.Command = USB_COMMAND_LOAD_PRESET_TO_SLOT_A;
message.Payload = preset;

// send to queue
if (xQueueSend(usb_input_queue, (void*)&message, 0) != pdPASS)
{
ESP_LOGE(TAG, "usb_load_preset_to_slot_a queue send failed!");
}
}
}

/****************************************************************************
* NAME:
* DESCRIPTION:
* PARAMETERS:
* RETURN:
* NOTES:
*****************************************************************************/
void usb_load_preset_to_slot_b(uint32_t preset)
{
tUSBMessage message;

if (usb_input_queue == NULL)
{
ESP_LOGE(TAG, "usb_load_preset_to_slot_b queue null");
}
else
{
message.Command = USB_COMMAND_LOAD_PRESET_TO_SLOT_B;
message.Payload = preset;

// send to queue
if (xQueueSend(usb_input_queue, (void*)&message, 0) != pdPASS)
{
ESP_LOGE(TAG, "usb_load_preset_to_slot_b queue send failed!");
}
}
}

/****************************************************************************
* NAME:
* DESCRIPTION:
Expand Down
6 changes: 5 additions & 1 deletion source/main/usb_comms.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ enum AmpModellers
enum USB_Commands
{
USB_COMMAND_SET_PRESET,
USB_COMMAND_MODIFY_PARAMETER
USB_COMMAND_MODIFY_PARAMETER,
USB_COMMAND_LOAD_PRESET_TO_SLOT_A,
USB_COMMAND_LOAD_PRESET_TO_SLOT_B
};

typedef struct
Expand All @@ -61,6 +63,8 @@ void init_usb_comms(void);
// thread safe public API
void usb_set_preset(uint32_t preset);
void usb_modify_parameter(uint16_t index, float value);
void usb_load_preset_to_slot_a(uint32_t preset);
void usb_load_preset_to_slot_b(uint32_t preset);
uint8_t usb_get_max_presets_for_connected_modeller(void);
uint8_t usb_get_first_preset_index_for_connected_modeller(void);

Expand Down
33 changes: 33 additions & 0 deletions source/main/usb_tonex_one.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,7 @@ static esp_err_t __attribute__((unused)) usb_tonex_one_set_active_slot(Slot newS
return tonex_common_transmit(cdc_dev, FramedBuffer, framed_length, TONEX_USB_TX_BUFFER_SIZE);
}


/****************************************************************************
* NAME:
* DESCRIPTION:
Expand Down Expand Up @@ -1316,6 +1317,38 @@ void usb_tonex_one_handle(class_driver_t* driver_obj)
// failed return to queue?
}
}
} break;

case USB_COMMAND_LOAD_PRESET_TO_SLOT_A:
{
if (message.Payload < MAX_PRESETS_TONEX_ONE)
{
ESP_LOGI(TAG, "Loading preset %d to Slot A via MIDI CC 120", (int)message.Payload);
if (usb_tonex_one_set_preset_in_slot(message.Payload, A, 0) != ESP_OK)
{
ESP_LOGE(TAG, "Failed to load preset %d to Slot A", (int)message.Payload);
}
}
else
{
ESP_LOGW(TAG, "Invalid preset index %d for Slot A (max %d)", (int)message.Payload, MAX_PRESETS_TONEX_ONE - 1);
}
} break;

case USB_COMMAND_LOAD_PRESET_TO_SLOT_B:
{
if (message.Payload < MAX_PRESETS_TONEX_ONE)
{
ESP_LOGI(TAG, "Loading preset %d to Slot B via MIDI CC 121", (int)message.Payload);
if (usb_tonex_one_set_preset_in_slot(message.Payload, B, 0) != ESP_OK)
{
ESP_LOGE(TAG, "Failed to load preset %d to Slot B", (int)message.Payload);
}
}
else
{
ESP_LOGW(TAG, "Invalid preset index %d for Slot B (max %d)", (int)message.Payload, MAX_PRESETS_TONEX_ONE - 1);
}
} break;

case USB_COMMAND_MODIFY_PARAMETER:
Expand Down
4 changes: 4 additions & 0 deletions source/main/usb_tonex_one.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ void usb_tonex_one_init(class_driver_t* driver_obj, QueueHandle_t comms_queue);
void usb_tonex_one_deinit(void);
void usb_tonex_one_preallocate_memory(void);

// MIDI CC slot targeting functions
esp_err_t usb_tonex_one_load_preset_to_slot_a(uint16_t preset);
esp_err_t usb_tonex_one_load_preset_to_slot_b(uint16_t preset);

#ifdef __cplusplus
} /*extern "C"*/
#endif
Expand Down