From 0c27d1bb60514027ecb947d164097232b8c53e10 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Mon, 13 Jul 2020 11:27:14 +0200 Subject: [PATCH] Removing not used files. Added a wy to not use the Reverb-Anitalias-Filter and tried the one mentioned in https://github.com/PaulStoffregen/Audio/pull/357/files. --- MicroDexed.ino | 9 +- config.h | 16 ++-- effect_dynamics.cpp | 144 -------------------------------- effect_dynamics.h | 194 -------------------------------------------- 4 files changed, 17 insertions(+), 346 deletions(-) delete mode 100644 effect_dynamics.cpp delete mode 100644 effect_dynamics.h diff --git a/MicroDexed.ino b/MicroDexed.ino index 0ca60fe..2d3c20e 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -61,9 +61,11 @@ AudioMixer4 reverb_mixer_r; AudioMixer4 reverb_mixer_l; AudioEffectFreeverb freeverb_r; AudioEffectFreeverb freeverb_l; +#if defined(REVERB_ANTIALIAS_FRQ) AudioFilterBiquad freeverb_antialias_r; AudioFilterBiquad freeverb_antialias_l; #endif +#endif AudioMixer4 master_mixer_r; AudioMixer4 master_mixer_l; AudioAmplifier volume_r; @@ -76,10 +78,15 @@ AudioAnalyzePeak master_peak_l; #if defined(USE_FX) AudioConnection patchCord0(reverb_mixer_r, freeverb_r); AudioConnection patchCord1(reverb_mixer_l, freeverb_l); +#if defined(REVERB_ANTIALIAS_FRQ) AudioConnection patchCord2(freeverb_r, freeverb_antialias_r); AudioConnection patchCord3(freeverb_l, freeverb_antialias_l); AudioConnection patchCord4(freeverb_antialias_r, 0, master_mixer_r, 3); AudioConnection patchCord5(freeverb_antialias_l, 0, master_mixer_l, 3); +#else +AudioConnection patchCord2(freeverb_r, 0, master_mixer_r, 3); +AudioConnection patchCord3(freeverb_l, 0, master_mixer_l, 3); +#endif #endif AudioConnection patchCord6(master_mixer_r, volume_r); AudioConnection patchCord7(master_mixer_l, volume_l); @@ -1466,7 +1473,7 @@ void initial_values_from_eeprom(bool init) } check_configuration(); - + for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) { set_voiceconfig_params(instance_id); diff --git a/config.h b/config.h index e30621a..a5c62bf 100644 --- a/config.h +++ b/config.h @@ -56,7 +56,7 @@ // sed -i.orig 's/^#define USB_MIDI_SYSEX_MAX 290/#define USB_MIDI_SYSEX_MAX 4104/' /usr/local/arduino-teensy/hardware/teensy/avr/cores/teensy3/usb_midi.h //#define USB_MIDI_SYSEX_MAX 4104 -#define VERSION "1.0.3" +#define VERSION "1.0.4" //************************************************************************************************* //* DEVICE SETTINGS @@ -74,14 +74,13 @@ //************************************************************************************************* // If nothing is defined Teensy internal DAC is used as audio output device! // Left and right channel audio signal is presented on pins A21 and A22. -#define TEENSY_AUDIO_BOARD #define AUDIO_DEVICE_USB -#define SGTL5000_HEADPHONE_VOLUME 0.8 +#define TEENSY_AUDIO_BOARD +//#define PT8211_AUDIO +//#define TGA_AUDIO_BOARD //#define TEENSY_DAC //#define TEENSY_DAC_SYMMETRIC //#define I2S_AUDIO_ONLY -//#define TGA_AUDIO_BOARD -//#define PT8211_AUDIO //************************************************************************************************* //* MIDI SOFTWARE SETTINGS @@ -93,7 +92,7 @@ //************************************************************************************************* //* DEBUG OUTPUT SETTINGS //************************************************************************************************* -//#define DEBUG 1 +#define DEBUG 1 #define SERIAL_SPEED 230400 #define SHOW_XRUN 1 #define SHOW_CPU_LOAD_MSEC 5000 @@ -113,10 +112,13 @@ #define MOD_FILTER_OUTPUT MOD_BUTTERWORTH_FILTER_OUTPUT // MOD_LINKWITZ_RILEY_FILTER_OUTPUT MOD_BUTTERWORTH_FILTER_OUTPUT MOD_NO_FILTER_OUTPUT #define MOD_FILTER_CUTOFF_HZ 2000 // REVERB parameters -#define REVERB_ANTIALIAS_FRQ 7500 +//#define REVERB_ANTIALIAS_FRQ 7500 // SGTL5000 +#ifdef TEENSY_AUDIO_BOARD #define SGTL5000_AUDIO_ENHANCE 1 #define SGTL5000_AUDIO_THRU 1 +#define SGTL5000_HEADPHONE_VOLUME 0.8 +#endif //************************************************************************************************* //* AUDIO SOFTWARE SETTINGS //************************************************************************************************* diff --git a/effect_dynamics.cpp b/effect_dynamics.cpp deleted file mode 100644 index d2d9a03..0000000 --- a/effect_dynamics.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* Audio Library for Teensy 3.X - * Dynamics Processor (Gate, Compressor & Limiter) - * Copyright (c) 2017, Marc Paquette (marc@dacsystemes.com) - * Based on analyse_rms & mixer objects by Paul Stoffregen - * - * Development of this audio library was funded by PJRC.COM, LLC by sales of - * Teensy and Audio Adaptor boards. Please support PJRC's efforts to develop - * open source software by purchasing Teensy or other PJRC products. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice, development funding notice, and this permission - * notice shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "effect_dynamics.h" -#include "fast_log.h" -#include "utility/dspinst.h" -#include "utility/sqrt_integer.h" - -static float analyse_rms(int16_t *data) { - - uint32_t *p = (uint32_t *)data; - const uint32_t *end = p + AUDIO_BLOCK_SAMPLES / 2; - int64_t sum = 0; - do { - uint32_t n1 = *p++; - uint32_t n2 = *p++; - uint32_t n3 = *p++; - uint32_t n4 = *p++; - sum = multiply_accumulate_16tx16t_add_16bx16b(sum, n1, n1); - sum = multiply_accumulate_16tx16t_add_16bx16b(sum, n2, n2); - sum = multiply_accumulate_16tx16t_add_16bx16b(sum, n3, n3); - sum = multiply_accumulate_16tx16t_add_16bx16b(sum, n4, n4); - - } while (p < end); - - int32_t meansq = sum / AUDIO_BLOCK_SAMPLES; - return sqrt_uint32(meansq) / 32767.0f; -} - -static void applyGain(int16_t *data, int32_t mult1, int32_t mult2) { - - uint32_t *p = (uint32_t *)data; - const uint32_t *end = p + AUDIO_BLOCK_SAMPLES / 2; - int32_t inc = (mult2 - mult1) / (AUDIO_BLOCK_SAMPLES / 2); - - do { - uint32_t tmp32 = *p; // read 2 samples from *data - int32_t val1 = signed_multiply_32x16b(mult1, tmp32); - mult1 += inc; - int32_t val2 = signed_multiply_32x16t(mult1, tmp32); - mult1 += inc; - val1 = signed_saturate_rshift(val1, 16, 0); - val2 = signed_saturate_rshift(val2, 16, 0); - *p++ = pack_16b_16b(val2, val1); - } while (p < end); -} - -void AudioEffectDynamics::update(void) { - - audio_block_t *block; - - block = receiveWritable(0); - - if (!block) return; - - if (!gateEnabled && !compEnabled && !limiterEnabled) { - - //Transmit & release - transmit(block); - release(block); - return; - } - - //Analyze received block - float rms = analyse_rms(block->data); - - //Compute block RMS level in Db - float inputdb = MIN_DB; - if (rms > 0) inputdb = unitToDb(rms); - - //Gate - if (gateEnabled) { - if (inputdb >= gateThresholdOpen) gatedb = (aGateAttack * gatedb) + (aOneMinusGateAttack * MAX_DB); - else if (inputdb < gateThresholdClose) gatedb = (aGateRelease * gatedb) + (aOneMinusGateRelease * MIN_DB); - } - else gatedb = MAX_DB; - - //Compressor - if (compEnabled) { - float attdb = MAX_DB; //Below knee - if (inputdb >= aLowKnee) { - if(inputdb <= aHighKnee) { - //Knee transition - float knee = inputdb - aLowKnee; - attdb = aKneeRatio * knee * knee * aTwoKneeWidth; - } - else { - //Above knee - attdb = compThreshold + ((inputdb - compThreshold) * compRatio) - inputdb; - } - } - if (attdb <= compdb) compdb = (aCompAttack * compdb) + (aOneMinusCompAttack * attdb); - else compdb = (aCompRelease * compdb) + (aOneMinusCompRelease * attdb); - } - else compdb = MAX_DB; - - //Brickwall Limiter - if (limiterEnabled) { - float outdb = inputdb + compdb + makeupdb; - if (outdb >= limitThreshold) limitdb = (aLimitAttack * limitdb) + (aOneMinusLimitAttack * (limitThreshold - outdb)); - else limitdb *= aLimitRelease; - } - else limitdb = MAX_DB; - - //Compute linear gain - float totalGain = gatedb + compdb + makeupdb + limitdb; - int32_t mult = dbToUnit(totalGain) * 65536.0f; - - //Apply gain to block - applyGain(block->data, last_mult, mult); - last_mult = mult; - - //Transmit & release - transmit(block); - release(block); -} - - - diff --git a/effect_dynamics.h b/effect_dynamics.h deleted file mode 100644 index d5a96b1..0000000 --- a/effect_dynamics.h +++ /dev/null @@ -1,194 +0,0 @@ -/* Audio Library for Teensy 3.X - * Dynamics Processor (Gate, Compressor & Limiter) - * Copyright (c) 2018, Marc Paquette (marc@dacsystemes.com) - * Based on analyse_rms, effect_envelope & mixer objects by Paul Stoffregen - * - * Development of this audio library was funded by PJRC.COM, LLC by sales of - * Teensy and Audio Adaptor boards. Please support PJRC's efforts to develop - * open source software by purchasing Teensy or other PJRC products. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice, development funding notice, and this permission - * notice shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef effect_dynamics_h_ -#define effect_dynamics_h_ - -#include "Arduino.h" -#include "AudioStream.h" - -#define MIN_DB -110.0f -#define MAX_DB 0.0f - -#define MIN_T 0.03f //Roughly 1 block -#define MAX_T 4.00f - -#define RATIO_OFF 1.0f -#define RATIO_INFINITY 60.0f - -class AudioEffectDynamics : public AudioStream -{ -public: - AudioEffectDynamics(void) : AudioStream(1, inputQueueArray) { - - gate(); - compression(); - limit(); - autoMakeupGain(); - - gatedb = MIN_DB; - compdb = MIN_DB; - limitdb = MIN_DB; - } - - //Sets the gate parameters. - //threshold is in dbFS - //attack & release are in seconds - void gate(float threshold = -50.0f, float attack = MIN_T, float release = 0.3f, float hysterisis = 6.0f) { - - gateEnabled = threshold > MIN_DB; - - gateThresholdOpen = constrain(threshold, MIN_DB, MAX_DB); - gateThresholdClose = gateThresholdOpen - constrain(hysterisis, 0.0f, 6.0f); - - float gateAttackTime = constrain(attack, MIN_T, MAX_T); - float gateReleaseTime = constrain(release, MIN_T, MAX_T); - - aGateAttack = timeToAlpha(gateAttackTime); - aOneMinusGateAttack = 1.0f - aGateAttack; - aGateRelease = timeToAlpha(gateReleaseTime); - aOneMinusGateRelease = 1.0f - aGateRelease; - } - - //Sets the compression parameters. - //threshold & kneeWidth are in db(FS) - //attack and release are in seconds - //ratio is expressed as x:1 i.e. 1 for no compression, 60 for brickwall limiting - //Set kneeWidth to 0 for hard knee - void compression(float threshold = -40.0f, float attack = MIN_T, float release = 0.5f, float ratio = 35.0f, float kneeWidth = 6.0f) { - - compEnabled = threshold < MAX_DB; - - compThreshold = constrain(threshold, MIN_DB, MAX_DB); - float compAttackTime = constrain(attack, MIN_T, MAX_T); - float compReleaseTime = constrain(release, MIN_T, MAX_T); - compRatio = 1.0f / constrain(abs(ratio), RATIO_OFF, RATIO_INFINITY); - float compKneeWidth = constrain(abs(kneeWidth), 0.0f, 32.0f); - computeMakeupGain(); - - aCompAttack = timeToAlpha(compAttackTime); - aOneMinusCompAttack = 1.0f - aCompAttack; - aCompRelease = timeToAlpha(compReleaseTime); - aOneMinusCompRelease = 1.0f - aCompRelease; - aHalfKneeWidth = compKneeWidth / 2.0f; - aTwoKneeWidth = 1.0f / (compKneeWidth * 2.0f); - aKneeRatio = compRatio - 1.0f; - aLowKnee = compThreshold - aHalfKneeWidth; - aHighKnee = compThreshold + aHalfKneeWidth; - } - - //Sets the hard limiter parameters - //threshold is in dbFS - //attack & release are in seconds - void limit(float threshold = -3.0f, float attack = MIN_T, float release = MIN_T) { - - limiterEnabled = threshold < MAX_DB; - - limitThreshold = constrain(threshold, MIN_DB, MAX_DB); - float limitAttackTime = constrain(attack, MIN_T, MAX_T); - float limitReleaseTime = constrain(release, MIN_T, MAX_T); - - computeMakeupGain(); - - aLimitAttack = timeToAlpha(limitAttackTime); - aOneMinusLimitAttack = 1.0f - aLimitAttack; - aLimitRelease = timeToAlpha(limitReleaseTime); - } - - //Enables automatic makeup gain setting - //headroom is in dbFS - void autoMakeupGain(float headroom = 6.0f) { - - mgAutoEnabled = true; - mgHeadroom = constrain(headroom, 0.0f, 60.0f); - computeMakeupGain(); - } - - //Sets a fixed makeup gain value. - //gain is in dbFS - void makeupGain(float gain = 0.0f) { - - mgAutoEnabled = false; - makeupdb = constrain(gain, -12.0f, 24.0f); - } - -private: - audio_block_t *inputQueueArray[1]; - - bool gateEnabled = false; - float gateThresholdOpen; - float gateThresholdClose; - float gatedb; - - bool compEnabled = false; - float compThreshold; - float compRatio; - float compdb; - - bool limiterEnabled = false; - float limitThreshold; - float limitdb; - - bool mgAutoEnabled; - float mgHeadroom; - float makeupdb; - - float aGateAttack; - float aOneMinusGateAttack; - float aGateRelease; - float aOneMinusGateRelease; - float aHalfKneeWidth; - float aTwoKneeWidth; - float aKneeRatio; - float aLowKnee; - float aHighKnee; - float aCompAttack; - float aOneMinusCompAttack; - float aCompRelease; - float aOneMinusCompRelease; - float aLimitAttack; - float aOneMinusLimitAttack; - float aLimitRelease; - - int32_t last_mult; - - void computeMakeupGain() { - if (mgAutoEnabled) { - makeupdb = -compThreshold + (compThreshold * compRatio) + limitThreshold - mgHeadroom; - } - } - - //Computes smoothing time constants for a 10% to 90% change - float timeToAlpha(float time) { - return expf(-0.9542f / (((float)AUDIO_SAMPLE_RATE_EXACT / (float)AUDIO_BLOCK_SAMPLES) * time)); - } - - virtual void update(void); -}; - -#endif