Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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 |
32 changes: 25 additions & 7 deletions source/main/midi_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -1229,19 +1229,37 @@ 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_tonex_one_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_tonex_one_load_preset_to_slot_b(midi_value);
}

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

case 127:
case 127:
{
// Custom case: use CC to change params.
if (midi_value >= (usb_get_max_presets_for_connected_modeller()))
Expand Down
38 changes: 38 additions & 0 deletions source/main/usb_tonex_one.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,44 @@ 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: usb_tonex_one_load_preset_to_slot_a
* DESCRIPTION: Load a preset to Slot A without switching to it (MIDI CC 120)
* PARAMETERS: preset - Preset index (0-19 for presets 1-20)
* RETURN: ESP_OK on success, ESP_FAIL on error
* NOTES: Bypasses CONFIG_ITEM_SAVE_PRESET_TO_SLOT configuration
*****************************************************************************/
esp_err_t usb_tonex_one_load_preset_to_slot_a(uint16_t preset)
{
if (preset >= MAX_PRESETS_TONEX_ONE)
{
ESP_LOGW(TAG, "Invalid preset index %d for Slot A (max %d)", preset, MAX_PRESETS_TONEX_ONE - 1);
return ESP_FAIL;
}

ESP_LOGI(TAG, "Loading preset %d to Slot A via MIDI CC 120", preset);
return usb_tonex_one_set_preset_in_slot(preset, A, 0);
}

/****************************************************************************
* NAME: usb_tonex_one_load_preset_to_slot_b
* DESCRIPTION: Load a preset to Slot B without switching to it (MIDI CC 121)
* PARAMETERS: preset - Preset index (0-19 for presets 1-20)
* RETURN: ESP_OK on success, ESP_FAIL on error
* NOTES: Bypasses CONFIG_ITEM_SAVE_PRESET_TO_SLOT configuration
*****************************************************************************/
esp_err_t usb_tonex_one_load_preset_to_slot_b(uint16_t preset)
{
if (preset >= MAX_PRESETS_TONEX_ONE)
{
ESP_LOGW(TAG, "Invalid preset index %d for Slot B (max %d)", preset, MAX_PRESETS_TONEX_ONE - 1);
return ESP_FAIL;
}

ESP_LOGI(TAG, "Loading preset %d to Slot B via MIDI CC 121", preset);
return usb_tonex_one_set_preset_in_slot(preset, B, 0);
}

/****************************************************************************
* NAME:
* DESCRIPTION:
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