diff --git a/README.md b/README.md index 03dfb97..16898c5 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,13 @@ The project has been tested on the ESP32 Audio Kit V2.2 Useful documents: ESP32 Audio Kit docu: http://myosuploads3.banggood.com/products/20210306/20210306011116instruction.pdf + +--- +The latest update has been tested on the ESP32 Audio Kit V2.2 with an ES8388 audio codec. +You can use it stand-alone when applied the analog button mod (https://youtu.be/r0af0DB1R68) +Default configuration: +- Key1: set length +- Key2: toggle click +- Key3 - Key6: toggle rec mode + +I recommend using Tera Term or another VT100 compatible tool to see whats going on inside of the application \ No newline at end of file diff --git a/blink.ino b/blink.ino index 9c6436f..d2818c5 100644 --- a/blink.ino +++ b/blink.ino @@ -1,6 +1,4 @@ /* - * The GNU GENERAL PUBLIC LICENSE (GNU GPLv3) - * * Copyright (c) 2021 Marcel Licence * * This program is free software: you can redistribute it and/or modify diff --git a/click_module.ino b/click_module.ino index 72cd25b..ec7cebd 100644 --- a/click_module.ino +++ b/click_module.ino @@ -1,6 +1,4 @@ /* - * The GNU GENERAL PUBLIC LICENSE (GNU GPLv3) - * * Copyright (c) 2021 Marcel Licence * * This program is free software: you can redistribute it and/or modify @@ -38,16 +36,16 @@ * Author: Marcel Licence */ -#define SEQ_TRACK_CNT 12 -#define SEQ_STEPS 16 +#define SEQ_TRACK_CNT 12 +#define SEQ_STEPS 16 /* * 1: only 4th notes * 2: for 8th notes */ -#define SEQ_SUBSTEP_MUL 2 +#define SEQ_SUBSTEP_MUL 2 -#define DEFAULT_BPM 140 +#define DEFAULT_BPM 140 uint32_t seq_prescaler = 60.0f * 44100.0f / (2.0f * SEQ_SUBSTEP_MUL * (float)DEFAULT_BPM); uint32_t seq_prescaler_next = 0; diff --git a/config.h b/config.h index 8a4b998..ce027ad 100644 --- a/config.h +++ b/config.h @@ -51,17 +51,21 @@ #include #endif +#define MIDI_RECV_FROM_SERIAL +#define AUDIO_KIT_BUTTON_ANALOG + /* * include the board configuration * there you will find the most hardware depending pin settings */ -#define BOARD_ESP32_AUDIO_KIT_AC101 +#define BOARD_ESP32_AUDIO_KIT_ES8388 #include /* requires https://github.com/marcel-licence/ML_SynthTools */ /* our samplerate */ #define SAMPLE_RATE 44100 + /* on board led */ #define LED_PIN 19 diff --git a/esp32_multitrack_looper.ino b/esp32_multitrack_looper.ino index e8afa7b..c68081a 100644 --- a/esp32_multitrack_looper.ino +++ b/esp32_multitrack_looper.ino @@ -100,6 +100,7 @@ void setup() #ifdef ESP32_AUDIO_KIT #ifdef ES8388_ENABLED ES8388_Setup(); + ES8388_SetIn2OoutVOL(0, 0); #else ac101_setup(); /* using mic as default source */ @@ -176,6 +177,7 @@ inline void Core0TaskLoop() { Status_Process(); + button_loop(); } void Core0Task(void *parameter) @@ -368,7 +370,6 @@ inline void audio_task() */ void loop_1Hz(void) { - button_loop(); #ifdef BLINK_LED_PIN Blink_Process(); #endif @@ -402,3 +403,31 @@ void loop() midi_pre_scaler = 0; } } + +void App_ButtonCb(uint8_t key, uint8_t down) +{ + if (down > 0) + { + switch (key) + { + case 0: + Loop_SetLength(0, 1); + break; + case 1: + Click_ToggleOnOff(0, 1); + break; + case 2: + Loop_SelectTrack(0, 1); + break; + case 3: + Loop_SelectTrack(1, 1); + break; + case 4: + Loop_SelectTrack(2, 1); + break; + case 5: + Loop_SelectTrack(3, 1); + break; + } + } +} diff --git a/i2s_interface.ino b/i2s_interface.ino index 7c589b4..b6fa236 100644 --- a/i2s_interface.ino +++ b/i2s_interface.ino @@ -1,77 +1,46 @@ /* - * The GNU GENERAL PUBLIC LICENSE (GNU GPLv3) - * * Copyright (c) 2021 Marcel Licence - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * Dieses Programm ist Freie Software: Sie können es unter den Bedingungen - * der GNU General Public License, wie von der Free Software Foundation, - * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren - * veröffentlichten Version, weiter verteilen und/oder modifizieren. - * - * Dieses Programm wird in der Hoffnung bereitgestellt, dass es nützlich sein wird, jedoch - * OHNE JEDE GEWÄHR,; sogar ohne die implizite - * Gewähr der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. - * Siehe die GNU General Public License für weitere Einzelheiten. - * - * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem - * Programm erhalten haben. Wenn nicht, siehe . */ -/* - * this file includes all required function to setup and drive the i2s interface +/** + * @file i2s_interface.ino + * @author Marcel Licence + * @date 13.10.2021 * - * Author: Marcel Licence + * @brief this file includes all required function to setup and drive the i2s interface */ + +#ifdef __CDT_PARSER__ +#include +#endif + + #include - /* * no dac not tested within this code * - it has the purpose to generate a quasy analog signal without a DAC */ //#define I2S_NODAC + +const i2s_port_t i2s_port_number = I2S_NUM_0; + /* - * Define and connect your PINS to DAC here + * please refer to https://www.hackster.io/janost/audio-hacking-on-the-esp8266-fa9464#toc-a-simple-909-drum-synth-0 + * for the following implementation */ -#if 0 -#define I2S_BCLK_PIN 25 -#define I2S_WCLK_PIN 27 +#ifdef I2S_NODAC -#define I2S_DOUT_PIN 26 +bool writeDAC(float DAC_f); +bool i2s_write_sample(uint32_t sample); -#else - -#endif - -const i2s_port_t i2s_num = I2S_NUM_0; // i2s port number - - - -bool i2s_write_sample_32ch2(uint8_t *sample); - -bool i2s_write_sample_32ch2(uint8_t *sample) +bool i2s_write_sample(uint32_t sample) { static size_t bytes_written = 0; - static size_t bytes_read = 0; - i2s_read(i2s_num, (char *)sample, 8, &bytes_read, portMAX_DELAY); - - i2s_write(i2s_num, (const char *)sample, 8, &bytes_written, portMAX_DELAY); + i2s_write(i2s_port_number, (const char *)&sample, 4, &bytes_written, portMAX_DELAY); if (bytes_written > 0) { @@ -83,18 +52,38 @@ bool i2s_write_sample_32ch2(uint8_t *sample) } } -#ifdef SAMPLE_SIZE_24BIT +static uint32_t i2sACC; +static uint16_t err; -bool i2s_write_sample_24ch2(uint8_t *sample); - -bool i2s_write_sample_24ch2(uint8_t *sample) +bool writeDAC(float DAC_f) { - static size_t bytes_written1 = 0; - static size_t bytes_written2 = 0; - i2s_write((i2s_port_t)i2s_num, (const char *)&sample[1], 3, &bytes_written1, portMAX_DELAY); - i2s_write((i2s_port_t)i2s_num, (const char *)&sample[5], 3, &bytes_written2, portMAX_DELAY); + uint16_t DAC = 0x8000 + int16_t(DAC_f * 32767.0f); + for (uint8_t i = 0; i < 32; i++) + { + i2sACC = i2sACC << 1; + if (DAC >= err) + { + i2sACC |= 1; + err += 0xFFFF - DAC; + } + else + { + err -= DAC; + } + } + bool ret = i2s_write_sample(i2sACC); - if ((bytes_written1 + bytes_written2) > 0) + return ret; +} + +#else + +bool i2s_write_sample_32ch2(uint64_t sample) +{ + static size_t bytes_written = 0; + i2s_write((i2s_port_t)i2s_port_number, (const char *)&sample, 8, &bytes_written, portMAX_DELAY); + + if (bytes_written > 0) { return true; } @@ -104,11 +93,15 @@ bool i2s_write_sample_24ch2(uint8_t *sample) } } -#endif - bool i2s_write_stereo_samples(float *fl_sample, float *fr_sample) { - +#ifdef SAMPLE_SIZE_32BIT + static union sampleTUNT + { + uint64_t sample; + int32_t ch[2]; + } sampleDataU; +#endif #ifdef SAMPLE_SIZE_24BIT #if 0 static union sampleTUNT @@ -132,12 +125,26 @@ bool i2s_write_stereo_samples(float *fl_sample, float *fr_sample) } sampleDataU; #endif - sampleDataU.ch[0] = int16_t(*fl_sample * 16383.0f); - sampleDataU.ch[1] = int16_t(*fr_sample * 16383.0f); + /* + * using RIGHT_LEFT format + */ +#ifdef SAMPLE_SIZE_16BIT + sampleDataU.ch[0] = int16_t(*fr_sample * 16383.0f); /* some bits missing here */ + sampleDataU.ch[1] = int16_t(*fl_sample * 16383.0f); +#endif +#ifdef SAMPLE_SIZE_32BIT + sampleDataU.ch[0] = int32_t(*fr_sample * 1073741823.0f); /* some bits missing here */ + sampleDataU.ch[1] = int32_t(*fl_sample * 1073741823.0f); +#endif static size_t bytes_written = 0; - i2s_write(i2s_num, (const char *)&sampleDataU.sample, 4, &bytes_written, portMAX_DELAY); +#ifdef SAMPLE_SIZE_16BIT + i2s_write(i2s_port_number, (const char *)&sampleDataU.sample, 4, &bytes_written, portMAX_DELAY); +#endif +#ifdef SAMPLE_SIZE_32BIT + i2s_write(i2s_port_number, (const char *)&sampleDataU.sample, 8, &bytes_written, portMAX_DELAY); +#endif if (bytes_written > 0) { @@ -149,6 +156,85 @@ bool i2s_write_stereo_samples(float *fl_sample, float *fr_sample) } } +#ifdef SAMPLE_BUFFER_SIZE +bool i2s_write_stereo_samples_buff(float *fl_sample, float *fr_sample, const int buffLen) +{ +#ifdef SAMPLE_SIZE_32BIT + static union sampleTUNT + { + uint64_t sample; + int32_t ch[2]; + } sampleDataU[SAMPLE_BUFFER_SIZE]; +#endif +#ifdef SAMPLE_SIZE_24BIT +#if 0 + static union sampleTUNT + { + uint8_t sample[8]; + int32_t ch[2]; + } sampleDataU[SAMPLE_BUFFER_SIZE]; +#else + static union sampleTUNT + { + int32_t ch[2]; + uint8_t bytes[8]; + } sampleDataU[SAMPLE_BUFFER_SIZE]; +#endif +#endif +#ifdef SAMPLE_SIZE_16BIT + static union sampleTUNT + { + uint32_t sample; + int16_t ch[2]; + } sampleDataU[SAMPLE_BUFFER_SIZE]; +#endif + + for (int n = 0; n < buffLen; n++) + { +#ifdef ES8388_ENABLED + /* + * using LEFT_RIGHT format + */ +#ifdef SAMPLE_SIZE_16BIT + sampleDataU[n].ch[1] = int16_t(fr_sample[n] * 16383.0f); /* some bits missing here */ + sampleDataU[n].ch[0] = int16_t(fl_sample[n] * 16383.0f); +#endif +#ifdef SAMPLE_SIZE_32BIT + sampleDataU[n].ch[1] = int32_t(fr_sample[n] * 1073741823.0f); /* some bits missing here */ + sampleDataU[n].ch[0] = int32_t(fl_sample[n] * 1073741823.0f); +#endif +#else + /* + * using RIGHT_LEFT format + */ +#ifdef SAMPLE_SIZE_16BIT + sampleDataU[n].ch[0] = int16_t(fr_sample[n] * 16383.0f); /* some bits missing here */ + sampleDataU[n].ch[1] = int16_t(fl_sample[n] * 16383.0f); +#endif +#ifdef SAMPLE_SIZE_32BIT + sampleDataU[n].ch[0] = int32_t(fr_sample[n] * 1073741823.0f); /* some bits missing here */ + sampleDataU[n].ch[1] = int32_t(fl_sample[n] * 1073741823.0f); +#endif +#endif + } + + static size_t bytes_written = 0; + + calcCycleCountPre(); + i2s_write(i2s_port_number, (const char *)&sampleDataU[0].sample, 4 * buffLen, &bytes_written, portMAX_DELAY); + calcCycleCount(); + + if (bytes_written > 0) + { + return true; + } + else + { + return false; + } +} +#endif + void i2s_read_stereo_samples(float *fl_sample, float *fr_sample) { static size_t bytes_read = 0; @@ -160,78 +246,123 @@ void i2s_read_stereo_samples(float *fl_sample, float *fr_sample) } sampleData; - i2s_read(i2s_num, (char *)&sampleData.sample, 4, &bytes_read, portMAX_DELAY); + i2s_read(i2s_port_number, (char *)&sampleData.sample, 4, &bytes_read, portMAX_DELAY); //sampleData.ch[0] &= 0xFFFE; //sampleData.ch[1] &= 0; - *fl_sample = ((float)sampleData.ch[0] * (5.5f / 65535.0f)); - *fr_sample = ((float)sampleData.ch[1] * (5.5f / 65535.0f)); + /* + * using RIGHT_LEFT format + */ + *fr_sample = ((float)sampleData.ch[0] * (5.5f / 65535.0f)); + *fl_sample = ((float)sampleData.ch[1] * (5.5f / 65535.0f)); } +#ifdef SAMPLE_BUFFER_SIZE +void i2s_read_stereo_samples_buff(float *fl_sample, float *fr_sample, const int buffLen) +{ +#ifdef I2S_DIN_PIN + static size_t bytes_read = 0; + +#ifdef SAMPLE_SIZE_16BIT + static union + { + uint32_t sample; + int16_t ch[2]; + } sampleData[SAMPLE_BUFFER_SIZE]; +#endif + + i2s_read(i2s_port_number, (char *)&sampleData[0].sample, 4 * SAMPLE_BUFFER_SIZE, &bytes_read, portMAX_DELAY); + + //sampleData.ch[0] &= 0xFFFE; + //sampleData.ch[1] &= 0; + + for (int n = 0; n < SAMPLE_BUFFER_SIZE; n++) + { + /* + * using RIGHT_LEFT format + */ + //fr_sample[n] = ((float)sampleData[n].ch[0] * (5.5f / 65535.0f)); + //fl_sample[n] = ((float)sampleData[n].ch[1] * (5.5f / 65535.0f)); + fr_sample[n] = ((float)sampleData[n].ch[0] / (16383.0f)); + fl_sample[n] = ((float)sampleData[n].ch[1] / (16383.0f)); + } +#endif +} +#endif + +#endif + /* * i2s configuration */ - -#if 1 -i2s_config_t i2s_config = +i2s_config_t i2s_configuration = { +#ifdef I2S_DIN_PIN .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX), // | I2S_MODE_DAC_BUILT_IN +#else + .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX), +#endif .sample_rate = SAMPLE_RATE, +#ifdef I2S_NODAC + .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, + .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, + .communication_format = (i2s_comm_format_t)I2S_COMM_FORMAT_I2S_MSB, +#else +#ifdef SAMPLE_SIZE_32BIT + .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, /* the DAC module will only take the 8bits from MSB */ +#endif #ifdef SAMPLE_SIZE_24BIT .bits_per_sample = I2S_BITS_PER_SAMPLE_24BIT, /* the DAC module will only take the 8bits from MSB */ #endif #ifdef SAMPLE_SIZE_16BIT .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, /* the DAC module will only take the 8bits from MSB */ #endif - .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, - .communication_format = (i2s_comm_format_t)( I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB), - .intr_alloc_flags = 0, // default interrupt priority -#if 0 - .dma_buf_count = 2, - .dma_buf_len = 1024, -#else - .dma_buf_count = 8, - .dma_buf_len = 64, -#endif - .use_apll = 0 -}; -#else -i2s_config_t i2s_config = -{ - .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX ), - .sample_rate = SAMPLE_RATE, -#ifdef I2S_NODAC - .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, - .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, - .communication_format = (i2s_comm_format_t)I2S_COMM_FORMAT_I2S_MSB, -#else - .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB), #endif - .intr_alloc_flags = 0, + .intr_alloc_flags = 0, // default interrupt priority .dma_buf_count = 8, .dma_buf_len = 64, - .use_apll = 0 -}; +#ifdef I2S_USE_APLL + .use_apll = true, +#else + .use_apll = false, #endif + // .fixed_mclk = (44100 * 256), +}; +#ifdef I2S_NODAC i2s_pin_config_t pins = { - .bck_io_num = IIS_SCLK, - .ws_io_num = IIS_LCLK, - .data_out_num = IIS_DSIN, - .data_in_num = IIS_DSOUT + .bck_io_num = I2S_PIN_NO_CHANGE, + .ws_io_num = I2S_PIN_NO_CHANGE, + .data_out_num = I2S_NODAC_OUT_PIN, + .data_in_num = I2S_PIN_NO_CHANGE }; - - +#else +i2s_pin_config_t pins = +{ + .bck_io_num = I2S_BCLK_PIN, + .ws_io_num = I2S_WCLK_PIN, + .data_out_num = I2S_DOUT_PIN, +#ifdef I2S_DIN_PIN + .data_in_num = I2S_DIN_PIN +#else + .data_in_num = I2S_PIN_NO_CHANGE +#endif +}; +#endif void setup_i2s() { - i2s_driver_install(i2s_num, &i2s_config, 0, NULL); + i2s_driver_install(i2s_port_number, &i2s_configuration, 0, NULL); i2s_set_pin(I2S_NUM_0, &pins); - i2s_set_sample_rates(i2s_num, SAMPLE_RATE); - i2s_start(i2s_num); + i2s_set_sample_rates(i2s_port_number, SAMPLE_RATE); + i2s_start(i2s_port_number); +#ifdef ES8388_ENABLED + REG_WRITE(PIN_CTRL, 0xFFFFFFF0); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0_CLK_OUT1); +#endif } diff --git a/loop_module.ino b/loop_module.ino index a27c928..6c6fbac 100644 --- a/loop_module.ino +++ b/loop_module.ino @@ -1,6 +1,4 @@ /* - * The GNU GENERAL PUBLIC LICENSE (GNU GPLv3) - * * Copyright (c) 2021 Marcel Licence * * This program is free software: you can redistribute it and/or modify @@ -44,8 +42,8 @@ * all PSRAM memory will be used * if values are set to big the startup of the firmware will fail */ -#define MAX_LOOP 513246 -#define TRACK_CNT 4 +#define MAX_LOOP 513246 +#define TRACK_CNT 4 int16_t *loopLine[TRACK_CNT]; float loopGainOut[TRACK_CNT]; @@ -98,7 +96,7 @@ void Loop_init(void) Serial.printf("Total PSRAM: %d\n", ESP.getPsramSize()); Serial.printf("Free PSRAM: %d\n", ESP.getFreePsram()); - loopGainIn = 0.0f; + loopGainIn = 1.0f; loopInCh = 0; Serial.printf("Loop Max Length: %0.0f seconds\n", ((float)MAX_LOOP) / 44100.0f); @@ -113,7 +111,7 @@ float loopSpeed = 1.0f; uint32_t loopSubCnt = 0; -#define absf(a) (a>0)?a:(-a) +#define absf(a) (a>0)?a:(-a) /* * this function processes the input audio and mixes also the audio output to the signal @@ -122,8 +120,8 @@ void Loop_Process(float *signal_l, float *signal_r) { float tempL = 0.0f, tempR = 0.0f; - loopMeter[TRACK_CNT] = max(absf(*signal_l), loopMeter[TRACK_CNT] ); - loopMeter[TRACK_CNT] = max(absf(*signal_r), loopMeter[TRACK_CNT] ); + loopMeter[TRACK_CNT] = max(absf(*signal_l), loopMeter[TRACK_CNT]); + loopMeter[TRACK_CNT] = max(absf(*signal_r), loopMeter[TRACK_CNT]); loopSubCnt++; @@ -210,8 +208,8 @@ void Loop_Process(float *signal_l, float *signal_r) /* * get max value of left and right channel */ - loopMeter[TRACK_CNT + 1] = max(absf(*signal_l), loopMeter[TRACK_CNT + 1] ); - loopMeter[TRACK_CNT + 1] = max(absf(*signal_r), loopMeter[TRACK_CNT + 1] ); + loopMeter[TRACK_CNT + 1] = max(absf(*signal_l), loopMeter[TRACK_CNT + 1]); + loopMeter[TRACK_CNT + 1] = max(absf(*signal_r), loopMeter[TRACK_CNT + 1]); Loop_ProcessButton(); } diff --git a/simple_delay.ino b/simple_delay.ino index 6dd66d4..7f3855b 100644 --- a/simple_delay.ino +++ b/simple_delay.ino @@ -1,6 +1,4 @@ /* - * The GNU GENERAL PUBLIC LICENSE (GNU GPLv3) - * * Copyright (c) 2021 Marcel Licence * * This program is free software: you can redistribute it and/or modify @@ -43,7 +41,7 @@ /* max delay can be changed but changes also the memory consumption */ -#define MAX_DELAY 22050*2 +#define MAX_DELAY 22050*2 /* * module variables diff --git a/status_module.ino b/status_module.ino index 93d8e88..f1c4daf 100644 --- a/status_module.ino +++ b/status_module.ino @@ -1,6 +1,4 @@ /* - * The GNU GENERAL PUBLIC LICENSE (GNU GPLv3) - * * Copyright (c) 2021 Marcel Licence * * This program is free software: you can redistribute it and/or modify @@ -46,7 +44,7 @@ uint32_t loopMeterCount = 0; /*!< prescaler to reduce the serial output */ float *meter; /* pointer to vu meter information */ -#define VU_MAX 24 /*!< character length of vu meter */ +#define VU_MAX 24 /*!< character length of vu meter */ float statusVuLookup[VU_MAX]; /*!< precalculated lookup */ @@ -169,7 +167,7 @@ void Status_PrintAll(void) Serial.printf("--------------------------------\n"); for (int i = 0; i < 32; i++) { - if ( i == (int)(Loop_GetRelPos() * 32.0f)) + if (i == (int)(Loop_GetRelPos() * 32.0f)) { Serial.printf("O"); } @@ -189,7 +187,7 @@ void Status_PrintAll(void) Serial.printf("Click: <"); for (int i = 0; i < 16; i++) { - if ( i == (int)(Click_GetRelPos() * 32.0f)) + if (i == (int)(Click_GetRelPos() * 32.0f)) { Serial.printf("%d", (i % 4) + 1); } @@ -226,6 +224,7 @@ void Status_Process(void) void Status_ValueChangedFloat(const char *descr, float value) { status_cnt = 0; + memset(statusMsg, 0, sizeof(statusMsg)); sprintf(statusMsg, "%s: %0.2f", descr, value); } @@ -235,6 +234,7 @@ void Status_ValueChangedFloat(const char *descr, float value) void Status_ValueChangedInt(const char *descr, int value) { status_cnt = 0; + memset(statusMsg, 0, sizeof(statusMsg)); sprintf(statusMsg, "%s: %d", descr, value); } @@ -244,5 +244,6 @@ void Status_ValueChangedInt(const char *descr, int value) void Status_TestMsg(const char *text) { status_cnt = 0; + memset(statusMsg, 0, sizeof(statusMsg)); sprintf(statusMsg, "%s", text); } diff --git a/z_config.ino b/z_config.ino index 27d639d..0d3a352 100644 --- a/z_config.ino +++ b/z_config.ino @@ -39,6 +39,10 @@ * Author: Marcel Licence */ +#ifdef AUDIO_KIT_BUTTON_ANALOG +audioKitButtonCb audioKitButtonCallback = App_ButtonCb; +#endif + /* * this mapping is used for the edirol pcr-800 * this should be changed when using another controller @@ -109,11 +113,7 @@ struct midiControllerMapping edirolMapping[] = { 0x0, 0x12, "R9", NULL, Loop_SetChannelGainIn, 0}, /* Central slider */ -#ifndef AS5600_ENABLED - // { 0x0, 0x13, "H1", NULL, App_SetBrightness, 0}, -#else - { 0x0, 0x13, "H1", NULL, Sampler_ScratchFader, 0}, -#endif + { 0x0, 0x13, "H1", NULL, NULL, 0}, };