@@ -423,6 +423,7 @@ static uint8_t usb_valeton_gp5_process_single_sysex(const uint8_t* buffer, uint3
423423static void usb_valeton_gp5_request_ir (void );
424424static void usb_valeton_gp5_request_nams (void );
425425static void usb_valeton_gp5_request_globals (void );
426+ static void usb_valeton_gp5_save_preset (uint16_t preset_index , char * preset_name );
426427
427428/****************************************************************************
428429* NAME:
@@ -1593,6 +1594,48 @@ static void usb_valeton_gp5_set_effect_block_state(uint8_t block_index, uint8_t
15931594 usb_valeton_gp5_send_sysex ((const uint8_t * )midi_tx , sizeof (midi_tx ), 0x01 );
15941595}
15951596
1597+ /****************************************************************************
1598+ * NAME:
1599+ * DESCRIPTION:
1600+ * PARAMETERS:
1601+ * RETURN:
1602+ * NOTES:
1603+ *****************************************************************************/
1604+ static void usb_valeton_gp5_save_preset (uint16_t preset_index , char * preset_name )
1605+ {
1606+ uint8_t midi_tx [] = {0x04 , 0x0A , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
1607+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 };
1608+ uint8_t preset_name_length ;
1609+ uint8_t buffer_index ;
1610+
1611+ // set preset index
1612+ midi_tx [2 ] = (uint8_t )(preset_index / 16 );
1613+ midi_tx [3 ] = (uint8_t )(preset_index % 16 );
1614+
1615+ // set preset name
1616+ preset_name_length = strlen (preset_name );
1617+ if (preset_name_length > 10 )
1618+ {
1619+ preset_name_length = 10 ;
1620+ }
1621+
1622+ // name starts at offset 10, and is 10 characters/20 bytes long
1623+ buffer_index = 10 ;
1624+ for (uint32_t character = 0 ; character < preset_name_length ; character ++ )
1625+ {
1626+ // break character into 2 x 4 bit nibbles e.g. 47 becomes 04 07
1627+ midi_tx [buffer_index ++ ] = (preset_name [character ] >> 4 ) & 0x0F ;
1628+ midi_tx [buffer_index ++ ] = preset_name [character ] & 0x0F ;
1629+ }
1630+
1631+ ESP_LOGI (TAG , "Save Preset" );
1632+
1633+ // debug
1634+ //ESP_LOG_BUFFER_HEXDUMP(TAG, midi_tx, sizeof(midi_tx), ESP_LOG_INFO);
1635+
1636+ usb_valeton_gp5_send_sysex ((const uint8_t * )midi_tx , sizeof (midi_tx ), 0x01 );
1637+ }
1638+
15961639/****************************************************************************
15971640* NAME:
15981641* DESCRIPTION:
@@ -2148,6 +2191,14 @@ void usb_valeton_gp5_handle(class_driver_t* driver_obj)
21482191 ESP_LOGW (TAG , "Attempt to modify unknown param %d" , (int )message .Payload );
21492192 }
21502193 } break ;
2194+
2195+ case USB_COMMAND_SAVE_PRESET :
2196+ {
2197+ char preset_name [MAX_PRESET_NAME_LENGTH ];
2198+ control_get_current_preset_name (preset_name );
2199+
2200+ usb_valeton_gp5_save_preset (control_get_current_preset_index (), preset_name );
2201+ } break ;
21512202 }
21522203 }
21532204 } break ;
@@ -2280,6 +2331,27 @@ void usb_valeton_gp5_init(class_driver_t* driver_obj, QueueHandle_t comms_queue)
22802331*****************************************************************************/
22812332void usb_valeton_gp5_deinit (void )
22822333{
2283- //to do here: need to clean up properly if pedal disconnected
2284- //cdc_acm_host_close();
2334+ midi_host_close (midi_dev );
2335+ vTaskDelay (200 );
2336+ midi_dev = NULL ;
2337+ midi_host_uninstall ();
2338+
2339+ // free mem
2340+ free ((void * )InputBuffers );
2341+ InputBuffers = NULL ;
2342+
2343+ free ((void * )ProcessingBuffer );
2344+ ProcessingBuffer = NULL ;
2345+
2346+ free ((void * )TransmitBuffer );
2347+ TransmitBuffer = NULL ;
2348+
2349+ free ((void * )TxBuffer );
2350+ TxBuffer = NULL ;
2351+
2352+ free ((void * )ValetonGP5Data );
2353+ ValetonGP5Data = NULL ;
2354+
2355+ // preallocate big memory again, ready for freeing on reconnect
2356+ tonex_common_preallocate_memory ();
22852357}
0 commit comments