Browse Source

DSP: Revamp DSP module

tags/2021-05-28
Ivan Cohen reuk 5 years ago
parent
commit
c138bf91b4
93 changed files with 17893 additions and 1729 deletions
  1. +2
    -2
      examples/Assets/DSPDemos_Common.h
  2. BIN
      examples/Assets/Impulse1.wav
  3. BIN
      examples/Assets/Impulse2.wav
  4. BIN
      examples/Assets/reverb_ir.wav
  5. +11
    -10
      examples/DSP/StateVariableFilterDemo.h
  6. +70
    -20
      examples/DemoRunner/Builds/Android/app/CMakeLists.txt
  7. BIN
      examples/DemoRunner/Builds/Android/app/src/main/assets/Impulse1.wav
  8. BIN
      examples/DemoRunner/Builds/Android/app/src/main/assets/Impulse2.wav
  9. BIN
      examples/DemoRunner/Builds/Android/app/src/main/assets/reverb_ir.wav
  10. +62
    -11
      examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj
  11. +93
    -15
      examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters
  12. +62
    -11
      examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
  13. +93
    -15
      examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
  14. +62
    -11
      examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
  15. +93
    -15
      examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
  16. +1670
    -351
      examples/Plugins/DSPModulePluginDemo.h
  17. +1
    -1
      examples/Plugins/MidiLoggerPluginDemo.h
  18. +8
    -6
      extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
  19. +7
    -4
      extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj
  20. +8
    -5
      extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters
  21. +70
    -20
      extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
  22. +62
    -11
      extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj
  23. +93
    -15
      extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters
  24. +62
    -11
      extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
  25. +93
    -15
      extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
  26. +62
    -11
      extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
  27. +93
    -15
      extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
  28. +4
    -0
      extras/AudioPluginHost/CMakeLists.txt
  29. +1
    -1
      extras/Build/CMake/JUCEConfig.cmake.in
  30. +8
    -6
      extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
  31. +7
    -4
      extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj
  32. +8
    -5
      extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters
  33. +62
    -11
      extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
  34. +93
    -15
      extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
  35. +62
    -11
      extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
  36. +93
    -15
      extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
  37. +7
    -4
      extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj
  38. +8
    -5
      extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters
  39. +2
    -1
      modules/juce_audio_basics/juce_audio_basics.cpp
  40. +2
    -2
      modules/juce_audio_basics/juce_audio_basics.h
  41. +29
    -2
      modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp
  42. +19
    -2
      modules/juce_audio_basics/sources/juce_MemoryAudioSource.h
  43. +0
    -75
      modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp
  44. +0
    -146
      modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h
  45. +493
    -0
      modules/juce_audio_basics/utilities/juce_GenericInterpolator.h
  46. +184
    -0
      modules/juce_audio_basics/utilities/juce_Interpolators.cpp
  47. +228
    -0
      modules/juce_audio_basics/utilities/juce_Interpolators.h
  48. +17
    -422
      modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp
  49. +0
    -146
      modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h
  50. +10026
    -0
      modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp
  51. +44
    -0
      modules/juce_core/maths/juce_MathsFunctions.h
  52. +3
    -0
      modules/juce_core/threads/juce_SpinLock.h
  53. +4
    -4
      modules/juce_dsp/filter_design/juce_FilterDesign.cpp
  54. +2
    -2
      modules/juce_dsp/frequency/juce_Convolution.cpp
  55. +4
    -4
      modules/juce_dsp/frequency/juce_FFT.cpp
  56. +13
    -1
      modules/juce_dsp/juce_dsp.cpp
  57. +18
    -6
      modules/juce_dsp/juce_dsp.h
  58. +121
    -0
      modules/juce_dsp/processors/juce_BallisticsFilter.cpp
  59. +142
    -0
      modules/juce_dsp/processors/juce_BallisticsFilter.h
  60. +121
    -0
      modules/juce_dsp/processors/juce_DelayLine.cpp
  61. +309
    -0
      modules/juce_dsp/processors/juce_DelayLine.h
  62. +172
    -0
      modules/juce_dsp/processors/juce_DryWetMixer.cpp
  63. +110
    -0
      modules/juce_dsp/processors/juce_DryWetMixer.h
  64. +114
    -0
      modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp
  65. +144
    -0
      modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h
  66. +5
    -1
      modules/juce_dsp/processors/juce_IIRFilter.h
  67. +0
    -162
      modules/juce_dsp/processors/juce_LadderFilter.cpp
  68. +142
    -0
      modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp
  69. +136
    -0
      modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h
  70. +48
    -6
      modules/juce_dsp/processors/juce_Oversampling.cpp
  71. +63
    -48
      modules/juce_dsp/processors/juce_Oversampling.h
  72. +136
    -0
      modules/juce_dsp/processors/juce_Panner.cpp
  73. +112
    -0
      modules/juce_dsp/processors/juce_Panner.h
  74. +33
    -12
      modules/juce_dsp/processors/juce_StateVariableFilter.h
  75. +130
    -0
      modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp
  76. +159
    -0
      modules/juce_dsp/processors/juce_StateVariableTPTFilter.h
  77. +1
    -1
      modules/juce_dsp/widgets/juce_Bias.h
  78. +131
    -0
      modules/juce_dsp/widgets/juce_Chorus.cpp
  79. +157
    -0
      modules/juce_dsp/widgets/juce_Chorus.h
  80. +117
    -0
      modules/juce_dsp/widgets/juce_Compressor.cpp
  81. +103
    -0
      modules/juce_dsp/widgets/juce_Compressor.h
  82. +0
    -0
      modules/juce_dsp/widgets/juce_Gain.h
  83. +169
    -0
      modules/juce_dsp/widgets/juce_LadderFilter.cpp
  84. +39
    -33
      modules/juce_dsp/widgets/juce_LadderFilter.h
  85. +91
    -0
      modules/juce_dsp/widgets/juce_Limiter.cpp
  86. +98
    -0
      modules/juce_dsp/widgets/juce_Limiter.h
  87. +122
    -0
      modules/juce_dsp/widgets/juce_NoiseGate.cpp
  88. +103
    -0
      modules/juce_dsp/widgets/juce_NoiseGate.h
  89. +0
    -0
      modules/juce_dsp/widgets/juce_Oscillator.h
  90. +147
    -0
      modules/juce_dsp/widgets/juce_Phaser.cpp
  91. +199
    -0
      modules/juce_dsp/widgets/juce_Phaser.h
  92. +1
    -1
      modules/juce_dsp/widgets/juce_Reverb.h
  93. +0
    -0
      modules/juce_dsp/widgets/juce_WaveShaper.h

+ 2
- 2
examples/Assets/DSPDemos_Common.h View File

@@ -312,8 +312,8 @@ struct DSPDemo : public AudioSource,
inputSource->getNextAudioBlock (bufferToFill);
dsp::AudioBlock<float> block (*bufferToFill.buffer,
(size_t) bufferToFill.startSample);
AudioBlock<float> block (*bufferToFill.buffer,
(size_t) bufferToFill.startSample);
ScopedLock audioLock (audioCallbackLock);
this->process (ProcessContextReplacing<float> (block));


BIN
examples/Assets/Impulse1.wav View File


BIN
examples/Assets/Impulse2.wav View File


BIN
examples/Assets/reverb_ir.wav View File


+ 11
- 10
examples/DSP/StateVariableFilterDemo.h View File

@@ -59,8 +59,6 @@ struct StateVariableFilterDemoDSP
void prepare (const ProcessSpec& spec)
{
sampleRate = spec.sampleRate;
filter.state = new StateVariableFilter::Parameters<float>;
filter.prepare (spec);
}
@@ -78,18 +76,21 @@ struct StateVariableFilterDemoDSP
{
if (sampleRate != 0.0)
{
auto cutoff = static_cast<float> (cutoffParam.getCurrentValue());
auto resonance = static_cast<float> (qParam.getCurrentValue());
auto type = static_cast<StateVariableFilter::Parameters<float>::Type> (typeParam.getCurrentSelectedID() - 1);
filter.state->type = type;
filter.state->setCutOffFrequency (sampleRate, cutoff, resonance);
filter.setCutoffFrequency (static_cast<float> (cutoffParam.getCurrentValue()));
filter.setResonance (static_cast<float> (qParam.getCurrentValue()));
switch (typeParam.getCurrentSelectedID() - 1)
{
case 0: filter.setType (StateVariableTPTFilterType::lowpass); break;
case 1: filter.setType (StateVariableTPTFilterType::bandpass); break;
case 2: filter.setType (StateVariableTPTFilterType::highpass); break;
default: jassertfalse; break;
};
}
}
//==============================================================================
ProcessorDuplicator<StateVariableFilter::Filter<float>,
StateVariableFilter::Parameters<float>> filter;
StateVariableTPTFilter<float> filter;
ChoiceParameter typeParam {{ "Low-pass", "Band-pass", "High-pass" }, 1, "Type" };
SliderParameter cutoffParam {{ 20.0, 20000.0 }, 0.5, 440.0f, "Cutoff", "Hz" };


+ 70
- 20
examples/DemoRunner/Builds/Android/app/CMakeLists.txt View File

@@ -117,16 +117,17 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"
"../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"
"../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h"
"../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h"
"../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h"
"../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h"
"../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h"
"../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp"
"../../../../../modules/juce_audio_basics/juce_audio_basics.cpp"
"../../../../../modules/juce_audio_basics/juce_audio_basics.mm"
"../../../../../modules/juce_audio_basics/juce_audio_basics.h"
@@ -1078,27 +1079,51 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h"
"../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp"
"../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h"
"../../../../../modules/juce_dsp/processors/juce_Bias.h"
"../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h"
"../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp"
"../../../../../modules/juce_dsp/processors/juce_DelayLine.h"
"../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp"
"../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h"
"../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_FIRFilter.h"
"../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp"
"../../../../../modules/juce_dsp/processors/juce_Gain.h"
"../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h"
"../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_IIRFilter.h"
"../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h"
"../../../../../modules/juce_dsp/processors/juce_LadderFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_LadderFilter.h"
"../../../../../modules/juce_dsp/processors/juce_Oscillator.h"
"../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h"
"../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp"
"../../../../../modules/juce_dsp/processors/juce_Oversampling.h"
"../../../../../modules/juce_dsp/processors/juce_Panner.cpp"
"../../../../../modules/juce_dsp/processors/juce_Panner.h"
"../../../../../modules/juce_dsp/processors/juce_ProcessContext.h"
"../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h"
"../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp"
"../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h"
"../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h"
"../../../../../modules/juce_dsp/processors/juce_Reverb.h"
"../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h"
"../../../../../modules/juce_dsp/processors/juce_WaveShaper.h"
"../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h"
"../../../../../modules/juce_dsp/widgets/juce_Bias.h"
"../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp"
"../../../../../modules/juce_dsp/widgets/juce_Chorus.h"
"../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp"
"../../../../../modules/juce_dsp/widgets/juce_Compressor.h"
"../../../../../modules/juce_dsp/widgets/juce_Gain.h"
"../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp"
"../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h"
"../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp"
"../../../../../modules/juce_dsp/widgets/juce_Limiter.h"
"../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp"
"../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h"
"../../../../../modules/juce_dsp/widgets/juce_Oscillator.h"
"../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp"
"../../../../../modules/juce_dsp/widgets/juce_Phaser.h"
"../../../../../modules/juce_dsp/widgets/juce_Reverb.h"
"../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h"
"../../../../../modules/juce_dsp/juce_dsp.cpp"
"../../../../../modules/juce_dsp/juce_dsp.mm"
"../../../../../modules/juce_dsp/juce_dsp.h"
@@ -1841,16 +1866,17 @@ set_source_files_properties("../../../../../modules/juce_audio_basics/sources/ju
set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -2802,27 +2828,51 @@ set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SI
set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Bias.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Gain.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LadderFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LadderFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oscillator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_WaveShaper.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Bias.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Gain.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.h" PROPERTIES HEADER_FILE_ONLY TRUE)


BIN
examples/DemoRunner/Builds/Android/app/src/main/assets/Impulse1.wav View File


BIN
examples/DemoRunner/Builds/Android/app/src/main/assets/Impulse2.wav View File


BIN
examples/DemoRunner/Builds/Android/app/src/main/assets/reverb_ir.wav View File


+ 62
- 11
examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj View File

@@ -242,10 +242,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -254,6 +254,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -1427,24 +1430,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2453,10 +2492,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>
@@ -2983,21 +3022,33 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_fallback_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_neon_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorDuplicator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionListener.h"/>


+ 93
- 15
examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters View File

@@ -374,6 +374,9 @@
<Filter Include="JUCE Modules\juce_dsp\processors">
<UniqueIdentifier>{DDF4BA73-8578-406D-21F8-06B9BC70BFEA}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp\widgets">
<UniqueIdentifier>{73374573-0194-9A6E-461A-A81EEB511C26}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp">
<UniqueIdentifier>{5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E}</UniqueIdentifier>
</Filter>
@@ -676,10 +679,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -688,6 +691,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -1915,24 +1921,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
@@ -3141,16 +3183,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">
@@ -4731,13 +4773,19 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h">
@@ -4746,13 +4794,13 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h">
@@ -4767,15 +4815,45 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClInclude>


+ 62
- 11
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj View File

@@ -242,10 +242,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -254,6 +254,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -1427,24 +1430,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2453,10 +2492,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>
@@ -2983,21 +3022,33 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_fallback_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_neon_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorDuplicator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionListener.h"/>


+ 93
- 15
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters View File

@@ -374,6 +374,9 @@
<Filter Include="JUCE Modules\juce_dsp\processors">
<UniqueIdentifier>{DDF4BA73-8578-406D-21F8-06B9BC70BFEA}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp\widgets">
<UniqueIdentifier>{73374573-0194-9A6E-461A-A81EEB511C26}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp">
<UniqueIdentifier>{5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E}</UniqueIdentifier>
</Filter>
@@ -676,10 +679,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -688,6 +691,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -1915,24 +1921,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
@@ -3141,16 +3183,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">
@@ -4731,13 +4773,19 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h">
@@ -4746,13 +4794,13 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h">
@@ -4767,15 +4815,45 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClInclude>


+ 62
- 11
examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj View File

@@ -242,10 +242,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -254,6 +254,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -1427,24 +1430,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2453,10 +2492,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>
@@ -2983,21 +3022,33 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_fallback_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_neon_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorDuplicator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionListener.h"/>


+ 93
- 15
examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters View File

@@ -374,6 +374,9 @@
<Filter Include="JUCE Modules\juce_dsp\processors">
<UniqueIdentifier>{DDF4BA73-8578-406D-21F8-06B9BC70BFEA}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp\widgets">
<UniqueIdentifier>{73374573-0194-9A6E-461A-A81EEB511C26}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp">
<UniqueIdentifier>{5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E}</UniqueIdentifier>
</Filter>
@@ -676,10 +679,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -688,6 +691,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -1915,24 +1921,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
@@ -3141,16 +3183,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">
@@ -4731,13 +4773,19 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h">
@@ -4746,13 +4794,13 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h">
@@ -4767,15 +4815,45 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClInclude>


+ 1670
- 351
examples/Plugins/DSPModulePluginDemo.h
File diff suppressed because it is too large
View File


+ 1
- 1
examples/Plugins/MidiLoggerPluginDemo.h View File

@@ -235,7 +235,7 @@ public:
bool hasEditor() const override { return true; }
AudioProcessorEditor* createEditor() override { return new Editor (*this); }
const String getName() const override { return "MIDILogger"; }
const String getName() const override { return "MIDI Logger"; }
bool acceptsMidi() const override { return true; }
bool producesMidi() const override { return true; }
double getTailLengthSeconds() const override { return 0.0; }


+ 8
- 6
extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt View File

@@ -98,16 +98,17 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"
"../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"
"../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h"
"../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h"
"../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h"
"../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h"
"../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h"
"../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp"
"../../../../../modules/juce_audio_basics/juce_audio_basics.cpp"
"../../../../../modules/juce_audio_basics/juce_audio_basics.mm"
"../../../../../modules/juce_audio_basics/juce_audio_basics.h"
@@ -1506,16 +1507,17 @@ set_source_files_properties("../../../../../modules/juce_audio_basics/sources/ju
set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE)


+ 7
- 4
extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj View File

@@ -223,10 +223,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -235,6 +235,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2047,10 +2050,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>


+ 8
- 5
extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters View File

@@ -508,10 +508,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -520,6 +520,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -2535,16 +2538,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">


+ 70
- 20
extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt View File

@@ -115,16 +115,17 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"
"../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"
"../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h"
"../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h"
"../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h"
"../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h"
"../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h"
"../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp"
"../../../../../modules/juce_audio_basics/juce_audio_basics.cpp"
"../../../../../modules/juce_audio_basics/juce_audio_basics.mm"
"../../../../../modules/juce_audio_basics/juce_audio_basics.h"
@@ -934,27 +935,51 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h"
"../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp"
"../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h"
"../../../../../modules/juce_dsp/processors/juce_Bias.h"
"../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h"
"../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp"
"../../../../../modules/juce_dsp/processors/juce_DelayLine.h"
"../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp"
"../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h"
"../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_FIRFilter.h"
"../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp"
"../../../../../modules/juce_dsp/processors/juce_Gain.h"
"../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h"
"../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_IIRFilter.h"
"../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h"
"../../../../../modules/juce_dsp/processors/juce_LadderFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_LadderFilter.h"
"../../../../../modules/juce_dsp/processors/juce_Oscillator.h"
"../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h"
"../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp"
"../../../../../modules/juce_dsp/processors/juce_Oversampling.h"
"../../../../../modules/juce_dsp/processors/juce_Panner.cpp"
"../../../../../modules/juce_dsp/processors/juce_Panner.h"
"../../../../../modules/juce_dsp/processors/juce_ProcessContext.h"
"../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h"
"../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp"
"../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h"
"../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h"
"../../../../../modules/juce_dsp/processors/juce_Reverb.h"
"../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h"
"../../../../../modules/juce_dsp/processors/juce_WaveShaper.h"
"../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp"
"../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h"
"../../../../../modules/juce_dsp/widgets/juce_Bias.h"
"../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp"
"../../../../../modules/juce_dsp/widgets/juce_Chorus.h"
"../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp"
"../../../../../modules/juce_dsp/widgets/juce_Compressor.h"
"../../../../../modules/juce_dsp/widgets/juce_Gain.h"
"../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp"
"../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h"
"../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp"
"../../../../../modules/juce_dsp/widgets/juce_Limiter.h"
"../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp"
"../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h"
"../../../../../modules/juce_dsp/widgets/juce_Oscillator.h"
"../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp"
"../../../../../modules/juce_dsp/widgets/juce_Phaser.h"
"../../../../../modules/juce_dsp/widgets/juce_Reverb.h"
"../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h"
"../../../../../modules/juce_dsp/juce_dsp.cpp"
"../../../../../modules/juce_dsp/juce_dsp.mm"
"../../../../../modules/juce_dsp/juce_dsp.h"
@@ -1654,16 +1679,17 @@ set_source_files_properties("../../../../../modules/juce_audio_basics/sources/ju
set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -2473,27 +2499,51 @@ set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SI
set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Bias.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Gain.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LadderFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LadderFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oscillator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_WaveShaper.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Bias.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Gain.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.h" PROPERTIES HEADER_FILE_ONLY TRUE)


+ 62
- 11
extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj View File

@@ -230,10 +230,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -242,6 +242,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -1220,24 +1223,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2190,10 +2229,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>
@@ -2647,21 +2686,33 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_fallback_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_neon_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorDuplicator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionListener.h"/>


+ 93
- 15
extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters View File

@@ -314,6 +314,9 @@
<Filter Include="JUCE Modules\juce_dsp\processors">
<UniqueIdentifier>{DDF4BA73-8578-406D-21F8-06B9BC70BFEA}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp\widgets">
<UniqueIdentifier>{73374573-0194-9A6E-461A-A81EEB511C26}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp">
<UniqueIdentifier>{5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E}</UniqueIdentifier>
</Filter>
@@ -586,10 +589,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -598,6 +601,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -1630,24 +1636,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
@@ -2781,16 +2823,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">
@@ -4152,13 +4194,19 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h">
@@ -4167,13 +4215,13 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h">
@@ -4188,15 +4236,45 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClInclude>


+ 62
- 11
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj View File

@@ -230,10 +230,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -242,6 +242,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -1220,24 +1223,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2190,10 +2229,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>
@@ -2647,21 +2686,33 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_fallback_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_neon_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorDuplicator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionListener.h"/>


+ 93
- 15
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters View File

@@ -314,6 +314,9 @@
<Filter Include="JUCE Modules\juce_dsp\processors">
<UniqueIdentifier>{DDF4BA73-8578-406D-21F8-06B9BC70BFEA}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp\widgets">
<UniqueIdentifier>{73374573-0194-9A6E-461A-A81EEB511C26}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp">
<UniqueIdentifier>{5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E}</UniqueIdentifier>
</Filter>
@@ -586,10 +589,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -598,6 +601,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -1630,24 +1636,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
@@ -2781,16 +2823,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">
@@ -4152,13 +4194,19 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h">
@@ -4167,13 +4215,13 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h">
@@ -4188,15 +4236,45 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClInclude>


+ 62
- 11
extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj View File

@@ -230,10 +230,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -242,6 +242,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -1220,24 +1223,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2190,10 +2229,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>
@@ -2647,21 +2686,33 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_fallback_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_neon_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorDuplicator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionListener.h"/>


+ 93
- 15
extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters View File

@@ -314,6 +314,9 @@
<Filter Include="JUCE Modules\juce_dsp\processors">
<UniqueIdentifier>{DDF4BA73-8578-406D-21F8-06B9BC70BFEA}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp\widgets">
<UniqueIdentifier>{73374573-0194-9A6E-461A-A81EEB511C26}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp">
<UniqueIdentifier>{5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E}</UniqueIdentifier>
</Filter>
@@ -586,10 +589,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -598,6 +601,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -1630,24 +1636,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
@@ -2781,16 +2823,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">
@@ -4152,13 +4194,19 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h">
@@ -4167,13 +4215,13 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h">
@@ -4188,15 +4236,45 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClInclude>


+ 4
- 0
extras/AudioPluginHost/CMakeLists.txt View File

@@ -52,3 +52,7 @@ target_link_libraries(AudioPluginHost PRIVATE
juce::juce_dsp
juce::juce_opengl
juce::juce_video)

if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
juce_add_bundle_resources_directory(AudioPluginHost ../../examples/Assets)
endif()

+ 1
- 1
extras/Build/CMake/JUCEConfig.cmake.in View File

@@ -1,7 +1,7 @@
# ==============================================================================
#
# This file is part of the JUCE library.
# Copyright (c) 2017 - ROLI Ltd.
# Copyright (c) 2020 - Raw Material Software Limited
#
# JUCE is an open source library subject to commercial or open-source
# licensing.


+ 8
- 6
extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt View File

@@ -102,16 +102,17 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"
"../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"
"../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h"
"../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h"
"../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h"
"../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h"
"../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h"
"../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp"
"../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h"
"../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp"
"../../../../../modules/juce_audio_basics/juce_audio_basics.cpp"
"../../../../../modules/juce_audio_basics/juce_audio_basics.mm"
"../../../../../modules/juce_audio_basics/juce_audio_basics.h"
@@ -1585,16 +1586,17 @@ set_source_files_properties("../../../../../modules/juce_audio_basics/sources/ju
set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE)


+ 7
- 4
extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj View File

@@ -223,10 +223,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -235,6 +235,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2132,10 +2135,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>


+ 8
- 5
extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters View File

@@ -538,10 +538,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -550,6 +550,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -2670,16 +2673,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">


+ 62
- 11
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj View File

@@ -239,10 +239,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -251,6 +251,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -1283,24 +1286,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2303,10 +2342,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>
@@ -2785,21 +2824,33 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_fallback_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_neon_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorDuplicator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionListener.h"/>


+ 93
- 15
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters View File

@@ -338,6 +338,9 @@
<Filter Include="JUCE Modules\juce_dsp\processors">
<UniqueIdentifier>{DDF4BA73-8578-406D-21F8-06B9BC70BFEA}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp\widgets">
<UniqueIdentifier>{73374573-0194-9A6E-461A-A81EEB511C26}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp">
<UniqueIdentifier>{5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E}</UniqueIdentifier>
</Filter>
@@ -625,10 +628,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -637,6 +640,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -1723,24 +1729,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
@@ -2931,16 +2973,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">
@@ -4377,13 +4419,19 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h">
@@ -4392,13 +4440,13 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h">
@@ -4413,15 +4461,45 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClInclude>


+ 62
- 11
extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj View File

@@ -239,10 +239,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -251,6 +251,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -1283,24 +1286,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2303,10 +2342,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>
@@ -2785,21 +2824,33 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_fallback_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_neon_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorDuplicator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h"/>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionBroadcaster.h"/>
<ClInclude Include="..\..\..\..\modules\juce_events\broadcasters\juce_ActionListener.h"/>


+ 93
- 15
extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters View File

@@ -338,6 +338,9 @@
<Filter Include="JUCE Modules\juce_dsp\processors">
<UniqueIdentifier>{DDF4BA73-8578-406D-21F8-06B9BC70BFEA}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp\widgets">
<UniqueIdentifier>{73374573-0194-9A6E-461A-A81EEB511C26}</UniqueIdentifier>
</Filter>
<Filter Include="JUCE Modules\juce_dsp">
<UniqueIdentifier>{5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E}</UniqueIdentifier>
</Filter>
@@ -625,10 +628,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -637,6 +640,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -1723,24 +1729,60 @@
<ClCompile Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.cpp">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorChain_test.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.cpp">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.cpp">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_dsp\juce_dsp.cpp">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
@@ -2931,16 +2973,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">
@@ -4377,13 +4419,19 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\native\juce_sse_SIMDNativeOps.h">
<Filter>JUCE Modules\juce_dsp\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Bias.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_BallisticsFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DelayLine.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_DryWetMixer.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FIRFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Gain.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_FirstOrderTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter.h">
@@ -4392,13 +4440,13 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_IIRFilter_Impl.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LadderFilter.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_LinkwitzRileyFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oscillator.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Oversampling.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Panner.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessContext.h">
@@ -4413,15 +4461,45 @@
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_ProcessorWrapper.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_WaveShaper.h">
<ClInclude Include="..\..\..\..\modules\juce_dsp\processors\juce_StateVariableTPTFilter.h">
<Filter>JUCE Modules\juce_dsp\processors</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Bias.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Chorus.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Compressor.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Gain.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_LadderFilter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Limiter.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_NoiseGate.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Oscillator.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Phaser.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_Reverb.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\widgets\juce_WaveShaper.h">
<Filter>JUCE Modules\juce_dsp\widgets</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_dsp\juce_dsp.h">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClInclude>


+ 7
- 4
extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj View File

@@ -222,10 +222,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -234,6 +234,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@@ -2108,10 +2111,10 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ToneGeneratorAudioSource.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.h"/>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.h"/>


+ 8
- 5
extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters View File

@@ -535,10 +535,10 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\synthesisers\juce_Synthesiser.cpp">
<Filter>JUCE Modules\juce_audio_basics\synthesisers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.cpp">
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.cpp">
@@ -547,6 +547,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_SmoothedValue.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_WindowedSincInterpolator.cpp">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
@@ -2637,16 +2640,16 @@
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_ADSR.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_CatmullRomInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Decibels.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_GenericInterpolator.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_IIRFilter.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_LagrangeInterpolator.h">
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Interpolators.h">
<Filter>JUCE Modules\juce_audio_basics\utilities</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_audio_basics\utilities\juce_Reverb.h">


+ 2
- 1
modules/juce_audio_basics/juce_audio_basics.cpp View File

@@ -59,7 +59,8 @@
#include "buffers/juce_AudioProcessLoadMeasurer.cpp"
#include "utilities/juce_IIRFilter.cpp"
#include "utilities/juce_LagrangeInterpolator.cpp"
#include "utilities/juce_CatmullRomInterpolator.cpp"
#include "utilities/juce_WindowedSincInterpolator.cpp"
#include "utilities/juce_Interpolators.cpp"
#include "utilities/juce_SmoothedValue.cpp"
#include "midi/juce_MidiBuffer.cpp"
#include "midi/juce_MidiFile.cpp"


+ 2
- 2
modules/juce_audio_basics/juce_audio_basics.h View File

@@ -88,8 +88,8 @@
#include "buffers/juce_AudioProcessLoadMeasurer.h"
#include "utilities/juce_Decibels.h"
#include "utilities/juce_IIRFilter.h"
#include "utilities/juce_LagrangeInterpolator.h"
#include "utilities/juce_CatmullRomInterpolator.h"
#include "utilities/juce_GenericInterpolator.h"
#include "utilities/juce_Interpolators.h"
#include "utilities/juce_SmoothedValue.h"
#include "utilities/juce_Reverb.h"
#include "utilities/juce_ADSR.h"


+ 29
- 2
modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp View File

@@ -24,7 +24,7 @@ namespace juce
{
MemoryAudioSource::MemoryAudioSource (AudioBuffer<float>& bufferToUse, bool copyMemory, bool shouldLoop)
: isLooping (shouldLoop)
: isCurrentlyLooping (shouldLoop)
{
if (copyMemory)
buffer.makeCopyOf (bufferToUse);
@@ -50,7 +50,7 @@ void MemoryAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferT
auto n = buffer.getNumSamples(), m = bufferToFill.numSamples;
int i;
for (i = position; (i < n || isLooping) && (pos < m); i += max)
for (i = position; (i < n || isCurrentlyLooping) && (pos < m); i += max)
{
max = jmin (m - pos, n - (i % n));
@@ -70,4 +70,31 @@ void MemoryAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferT
position = (i % n);
}
//==============================================================================
void MemoryAudioSource::setNextReadPosition (int64 newPosition)
{
position = (int) newPosition;
}
int64 MemoryAudioSource::getNextReadPosition() const
{
return position;
}
int64 MemoryAudioSource::getTotalLength() const
{
return buffer.getNumSamples();
}
//==============================================================================
bool MemoryAudioSource::isLooping() const
{
return isCurrentlyLooping;
}
void MemoryAudioSource::setLooping (bool shouldLoop)
{
isCurrentlyLooping = shouldLoop;
}
} // namespace juce

+ 19
- 2
modules/juce_audio_basics/sources/juce_MemoryAudioSource.h View File

@@ -29,7 +29,7 @@ namespace juce
@tags{Audio}
*/
class JUCE_API MemoryAudioSource : public AudioSource
class JUCE_API MemoryAudioSource : public PositionableAudioSource
{
public:
//==============================================================================
@@ -52,11 +52,28 @@ public:
/** Implementation of the AudioSource method. */
void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) override;
//==============================================================================
/** Implementation of the PositionableAudioSource method. */
void setNextReadPosition (int64 newPosition) override;
/** Implementation of the PositionableAudioSource method. */
int64 getNextReadPosition() const override;
/** Implementation of the PositionableAudioSource method. */
int64 getTotalLength() const override;
//==============================================================================
/** Implementation of the PositionableAudioSource method. */
bool isLooping() const override;
/** Implementation of the PositionableAudioSource method. */
void setLooping (bool shouldLoop) override;
private:
//==============================================================================
AudioBuffer<float> buffer;
int position = 0;
bool isLooping;
bool isCurrentlyLooping;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryAudioSource)


+ 0
- 75
modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp View File

@@ -1,75 +0,0 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2020 - Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
struct CatmullRomAlgorithm
{
static forcedinline float valueAtOffset (const float* const inputs, const float offset) noexcept
{
auto y0 = inputs[3];
auto y1 = inputs[2];
auto y2 = inputs[1];
auto y3 = inputs[0];
auto halfY0 = 0.5f * y0;
auto halfY3 = 0.5f * y3;
return y1 + offset * ((0.5f * y2 - halfY0)
+ (offset * (((y0 + 2.0f * y2) - (halfY3 + 2.5f * y1))
+ (offset * ((halfY3 + 1.5f * y1) - (halfY0 + 1.5f * y2))))));
}
};
CatmullRomInterpolator::CatmullRomInterpolator() noexcept { reset(); }
CatmullRomInterpolator::~CatmullRomInterpolator() noexcept {}
void CatmullRomInterpolator::reset() noexcept
{
subSamplePos = 1.0;
for (auto& s : lastInputSamples)
s = 0;
}
int CatmullRomInterpolator::process (double actualRatio, const float* in, float* out, int numOut, int available, int wrap) noexcept
{
return interpolate<CatmullRomAlgorithm> (lastInputSamples, subSamplePos, actualRatio, in, out, numOut, available, wrap);
}
int CatmullRomInterpolator::process (double actualRatio, const float* in, float* out, int numOut) noexcept
{
return interpolate<CatmullRomAlgorithm> (lastInputSamples, subSamplePos, actualRatio, in, out, numOut);
}
int CatmullRomInterpolator::processAdding (double actualRatio, const float* in, float* out, int numOut, int available, int wrap, float gain) noexcept
{
return interpolateAdding<CatmullRomAlgorithm> (lastInputSamples, subSamplePos, actualRatio, in, out, numOut, available, wrap, gain);
}
int CatmullRomInterpolator::processAdding (double actualRatio, const float* in, float* out, int numOut, float gain) noexcept
{
return interpolateAdding<CatmullRomAlgorithm> (lastInputSamples, subSamplePos, actualRatio, in, out, numOut, gain);
}
} // namespace juce

+ 0
- 146
modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h View File

@@ -1,146 +0,0 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2020 - Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
/**
Interpolator for resampling a stream of floats using Catmull-Rom interpolation.
Note that the resampler is stateful, so when there's a break in the continuity
of the input stream you're feeding it, you should call reset() before feeding
it any new data. And like with any other stateful filter, if you're resampling
multiple channels, make sure each one uses its own CatmullRomInterpolator
object.
@see LagrangeInterpolator
@tags{Audio}
*/
class JUCE_API CatmullRomInterpolator
{
public:
CatmullRomInterpolator() noexcept;
~CatmullRomInterpolator() noexcept;
CatmullRomInterpolator (CatmullRomInterpolator&&) noexcept = default;
CatmullRomInterpolator& operator= (CatmullRomInterpolator&&) noexcept = default;
/** Resets the state of the interpolator.
Call this when there's a break in the continuity of the input data stream.
*/
void reset() noexcept;
/** Resamples a stream of samples.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results into
@param numOutputSamplesToProduce the number of output samples that should be created
@returns the actual number of input samples that were used
*/
int process (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce) noexcept;
/** Resamples a stream of samples.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results into
@param numOutputSamplesToProduce the number of output samples that should be created
@param available the number of available input samples. If it needs more samples
than available, it either wraps back for wrapAround samples, or
it feeds zeroes
@param wrapAround if the stream exceeds available samples, it wraps back for
wrapAround samples. If wrapAround is set to 0, it will feed zeroes.
@returns the actual number of input samples that were used
*/
int process (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce,
int available,
int wrapAround) noexcept;
/** Resamples a stream of samples, adding the results to the output data
with a gain.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results to - the result values will be added
to any pre-existing data in this buffer after being multiplied by
the gain factor
@param numOutputSamplesToProduce the number of output samples that should be created
@param gain a gain factor to multiply the resulting samples by before
adding them to the destination buffer
@returns the actual number of input samples that were used
*/
int processAdding (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce,
float gain) noexcept;
/** Resamples a stream of samples, adding the results to the output data
with a gain.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results to - the result values will be added
to any pre-existing data in this buffer after being multiplied by
the gain factor
@param numOutputSamplesToProduce the number of output samples that should be created
@param available the number of available input samples. If it needs more samples
than available, it either wraps back for wrapAround samples, or
it feeds zeroes
@param wrapAround if the stream exceeds available samples, it wraps back for
wrapAround samples. If wrapAround is set to 0, it will feed zeroes.
@param gain a gain factor to multiply the resulting samples by before
adding them to the destination buffer
@returns the actual number of input samples that were used
*/
int processAdding (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce,
int available,
int wrapAround,
float gain) noexcept;
private:
float lastInputSamples[5];
double subSamplePos;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CatmullRomInterpolator)
};
} // namespace juce

+ 493
- 0
modules/juce_audio_basics/utilities/juce_GenericInterpolator.h View File

@@ -0,0 +1,493 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
/**
An interpolator base class for resampling streams of floats.
Note that the resamplers are stateful, so when there's a break in the continuity
of the input stream you're feeding it, you should call reset() before feeding
it any new data. And like with any other stateful filter, if you're resampling
multiple channels, make sure each one uses its own interpolator object.
@see LagrangeInterpolator, CatmullRomInterpolator, WindowedSincInterpolator,
LinearInterpolator, ZeroOrderHoldInterpolator
@tags{Audio}
*/
template <class InterpolatorTraits, int memorySize>
class JUCE_API GenericInterpolator
{
public:
GenericInterpolator() noexcept { reset(); }
GenericInterpolator (GenericInterpolator&&) noexcept = default;
GenericInterpolator& operator= (GenericInterpolator&&) noexcept = default;
/** Returns the latency of the interpolation algorithm in isolation.
In the context of resampling the total latency of a process using
the interpolator is the base latency divided by the speed ratio.
*/
static constexpr float getBaseLatency() noexcept
{
return InterpolatorTraits::algorithmicLatency;
}
/** Resets the state of the interpolator.
Call this when there's a break in the continuity of the input data stream.
*/
void reset() noexcept
{
indexBuffer = 0;
subSamplePos = 1.0;
std::fill (std::begin (lastInputSamples), std::end (lastInputSamples), 0.0f);
}
/** Resamples a stream of samples.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results into
@param numOutputSamplesToProduce the number of output samples that should be created
@returns the actual number of input samples that were used
*/
int process (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce) noexcept
{
return interpolate (speedRatio, inputSamples, outputSamples, numOutputSamplesToProduce);
}
/** Resamples a stream of samples.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results into
@param numOutputSamplesToProduce the number of output samples that should be created
@param numInputSamplesAvailable the number of available input samples. If it needs more samples
than available, it either wraps back for wrapAround samples, or
it feeds zeroes
@param wrapAround if the stream exceeds available samples, it wraps back for
wrapAround samples. If wrapAround is set to 0, it will feed zeroes.
@returns the actual number of input samples that were used
*/
int process (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce,
int numInputSamplesAvailable,
int wrapAround) noexcept
{
return interpolate (speedRatio, inputSamples, outputSamples,
numOutputSamplesToProduce, numInputSamplesAvailable, wrapAround);
}
/** Resamples a stream of samples, adding the results to the output data
with a gain.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results to - the result values will be added
to any pre-existing data in this buffer after being multiplied by
the gain factor
@param numOutputSamplesToProduce the number of output samples that should be created
@param gain a gain factor to multiply the resulting samples by before
adding them to the destination buffer
@returns the actual number of input samples that were used
*/
int processAdding (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce,
float gain) noexcept
{
return interpolateAdding (speedRatio, inputSamples, outputSamples, numOutputSamplesToProduce, gain);
}
/** Resamples a stream of samples, adding the results to the output data
with a gain.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results to - the result values will be added
to any pre-existing data in this buffer after being multiplied by
the gain factor
@param numOutputSamplesToProduce the number of output samples that should be created
@param numInputSamplesAvailable the number of available input samples. If it needs more samples
than available, it either wraps back for wrapAround samples, or
it feeds zeroes
@param wrapAround if the stream exceeds available samples, it wraps back for
wrapAround samples. If wrapAround is set to 0, it will feed zeroes.
@param gain a gain factor to multiply the resulting samples by before
adding them to the destination buffer
@returns the actual number of input samples that were used
*/
int processAdding (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce,
int numInputSamplesAvailable,
int wrapAround,
float gain) noexcept
{
return interpolateAdding (speedRatio, inputSamples, outputSamples,
numOutputSamplesToProduce, numInputSamplesAvailable, wrapAround, gain);
}
private:
//==============================================================================
forcedinline void pushInterpolationSample (float newValue) noexcept
{
lastInputSamples[indexBuffer] = newValue;
if (++indexBuffer == memorySize)
indexBuffer = 0;
}
forcedinline void pushInterpolationSamples (const float* input,
int numOutputSamplesToProduce) noexcept
{
if (numOutputSamplesToProduce >= memorySize)
{
const auto* const offsetInput = input + (numOutputSamplesToProduce - memorySize);
for (int i = 0; i < memorySize; ++i)
pushInterpolationSample (offsetInput[i]);
}
else
{
for (int i = 0; i < numOutputSamplesToProduce; ++i)
pushInterpolationSample (input[i]);
}
}
forcedinline void pushInterpolationSamples (const float* input,
int numOutputSamplesToProduce,
int numInputSamplesAvailable,
int wrapAround) noexcept
{
if (numOutputSamplesToProduce >= memorySize)
{
if (numInputSamplesAvailable >= memorySize)
{
pushInterpolationSamples (input,
numOutputSamplesToProduce);
}
else
{
pushInterpolationSamples (input + ((numOutputSamplesToProduce - numInputSamplesAvailable) - 1),
numInputSamplesAvailable);
if (wrapAround > 0)
{
numOutputSamplesToProduce -= wrapAround;
pushInterpolationSamples (input + ((numOutputSamplesToProduce - (memorySize - numInputSamplesAvailable)) - 1),
memorySize - numInputSamplesAvailable);
}
else
{
for (int i = numInputSamplesAvailable; i < memorySize; ++i)
pushInterpolationSample (0.0f);
}
}
}
else
{
if (numOutputSamplesToProduce > numInputSamplesAvailable)
{
for (int i = 0; i < numInputSamplesAvailable; ++i)
pushInterpolationSample (input[i]);
const auto extraSamples = numOutputSamplesToProduce - numInputSamplesAvailable;
if (wrapAround > 0)
{
const auto* const offsetInput = input + (numInputSamplesAvailable - wrapAround);
for (int i = 0; i < extraSamples; ++i)
pushInterpolationSample (offsetInput[i]);
}
else
{
for (int i = 0; i < extraSamples; ++i)
pushInterpolationSample (0.0f);
}
}
else
{
for (int i = 0; i < numOutputSamplesToProduce; ++i)
pushInterpolationSample (input[i]);
}
}
}
//==============================================================================
int interpolate (double speedRatio,
const float* input,
float* output,
int numOutputSamplesToProduce) noexcept
{
auto pos = subSamplePos;
int numUsed = 0;
while (numOutputSamplesToProduce > 0)
{
while (pos >= 1.0)
{
pushInterpolationSample (input[numUsed++]);
pos -= 1.0;
}
*output++ = InterpolatorTraits::valueAtOffset (lastInputSamples, (float) pos, indexBuffer);
pos += speedRatio;
--numOutputSamplesToProduce;
}
subSamplePos = pos;
return numUsed;
}
int interpolate (double speedRatio,
const float* input, float* output,
int numOutputSamplesToProduce,
int numInputSamplesAvailable,
int wrap) noexcept
{
auto originalIn = input;
auto pos = subSamplePos;
bool exceeded = false;
if (speedRatio < 1.0)
{
for (int i = numOutputSamplesToProduce; --i >= 0;)
{
if (pos >= 1.0)
{
if (exceeded)
{
pushInterpolationSample (0.0f);
}
else
{
pushInterpolationSample (*input++);
if (--numInputSamplesAvailable <= 0)
{
if (wrap > 0)
{
input -= wrap;
numInputSamplesAvailable += wrap;
}
else
{
exceeded = true;
}
}
}
pos -= 1.0;
}
*output++ = InterpolatorTraits::valueAtOffset (lastInputSamples, (float) pos, indexBuffer);
pos += speedRatio;
}
}
else
{
for (int i = numOutputSamplesToProduce; --i >= 0;)
{
while (pos < speedRatio)
{
if (exceeded)
{
pushInterpolationSample (0);
}
else
{
pushInterpolationSample (*input++);
if (--numInputSamplesAvailable <= 0)
{
if (wrap > 0)
{
input -= wrap;
numInputSamplesAvailable += wrap;
}
else
{
exceeded = true;
}
}
}
pos += 1.0;
}
pos -= speedRatio;
*output++ = InterpolatorTraits::valueAtOffset (lastInputSamples, jmax (0.0f, 1.0f - (float) pos), indexBuffer);
}
}
subSamplePos = pos;
if (wrap == 0)
return (int) (input - originalIn);
return ((int) (input - originalIn) + wrap) % wrap;
}
int interpolateAdding (double speedRatio,
const float* input,
float* output,
int numOutputSamplesToProduce,
int numInputSamplesAvailable,
int wrap,
float gain) noexcept
{
auto originalIn = input;
auto pos = subSamplePos;
bool exceeded = false;
if (speedRatio < 1.0)
{
for (int i = numOutputSamplesToProduce; --i >= 0;)
{
if (pos >= 1.0)
{
if (exceeded)
{
pushInterpolationSample (0.0);
}
else
{
pushInterpolationSample (*input++);
if (--numInputSamplesAvailable <= 0)
{
if (wrap > 0)
{
input -= wrap;
numInputSamplesAvailable += wrap;
}
else
{
numInputSamplesAvailable = true;
}
}
}
pos -= 1.0;
}
*output++ += gain * InterpolatorTraits::valueAtOffset ((float) pos);
pos += speedRatio;
}
}
else
{
for (int i = numOutputSamplesToProduce; --i >= 0;)
{
while (pos < speedRatio)
{
if (exceeded)
{
pushInterpolationSample (0.0);
}
else
{
pushInterpolationSample (*input++);
if (--numInputSamplesAvailable <= 0)
{
if (wrap > 0)
{
input -= wrap;
numInputSamplesAvailable += wrap;
}
else
{
exceeded = true;
}
}
}
pos += 1.0;
}
pos -= speedRatio;
*output++ += gain * InterpolatorTraits::valueAtOffset (lastInputSamples, jmax (0.0f, 1.0f - (float) pos), indexBuffer);
}
}
subSamplePos = pos;
if (wrap == 0)
return (int) (input - originalIn);
return ((int) (input - originalIn) + wrap) % wrap;
}
int interpolateAdding (double speedRatio,
const float* input,
float* output,
int numOutputSamplesToProduce,
float gain) noexcept
{
auto pos = subSamplePos;
int numUsed = 0;
while (numOutputSamplesToProduce > 0)
{
while (pos >= 1.0)
{
pushInterpolationSample (input[numUsed++]);
pos -= 1.0;
}
*output++ += gain * InterpolatorTraits::valueAtOffset (lastInputSamples, (float) pos, indexBuffer);
pos += speedRatio;
--numOutputSamplesToProduce;
}
subSamplePos = pos;
return numUsed;
}
//==============================================================================
float lastInputSamples[(size_t) memorySize];
double subSamplePos = 1.0;
int indexBuffer = 0;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GenericInterpolator)
};
} // namespace juce

+ 184
- 0
modules/juce_audio_basics/utilities/juce_Interpolators.cpp View File

@@ -0,0 +1,184 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
#if JUCE_UNIT_TESTS
class InterpolatorTests : public UnitTest
{
public:
InterpolatorTests()
: UnitTest ("InterpolatorTests", UnitTestCategories::audio)
{
}
private:
template<typename InterpolatorType>
void runInterplatorTests (const String& interpolatorName)
{
auto createGaussian = [](std::vector<float>& destination, float scale, float centreInSamples, float width)
{
for (size_t i = 0; i < destination.size(); ++i)
{
auto x = (((float) i) - centreInSamples) * width;
destination[i] = std::exp (-(x * x));
}
FloatVectorOperations::multiply (destination.data(), scale, (int) destination.size());
};
auto findGaussianPeak = [](const std::vector<float>& input) -> float
{
auto max = std::max_element (std::begin (input), std::end (input));
auto maxPrev = max - 1;
jassert (maxPrev >= std::begin (input));
auto maxNext = max + 1;
jassert (maxNext < std::end (input));
auto quadraticMaxLoc = (*maxPrev - *maxNext) / (2.0f * ((*maxNext + *maxPrev) - (2.0f * *max)));
return quadraticMaxLoc + (float) std::distance (std::begin (input), max);
};
auto expectAllElementsWithin = [this](const std::vector<float>& v1, const std::vector<float>& v2, float tolerance)
{
expectEquals ((int) v1.size(), (int) v2.size());
for (size_t i = 0; i < v1.size(); ++i)
expectWithinAbsoluteError (v1[i], v2[i], tolerance);
};
InterpolatorType interpolator;
constexpr size_t inputSize = 1001;
static_assert (inputSize > 800 + InterpolatorType::getBaseLatency(),
"The test InterpolatorTests input buffer is too small");
std::vector<float> input (inputSize);
constexpr auto inputGaussianMidpoint = (float) (inputSize - 1) / 2.0f;
constexpr auto inputGaussianValueAtEnds = 0.000001f;
const auto inputGaussianWidth = std::sqrt (-std::log (inputGaussianValueAtEnds)) / inputGaussianMidpoint;
createGaussian (input, 1.0f, inputGaussianMidpoint, inputGaussianWidth);
for (auto speedRatio : { 0.4, 0.8263, 1.0, 1.05, 1.2384, 1.6 })
{
const auto expectedGaussianMidpoint = (inputGaussianMidpoint + InterpolatorType::getBaseLatency()) / (float) speedRatio;
const auto expectedGaussianWidth = inputGaussianWidth * (float) speedRatio;
const auto outputBufferSize = (size_t) std::floor ((float) input.size() / speedRatio);
for (int numBlocks : { 1, 5 })
{
const auto inputBlockSize = (float) input.size() / (float) numBlocks;
const auto outputBlockSize = (int) std::floor (inputBlockSize / speedRatio);
std::vector<float> output (outputBufferSize, std::numeric_limits<float>::min());
beginTest (interpolatorName + " process " + String (numBlocks) + " blocks ratio " + String (speedRatio));
interpolator.reset();
{
auto* inputPtr = input.data();
auto* outputPtr = output.data();
for (int i = 0; i < numBlocks; ++i)
{
auto numInputSamplesRead = interpolator.process (speedRatio, inputPtr, outputPtr, outputBlockSize);
inputPtr += numInputSamplesRead;
outputPtr += outputBlockSize;
}
}
expectWithinAbsoluteError (findGaussianPeak (output), expectedGaussianMidpoint, 0.1f);
std::vector<float> expectedOutput (output.size());
createGaussian (expectedOutput, 1.0f, expectedGaussianMidpoint, expectedGaussianWidth);
expectAllElementsWithin (output, expectedOutput, 0.02f);
beginTest (interpolatorName + " process adding " + String (numBlocks) + " blocks ratio " + String (speedRatio));
interpolator.reset();
constexpr float addingGain = 0.7384f;
{
auto* inputPtr = input.data();
auto* outputPtr = output.data();
for (int i = 0; i < numBlocks; ++i)
{
auto numInputSamplesRead = interpolator.processAdding (speedRatio, inputPtr, outputPtr, outputBlockSize, addingGain);
inputPtr += numInputSamplesRead;
outputPtr += outputBlockSize;
}
}
expectWithinAbsoluteError (findGaussianPeak (output), expectedGaussianMidpoint, 0.1f);
std::vector<float> additionalOutput (output.size());
createGaussian (additionalOutput, addingGain, expectedGaussianMidpoint, expectedGaussianWidth);
FloatVectorOperations::add (expectedOutput.data(), additionalOutput.data(), (int) additionalOutput.size());
expectAllElementsWithin (output, expectedOutput, 0.02f);
}
beginTest (interpolatorName + " process wrap 0 ratio " + String (speedRatio));
std::vector<float> doubleLengthOutput (2 * outputBufferSize, std::numeric_limits<float>::min());
interpolator.reset();
interpolator.process (speedRatio, input.data(), doubleLengthOutput.data(), (int) doubleLengthOutput.size(),
(int) input.size(), 0);
std::vector<float> expectedDoubleLengthOutput (doubleLengthOutput.size());
createGaussian (expectedDoubleLengthOutput, 1.0f, expectedGaussianMidpoint, expectedGaussianWidth);
expectAllElementsWithin (doubleLengthOutput, expectedDoubleLengthOutput, 0.02f);
beginTest (interpolatorName + " process wrap double ratio " + String (speedRatio));
interpolator.reset();
interpolator.process (speedRatio, input.data(), doubleLengthOutput.data(), (int) doubleLengthOutput.size(),
(int) input.size(), (int) input.size());
std::vector<float> secondGaussian (doubleLengthOutput.size());
createGaussian (secondGaussian, 1.0f, expectedGaussianMidpoint + outputBufferSize, expectedGaussianWidth);
FloatVectorOperations::add (expectedDoubleLengthOutput.data(), secondGaussian.data(), (int) expectedDoubleLengthOutput.size());
expectAllElementsWithin (doubleLengthOutput, expectedDoubleLengthOutput, 0.02f);
}
}
public:
void runTest() override
{
runInterplatorTests<WindowedSincInterpolator> ("WindowedSincInterpolator");
runInterplatorTests<LagrangeInterpolator> ("LagrangeInterpolator");
runInterplatorTests<CatmullRomInterpolator> ("CatmullRomInterpolator");
runInterplatorTests<LinearInterpolator> ("LinearInterpolator");
}
};
static InterpolatorTests interpolatorTests;
#endif
} // namespace juce

+ 228
- 0
modules/juce_audio_basics/utilities/juce_Interpolators.h View File

@@ -0,0 +1,228 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
class Interpolators
{
private:
struct WindowedSincTraits
{
static constexpr float algorithmicLatency = 100.0f;
static forcedinline float windowedSinc (float firstFrac, int index) noexcept
{
auto index2 = index + 1;
auto frac = firstFrac;
auto value1 = lookupTable[index];
auto value2 = lookupTable[index2];
return value1 + (frac * (value2 - value1));
}
static forcedinline float valueAtOffset (const float* const inputs, const float offset, int indexBuffer) noexcept
{
int numCrossings = 100;
float result = 0.0f;
auto samplePosition = indexBuffer;
float firstFrac = 0.0f;
float lastSincPosition = -1.0f;
int index = 0, sign = -1;
for (int i = -numCrossings; i <= numCrossings; ++i)
{
auto sincPosition = (1.0f - offset) + (float) i;
if (i == -numCrossings || (sincPosition >= 0 && lastSincPosition < 0))
{
auto indexFloat = (sincPosition >= 0.f ? sincPosition : -sincPosition) * 100.0f;
index = (int) std::floor (indexFloat);
firstFrac = indexFloat - index;
sign = (sincPosition < 0 ? -1 : 1);
}
if (sincPosition == 0.0f)
result += inputs[samplePosition];
else if (sincPosition < numCrossings && sincPosition > -numCrossings)
result += inputs[samplePosition] * windowedSinc (firstFrac, index);
if (++samplePosition == numCrossings * 2)
samplePosition = 0;
lastSincPosition = sincPosition;
index += 100 * sign;
}
return result;
}
static const float lookupTable[10001];
};
struct LagrangeTraits
{
static constexpr float algorithmicLatency = 2.0f;
static float valueAtOffset (const float*, float, int) noexcept;
};
struct CatmullRomTraits
{
//==============================================================================
static constexpr float algorithmicLatency = 2.0f;
static forcedinline float valueAtOffset (const float* const inputs, const float offset, int index) noexcept
{
auto y0 = inputs[index]; if (++index == 4) index = 0;
auto y1 = inputs[index]; if (++index == 4) index = 0;
auto y2 = inputs[index]; if (++index == 4) index = 0;
auto y3 = inputs[index];
auto halfY0 = 0.5f * y0;
auto halfY3 = 0.5f * y3;
return y1 + offset * ((0.5f * y2 - halfY0)
+ (offset * (((y0 + 2.0f * y2) - (halfY3 + 2.5f * y1))
+ (offset * ((halfY3 + 1.5f * y1) - (halfY0 + 1.5f * y2))))));
}
};
struct LinearTraits
{
static constexpr float algorithmicLatency = 1.0f;
static forcedinline float valueAtOffset (const float* const inputs, const float offset, int index) noexcept
{
auto y0 = inputs[index];
auto y1 = inputs[index == 0 ? 1 : 0];
return y1 * offset + y0 * (1.0f - offset);
}
};
struct ZeroOrderHoldTraits
{
static constexpr float algorithmicLatency = 0.0f;
static forcedinline float valueAtOffset (const float* const inputs, const float, int) noexcept
{
return inputs[0];
}
};
public:
using WindowedSinc = GenericInterpolator<WindowedSincTraits, 200>;
using Lagrange = GenericInterpolator<LagrangeTraits, 5>;
using CatmullRom = GenericInterpolator<CatmullRomTraits, 4>;
using Linear = GenericInterpolator<LinearTraits, 2>;
using ZeroOrderHold = GenericInterpolator<ZeroOrderHoldTraits, 1>;
};
//==============================================================================
/**
An interpolator for resampling a stream of floats using high order windowed
(hann) sinc interpolation, recommended for high quality resampling.
Note that the resampler is stateful, so when there's a break in the continuity
of the input stream you're feeding it, you should call reset() before feeding
it any new data. And like with any other stateful filter, if you're resampling
multiple channels, make sure each one uses its own LinearInterpolator object.
@see GenericInterpolator
@see LagrangeInterpolator, CatmullRomInterpolator, LinearInterpolator,
ZeroOrderHoldInterpolator
@tags{Audio}
*/
using WindowedSincInterpolator = Interpolators::WindowedSinc;
/**
An interpolator for resampling a stream of floats using 4-point lagrange interpolation.
Note that the resampler is stateful, so when there's a break in the continuity
of the input stream you're feeding it, you should call reset() before feeding
it any new data. And like with any other stateful filter, if you're resampling
multiple channels, make sure each one uses its own LagrangeInterpolator object.
@see GenericInterpolator
@see CatmullRomInterpolator, WindowedSincInterpolator, LinearInterpolator,
ZeroOrderHoldInterpolator
@tags{Audio}
*/
using LagrangeInterpolator = Interpolators::Lagrange;
/**
An interpolator for resampling a stream of floats using Catmull-Rom interpolation.
Note that the resampler is stateful, so when there's a break in the continuity
of the input stream you're feeding it, you should call reset() before feeding
it any new data. And like with any other stateful filter, if you're resampling
multiple channels, make sure each one uses its own CatmullRomInterpolator object.
@see GenericInterpolator
@see LagrangeInterpolator, WindowedSincInterpolator, LinearInterpolator,
ZeroOrderHoldInterpolator
@tags{Audio}
*/
using CatmullRomInterpolator = Interpolators::CatmullRom;
/**
An interpolator for resampling a stream of floats using linear interpolation.
Note that the resampler is stateful, so when there's a break in the continuity
of the input stream you're feeding it, you should call reset() before feeding
it any new data. And like with any other stateful filter, if you're resampling
multiple channels, make sure each one uses its own LinearInterpolator object.
@see GenericInterpolator
@see LagrangeInterpolator, CatmullRomInterpolator, WindowedSincInterpolator,
ZeroOrderHoldInterpolator
@tags{Audio}
*/
using LinearInterpolator = Interpolators::Linear;
/**
An interpolator for resampling a stream of floats using zero order hold
interpolation.
Note that the resampler is stateful, so when there's a break in the continuity
of the input stream you're feeding it, you should call reset() before feeding
it any new data. And like with any other stateful filter, if you're resampling
multiple channels, make sure each one uses its own ZeroOrderHoldInterpolator
object.
@see GenericInterpolator
@see LagrangeInterpolator, CatmullRomInterpolator, WindowedSincInterpolator,
LinearInterpolator
@tags{Audio}
*/
using ZeroOrderHoldInterpolator = Interpolators::ZeroOrderHold;
} // namespace juce

+ 17
- 422
modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp View File

@@ -23,381 +23,6 @@
namespace juce
{
namespace
{
static forcedinline void pushInterpolationSample (float* lastInputSamples, float newValue) noexcept
{
lastInputSamples[4] = lastInputSamples[3];
lastInputSamples[3] = lastInputSamples[2];
lastInputSamples[2] = lastInputSamples[1];
lastInputSamples[1] = lastInputSamples[0];
lastInputSamples[0] = newValue;
}
static forcedinline void pushInterpolationSamples (float* lastInputSamples, const float* input, int numOut) noexcept
{
if (numOut >= 5)
{
for (int i = 0; i < 5; ++i)
lastInputSamples[i] = input[--numOut];
}
else
{
for (int i = 0; i < numOut; ++i)
pushInterpolationSample (lastInputSamples, input[i]);
}
}
static forcedinline void pushInterpolationSamples (float* lastInputSamples, const float* input,
int numOut, int available, int wrapAround) noexcept
{
if (numOut >= 5)
{
if (available >= 5)
{
for (int i = 0; i < 5; ++i)
lastInputSamples[i] = input[--numOut];
}
else
{
for (int i = 0; i < available; ++i)
lastInputSamples[i] = input[--numOut];
if (wrapAround > 0)
{
numOut -= wrapAround;
for (int i = available; i < 5; ++i)
lastInputSamples[i] = input[--numOut];
}
else
{
for (int i = available; i < 5; ++i)
lastInputSamples[i] = 0.0f;
}
}
}
else
{
if (numOut > available)
{
for (int i = 0; i < available; ++i)
pushInterpolationSample (lastInputSamples, input[i]);
if (wrapAround > 0)
{
for (int i = 0; i < numOut - available; ++i)
pushInterpolationSample (lastInputSamples, input[i + available - wrapAround]);
}
else
{
for (int i = 0; i < numOut - available; ++i)
pushInterpolationSample (lastInputSamples, 0);
}
}
else
{
for (int i = 0; i < numOut; ++i)
pushInterpolationSample (lastInputSamples, input[i]);
}
}
}
template <typename InterpolatorType>
static int interpolate (float* lastInputSamples, double& subSamplePos, double actualRatio,
const float* in, float* out, int numOut) noexcept
{
auto pos = subSamplePos;
if (actualRatio == 1.0 && pos == 1.0)
{
memcpy (out, in, (size_t) numOut * sizeof (float));
pushInterpolationSamples (lastInputSamples, in, numOut);
return numOut;
}
int numUsed = 0;
while (numOut > 0)
{
while (pos >= 1.0)
{
pushInterpolationSample (lastInputSamples, in[numUsed++]);
pos -= 1.0;
}
*out++ = InterpolatorType::valueAtOffset (lastInputSamples, (float) pos);
pos += actualRatio;
--numOut;
}
subSamplePos = pos;
return numUsed;
}
template <typename InterpolatorType>
static int interpolate (float* lastInputSamples, double& subSamplePos, double actualRatio,
const float* in, float* out, int numOut, int available, int wrap) noexcept
{
if (actualRatio == 1.0)
{
if (available >= numOut)
{
memcpy (out, in, (size_t) numOut * sizeof (float));
pushInterpolationSamples (lastInputSamples, in, numOut, available, wrap);
}
else
{
memcpy (out, in, (size_t) available * sizeof (float));
pushInterpolationSamples (lastInputSamples, in, numOut, available, wrap);
if (wrap > 0)
{
memcpy (out + available, in + available - wrap, (size_t) (numOut - available) * sizeof (float));
pushInterpolationSamples (lastInputSamples, in, numOut, available, wrap);
}
else
{
for (int i = 0; i < numOut - available; ++i)
pushInterpolationSample (lastInputSamples, 0);
}
}
return numOut;
}
auto originalIn = in;
auto pos = subSamplePos;
bool exceeded = false;
if (actualRatio < 1.0)
{
for (int i = numOut; --i >= 0;)
{
if (pos >= 1.0)
{
if (exceeded)
{
pushInterpolationSample (lastInputSamples, 0);
}
else
{
pushInterpolationSample (lastInputSamples, *in++);
if (--available <= 0)
{
if (wrap > 0)
{
in -= wrap;
available += wrap;
}
else
{
exceeded = true;
}
}
}
pos -= 1.0;
}
*out++ = InterpolatorType::valueAtOffset (lastInputSamples, (float) pos);
pos += actualRatio;
}
}
else
{
for (int i = numOut; --i >= 0;)
{
while (pos < actualRatio)
{
if (exceeded)
{
pushInterpolationSample (lastInputSamples, 0);
}
else
{
pushInterpolationSample (lastInputSamples, *in++);
if (--available <= 0)
{
if (wrap > 0)
{
in -= wrap;
available += wrap;
}
else
{
exceeded = true;
}
}
}
pos += 1.0;
}
pos -= actualRatio;
*out++ = InterpolatorType::valueAtOffset (lastInputSamples, jmax (0.0f, 1.0f - (float) pos));
}
}
subSamplePos = pos;
if (wrap == 0)
return (int) (in - originalIn);
return ((int) (in - originalIn) + wrap) % wrap;
}
template <typename InterpolatorType>
static int interpolateAdding (float* lastInputSamples, double& subSamplePos, double actualRatio,
const float* in, float* out, int numOut,
int available, int wrap, float gain) noexcept
{
if (actualRatio == 1.0)
{
if (available >= numOut)
{
FloatVectorOperations::addWithMultiply (out, in, gain, numOut);
pushInterpolationSamples (lastInputSamples, in, numOut, available, wrap);
}
else
{
FloatVectorOperations::addWithMultiply (out, in, gain, available);
pushInterpolationSamples (lastInputSamples, in, available, available, wrap);
if (wrap > 0)
{
FloatVectorOperations::addWithMultiply (out, in - wrap, gain, numOut - available);
pushInterpolationSamples (lastInputSamples, in - wrap, numOut - available, available, wrap);
}
else
{
for (int i = 0; i < numOut-available; ++i)
pushInterpolationSample (lastInputSamples, 0.0);
}
}
return numOut;
}
auto originalIn = in;
auto pos = subSamplePos;
bool exceeded = false;
if (actualRatio < 1.0)
{
for (int i = numOut; --i >= 0;)
{
if (pos >= 1.0)
{
if (exceeded)
{
pushInterpolationSample (lastInputSamples, 0.0);
}
else
{
pushInterpolationSample (lastInputSamples, *in++);
if (--available <= 0)
{
if (wrap > 0)
{
in -= wrap;
available += wrap;
}
else
{
exceeded = true;
}
}
}
pos -= 1.0;
}
*out++ += gain * InterpolatorType::valueAtOffset (lastInputSamples, (float) pos);
pos += actualRatio;
}
}
else
{
for (int i = numOut; --i >= 0;)
{
while (pos < actualRatio)
{
if (exceeded)
{
pushInterpolationSample (lastInputSamples, 0.0);
}
else
{
pushInterpolationSample (lastInputSamples, *in++);
if (--available <= 0)
{
if (wrap > 0)
{
in -= wrap;
available += wrap;
}
else
{
exceeded = true;
}
}
}
pos += 1.0;
}
pos -= actualRatio;
*out++ += gain * InterpolatorType::valueAtOffset (lastInputSamples, jmax (0.0f, 1.0f - (float) pos));
}
}
subSamplePos = pos;
if (wrap == 0)
return (int) (in - originalIn);
return ((int) (in - originalIn) + wrap) % wrap;
}
template <typename InterpolatorType>
static int interpolateAdding (float* lastInputSamples, double& subSamplePos, double actualRatio,
const float* in, float* out, int numOut, float gain) noexcept
{
auto pos = subSamplePos;
if (actualRatio == 1.0 && pos == 1.0)
{
FloatVectorOperations::addWithMultiply (out, in, gain, numOut);
pushInterpolationSamples (lastInputSamples, in, numOut);
return numOut;
}
int numUsed = 0;
while (numOut > 0)
{
while (pos >= 1.0)
{
pushInterpolationSample (lastInputSamples, in[numUsed++]);
pos -= 1.0;
}
*out++ += gain * InterpolatorType::valueAtOffset (lastInputSamples, (float) pos);
pos += actualRatio;
--numOut;
}
subSamplePos = pos;
return numUsed;
}
}
//==============================================================================
template <int k>
struct LagrangeResampleHelper
{
@@ -410,58 +35,28 @@ struct LagrangeResampleHelper<0>
static forcedinline void calc (float&, float) noexcept {}
};
struct LagrangeAlgorithm
{
static forcedinline float valueAtOffset (const float* inputs, float offset) noexcept
{
return calcCoefficient<0> (inputs[4], offset)
+ calcCoefficient<1> (inputs[3], offset)
+ calcCoefficient<2> (inputs[2], offset)
+ calcCoefficient<3> (inputs[1], offset)
+ calcCoefficient<4> (inputs[0], offset);
}
template <int k>
static forcedinline float calcCoefficient (float input, float offset) noexcept
{
LagrangeResampleHelper<0 - k>::calc (input, -2.0f - offset);
LagrangeResampleHelper<1 - k>::calc (input, -1.0f - offset);
LagrangeResampleHelper<2 - k>::calc (input, 0.0f - offset);
LagrangeResampleHelper<3 - k>::calc (input, 1.0f - offset);
LagrangeResampleHelper<4 - k>::calc (input, 2.0f - offset);
return input;
}
};
LagrangeInterpolator::LagrangeInterpolator() noexcept { reset(); }
LagrangeInterpolator::~LagrangeInterpolator() noexcept {}
void LagrangeInterpolator::reset() noexcept
{
subSamplePos = 1.0;
for (auto& s : lastInputSamples)
s = 0;
}
int LagrangeInterpolator::process (double actualRatio, const float* in, float* out, int numOut, int available, int wrap) noexcept
{
return interpolate<LagrangeAlgorithm> (lastInputSamples, subSamplePos, actualRatio, in, out, numOut, available, wrap);
template <int k>
static float calcCoefficient (float input, float offset) noexcept
{
LagrangeResampleHelper<0 - k>::calc (input, -2.0f - offset);
LagrangeResampleHelper<1 - k>::calc (input, -1.0f - offset);
LagrangeResampleHelper<2 - k>::calc (input, 0.0f - offset);
LagrangeResampleHelper<3 - k>::calc (input, 1.0f - offset);
LagrangeResampleHelper<4 - k>::calc (input, 2.0f - offset);
return input;
}
int LagrangeInterpolator::process (double actualRatio, const float* in, float* out, int numOut) noexcept
float Interpolators::LagrangeTraits::valueAtOffset (const float* inputs, float offset, int index) noexcept
{
return interpolate<LagrangeAlgorithm> (lastInputSamples, subSamplePos, actualRatio, in, out, numOut);
}
float result = 0.0f;
int LagrangeInterpolator::processAdding (double actualRatio, const float* in, float* out, int numOut, int available, int wrap, float gain) noexcept
{
return interpolateAdding<LagrangeAlgorithm> (lastInputSamples, subSamplePos, actualRatio, in, out, numOut, available, wrap, gain);
}
result += calcCoefficient<0> (inputs[index], offset); if (++index == 5) index = 0;
result += calcCoefficient<1> (inputs[index], offset); if (++index == 5) index = 0;
result += calcCoefficient<2> (inputs[index], offset); if (++index == 5) index = 0;
result += calcCoefficient<3> (inputs[index], offset); if (++index == 5) index = 0;
result += calcCoefficient<4> (inputs[index], offset);
int LagrangeInterpolator::processAdding (double actualRatio, const float* in, float* out, int numOut, float gain) noexcept
{
return interpolateAdding<LagrangeAlgorithm> (lastInputSamples, subSamplePos, actualRatio, in, out, numOut, gain);
return result;
}
} // namespace juce

+ 0
- 146
modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h View File

@@ -1,146 +0,0 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2020 - Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
/**
Interpolator for resampling a stream of floats using 4-point lagrange interpolation.
Note that the resampler is stateful, so when there's a break in the continuity
of the input stream you're feeding it, you should call reset() before feeding
it any new data. And like with any other stateful filter, if you're resampling
multiple channels, make sure each one uses its own LagrangeInterpolator
object.
@see CatmullRomInterpolator
@tags{Audio}
*/
class JUCE_API LagrangeInterpolator
{
public:
LagrangeInterpolator() noexcept;
~LagrangeInterpolator() noexcept;
LagrangeInterpolator (LagrangeInterpolator&&) noexcept = default;
LagrangeInterpolator& operator= (LagrangeInterpolator&&) noexcept = default;
/** Resets the state of the interpolator.
Call this when there's a break in the continuity of the input data stream.
*/
void reset() noexcept;
/** Resamples a stream of samples.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results into
@param numOutputSamplesToProduce the number of output samples that should be created
@returns the actual number of input samples that were used
*/
int process (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce) noexcept;
/** Resamples a stream of samples.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results into
@param numOutputSamplesToProduce the number of output samples that should be created
@param available the number of available input samples. If it needs more samples
than available, it either wraps back for wrapAround samples, or
it feeds zeroes
@param wrapAround if the stream exceeds available samples, it wraps back for
wrapAround samples. If wrapAround is set to 0, it will feed zeroes.
@returns the actual number of input samples that were used
*/
int process (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce,
int available,
int wrapAround) noexcept;
/** Resamples a stream of samples, adding the results to the output data
with a gain.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results to - the result values will be added
to any pre-existing data in this buffer after being multiplied by
the gain factor
@param numOutputSamplesToProduce the number of output samples that should be created
@param gain a gain factor to multiply the resulting samples by before
adding them to the destination buffer
@returns the actual number of input samples that were used
*/
int processAdding (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce,
float gain) noexcept;
/** Resamples a stream of samples, adding the results to the output data
with a gain.
@param speedRatio the number of input samples to use for each output sample
@param inputSamples the source data to read from. This must contain at
least (speedRatio * numOutputSamplesToProduce) samples.
@param outputSamples the buffer to write the results to - the result values will be added
to any pre-existing data in this buffer after being multiplied by
the gain factor
@param numOutputSamplesToProduce the number of output samples that should be created
@param available the number of available input samples. If it needs more samples
than available, it either wraps back for wrapAround samples, or
it feeds zeroes
@param wrapAround if the stream exceeds available samples, it wraps back for
wrapAround samples. If wrapAround is set to 0, it will feed zeroes.
@param gain a gain factor to multiply the resulting samples by before
adding them to the destination buffer
@returns the actual number of input samples that were used
*/
int processAdding (double speedRatio,
const float* inputSamples,
float* outputSamples,
int numOutputSamplesToProduce,
int available,
int wrapAround,
float gain) noexcept;
private:
float lastInputSamples[5];
double subSamplePos;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LagrangeInterpolator)
};
} // namespace juce

+ 10026
- 0
modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp
File diff suppressed because it is too large
View File


+ 44
- 0
modules/juce_core/maths/juce_MathsFunctions.h View File

@@ -130,6 +130,50 @@ Type jmap (Type sourceValue, Type sourceRangeMin, Type sourceRangeMax, Type targ
return targetRangeMin + ((targetRangeMax - targetRangeMin) * (sourceValue - sourceRangeMin)) / (sourceRangeMax - sourceRangeMin);
}
/** Remaps a normalised value (between 0 and 1) to a logarithmic target range.
The entire target range must be greater than zero.
@see mapFromLog10
@code
mapToLog10 (0.5, 0.4, 40.0) == 4.0
@endcode
*/
template <typename Type>
Type mapToLog10 (Type value0To1, Type logRangeMin, Type logRangeMax)
{
jassert (logRangeMin > 0);
jassert (logRangeMax > 0);
auto logMin = std::log10 (logRangeMin);
auto logMax = std::log10 (logRangeMax);
return std::pow ((Type) 10.0, value0To1 * (logMax - logMin) + logMin);
}
/** Remaps a logarithmic value in a target range to a normalised value (between 0 and 1).
The entire target range must be greater than zero.
@see mapToLog10
@code
mapFromLog10 (4.0, 0.4, 40.0) == 0.5
@endcode
*/
template <typename Type>
Type mapFromLog10 (Type valueInLogRange, Type logRangeMin, Type logRangeMax)
{
jassert (logRangeMin > 0);
jassert (logRangeMax > 0);
auto logMin = std::log10 (logRangeMin);
auto logMax = std::log10 (logRangeMax);
return (std::log10 (valueInLogRange) - logMin) / (logMax - logMin);
}
/** Scans an array of values, returning the minimum value that it contains. */
template <typename Type>
Type findMinimum (const Type* data, int numValues)


+ 3
- 0
modules/juce_core/threads/juce_SpinLock.h View File

@@ -75,6 +75,9 @@ public:
/** Provides the type of scoped unlocker to use with a SpinLock. */
using ScopedUnlockType = GenericScopedUnlock<SpinLock>;
/** Provides the type of scoped try-lock to use for locking a SpinLock. */
using ScopedTryLockType = GenericScopedTryLock<SpinLock>;
private:
//==============================================================================
mutable Atomic<int> lock;


+ 4
- 4
modules/juce_dsp/filter_design/juce_FilterDesign.cpp View File

@@ -545,7 +545,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
{
arrayFilters.add (*IIR::Coefficients<FloatType>::makeFirstOrderLowPass (sampleRate, frequency));
for (auto i = 0; i < order / 2; ++i)
for (int i = 0; i < order / 2; ++i)
{
auto Q = 1.0 / (2.0 * std::cos ((i + 1.0) * MathConstants<double>::pi / order));
arrayFilters.add (*IIR::Coefficients<FloatType>::makeLowPass (sampleRate, frequency,
@@ -554,7 +554,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
}
else
{
for (auto i = 0; i < order / 2; ++i)
for (int i = 0; i < order / 2; ++i)
{
auto Q = 1.0 / (2.0 * std::cos ((2.0 * i + 1.0) * MathConstants<double>::pi / (order * 2.0)));
arrayFilters.add (*IIR::Coefficients<FloatType>::makeLowPass (sampleRate, frequency,
@@ -580,7 +580,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
{
arrayFilters.add (*IIR::Coefficients<FloatType>::makeFirstOrderHighPass (sampleRate, frequency));
for (auto i = 0; i < order / 2; ++i)
for (int i = 0; i < order / 2; ++i)
{
auto Q = 1.0 / (2.0 * std::cos ((i + 1.0) * MathConstants<double>::pi / order));
arrayFilters.add (*IIR::Coefficients<FloatType>::makeHighPass (sampleRate, frequency,
@@ -589,7 +589,7 @@ ReferenceCountedArray<IIR::Coefficients<FloatType>>
}
else
{
for (auto i = 0; i < order / 2; ++i)
for (int i = 0; i < order / 2; ++i)
{
auto Q = 1.0 / (2.0 * std::cos ((2.0 * i + 1.0) * MathConstants<double>::pi / (order * 2.0)));
arrayFilters.add (*IIR::Coefficients<FloatType>::makeHighPass (sampleRate, frequency,


+ 2
- 2
modules/juce_dsp/frequency/juce_Convolution.cpp View File

@@ -685,7 +685,7 @@ struct Convolution::Pimpl : private Thread
/** This function copies a buffer to a temporary location, so that any external
audio source can be processed then in the dedicated thread.
*/
void copyBufferToTemporaryLocation (dsp::AudioBlock<float> block)
void copyBufferToTemporaryLocation (AudioBlock<float> block)
{
const SpinLock::ScopedLockType sl (processLock);
@@ -725,7 +725,7 @@ struct Convolution::Pimpl : private Thread
}
else
{
auto interpolated = dsp::AudioBlock<float> (interpolationBuffer).getSubBlock (0, numSamples);
auto interpolated = AudioBlock<float> (interpolationBuffer).getSubBlock (0, numSamples);
for (size_t channel = 0; channel < numChannels; ++channel)
{


+ 4
- 4
modules/juce_dsp/frequency/juce_FFT.cpp View File

@@ -167,7 +167,7 @@ struct FFTFallback : public FFT::Instance
{
auto* input = reinterpret_cast<Complex<float>*> (d);
for (auto i = size >> 1; i < size; ++i)
for (int i = size >> 1; i < size; ++i)
input[i] = std::conj (input[size - i]);
perform (input, scratch, true);
@@ -681,7 +681,7 @@ struct FFTWImpl : public FFT::Instance
auto size = (1 << order);
if (! ignoreNegativeFreqs)
for (auto i = size >> 1; i < size; ++i)
for (int i = size >> 1; i < size; ++i)
out[i] = std::conj (out[size - i]);
}
@@ -780,7 +780,7 @@ struct IntelFFT : public FFT::Instance
auto size = (1 << order);
if (! ignoreNegativeFreqs)
for (auto i = size >> 1; i < size; ++i)
for (int i = size >> 1; i < size; ++i)
out[i] = std::conj (out[size - i]);
}
@@ -971,7 +971,7 @@ void FFT::performFrequencyOnlyForwardTransform (float* inputOutputData) const no
performRealOnlyForwardTransform (inputOutputData);
auto* out = reinterpret_cast<Complex<float>*> (inputOutputData);
for (auto i = 0; i < size; ++i)
for (int i = 0; i < size; ++i)
inputOutputData[i] = std::abs (out[i]);
zeromem (&inputOutputData[size], static_cast<size_t> (size) * sizeof (float));


+ 13
- 1
modules/juce_dsp/juce_dsp.cpp View File

@@ -49,8 +49,14 @@
#include "processors/juce_FIRFilter.cpp"
#include "processors/juce_IIRFilter.cpp"
#include "processors/juce_LadderFilter.cpp"
#include "processors/juce_FirstOrderTPTFilter.cpp"
#include "processors/juce_Panner.cpp"
#include "processors/juce_Oversampling.cpp"
#include "processors/juce_BallisticsFilter.cpp"
#include "processors/juce_LinkwitzRileyFilter.cpp"
#include "processors/juce_DelayLine.cpp"
#include "processors/juce_DryWetMixer.cpp"
#include "processors/juce_StateVariableTPTFilter.cpp"
#include "maths/juce_SpecialFunctions.cpp"
#include "maths/juce_Matrix.cpp"
#include "maths/juce_LookupTable.cpp"
@@ -58,6 +64,12 @@
#include "frequency/juce_Convolution.cpp"
#include "frequency/juce_Windowing.cpp"
#include "filter_design/juce_FilterDesign.cpp"
#include "widgets/juce_LadderFilter.cpp"
#include "widgets/juce_Compressor.cpp"
#include "widgets/juce_NoiseGate.cpp"
#include "widgets/juce_Limiter.cpp"
#include "widgets/juce_Phaser.cpp"
#include "widgets/juce_Chorus.cpp"
#if JUCE_USE_SIMD
#if defined(__i386__) || defined(__amd64__) || defined(_M_X64) || defined(_X86_) || defined(_M_IX86)


+ 18
- 6
modules/juce_dsp/juce_dsp.h View File

@@ -243,17 +243,29 @@ namespace juce
#include "processors/juce_ProcessorWrapper.h"
#include "processors/juce_ProcessorChain.h"
#include "processors/juce_ProcessorDuplicator.h"
#include "processors/juce_Bias.h"
#include "processors/juce_Gain.h"
#include "processors/juce_WaveShaper.h"
#include "processors/juce_IIRFilter.h"
#include "processors/juce_FIRFilter.h"
#include "processors/juce_Oscillator.h"
#include "processors/juce_LadderFilter.h"
#include "processors/juce_StateVariableFilter.h"
#include "processors/juce_FirstOrderTPTFilter.h"
#include "processors/juce_Panner.h"
#include "processors/juce_DelayLine.h"
#include "processors/juce_Oversampling.h"
#include "processors/juce_Reverb.h"
#include "processors/juce_BallisticsFilter.h"
#include "processors/juce_LinkwitzRileyFilter.h"
#include "processors/juce_DryWetMixer.h"
#include "processors/juce_StateVariableTPTFilter.h"
#include "frequency/juce_FFT.h"
#include "frequency/juce_Convolution.h"
#include "frequency/juce_Windowing.h"
#include "filter_design/juce_FilterDesign.h"
#include "widgets/juce_Reverb.h"
#include "widgets/juce_Bias.h"
#include "widgets/juce_Gain.h"
#include "widgets/juce_WaveShaper.h"
#include "widgets/juce_Oscillator.h"
#include "widgets/juce_LadderFilter.h"
#include "widgets/juce_Compressor.h"
#include "widgets/juce_NoiseGate.h"
#include "widgets/juce_Limiter.h"
#include "widgets/juce_Phaser.h"
#include "widgets/juce_Chorus.h"

+ 121
- 0
modules/juce_dsp/processors/juce_BallisticsFilter.cpp View File

@@ -0,0 +1,121 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
BallisticsFilter<SampleType>::BallisticsFilter()
{
setAttackTime (attackTime);
setReleaseTime (releaseTime);
}
template <typename SampleType>
void BallisticsFilter<SampleType>::setAttackTime (SampleType attackTimeMs)
{
attackTime = attackTimeMs;
cteAT = calculateLimitedCte (static_cast<SampleType> (attackTime));
}
template <typename SampleType>
void BallisticsFilter<SampleType>::setReleaseTime (SampleType releaseTimeMs)
{
releaseTime = releaseTimeMs;
cteRL = calculateLimitedCte (static_cast<SampleType> (releaseTime));
}
template <typename SampleType>
void BallisticsFilter<SampleType>::setLevelCalculationType (LevelCalculationType newLevelType)
{
levelType = newLevelType;
reset();
}
template <typename SampleType>
void BallisticsFilter<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
expFactor = -2.0 * MathConstants<double>::pi * 1000.0 / sampleRate;
setAttackTime (attackTime);
setReleaseTime (releaseTime);
yold.resize (spec.numChannels);
reset();
}
template <typename SampleType>
void BallisticsFilter<SampleType>::reset()
{
reset (0);
}
template <typename SampleType>
void BallisticsFilter<SampleType>::reset (SampleType initialValue)
{
for (auto& old : yold)
old = initialValue;
}
template <typename SampleType>
SampleType BallisticsFilter<SampleType>::processSample (int channel, SampleType inputValue)
{
jassert (isPositiveAndBelow (channel, yold.size()));
SampleType cte = (inputValue > yold[(size_t) channel] ? cteAT : cteRL);
if (levelType == LevelCalculationType::RMS)
inputValue *= inputValue;
SampleType result = inputValue + cte * (yold[(size_t) channel] - inputValue);
yold[(size_t) channel] = result;
if (levelType == LevelCalculationType::RMS)
return std::sqrt (result);
return result;
}
template <typename SampleType>
void BallisticsFilter<SampleType>::snapToZero() noexcept
{
for (auto& old : yold)
util::snapToZero (old);
}
template <typename SampleType>
SampleType BallisticsFilter<SampleType>::calculateLimitedCte (SampleType timeMs) const noexcept
{
return timeMs < static_cast<SampleType> (1.0e-3) ? 0
: static_cast<SampleType> (std::exp (expFactor / timeMs));
}
//==============================================================================
template class BallisticsFilter<float>;
template class BallisticsFilter<double>;
} // namespace dsp
} // namespace juce

+ 142
- 0
modules/juce_dsp/processors/juce_BallisticsFilter.h View File

@@ -0,0 +1,142 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
enum class BallisticsFilterLevelCalculationType
{
peak,
RMS
};
/**
A processor to apply standard attack / release ballistics to an input signal.
This is useful in dynamics processors, envelope followers, modulated audio
effects and for smoothing animation in data visualisation.
@tags{DSP}
*/
template <typename SampleType>
class BallisticsFilter
{
public:
//==============================================================================
using LevelCalculationType = BallisticsFilterLevelCalculationType;
//==============================================================================
/** Constructor. */
BallisticsFilter();
//==============================================================================
/** Sets the attack time in ms.
Attack times less that 0.001 will be snapped to zero and very long attack
times will eventually saturate depending on the numerical precision used.
*/
void setAttackTime (SampleType attackTimeMs);
/** Sets the release time in ms.
Release times less that 0.001 will be snapped to zero and very long release
times will eventually saturate depending on the numerical precision used.
*/
void setReleaseTime (SampleType releaseTimeMs);
/** Sets how the filter levels are calculated.
Level calculation in digital envelope followers is usually performed using
peak detection with a rectifier function (like std::abs) and filtering,
which returns an envelope dependant on the peak or maximum values of the
signal amplitude.
To perform an estimation of the average value of the signal you can use
an RMS (root mean squared) implementation of the ballistics filter instead.
This is useful in some compressor and noise-gate designs, or in specific
types of volume meters.
*/
void setLevelCalculationType (LevelCalculationType newCalculationType);
//==============================================================================
/** Initialises the filter. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the filter. */
void reset();
/** Resets the internal state variables of the filter to the given initial value. */
void reset (SampleType initialValue);
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() <= yold.size());
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
for (size_t channel = 0; channel < numChannels; ++channel)
{
auto* inputSamples = inputBlock .getChannelPointer (channel);
auto* outputSamples = outputBlock.getChannelPointer (channel);
for (size_t i = 0; i < numSamples; ++i)
outputSamples[i] = processSample (inputSamples[i], (int) channel);
}
#if JUCE_SNAP_TO_ZERO
snapToZero();
#endif
}
/** Processes one sample at a time on a given channel. */
SampleType processSample (int channel, SampleType inputValue);
/** Ensure that the state variables are rounded to zero if the state
variables are denormals. This is only needed if you are doing
sample by sample processing.
*/
void snapToZero() noexcept;
private:
//==============================================================================
SampleType calculateLimitedCte (SampleType) const noexcept;
//==============================================================================
std::vector<SampleType> yold;
double sampleRate = 44100.0, expFactor = -0.142;
SampleType attackTime = 1.0, releaseTime = 100.0, cteAT = 0.0, cteRL = 0.0;
LevelCalculationType levelType = LevelCalculationType::peak;
};
} // namespace dsp
} // namespace juce

+ 121
- 0
modules/juce_dsp/processors/juce_DelayLine.cpp View File

@@ -0,0 +1,121 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType, typename InterpolationType>
DelayLine<SampleType, InterpolationType>::DelayLine()
: DelayLine (0)
{
}
template <typename SampleType, typename InterpolationType>
DelayLine<SampleType, InterpolationType>::DelayLine (int maximumDelayInSamples)
{
jassert (maximumDelayInSamples >= 0);
totalSize = jmax (4, maximumDelayInSamples + 1);
sampleRate = 44100.0;
}
//==============================================================================
template <typename SampleType, typename InterpolationType>
void DelayLine<SampleType, InterpolationType>::setDelay (SampleType newDelayInSamples)
{
auto upperLimit = (SampleType) (totalSize - 1);
jassert (isPositiveAndNotGreaterThan (newDelayInSamples, upperLimit));
delay = jlimit ((SampleType) 0, upperLimit, newDelayInSamples);
delayInt = static_cast<int> (std::floor (delay));
delayFrac = delay - (SampleType) delayInt;
updateInternalVariables();
}
template <typename SampleType, typename InterpolationType>
SampleType DelayLine<SampleType, InterpolationType>::getDelay() const
{
return delay;
}
//==============================================================================
template <typename SampleType, typename InterpolationType>
void DelayLine<SampleType, InterpolationType>::prepare (const ProcessSpec& spec)
{
jassert (spec.numChannels > 0);
bufferData.setSize ((int) spec.numChannels, totalSize, false, false, true);
writePos.resize (spec.numChannels);
readPos.resize (spec.numChannels);
v.resize (spec.numChannels);
sampleRate = spec.sampleRate;
reset();
}
template <typename SampleType, typename InterpolationType>
void DelayLine<SampleType, InterpolationType>::reset()
{
for (auto vec : { &writePos, &readPos })
std::fill (vec->begin(), vec->end(), 0);
std::fill (v.begin(), v.end(), static_cast<SampleType> (0));
bufferData.clear();
}
//==============================================================================
template <typename SampleType, typename InterpolationType>
void DelayLine<SampleType, InterpolationType>::pushSample (int channel, SampleType sample)
{
bufferData.setSample (channel, writePos[(size_t) channel], sample);
writePos[(size_t) channel] = (writePos[(size_t) channel] + totalSize - 1) % totalSize;
}
template <typename SampleType, typename InterpolationType>
SampleType DelayLine<SampleType, InterpolationType>::popSample (int channel, SampleType delayInSamples, bool updateReadPointer)
{
if (delayInSamples >= 0)
setDelay(delayInSamples);
auto result = interpolateSample (channel);
if (updateReadPointer)
readPos[(size_t) channel] = (readPos[(size_t) channel] + totalSize - 1) % totalSize;
return result;
}
//==============================================================================
template class DelayLine<float, DelayLineInterpolationTypes::None>;
template class DelayLine<double, DelayLineInterpolationTypes::None>;
template class DelayLine<float, DelayLineInterpolationTypes::Linear>;
template class DelayLine<double, DelayLineInterpolationTypes::Linear>;
template class DelayLine<float, DelayLineInterpolationTypes::Lagrange3rd>;
template class DelayLine<double, DelayLineInterpolationTypes::Lagrange3rd>;
template class DelayLine<float, DelayLineInterpolationTypes::Thiran>;
template class DelayLine<double, DelayLineInterpolationTypes::Thiran>;
} // namespace dsp
} // namespace juce

+ 309
- 0
modules/juce_dsp/processors/juce_DelayLine.h View File

@@ -0,0 +1,309 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
/**
A collection of structs to pass as the template argument when setting the
interpolation type for the DelayLine class.
*/
namespace DelayLineInterpolationTypes
{
/**
No interpolation between successive samples in the delay line will be
performed. This is useful when the delay is a constant integer or to
create lo-fi audio effects.
*/
struct None {};
/**
Successive samples in the delay line will be linearly interpolated. This
type of interpolation has a low compuational cost where the delay can be
modulated in real time, but it also introduces a low-pass filtering effect
into your audio signal.
*/
struct Linear {};
/**
Successive samples in the delay line will be interpolated using a 3rd order
Lagrange interpolator. This method incurs more computational overhead than
linear interpolation but reduces the low-pass filtering effect whilst
remaining amenable to real time delay modulation.
*/
struct Lagrange3rd {};
/**
Successive samples in the delay line will be interpolated using 1st order
Thiran interpolation. This method is very efficient, and features a flat
amplitude frequency response in exchange for less accuracy in the phase
response. This interpolation method is stateful so is unsuitable for
applications requiring fast delay modulation.
*/
struct Thiran {};
}
//==============================================================================
/**
A delay line processor featuring several algorithms for the fractional delay
calculation, block processing, and sample-by-sample processing useful when
modulating the delay in real time or creating a standard delay effect with
feedback.
Note: If you intend to change the delay in real time, you may want to smooth
changes to the delay systematically using either a ramp or a low-pass filter.
@see SmoothedValue, FirstOrderTPTFilter
@tags{DSP}
*/
template <typename SampleType, typename InterpolationType = DelayLineInterpolationTypes::Linear>
class DelayLine
{
public:
//==============================================================================
/** Default constructor. */
DelayLine();
/** Constructor. */
explicit DelayLine (int maximumDelayInSamples);
//==============================================================================
/** Sets the delay in samples. */
void setDelay (SampleType newDelayInSamples);
/** Returns the current delay in samples. */
SampleType getDelay() const;
//==============================================================================
/** Initialises the processor. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the processor. */
void reset();
//==============================================================================
/** Pushes a single sample into one channel of the delay line.
Use this function and popSample instead of process if you need to modulate
the delay in real time instead of using a fixed delay value, or if you want
to code a delay effect with a feedback loop.
@see setDelay, popSample, process
*/
void pushSample (int channel, SampleType sample);
/** Pops a single sample from one channel of the delay line.
Use this function to modulate the delay in real time or implement standard
delay effects with feedback.
@param channel the target channel for the delay line.
@param delayInSamples sets the wanted fractional delay in samples, or -1
to use the value being used before or set with
setDelay function.
@param updateReadPointer should be set to true if you use the function
once for each sample, or false if you need
multi-tap delay capabilities.
@see setDelay, pushSample, process
*/
SampleType popSample (int channel, SampleType delayInSamples = -1, bool updateReadPointer = true);
//==============================================================================
/** Processes the input and output samples supplied in the processing context.
Can be used for block processing when the delay is not going to change
during processing. The delay must first be set by calling setDelay.
@see setDelay
*/
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumChannels() == writePos.size());
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
for (size_t channel = 0; channel < numChannels; ++channel)
{
auto* inputSamples = inputBlock.getChannelPointer (channel);
auto* outputSamples = outputBlock.getChannelPointer (channel);
for (size_t i = 0; i < numSamples; ++i)
{
pushSample ((int) channel, inputSamples[i]);
outputSamples[i] = popSample ((int) channel);
}
}
}
private:
//==============================================================================
template <typename T = InterpolationType>
typename std::enable_if <std::is_same <T, DelayLineInterpolationTypes::None>::value, SampleType>::type
interpolateSample (int channel) const
{
auto index = (readPos[(size_t) channel] + delayInt) % totalSize;
return bufferData.getSample (channel, index);
}
template <typename T = InterpolationType>
typename std::enable_if <std::is_same <T, DelayLineInterpolationTypes::Linear>::value, SampleType>::type
interpolateSample (int channel) const
{
auto index1 = readPos[(size_t) channel] + delayInt;
auto index2 = index1 + 1;
if (index2 >= totalSize)
{
index1 %= totalSize;
index2 %= totalSize;
}
auto value1 = bufferData.getSample (channel, index1);
auto value2 = bufferData.getSample (channel, index2);
return value1 + delayFrac * (value2 - value1);
}
template <typename T = InterpolationType>
typename std::enable_if <std::is_same <T, DelayLineInterpolationTypes::Lagrange3rd>::value, SampleType>::type
interpolateSample (int channel) const
{
auto index1 = readPos[(size_t) channel] + delayInt;
auto index2 = index1 + 1;
auto index3 = index2 + 1;
auto index4 = index3 + 1;
if (index4 >= totalSize)
{
index1 %= totalSize;
index2 %= totalSize;
index3 %= totalSize;
index4 %= totalSize;
}
auto* samples = bufferData.getReadPointer (channel);
auto value1 = samples[index1];
auto value2 = samples[index2];
auto value3 = samples[index3];
auto value4 = samples[index4];
auto d1 = delayFrac - 1.f;
auto d2 = delayFrac - 2.f;
auto d3 = delayFrac - 3.f;
auto c1 = -d1 * d2 * d3 / 6.f;
auto c2 = d2 * d3 * 0.5f;
auto c3 = -d1 * d3 * 0.5f;
auto c4 = d1 * d2 / 6.f;
return value1 * c1 + delayFrac * (value2 * c2 + value3 * c3 + value4 * c4);
}
template <typename T = InterpolationType>
typename std::enable_if <std::is_same <T, DelayLineInterpolationTypes::Thiran>::value, SampleType>::type
interpolateSample (int channel)
{
auto index1 = readPos[(size_t) channel] + delayInt;
auto index2 = index1 + 1;
if (index2 >= totalSize)
{
index1 %= totalSize;
index2 %= totalSize;
}
auto value1 = bufferData.getSample (channel, index1);
auto value2 = bufferData.getSample (channel, index2);
auto output = delayFrac == 0 ? value1 : value2 + alpha * (value1 - v[(size_t) channel]);
v[(size_t) channel] = output;
return output;
}
//==============================================================================
template <typename T = InterpolationType>
typename std::enable_if <std::is_same <T, DelayLineInterpolationTypes::None>::value, void>::type
updateInternalVariables()
{
}
template <typename T = InterpolationType>
typename std::enable_if <std::is_same <T, DelayLineInterpolationTypes::Linear>::value, void>::type
updateInternalVariables()
{
}
template <typename T = InterpolationType>
typename std::enable_if <std::is_same <T, DelayLineInterpolationTypes::Lagrange3rd>::value, void>::type
updateInternalVariables()
{
if (delayInt >= 1)
{
delayFrac++;
delayInt--;
}
}
template <typename T = InterpolationType>
typename std::enable_if <std::is_same <T, DelayLineInterpolationTypes::Thiran>::value, void>::type
updateInternalVariables()
{
if (delayFrac < (SampleType) 0.618 && delayInt >= 1)
{
delayFrac++;
delayInt--;
}
alpha = (1 - delayFrac) / (1 + delayFrac);
}
//==============================================================================
double sampleRate;
//==============================================================================
AudioBuffer<SampleType> bufferData;
std::vector<SampleType> v;
std::vector<int> writePos, readPos;
SampleType delay = 0.0, delayFrac = 0.0;
int delayInt = 0, totalSize = 4;
SampleType alpha = 0.0;
};
} // namespace dsp
} // namespace juce

+ 172
- 0
modules/juce_dsp/processors/juce_DryWetMixer.cpp View File

@@ -0,0 +1,172 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
DryWetMixer<SampleType>::DryWetMixer()
: DryWetMixer (0)
{
}
template <typename SampleType>
DryWetMixer<SampleType>::DryWetMixer (int maximumWetLatencyInSamples)
: dryDelayLine (maximumWetLatencyInSamples)
{
dryDelayLine.setDelay (0);
update();
reset();
}
//==============================================================================
template <typename SampleType>
void DryWetMixer<SampleType>::setMixingRule (MixingRule newRule)
{
currentMixingRule = newRule;
update();
}
template <typename SampleType>
void DryWetMixer<SampleType>::setWetMixProportion (SampleType newWetMixProportion)
{
jassert (isPositiveAndNotGreaterThan (newWetMixProportion, 1.0));
mix = jlimit (static_cast<SampleType> (0.0), static_cast<SampleType> (1.0), newWetMixProportion);
update();
}
template <typename SampleType>
void DryWetMixer<SampleType>::setWetLatency (SampleType wetLatencySamples)
{
dryDelayLine.setDelay (wetLatencySamples);
}
//==============================================================================
template <typename SampleType>
void DryWetMixer<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
dryDelayLine.prepare (spec);
bufferDry.setSize ((int) spec.numChannels, (int) spec.maximumBlockSize, false, false, true);
update();
reset();
}
template <typename SampleType>
void DryWetMixer<SampleType>::reset()
{
dryVolume.reset (sampleRate, 0.05);
wetVolume.reset (sampleRate, 0.05);
dryDelayLine.reset();
}
//==============================================================================
template <typename SampleType>
void DryWetMixer<SampleType>::pushDrySamples (const AudioBlock<const SampleType> drySamples)
{
jassert (drySamples.getNumChannels() <= (size_t) bufferDry.getNumChannels());
auto dryBlock = AudioBlock<SampleType> (bufferDry);
dryBlock = dryBlock.getSubsetChannelBlock (0, drySamples.getNumChannels()).getSubBlock (0, drySamples.getNumSamples());
auto context = ProcessContextNonReplacing<SampleType>(drySamples, dryBlock);
dryDelayLine.process (context);
}
template <typename SampleType>
void DryWetMixer<SampleType>::mixWetSamples (AudioBlock<SampleType> inOutBlock)
{
auto dryBlock = AudioBlock<SampleType> (bufferDry);
dryBlock = dryBlock.getSubsetChannelBlock (0, inOutBlock.getNumChannels()).getSubBlock (0, inOutBlock.getNumSamples());
dryBlock.multiplyBy (dryVolume);
inOutBlock.multiplyBy (wetVolume);
inOutBlock.add (dryBlock);
}
//==============================================================================
template <typename SampleType>
void DryWetMixer<SampleType>::update()
{
SampleType dryValue, wetValue;
switch (currentMixingRule)
{
case MixingRule::balanced:
dryValue = static_cast<SampleType> (2.0) * jmin (static_cast<SampleType> (0.5), static_cast<SampleType> (1.0) - mix);
wetValue = static_cast<SampleType> (2.0) * jmin (static_cast<SampleType> (0.5), mix);
break;
case MixingRule::linear:
dryValue = static_cast<SampleType> (1.0) - mix;
wetValue = mix;
break;
case MixingRule::sin3dB:
dryValue = static_cast<SampleType> (std::sin (0.5 * MathConstants<double>::pi * (1.0 - mix)));
wetValue = static_cast<SampleType> (std::sin (0.5 * MathConstants<double>::pi * mix));
break;
case MixingRule::sin4p5dB:
dryValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * (1.0 - mix)), 1.5));
wetValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * mix), 1.5));
break;
case MixingRule::sin6dB:
dryValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * (1.0 - mix)), 2.0));
wetValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * mix), 2.0));
break;
case MixingRule::squareRoot3dB:
dryValue = std::sqrt (static_cast<SampleType> (1.0) - mix);
wetValue = std::sqrt (mix);
break;
case MixingRule::squareRoot4p5dB:
dryValue = static_cast<SampleType> (std::pow (std::sqrt (1.0 - mix), 1.5));
wetValue = static_cast<SampleType> (std::pow (std::sqrt (mix), 1.5));
break;
default:
dryValue = jmin (static_cast<SampleType> (0.5), static_cast<SampleType> (1.0) - mix);
wetValue = jmin (static_cast<SampleType> (0.5), mix);
break;
}
dryVolume.setTargetValue (dryValue);
wetVolume.setTargetValue (wetValue);
}
//==============================================================================
template class DryWetMixer<float>;
template class DryWetMixer<double>;
} // namespace dsp
} // namespace juce

+ 110
- 0
modules/juce_dsp/processors/juce_DryWetMixer.h View File

@@ -0,0 +1,110 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
enum class DryWetMixingRule
{
linear,
balanced,
sin3dB,
sin4p5dB,
sin6dB,
squareRoot3dB,
squareRoot4p5dB
};
/**
A processor to handle dry/wet mixing of two audio signals, where the wet signal
may have additional latency.
Once a DryWetMixer object is configured, push the dry samples using pushDrySamples
and mix into the fully wet samples using mixWetSamples.
@tags{DSP}
*/
template <typename SampleType>
class DryWetMixer
{
public:
//==============================================================================
using MixingRule = DryWetMixingRule;
//==============================================================================
/** Default constructor. */
DryWetMixer();
/** Constructor. */
explicit DryWetMixer (int maximumWetLatencyInSamples);
//==============================================================================
/** Sets the mix rule. */
void setMixingRule (MixingRule newRule);
/** Sets the current dry/wet mix proportion, with 0.0 being full dry and 1.0
being fully wet.
*/
void setWetMixProportion (SampleType newWetMixProportion);
/** Sets the relative latency of the wet signal path compared to the dry signal
path, and thus the amount of latency compensation that will be added to the
dry samples in this processor.
*/
void setWetLatency (SampleType wetLatencyInSamples);
//==============================================================================
/** Initialises the processor. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the processor. */
void reset();
//==============================================================================
/** Copies the dry path samples into an internal delay line. */
void pushDrySamples (const AudioBlock<const SampleType> drySamples);
/** Mixes the supplied wet samples with the latency-compensated dry samples from
pushDrySamples.
@param wetSamples Input: The AudioBlock references fully wet samples.
Output: The AudioBlock references the wet samples mixed
with the latency compensated dry samples.
@see pushDrySamples
*/
void mixWetSamples (AudioBlock<SampleType> wetSamples);
private:
//==============================================================================
void update();
//==============================================================================
SmoothedValue<SampleType, ValueSmoothingTypes::Linear> dryVolume, wetVolume;
DelayLine<SampleType, DelayLineInterpolationTypes::Thiran> dryDelayLine;
AudioBuffer<SampleType> bufferDry;
SampleType mix = 1.0;
MixingRule currentMixingRule = MixingRule::linear;
double sampleRate = 44100.0;
};
} // namespace dsp
} // namespace juce

+ 114
- 0
modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp View File

@@ -0,0 +1,114 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
FirstOrderTPTFilter<SampleType>::FirstOrderTPTFilter()
{
update();
}
//==============================================================================
template <typename SampleType>
void FirstOrderTPTFilter<SampleType>::setType (Type newValue)
{
filterType = newValue;
}
template <typename SampleType>
void FirstOrderTPTFilter<SampleType>::setCutoffFrequency (SampleType newValue)
{
jassert (isPositiveAndBelow (newValue, static_cast<SampleType> (sampleRate * 0.5)));
cutoffFrequency = newValue;
update();
}
//==============================================================================
template <typename SampleType>
void FirstOrderTPTFilter<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
s1.resize (spec.numChannels);
reset();
}
template <typename SampleType>
void FirstOrderTPTFilter<SampleType>::reset()
{
reset (static_cast<SampleType> (0));
}
template <typename SampleType>
void FirstOrderTPTFilter<SampleType>::reset (SampleType newValue)
{
std::fill (s1.begin(), s1.end(), newValue);
}
//==============================================================================
template <typename SampleType>
SampleType FirstOrderTPTFilter<SampleType>::processSample (int channel, SampleType inputValue)
{
auto& s = s1[(size_t) channel];
auto v = G * (inputValue - s);
auto y = v + s;
s = y + v;
switch (filterType)
{
case Type::lowpass: return y;
case Type::highpass: return inputValue - y;
case Type::allpass: return 2 * y - inputValue;
default: break;
}
jassertfalse;
return y;
}
template <typename SampleType>
void FirstOrderTPTFilter<SampleType>::snapToZero() noexcept
{
for (auto& s : s1)
util::snapToZero (s);
}
//==============================================================================
template <typename SampleType>
void FirstOrderTPTFilter<SampleType>::update()
{
auto g = SampleType (std::tan (juce::MathConstants<double>::pi * cutoffFrequency / sampleRate));
G = g / (1 + g);
}
//==============================================================================
template class FirstOrderTPTFilter<float>;
template class FirstOrderTPTFilter<double>;
} // namespace dsp
} // namespace juce

+ 144
- 0
modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h View File

@@ -0,0 +1,144 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
enum class FirstOrderTPTFilterType
{
lowpass,
highpass,
allpass
};
//==============================================================================
/**
A first order filter class using the TPT (Topology-Preserving Transform) structure.
This filter can be modulated at high rates without producing audio artefacts. See
Vadim Zavalishin's documentation about TPT structures for more information.
Note: Using this class prevents some loud audio artefacts commonly encountered when
changing the cutoff frequency using of other filter simulation structures and IIR
filter classes. However, this class may still require additional smoothing for
cutoff frequency changes.
see StateVariableFilter, IIRFilter, SmoothedValue
@tags{DSP}
*/
template <typename SampleType>
class FirstOrderTPTFilter
{
public:
//==============================================================================
using Type = FirstOrderTPTFilterType;
//==============================================================================
/** Constructor. */
FirstOrderTPTFilter();
//==============================================================================
/** Sets the filter type. */
void setType (Type newType);
/** Sets the cutoff frequency of the filter.
@param newFrequencyHz cutoff frequency in Hz.
*/
void setCutoffFrequency (SampleType newFrequencyHz);
//==============================================================================
/** Returns the type of the filter. */
Type getType() const noexcept { return filterType; }
/** Returns the cutoff frequency of the filter. */
SampleType getCutoffFrequency() const noexcept { return cutoffFrequency; }
//==============================================================================
/** Initialises the filter. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the filter. */
void reset();
/** Resets the internal state variables of the filter to a given value. */
void reset (SampleType newValue);
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() <= s1.size());
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
for (size_t channel = 0; channel < numChannels; ++channel)
{
auto* inputSamples = inputBlock .getChannelPointer (channel);
auto* outputSamples = outputBlock.getChannelPointer (channel);
for (size_t i = 0; i < numSamples; ++i)
outputSamples[i] = processSample ((int) channel, inputSamples[i]);
}
#if JUCE_SNAP_TO_ZERO
snapToZero();
#endif
}
//==============================================================================
/** Processes one sample at a time on a given channel. */
SampleType processSample (int channel, SampleType inputValue);
/** Ensure that the state variables are rounded to zero if the state
variables are denormals. This is only needed if you are doing
sample by sample processing.
*/
void snapToZero() noexcept;
private:
//==============================================================================
void update();
//==============================================================================
SampleType G = 0;
std::vector<SampleType> s1 { 2 };
double sampleRate = 44100.0;
//==============================================================================
Type filterType = Type::lowpass;
SampleType cutoffFrequency = 1000.0;
};
} // namespace dsp
} // namespace juce

+ 5
- 1
modules/juce_dsp/processors/juce_IIRFilter.h View File

@@ -86,7 +86,7 @@ namespace IIR
Note that this clears the processing state, but the type of filter and
its coefficients aren't changed.
*/
void reset() { reset (SampleType {0}); }
void reset() { reset (SampleType {0}); }
/** Resets the filter's processing pipeline to a specific value.
@see reset
@@ -105,6 +105,10 @@ namespace IIR
processInternal<ProcessContext, true> (context);
else
processInternal<ProcessContext, false> (context);
#if JUCE_SNAP_TO_ZERO
snapToZero();
#endif
}
/** Processes a single sample, without any locking.


+ 0
- 162
modules/juce_dsp/processors/juce_LadderFilter.cpp View File

@@ -1,162 +0,0 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename Type>
LadderFilter<Type>::LadderFilter() : state (2)
{
setSampleRate (Type (1000)); // intentionally setting unrealistic default
// sample rate to catch missing initialisation bugs
setResonance (Type (0));
setDrive (Type (1.2));
setMode (Mode::LPF12);
}
//==============================================================================
template <typename Type>
void LadderFilter<Type>::setMode (Mode newValue) noexcept
{
switch (newValue)
{
case Mode::LPF12: A = {{ Type (0), Type (0), Type (1), Type (0), Type (0) }}; comp = Type (0.5); break;
case Mode::HPF12: A = {{ Type (1), Type (-2), Type (1), Type (0), Type (0) }}; comp = Type (0); break;
case Mode::LPF24: A = {{ Type (0), Type (0), Type (0), Type (0), Type (1) }}; comp = Type (0.5); break;
case Mode::HPF24: A = {{ Type (1), Type (-4), Type (6), Type (-4), Type (1) }}; comp = Type (0); break;
default: jassertfalse; break;
}
static constexpr auto outputGain = Type (1.2);
for (auto& a : A)
a *= outputGain;
mode = newValue;
reset();
}
//==============================================================================
template <typename Type>
void LadderFilter<Type>::prepare (const juce::dsp::ProcessSpec& spec)
{
setSampleRate (Type (spec.sampleRate));
setNumChannels (spec.numChannels);
reset();
}
//==============================================================================
template <typename Type>
void LadderFilter<Type>::reset() noexcept
{
for (auto& s : state)
s.fill (Type (0));
cutoffTransformSmoother.setCurrentAndTargetValue (cutoffTransformSmoother.getTargetValue());
scaledResonanceSmoother.setCurrentAndTargetValue (scaledResonanceSmoother.getTargetValue());
}
//==============================================================================
template <typename Type>
void LadderFilter<Type>::setCutoffFrequencyHz (Type newValue) noexcept
{
jassert (newValue > Type (0));
cutoffFreqHz = newValue;
updateCutoffFreq();
}
//==============================================================================
template <typename Type>
void LadderFilter<Type>::setResonance (Type newValue) noexcept
{
jassert (newValue >= Type (0) && newValue <= Type (1));
resonance = newValue;
updateResonance();
}
//==============================================================================
template <typename Type>
void LadderFilter<Type>::setDrive (Type newValue) noexcept
{
jassert (newValue >= Type (1));
drive = newValue;
gain = std::pow (drive, Type (-2.642)) * Type (0.6103) + Type (0.3903);
drive2 = drive * Type (0.04) + Type (0.96);
gain2 = std::pow (drive2, Type (-2.642)) * Type (0.6103) + Type (0.3903);
}
//==============================================================================
template <typename Type>
Type LadderFilter<Type>::processSample (Type inputValue, size_t channelToUse) noexcept
{
auto& s = state[channelToUse];
const auto a1 = cutoffTransformValue;
const auto g = a1 * Type (-1) + Type (1);
const auto b0 = g * Type (0.76923076923);
const auto b1 = g * Type (0.23076923076);
const auto dx = gain * saturationLUT (drive * inputValue);
const auto a = dx + scaledResonanceValue * Type (-4) * (gain2 * saturationLUT (drive2 * s[4]) - dx * comp);
const auto b = b1 * s[0] + a1 * s[1] + b0 * a;
const auto c = b1 * s[1] + a1 * s[2] + b0 * b;
const auto d = b1 * s[2] + a1 * s[3] + b0 * c;
const auto e = b1 * s[3] + a1 * s[4] + b0 * d;
s[0] = a;
s[1] = b;
s[2] = c;
s[3] = d;
s[4] = e;
return a * A[0] + b * A[1] + c * A[2] + d * A[3] + e * A[4];
}
//==============================================================================
template <typename Type>
void LadderFilter<Type>::updateSmoothers() noexcept
{
cutoffTransformValue = cutoffTransformSmoother.getNextValue();
scaledResonanceValue = scaledResonanceSmoother.getNextValue();
}
//==============================================================================
template <typename Type>
void LadderFilter<Type>::setSampleRate (Type newValue) noexcept
{
jassert (newValue > Type (0));
cutoffFreqScaler = Type (-2.0 * juce::MathConstants<double>::pi) / newValue;
static constexpr Type smootherRampTimeSec = Type (0.05);
cutoffTransformSmoother.reset (newValue, smootherRampTimeSec);
scaledResonanceSmoother.reset (newValue, smootherRampTimeSec);
updateCutoffFreq();
}
//==============================================================================
template class LadderFilter<float>;
template class LadderFilter<double>;
} // namespace dsp
} // namespace juce

+ 142
- 0
modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp View File

@@ -0,0 +1,142 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
LinkwitzRileyFilter<SampleType>::LinkwitzRileyFilter()
{
update();
}
//==============================================================================
template <typename SampleType>
void LinkwitzRileyFilter<SampleType>::setType (Type newType)
{
filterType = newType;
}
template <typename SampleType>
void LinkwitzRileyFilter<SampleType>::setCutoffFrequency (SampleType newCutoffFrequencyHz)
{
jassert (isPositiveAndBelow (newCutoffFrequencyHz, static_cast<SampleType> (sampleRate * 0.5)));
cutoffFrequency = newCutoffFrequencyHz;
update();
}
//==============================================================================
template <typename SampleType>
void LinkwitzRileyFilter<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
update();
s1.resize (spec.numChannels);
s2.resize (spec.numChannels);
s3.resize (spec.numChannels);
s4.resize (spec.numChannels);
reset();
}
template <typename SampleType>
void LinkwitzRileyFilter<SampleType>::reset()
{
for (auto s : { &s1, &s2, &s3, &s4 })
std::fill (s->begin(), s->end(), static_cast<SampleType> (0));
}
template <typename SampleType>
void LinkwitzRileyFilter<SampleType>::snapToZero() noexcept
{
for (auto s : { &s1, &s2, &s3, &s4 })
for (auto& element : *s)
util::snapToZero (element);
}
//==============================================================================
template <typename SampleType>
SampleType LinkwitzRileyFilter<SampleType>::processSample (int channel, SampleType inputValue)
{
auto yH = (inputValue - (R2 + g) * s1[(size_t) channel] - s2[(size_t) channel]) * h;
auto yB = g * yH + s1[(size_t) channel];
s1[(size_t) channel] = g * yH + yB;
auto yL = g * yB + s2[(size_t) channel];
s2[(size_t) channel] = g * yB + yL;
if (filterType == Type::allpass)
return yL - R2 * yB + yH;
auto yH2 = ((filterType == Type::lowpass ? yL : yH) - (R2 + g) * s3[(size_t) channel] - s4[(size_t) channel]) * h;
auto yB2 = g * yH2 + s3[(size_t) channel];
s3[(size_t) channel] = g * yH2 + yB2;
auto yL2 = g * yB2 + s4[(size_t) channel];
s4[(size_t) channel] = g * yB2 + yL2;
return filterType == Type::lowpass ? yL2 : yH2;
}
template <typename SampleType>
void LinkwitzRileyFilter<SampleType>::processSample (int channel, SampleType inputValue, SampleType &outputLow, SampleType &outputHigh)
{
auto yH = (inputValue - (R2 + g) * s1[(size_t) channel] - s2[(size_t) channel]) * h;
auto yB = g * yH + s1[(size_t) channel];
s1[(size_t) channel] = g * yH + yB;
auto yL = g * yB + s2[(size_t) channel];
s2[(size_t) channel] = g * yB + yL;
auto yH2 = (yL - (R2 + g) * s3[(size_t) channel] - s4[(size_t) channel]) * h;
auto yB2 = g * yH2 + s3[(size_t) channel];
s3[(size_t) channel] = g * yH2 + yB2;
auto yL2 = g * yB2 + s4[(size_t) channel];
s4[(size_t) channel] = g * yB2 + yL2;
outputLow = yL2;
outputHigh = yL - R2 * yB + yH - yL2;
}
template <typename SampleType>
void LinkwitzRileyFilter<SampleType>::update()
{
g = (SampleType) std::tan (MathConstants<double>::pi * cutoffFrequency / sampleRate);
R2 = (SampleType) std::sqrt (2.0);
h = (SampleType) (1.0 / (1.0 + R2 * g + g * g));
}
//==============================================================================
template class LinkwitzRileyFilter<float>;
template class LinkwitzRileyFilter<double>;
} // namespace dsp
} // namespace juce

+ 136
- 0
modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h View File

@@ -0,0 +1,136 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
enum class LinkwitzRileyFilterType
{
lowpass,
highpass,
allpass
};
/**
A filter class designed to perform multi-band separation using the TPT
(Topology-Preserving Transform) structure.
Linkwitz-Riley filters are widely used in audio crossovers that have two outputs,
a low-pass and a high-pass, such that their sum is equivalent to an all-pass filter
with a flat magnitude frequency response. The Linkwitz-Riley filters available in
this class are designed to have a -24 dB/octave slope (LR 4th order).
@tags{DSP}
*/
template <typename SampleType>
class LinkwitzRileyFilter
{
public:
//==============================================================================
using Type = LinkwitzRileyFilterType;
//==============================================================================
/** Constructor. */
LinkwitzRileyFilter();
//==============================================================================
/** Sets the filter type. */
void setType (Type newType);
/** Sets the cutoff frequency of the filter in Hz. */
void setCutoffFrequency (SampleType newCutoffFrequencyHz);
//==============================================================================
/** Returns the type of the filter. */
Type getType() const noexcept { return filterType; }
/** Returns the cutoff frequency of the filter. */
SampleType getCutoffFrequency() const noexcept { return cutoffFrequency; }
//==============================================================================
/** Initialises the filter. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the filter. */
void reset();
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() <= s1.size());
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
for (size_t channel = 0; channel < numChannels; ++channel)
{
auto* inputSamples = inputBlock.getChannelPointer (channel);
auto* outputSamples = outputBlock.getChannelPointer (channel);
for (size_t i = 0; i < numSamples; ++i)
outputSamples[i] = processSample ((int) channel, inputSamples[i]);
}
#if JUCE_SNAP_TO_ZERO
snapToZero();
#endif
}
/** Performs the filter operation on a single sample at a time. */
SampleType processSample (int channel, SampleType inputValue);
/** Performs the filter operation on a single sample at a time, and returns both
the low-pass and the high-pass outputs of the TPT structure.
*/
void processSample (int channel, SampleType inputValue, SampleType &outputLow, SampleType &outputHigh);
/** Ensure that the state variables are rounded to zero if the state
variables are denormals. This is only needed if you are doing
sample by sample processing.
*/
void snapToZero() noexcept;
private:
//==============================================================================
void update();
//==============================================================================
SampleType g, R2, h;
std::vector<SampleType> s1, s2, s3, s4;
double sampleRate = 44100.0;
SampleType cutoffFrequency = 2000.0;
Type filterType = Type::lowpass;
};
} // namespace dsp
} // namespace juce

+ 48
- 6
modules/juce_dsp/processors/juce_Oversampling.cpp View File

@@ -356,8 +356,9 @@ struct Oversampling2TimesPolyphaseIIR : public Oversampling<SampleType>::Oversa
}
}
// Snap To Zero
#if JUCE_SNAP_TO_ZERO
snapToZero (true);
#endif
}
void processSamplesDown (AudioBlock<SampleType>& outputBlock) override
@@ -414,8 +415,9 @@ struct Oversampling2TimesPolyphaseIIR : public Oversampling<SampleType>::Oversa
delayDown.setUnchecked (static_cast<int> (channel), delay);
}
// Snap To Zero
#if JUCE_SNAP_TO_ZERO
snapToZero (false);
#endif
}
void snapToZero (bool snapUpProcessing)
@@ -498,10 +500,10 @@ private:
coeffs.coefficients.clear();
auto inversion = one / denominator[0];
for (auto i = 0; i <= numerator.getOrder(); ++i)
for (int i = 0; i <= numerator.getOrder(); ++i)
coeffs.coefficients.add (numerator[i] * inversion);
for (auto i = 1; i <= denominator.getOrder(); ++i)
for (int i = 1; i <= denominator.getOrder(); ++i)
coeffs.coefficients.add (denominator[i] * inversion);
return coeffs;
@@ -531,8 +533,9 @@ Oversampling<SampleType>::Oversampling (size_t newNumChannels)
template <typename SampleType>
Oversampling<SampleType>::Oversampling (size_t newNumChannels, size_t newFactor,
FilterType newType, bool isMaximumQuality)
: numChannels (newNumChannels)
FilterType newType, bool isMaximumQuality,
bool useIntegerLatency)
: numChannels (newNumChannels), shouldUseIntegerLatency (useIntegerLatency)
{
jassert (isPositiveAndBelow (newFactor, 5) && numChannels > 0);
@@ -620,8 +623,21 @@ void Oversampling<SampleType>::clearOversamplingStages()
}
//==============================================================================
template <typename SampleType>
void Oversampling<SampleType>::setUsingIntegerLatency (bool useIntegerLatency) noexcept
{
shouldUseIntegerLatency = useIntegerLatency;
}
template <typename SampleType>
SampleType Oversampling<SampleType>::getLatencyInSamples() const noexcept
{
auto latency = getUncompensatedLatency();
return shouldUseIntegerLatency ? latency + fractionalDelay : latency;
}
template <typename SampleType>
SampleType Oversampling<SampleType>::getUncompensatedLatency() const noexcept
{
auto latency = static_cast<SampleType> (0);
size_t order = 1;
@@ -654,6 +670,10 @@ void Oversampling<SampleType>::initProcessing (size_t maximumNumberOfSamplesBefo
currentNumSamples *= stage->factor;
}
ProcessSpec spec = { 0.0, (uint32) maximumNumberOfSamplesBeforeOversampling, (uint32) numChannels };
delay.prepare (spec);
updateDelayLine();
isReady = true;
reset();
}
@@ -666,6 +686,8 @@ void Oversampling<SampleType>::reset() noexcept
if (isReady)
for (auto* stage : stages)
stage->reset();
delay.reset();
}
template <typename SampleType>
@@ -712,6 +734,26 @@ void Oversampling<SampleType>::processSamplesDown (AudioBlock<SampleType>& outpu
}
stages.getFirst()->processSamplesDown (outputBlock);
if (shouldUseIntegerLatency && fractionalDelay > static_cast<SampleType> (0.0))
{
auto context = ProcessContextReplacing<SampleType> (outputBlock);
delay.process (context);
}
}
template <typename SampleType>
void Oversampling<SampleType>::updateDelayLine()
{
auto latency = getUncompensatedLatency();
fractionalDelay = static_cast<SampleType> (1.0) - (latency - std::floor (latency));
if (fractionalDelay == static_cast<SampleType> (1.0))
fractionalDelay = static_cast<SampleType> (0.0);
else if (fractionalDelay < static_cast<SampleType> (0.618))
fractionalDelay += static_cast<SampleType> (1.0);
delay.setDelay (fractionalDelay);
}
template class Oversampling<float>;


+ 63
- 48
modules/juce_dsp/processors/juce_Oversampling.h View File

@@ -21,24 +21,23 @@ namespace juce
namespace dsp
{
//==============================================================================
//===============================================================================
/**
A processing class performing multi-channel oversampling.
A processor that performs multi-channel oversampling.
It can be configured to do 2 times, 4 times, 8 times or 16 times oversampling
using a multi-stage approach, either polyphase allpass IIR filters or FIR
filters for the filtering, and reports successfully the latency added by the
filter stages.
This class can be configured to do a factor of 2, 4, 8 or 16 times
oversampling, using multiple stages, with polyphase allpass IIR filters or FIR
filters, and latency compensation.
The principle of oversampling is to increase the sample rate of a given
non-linear process, to prevent it from creating aliasing. Oversampling works
by upsampling N times the input signal, processing the upsampled signal
with the increased internal sample rate, and downsampling the result to get
back the original processing sample rate.
Choose between FIR or IIR filtering depending on your needs in term of
latency and phase distortion. With FIR filters, the phase is linear but the
latency is maximised. With IIR filtering, the phase is compromised around the
non-linear process to prevent it from creating aliasing. Oversampling works
by upsampling the input signal N times, processing the upsampled signal
with the increased internal sample rate, then downsampling the result to get
back to the original sample rate.
Choose between FIR or IIR filtering depending on your needs in terms of
latency and phase distortion. With FIR filters the phase is linear but the
latency is maximised. With IIR filtering the phase is compromised around the
Nyquist frequency but the latency is minimised.
@see FilterDesign.
@@ -57,52 +56,62 @@ public:
numFilterTypes
};
//==============================================================================
/**
Constructor of the oversampling class. All the processing parameters must be
provided at the creation of the oversampling object.
@param numChannels the number of channels to process with this object
@param factor the processing will perform 2 ^ factor times oversampling
@param type the type of filter design employed for filtering during
oversampling
@param isMaxQuality if the oversampling is done using the maximum quality,
the filters will be more efficient, but the CPU load will
increase as well
*/
Oversampling (size_t numChannels,
size_t factor,
FilterType type,
bool isMaxQuality = true);
//===============================================================================
/** The default constructor.
/** The default constructor of the oversampling class, which can be used to create an
empty object and then add the appropriate stages.
Note: This creates a "dummy" oversampling stage, which needs to be removed first
Note: This creates a "dummy" oversampling stage, which needs to be removed
before adding proper oversampling stages.
@param numChannels the number of channels to process with this object
@see clearOversamplingStages, addOversamplingStage
*/
explicit Oversampling (size_t numChannels = 1);
/** Constructor.
@param numChannels the number of channels to process with this object
@param factor the processing will perform 2 ^ factor times oversampling
@param type the type of filter design employed for filtering during
oversampling
@param isMaxQuality if the oversampling is done using the maximum quality, where
the filters will be more efficient but the CPU load will
increase as well
@param useIntegerLatency if true this processor will add some fractional delay at the
end of the signal path to ensure that the overall latency of
the oversampling is an integer
*/
Oversampling (size_t numChannels,
size_t factor,
FilterType type,
bool isMaxQuality = true,
bool useIntegerLatency = false);
/** Destructor. */
~Oversampling();
//==============================================================================
/** Returns the latency in samples of the whole processing. Use this information
in your main processor to compensate the additional latency involved with
the oversampling, for example with a dry / wet functionality, and to report
the latency to the DAW.
//===============================================================================
/* Sets if this processor should add some fractional delay at the end of the signal
path to ensure that the overall latency of the oversampling is an integer.
*/
void setUsingIntegerLatency (bool shouldUseIntegerLatency) noexcept;
/** Returns the latency in samples of the overall processing. You can use this
information in your main processor to compensate the additional latency
involved with the oversampling, for example with a dry / wet mixer, and to
report the latency to the DAW.
Note: The latency might not be integer, so you might need to round its value
or to compensate it properly in your processing code.
Note: If you have not opted to use an integer latency then the latency may not be
integer, so you might need to round its value or to compensate it properly in
your processing code since plug-ins can only report integer latency values in
samples to the DAW.
*/
SampleType getLatencyInSamples() const noexcept;
/** Returns the current oversampling factor. */
size_t getOversamplingFactor() const noexcept;
//==============================================================================
//===============================================================================
/** Must be called before any processing, to set the buffer sizes of the internal
buffers of the oversampling processing.
*/
@@ -127,7 +136,7 @@ public:
*/
void processSamplesDown (AudioBlock<SampleType>& outputBlock) noexcept;
//==============================================================================
//===============================================================================
/** Adds a new oversampling stage to the Oversampling class, multiplying the
current oversampling factor by two. This is used with the default constructor
to create custom oversampling chains, requiring a call to the
@@ -171,7 +180,7 @@ public:
*/
void clearOversamplingStages();
//==============================================================================
//===============================================================================
size_t factorOversampling = 1;
size_t numChannels = 1;
@@ -180,11 +189,17 @@ public:
#endif
private:
//==============================================================================
//===============================================================================
void updateDelayLine();
SampleType getUncompensatedLatency() const noexcept;
//===============================================================================
OwnedArray<OversamplingStage> stages;
bool isReady = false;
bool isReady = false, shouldUseIntegerLatency = false;
DelayLine<SampleType, DelayLineInterpolationTypes::Thiran> delay { 8 };
SampleType fractionalDelay = 0;
//==============================================================================
//===============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Oversampling)
};


+ 136
- 0
modules/juce_dsp/processors/juce_Panner.cpp View File

@@ -0,0 +1,136 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
Panner<SampleType>::Panner()
{
update();
reset();
}
//==============================================================================
template <typename SampleType>
void Panner<SampleType>::setRule (Rule newRule)
{
currentRule = newRule;
update();
}
template <typename SampleType>
void Panner<SampleType>::setPan (SampleType newPan)
{
jassert (newPan >= -1.0 && newPan <= 1.0);
pan = jlimit (static_cast<SampleType> (-1.0), static_cast<SampleType> (1.0), newPan);
update();
}
//==============================================================================
template <typename SampleType>
void Panner<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
reset();
}
template <typename SampleType>
void Panner<SampleType>::reset()
{
leftVolume .reset (sampleRate, 0.05);
rightVolume.reset (sampleRate, 0.05);
}
//==============================================================================
template <typename SampleType>
void Panner<SampleType>::update()
{
SampleType leftValue, rightValue, boostValue;
auto normalisedPan = static_cast<SampleType> (0.5) * (pan + static_cast<SampleType> (1.0));
switch (currentRule)
{
case Rule::balanced:
leftValue = jmin (static_cast<SampleType> (0.5), static_cast<SampleType> (1.0) - normalisedPan);
rightValue = jmin (static_cast<SampleType> (0.5), normalisedPan);
boostValue = static_cast<SampleType> (2.0);
break;
case Rule::linear:
leftValue = static_cast<SampleType> (1.0) - normalisedPan;
rightValue = normalisedPan;
boostValue = static_cast<SampleType> (2.0);
break;
case Rule::sin3dB:
leftValue = static_cast<SampleType> (std::sin (0.5 * MathConstants<double>::pi * (1.0 - normalisedPan)));
rightValue = static_cast<SampleType> (std::sin (0.5 * MathConstants<double>::pi * normalisedPan));
boostValue = std::sqrt (static_cast<SampleType> (2.0));
break;
case Rule::sin4p5dB:
leftValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * (1.0 - normalisedPan)), 1.5));
rightValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * normalisedPan), 1.5));
boostValue = static_cast<SampleType> (std::pow (2.0, 3.0 / 4.0));
break;
case Rule::sin6dB:
leftValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * (1.0 - normalisedPan)), 2.0));
rightValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * normalisedPan), 2.0));
boostValue = static_cast<SampleType> (2.0);
break;
case Rule::squareRoot3dB:
leftValue = std::sqrt (static_cast<SampleType> (1.0) - normalisedPan);
rightValue = std::sqrt (normalisedPan);
boostValue = std::sqrt (static_cast<SampleType> (2.0));
break;
case Rule::squareRoot4p5dB:
leftValue = static_cast<SampleType> (std::pow (std::sqrt (1.0 - normalisedPan), 1.5));
rightValue = static_cast<SampleType> (std::pow (std::sqrt (normalisedPan), 1.5));
boostValue = static_cast<SampleType> (std::pow (2.0, 3.0 / 4.0));
break;
default:
leftValue = jmin (static_cast<SampleType> (0.5), static_cast<SampleType> (1.0) - normalisedPan);
rightValue = jmin (static_cast<SampleType> (0.5), normalisedPan);
boostValue = static_cast<SampleType> (2.0);
break;
}
leftVolume .setTargetValue (leftValue * boostValue);
rightVolume.setTargetValue (rightValue * boostValue);
}
//==============================================================================
template class Panner<float>;
template class Panner<double>;
} // namespace dsp
} // namespace juce

+ 112
- 0
modules/juce_dsp/processors/juce_Panner.h View File

@@ -0,0 +1,112 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
enum class PannerRule
{
linear,
balanced,
sin3dB,
sin4p5dB,
sin6dB,
squareRoot3dB,
squareRoot4p5dB
};
/**
A processor to perform panning operations on stereo buffers.
@tags{DSP}
*/
template <typename SampleType>
class Panner
{
public:
//==============================================================================
using Rule = PannerRule;
//==============================================================================
/** Constructor. */
Panner();
//==============================================================================
/** Sets the panning rule. */
void setRule (Rule newRule);
/** Sets the current panning value, between -1 (full left) and 1 (full right). */
void setPan (SampleType newPan);
//==============================================================================
/** Initialises the processor. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the processor. */
void reset();
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numInputChannels = inputBlock.getNumChannels();
const auto numOutputChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumSamples() == numSamples);
ignoreUnused (numSamples);
if (numOutputChannels != 2 || numInputChannels == 0 || numInputChannels > 2)
return;
if (numInputChannels == 2)
{
outputBlock.copyFrom (inputBlock);
}
else
{
outputBlock.getSingleChannelBlock (0).copyFrom (inputBlock);
outputBlock.getSingleChannelBlock (1).copyFrom (inputBlock);
}
if (context.isBypassed)
return;
outputBlock.getSingleChannelBlock (0).multiplyBy (leftVolume);
outputBlock.getSingleChannelBlock (1).multiplyBy (rightVolume);
}
private:
//==============================================================================
void update();
//==============================================================================
Rule currentRule = Rule::balanced;
SampleType pan = 0.0;
SmoothedValue<SampleType> leftVolume, rightVolume;
double sampleRate = 44100.0;
};
} // namespace dsp
} // namespace juce

+ 33
- 12
modules/juce_dsp/processors/juce_StateVariableFilter.h View File

@@ -31,14 +31,21 @@ namespace StateVariableFilter
/**
An IIR filter that can perform low, band and high-pass filtering on an audio
signal, with 12 dB of attenuation / octave, using a TPT structure, designed
signal, with 12 dB of attenuation per octave, using a TPT structure, designed
for fast modulation (see Vadim Zavalishin's documentation about TPT
structures for more information). Its behaviour is based on the analog
state variable filter circuit.
Note: The bandpass here is not the one in the RBJ CookBook, its gain can be
Note: The bandpass here is not the one in the RBJ CookBook as its gain can be
higher than 0 dB. For the classic 0 dB bandpass, we need to multiply the
result with R2
result by R2.
Note 2: Using this class prevents some loud audio artefacts commonly encountered when
changing the cutoff frequency using other filter simulation structures and IIR
filter classes. However, this class may still require additional smoothing for
cutoff frequency changes.
see IIRFilter, SmoothedValue
@tags{DSP}
*/
@@ -56,10 +63,19 @@ namespace StateVariableFilter
using ParametersPtr = typename Parameters<NumericType>::Ptr;
//==============================================================================
/** Creates a filter with default parameters. */
Filter() : parameters (new Parameters<NumericType>) { reset(); }
/** Creates a filter with default parameters.
The classes in the StateVariableFilter namespace are deprecated. you should
use the equivalent functionality in the StateVariableTPTFilter class.
*/
JUCE_DEPRECATED_WITH_BODY (Filter(), : parameters (new Parameters<NumericType>) { reset(); })
/** Creates a filter using some parameters.
Filter (ParametersPtr parametersToUse) : parameters (std::move (parametersToUse)) { reset(); }
The classes in the StateVariableFilter namespace are deprecated. you should
use the equivalent functionality in the StateVariableTPTFilter class.
*/
JUCE_DEPRECATED_WITH_BODY (Filter (ParametersPtr parametersToUse), : parameters (std::move (parametersToUse)) { reset(); })
/** Creates a copy of another filter. */
Filter (const Filter&) = default;
@@ -137,7 +153,10 @@ namespace StateVariableFilter
for (size_t i = 0 ; i < n; ++i)
output[i] = processLoop<isBypassed, type> (input[i], state);
#if JUCE_SNAP_TO_ZERO
snapToZero();
#endif
*parameters = state;
}
@@ -173,6 +192,13 @@ namespace StateVariableFilter
JUCE_LEAK_DETECTOR (Filter)
};
enum class StateVariableFilterType
{
lowPass,
bandPass,
highPass
};
//==============================================================================
/**
Structure used for the state variable filter parameters.
@@ -183,12 +209,7 @@ namespace StateVariableFilter
struct Parameters : public ProcessorState
{
//==============================================================================
enum class Type
{
lowPass,
bandPass,
highPass
};
using Type = StateVariableFilterType;
//==============================================================================
/** The type of the IIR filter */


+ 130
- 0
modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp View File

@@ -0,0 +1,130 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
StateVariableTPTFilter<SampleType>::StateVariableTPTFilter()
{
update();
}
template <typename SampleType>
void StateVariableTPTFilter<SampleType>::setType (Type newValue)
{
filterType = newValue;
}
template <typename SampleType>
void StateVariableTPTFilter<SampleType>::setCutoffFrequency (SampleType newCutoffFrequencyHz)
{
jassert (isPositiveAndBelow (newCutoffFrequencyHz, static_cast<SampleType> (sampleRate * 0.5)));
cutoffFrequency = newCutoffFrequencyHz;
update();
}
template <typename SampleType>
void StateVariableTPTFilter<SampleType>::setResonance (SampleType newResonance)
{
jassert (newResonance > static_cast<SampleType> (0));
resonance = newResonance;
update();
}
//==============================================================================
template <typename SampleType>
void StateVariableTPTFilter<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
s1.resize (spec.numChannels);
s2.resize (spec.numChannels);
reset();
update();
}
template <typename SampleType>
void StateVariableTPTFilter<SampleType>::reset()
{
reset (static_cast<SampleType> (0));
}
template <typename SampleType>
void StateVariableTPTFilter<SampleType>::reset (SampleType newValue)
{
for (auto v : { &s1, &s2 })
std::fill (v->begin(), v->end(), newValue);
}
template <typename SampleType>
void StateVariableTPTFilter<SampleType>::snapToZero() noexcept
{
for (auto v : { &s1, &s2 })
for (auto& element : *v)
util::snapToZero (element);
}
//==============================================================================
template <typename SampleType>
SampleType StateVariableTPTFilter<SampleType>::processSample (int channel, SampleType inputValue)
{
auto& ls1 = s1[(size_t) channel];
auto& ls2 = s2[(size_t) channel];
auto yHP = h * (inputValue - ls1 * (g + R2) - ls2);
auto yBP = yHP * g + ls1;
ls1 = yHP * g + yBP;
auto yLP = yBP * g + ls2;
ls2 = yBP * g + yLP;
switch (filterType)
{
case Type::lowpass: return yLP;
case Type::bandpass: return yBP;
case Type::highpass: return yHP;
default: return yLP;
}
}
//==============================================================================
template <typename SampleType>
void StateVariableTPTFilter<SampleType>::update()
{
g = static_cast<SampleType> (std::tan (juce::MathConstants<double>::pi * cutoffFrequency / sampleRate));
R2 = static_cast<SampleType> (1.0 / resonance);
h = static_cast<SampleType> (1.0 / (1.0 + R2 * g + g * g));
}
//==============================================================================
template class StateVariableTPTFilter<float>;
template class StateVariableTPTFilter<double>;
} // namespace dsp
} // namespace juce

+ 159
- 0
modules/juce_dsp/processors/juce_StateVariableTPTFilter.h View File

@@ -0,0 +1,159 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
enum class StateVariableTPTFilterType
{
lowpass,
bandpass,
highpass
};
//==============================================================================
/** An IIR filter that can perform low, band and high-pass filtering on an audio
signal, with 12 dB of attenuation per octave, using a TPT structure, designed
for fast modulation (see Vadim Zavalishin's documentation about TPT
structures for more information). Its behaviour is based on the analog
state variable filter circuit.
Note: The bandpass here is not the one in the RBJ CookBook as its gain can be
higher than 0 dB. For the classic 0 dB bandpass, we need to multiply the
result by R2.
Note 2: Using this class prevents some loud audio artefacts commonly encountered when
changing the cutoff frequency using other filter simulation structures and IIR
filter classes. However, this class may still require additional smoothing for
cutoff frequency changes.
see IIRFilter, SmoothedValue
@tags{DSP}
*/
template <typename SampleType>
class StateVariableTPTFilter
{
public:
//==============================================================================
using Type = StateVariableTPTFilterType;
//==============================================================================
/** Constructor. */
StateVariableTPTFilter();
//==============================================================================
/** Sets the filter type. */
void setType (Type newType);
/** Sets the cutoff frequency of the filter.
@param newFrequencyHz the new cutoff frequency in Hz.
*/
void setCutoffFrequency (SampleType newFrequencyHz);
/** Sets the resonance of the filter.
Note: The bandwidth of the resonance increases with the value of the
parameter. To have a standard 12 dB / octave filter, the value must be set
at 1 / sqrt(2).
*/
void setResonance (SampleType newResonance);
//==============================================================================
/** Returns the type of the filter. */
Type getType() const noexcept { return filterType; }
/** Returns the cutoff frequency of the filter. */
SampleType getCutoffFrequency() const noexcept { return cutoffFrequency; }
/** Returns the resonance of the filter. */
SampleType getResonance() const noexcept { return resonance; }
//==============================================================================
/** Initialises the filter. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the filter. */
void reset();
/** Resets the internal state variables of the filter to a given value. */
void reset (SampleType newValue);
/** Ensure that the state variables are rounded to zero if the state
variables are denormals. This is only needed if you are doing
sample by sample processing.
*/
void snapToZero() noexcept;
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() <= s1.size());
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
for (size_t channel = 0; channel < numChannels; ++channel)
{
auto* inputSamples = inputBlock .getChannelPointer (channel);
auto* outputSamples = outputBlock.getChannelPointer (channel);
for (size_t i = 0; i < numSamples; ++i)
outputSamples[i] = processSample ((int) channel, inputSamples[i]);
}
#if JUCE_SNAP_TO_ZERO
snapToZero();
#endif
}
//==============================================================================
/** Processes one sample at a time on a given channel. */
SampleType processSample (int channel, SampleType inputValue);
private:
//==============================================================================
void update();
//==============================================================================
SampleType g, h, R2;
std::vector<SampleType> s1 { 2 }, s2 { 2 };
double sampleRate = 44100.0;
Type filterType = Type::lowpass;
SampleType cutoffFrequency = static_cast<SampleType> (1000.0),
resonance = static_cast<SampleType> (1.0 / std::sqrt (2.0));
};
} // namespace dsp
} // namespace juce

modules/juce_dsp/processors/juce_Bias.h → modules/juce_dsp/widgets/juce_Bias.h View File

@@ -96,7 +96,7 @@ public:
auto&& outBlock = context.getOutputBlock();
jassert (inBlock.getNumChannels() == outBlock.getNumChannels());
jassert (inBlock.getNumSamples() == outBlock.getNumSamples());
jassert (inBlock.getNumSamples() == outBlock.getNumSamples());
auto len = inBlock.getNumSamples();
auto numChannels = inBlock.getNumChannels();

+ 131
- 0
modules/juce_dsp/widgets/juce_Chorus.cpp View File

@@ -0,0 +1,131 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
Chorus<SampleType>::Chorus()
{
auto oscFunction = [] (SampleType x) { return std::sin (x); };
osc.initialise (oscFunction);
dryWet.setMixingRule (DryWetMixingRule::linear);
}
template <typename SampleType>
void Chorus<SampleType>::setRate (SampleType newRateHz)
{
jassert (isPositiveAndBelow (newRateHz, static_cast<SampleType> (100.0)));
rate = newRateHz;
update();
}
template <typename SampleType>
void Chorus<SampleType>::setDepth (SampleType newDepth)
{
jassert (isPositiveAndNotGreaterThan (newDepth, static_cast<SampleType> (1.0)));
depth = newDepth;
update();
}
template <typename SampleType>
void Chorus<SampleType>::setCentreDelay (SampleType newDelayMs)
{
jassert (isPositiveAndBelow (newDelayMs, static_cast<SampleType> (100.0)));
centreDelay = jlimit (static_cast<SampleType> (1.0), static_cast<SampleType> (100.0), newDelayMs);
}
template <typename SampleType>
void Chorus<SampleType>::setFeedback (SampleType newFeedback)
{
jassert (newFeedback >= static_cast<SampleType> (-1.0) && newFeedback <= static_cast<SampleType> (1.0));
feedback = newFeedback;
update();
}
template <typename SampleType>
void Chorus<SampleType>::setMix (SampleType newMix)
{
jassert (isPositiveAndNotGreaterThan (newMix, static_cast<SampleType> (1.0)));
mix = newMix;
update();
}
//==============================================================================
template <typename SampleType>
void Chorus<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
delay.prepare (spec);
dryWet.prepare (spec);
feedbackVolume.resize (spec.numChannels);
lastOutput.resize (spec.numChannels);
osc.prepare (spec);
bufferDelayTimes.setSize (1, (int) spec.maximumBlockSize, false, false, true);
update();
reset();
}
template <typename SampleType>
void Chorus<SampleType>::reset()
{
std::fill (lastOutput.begin(), lastOutput.end(), static_cast<SampleType> (0));
delay.reset();
osc.reset();
dryWet.reset();
oscVolume.reset (sampleRate, 0.05);
for (auto& vol : feedbackVolume)
vol.reset (sampleRate, 0.05);
}
template <typename SampleType>
void Chorus<SampleType>::update()
{
osc.setFrequency (rate);
oscVolume.setTargetValue (depth * (SampleType) 0.5);
dryWet.setWetMixProportion (mix);
for (auto& vol : feedbackVolume)
vol.setTargetValue (feedback);
}
//==============================================================================
template class Chorus<float>;
template class Chorus<double>;
} // namespace dsp
} // namespace juce

+ 157
- 0
modules/juce_dsp/widgets/juce_Chorus.h View File

@@ -0,0 +1,157 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
/**
A simple chorus DSP widget that modulates the delay of a delay line in order to
create sweeping notches in the magnitude frequency response.
This audio effect can be controlled via the speed and depth of the LFO controlling
the frequency response, a mix control, a feedback control, and the centre delay
of the modulation.
Note: To get classic chorus sounds try to use a centre delay time around 7-8 ms
with a low feeback volume and a low depth. This effect can also be used as a
flanger with a lower centre delay time and a lot of feedback, and as a vibrato
effect if the mix value is 1.
@tags{DSP}
*/
template <typename SampleType>
class Chorus
{
public:
//==============================================================================
/** Constructor. */
Chorus();
//==============================================================================
/** Sets the rate (in Hz) of the LFO modulating the chorus delay line. This rate
must be lower than 100 Hz.
*/
void setRate (SampleType newRateHz);
/** Sets the volume of the LFO modulating the chorus delay line (between 0 and 1).
*/
void setDepth (SampleType newDepth);
/** Sets the centre delay in milliseconds of the chorus delay line modulation.
This delay must be between 1 and 100 ms.
*/
void setCentreDelay (SampleType newDelayMs);
/** Sets the feedback volume (between -1 and 1) of the chorus delay line.
Negative values can be used to get specific chorus sounds.
*/
void setFeedback (SampleType newFeedback);
/** Sets the amount of dry and wet signal in the output of the chorus (between 0
for full dry and 1 for full wet).
*/
void setMix (SampleType newMix);
//==============================================================================
/** Initialises the processor. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the processor. */
void reset();
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumChannels() == lastOutput.size());
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
auto delayValuesBlock = AudioBlock<SampleType>(bufferDelayTimes).getSubBlock (0, numSamples);
auto contextDelay = ProcessContextReplacing<SampleType> (delayValuesBlock);
delayValuesBlock.clear();
osc.process (contextDelay);
delayValuesBlock.multiplyBy (oscVolume);
auto* delaySamples = bufferDelayTimes.getWritePointer (0);
for (size_t i = 0; i < numSamples; ++i)
{
auto lfo = jmax (static_cast<SampleType> (1.0), maximumDelayModulation * delaySamples[i] + centreDelay);
delaySamples[i] = static_cast<SampleType> (lfo * sampleRate / 1000.0);
}
dryWet.pushDrySamples (inputBlock);
for (size_t channel = 0; channel < numChannels; ++channel)
{
auto* inputSamples = inputBlock .getChannelPointer (channel);
auto* outputSamples = outputBlock.getChannelPointer (channel);
for (size_t i = 0; i < numSamples; ++i)
{
auto input = inputSamples[i];
auto output = input - lastOutput[channel];
delay.pushSample ((int) channel, input);
delay.setDelay (delaySamples[i]);
output = delay.popSample ((int) channel);
outputSamples[i] = output;
lastOutput[channel] = output * feedbackVolume[channel].getNextValue();
}
}
dryWet.mixWetSamples (outputBlock);
}
private:
//==============================================================================
void update();
//==============================================================================
Oscillator<SampleType> osc;
DelayLine<SampleType, DelayLineInterpolationTypes::Linear> delay { 5000 };
SmoothedValue<SampleType, ValueSmoothingTypes::Linear> oscVolume;
std::vector<SmoothedValue<SampleType, ValueSmoothingTypes::Linear>> feedbackVolume { 2 };
DryWetMixer<SampleType> dryWet;
std::vector<SampleType> lastOutput { 2 };
AudioBuffer<SampleType> bufferDelayTimes;
double sampleRate = 44100.0;
SampleType rate = 1.0, depth = 0.25, feedback = 0.0, mix = 0.5,
centreDelay = 7.0, maximumDelayModulation = 20.0;
};
} // namespace dsp
} // namespace juce

+ 117
- 0
modules/juce_dsp/widgets/juce_Compressor.cpp View File

@@ -0,0 +1,117 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
Compressor<SampleType>::Compressor()
{
update();
}
//==============================================================================
template <typename SampleType>
void Compressor<SampleType>::setThreshold (SampleType newThreshold)
{
thresholddB = newThreshold;
update();
}
template <typename SampleType>
void Compressor<SampleType>::setRatio (SampleType newRatio)
{
jassert (newRatio >= static_cast<SampleType> (1.0));
ratio = newRatio;
update();
}
template <typename SampleType>
void Compressor<SampleType>::setAttack (SampleType newAttack)
{
attackTime = newAttack;
update();
}
template <typename SampleType>
void Compressor<SampleType>::setRelease (SampleType newRelease)
{
releaseTime = newRelease;
update();
}
//==============================================================================
template <typename SampleType>
void Compressor<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
envelopeFilter.prepare (spec);
update();
reset();
}
template <typename SampleType>
void Compressor<SampleType>::reset()
{
envelopeFilter.reset();
}
//==============================================================================
template <typename SampleType>
SampleType Compressor<SampleType>::processSample (int channel, SampleType inputValue)
{
// Rectifier
auto env = jmax ((SampleType) 0.0, inputValue);
// Ballistics filter
env = envelopeFilter.processSample (channel, env);
// VCA
auto gain = (env < threshold) ? static_cast<SampleType> (1.0)
: std::pow (env * thresholdInverse, ratioInverse - static_cast<SampleType> (1.0));
// Output
return gain * inputValue;
}
template <typename SampleType>
void Compressor<SampleType>::update()
{
threshold = Decibels::decibelsToGain (thresholddB, static_cast<SampleType> (-200.0));
thresholdInverse = static_cast<SampleType> (1.0) / threshold;
ratioInverse = static_cast<SampleType> (1.0) / ratio;
envelopeFilter.setAttackTime (attackTime);
envelopeFilter.setReleaseTime (releaseTime);
}
//==============================================================================
template class Compressor<float>;
template class Compressor<double>;
} // namespace dsp
} // namespace juce

+ 103
- 0
modules/juce_dsp/widgets/juce_Compressor.h View File

@@ -0,0 +1,103 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
/**
A simple compressor with standard threshold, ratio, attack time and release time
controls.
@tags{DSP}
*/
template <typename SampleType>
class Compressor
{
public:
//==============================================================================
/** Constructor. */
Compressor();
//==============================================================================
/** Sets the threshold in dB of the compressor.*/
void setThreshold (SampleType newThreshold);
/** Sets the ratio of the compressor (must be higher or equal to 1).*/
void setRatio (SampleType newRatio);
/** Sets the attack time in milliseconds of the compressor.*/
void setAttack (SampleType newAttack);
/** Sets the release time in milliseconds of the compressor.*/
void setRelease (SampleType newRelease);
//==============================================================================
/** Initialises the processor. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the processor. */
void reset();
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
for (size_t channel = 0; channel < numChannels; ++channel)
{
auto* inputSamples = inputBlock .getChannelPointer (channel);
auto* outputSamples = outputBlock.getChannelPointer (channel);
for (size_t i = 0; i < numSamples; ++i)
outputSamples[i] = processSample ((int) channel, inputSamples[i]);
}
}
/** Performs the processing operation on a single sample at a time. */
SampleType processSample (int channel, SampleType inputValue);
private:
//==============================================================================
void update();
//==============================================================================
SampleType threshold, thresholdInverse, ratioInverse;
BallisticsFilter<SampleType> envelopeFilter;
double sampleRate = 44100.0;
SampleType thresholddB = 0.0, ratio = 1.0, attackTime = 1.0, releaseTime = 100.0;
};
} // namespace dsp
} // namespace juce

modules/juce_dsp/processors/juce_Gain.h → modules/juce_dsp/widgets/juce_Gain.h View File


+ 169
- 0
modules/juce_dsp/widgets/juce_LadderFilter.cpp View File

@@ -0,0 +1,169 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
LadderFilter<SampleType>::LadderFilter() : state (2)
{
setSampleRate (SampleType (1000)); // intentionally setting unrealistic default
// sample rate to catch missing initialisation bugs
setResonance (SampleType (0));
setDrive (SampleType (1.2));
mode = Mode::LPF24;
setMode (Mode::LPF12);
}
//==============================================================================
template <typename SampleType>
void LadderFilter<SampleType>::setMode (Mode newMode) noexcept
{
if (newMode == mode)
return;
switch (newMode)
{
case Mode::LPF12: A = {{ SampleType (0), SampleType (0), SampleType (1), SampleType (0), SampleType (0) }}; comp = SampleType (0.5); break;
case Mode::HPF12: A = {{ SampleType (1), SampleType (-2), SampleType (1), SampleType (0), SampleType (0) }}; comp = SampleType (0); break;
case Mode::BPF12: A = {{ SampleType (0), SampleType (0), SampleType (-1), SampleType (1), SampleType (0) }}; comp = SampleType (0.5); break;
case Mode::LPF24: A = {{ SampleType (0), SampleType (0), SampleType (0), SampleType (0), SampleType (1) }}; comp = SampleType (0.5); break;
case Mode::HPF24: A = {{ SampleType (1), SampleType (-4), SampleType (6), SampleType (-4), SampleType (1) }}; comp = SampleType (0); break;
case Mode::BPF24: A = {{ SampleType (0), SampleType (0), SampleType (1), SampleType (-2), SampleType (1) }}; comp = SampleType (0.5); break;
default: jassertfalse; break;
}
static constexpr auto outputGain = SampleType (1.2);
for (auto& a : A)
a *= outputGain;
mode = newMode;
reset();
}
//==============================================================================
template <typename SampleType>
void LadderFilter<SampleType>::prepare (const ProcessSpec& spec)
{
setSampleRate (SampleType (spec.sampleRate));
setNumChannels (spec.numChannels);
reset();
}
//==============================================================================
template <typename SampleType>
void LadderFilter<SampleType>::reset() noexcept
{
for (auto& s : state)
s.fill (SampleType (0));
cutoffTransformSmoother.setCurrentAndTargetValue (cutoffTransformSmoother.getTargetValue());
scaledResonanceSmoother.setCurrentAndTargetValue (scaledResonanceSmoother.getTargetValue());
}
//==============================================================================
template <typename SampleType>
void LadderFilter<SampleType>::setCutoffFrequencyHz (SampleType newCutoff) noexcept
{
jassert (newCutoff > SampleType (0));
cutoffFreqHz = newCutoff;
updateCutoffFreq();
}
//==============================================================================
template <typename SampleType>
void LadderFilter<SampleType>::setResonance (SampleType newResonance) noexcept
{
jassert (newResonance >= SampleType (0) && newResonance <= SampleType (1));
resonance = newResonance;
updateResonance();
}
//==============================================================================
template <typename SampleType>
void LadderFilter<SampleType>::setDrive (SampleType newDrive) noexcept
{
jassert (newDrive >= SampleType (1));
drive = newDrive;
gain = std::pow (drive, SampleType (-2.642)) * SampleType (0.6103) + SampleType (0.3903);
drive2 = drive * SampleType (0.04) + SampleType (0.96);
gain2 = std::pow (drive2, SampleType (-2.642)) * SampleType (0.6103) + SampleType (0.3903);
}
//==============================================================================
template <typename SampleType>
SampleType LadderFilter<SampleType>::processSample (SampleType inputValue, size_t channelToUse) noexcept
{
auto& s = state[channelToUse];
const auto a1 = cutoffTransformValue;
const auto g = a1 * SampleType (-1) + SampleType (1);
const auto b0 = g * SampleType (0.76923076923);
const auto b1 = g * SampleType (0.23076923076);
const auto dx = gain * saturationLUT (drive * inputValue);
const auto a = dx + scaledResonanceValue * SampleType (-4) * (gain2 * saturationLUT (drive2 * s[4]) - dx * comp);
const auto b = b1 * s[0] + a1 * s[1] + b0 * a;
const auto c = b1 * s[1] + a1 * s[2] + b0 * b;
const auto d = b1 * s[2] + a1 * s[3] + b0 * c;
const auto e = b1 * s[3] + a1 * s[4] + b0 * d;
s[0] = a;
s[1] = b;
s[2] = c;
s[3] = d;
s[4] = e;
return a * A[0] + b * A[1] + c * A[2] + d * A[3] + e * A[4];
}
//==============================================================================
template <typename SampleType>
void LadderFilter<SampleType>::updateSmoothers() noexcept
{
cutoffTransformValue = cutoffTransformSmoother.getNextValue();
scaledResonanceValue = scaledResonanceSmoother.getNextValue();
}
//==============================================================================
template <typename SampleType>
void LadderFilter<SampleType>::setSampleRate (SampleType newValue) noexcept
{
jassert (newValue > SampleType (0));
cutoffFreqScaler = SampleType (-2.0 * juce::MathConstants<double>::pi) / newValue;
static constexpr SampleType smootherRampTimeSec = SampleType (0.05);
cutoffTransformSmoother.reset (newValue, smootherRampTimeSec);
scaledResonanceSmoother.reset (newValue, smootherRampTimeSec);
updateCutoffFreq();
}
//==============================================================================
template class LadderFilter<float>;
template class LadderFilter<double>;
} // namespace dsp
} // namespace juce

modules/juce_dsp/processors/juce_LadderFilter.h → modules/juce_dsp/widgets/juce_LadderFilter.h View File

@@ -21,62 +21,67 @@ namespace juce
namespace dsp
{
enum class LadderFilterMode
{
LPF12, // low-pass 12 dB/octave
HPF12, // high-pass 12 dB/octave
BPF12, // band-pass 12 dB/octave
LPF24, // low-pass 24 dB/octave
HPF24, // high-pass 24 dB/octave
BPF24 // band-pass 24 dB/octave
};
/**
Multi-mode filter based on the Moog ladder filter.
@tags{DSP}
*/
template <typename Type>
template <typename SampleType>
class LadderFilter
{
public:
enum class Mode
{
LPF12, // low-pass 12 dB/octave
HPF12, // high-pass 12 dB/octave
LPF24, // low-pass 24 dB/octave
HPF24 // high-pass 24 dB/octave
};
//==============================================================================
using Mode = LadderFilterMode;
//==============================================================================
/** Creates an uninitialised filter. Call prepare() before first use. */
LadderFilter();
/** Enables or disables the filter. If disabled it will simply pass through the input signal. */
void setEnabled (bool newValue) noexcept { enabled = newValue; }
void setEnabled (bool isEnabled) noexcept { enabled = isEnabled; }
/** Sets filter mode. */
void setMode (Mode newValue) noexcept;
void setMode (Mode newMode) noexcept;
/** Initialises the filter. */
void prepare (const juce::dsp::ProcessSpec& spec);
void prepare (const ProcessSpec& spec);
/** Returns the current number of channels. */
size_t getNumChannels() const noexcept { return state.size(); }
size_t getNumChannels() const noexcept { return state.size(); }
/** Resets the internal state variables of the filter. */
void reset() noexcept;
/** Sets the cutoff frequency of the filter.
@param newValue cutoff frequency in Hz */
void setCutoffFrequencyHz (Type newValue) noexcept;
void setCutoffFrequencyHz (SampleType newCutoff) noexcept;
/** Sets the resonance of the filter.
@param newValue a value between 0 and 1; higher values increase the resonance and can result in self oscillation! */
void setResonance (Type newValue) noexcept;
void setResonance (SampleType newResonance) noexcept;
/** Sets the amount of saturation in the filter.
@param newValue saturation amount; it can be any number greater than or equal to one. Higher values result in more distortion.*/
void setDrive (Type newValue) noexcept;
void setDrive (SampleType newDrive) noexcept;
//==============================================================================
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() <= getNumChannels());
jassert (inputBlock.getNumChannels() == numChannels);
@@ -99,35 +104,36 @@ public:
protected:
//==============================================================================
Type processSample (Type inputValue, size_t channelToUse) noexcept;
SampleType processSample (SampleType inputValue, size_t channelToUse) noexcept;
void updateSmoothers() noexcept;
private:
//==============================================================================
Type drive, drive2, gain, gain2, comp;
void setSampleRate (SampleType newValue) noexcept;
void setNumChannels (size_t newValue) { state.resize (newValue); }
void updateCutoffFreq() noexcept { cutoffTransformSmoother.setTargetValue (std::exp (cutoffFreqHz * cutoffFreqScaler)); }
void updateResonance() noexcept { scaledResonanceSmoother.setTargetValue (jmap (resonance, SampleType (0.1), SampleType (1.0))); }
//==============================================================================
SampleType drive, drive2, gain, gain2, comp;
static constexpr size_t numStates = 5;
std::vector<std::array<Type, numStates>> state;
std::array<Type, numStates> A;
std::vector<std::array<SampleType, numStates>> state;
std::array<SampleType, numStates> A;
SmoothedValue<Type> cutoffTransformSmoother, scaledResonanceSmoother;
Type cutoffTransformValue, scaledResonanceValue;
SmoothedValue<SampleType> cutoffTransformSmoother, scaledResonanceSmoother;
SampleType cutoffTransformValue, scaledResonanceValue;
LookupTableTransform<Type> saturationLUT { [] (Type x) { return std::tanh (x); }, Type (-5), Type (5), 128 };
LookupTableTransform<SampleType> saturationLUT { [] (SampleType x) { return std::tanh (x); },
SampleType (-5), SampleType (5), 128 };
Type cutoffFreqHz { Type (200) };
Type resonance;
SampleType cutoffFreqHz { SampleType (200) };
SampleType resonance;
Type cutoffFreqScaler;
SampleType cutoffFreqScaler;
Mode mode;
bool enabled = true;
//==============================================================================
void setSampleRate (Type newValue) noexcept;
void setNumChannels (size_t newValue) { state.resize (newValue); }
void updateCutoffFreq() noexcept { cutoffTransformSmoother.setTargetValue (std::exp (cutoffFreqHz * cutoffFreqScaler)); }
void updateResonance() noexcept { scaledResonanceSmoother.setTargetValue (jmap (resonance, Type (0.1), Type (1.0))); }
};
} // namespace dsp

+ 91
- 0
modules/juce_dsp/widgets/juce_Limiter.cpp View File

@@ -0,0 +1,91 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
void Limiter<SampleType>::setThreshold (SampleType newThreshold)
{
thresholddB = newThreshold;
update();
}
template <typename SampleType>
void Limiter<SampleType>::setRelease (SampleType newRelease)
{
releaseTime = newRelease;
update();
}
//==============================================================================
template <typename SampleType>
void Limiter<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
firstStageCompressor.prepare (spec);
secondStageCompressor.prepare (spec);
update();
reset();
}
template <typename SampleType>
void Limiter<SampleType>::reset()
{
firstStageCompressor.reset();
secondStageCompressor.reset();
outputVolume.reset (sampleRate, 0.001);
}
//==============================================================================
template <typename SampleType>
void Limiter<SampleType>::update()
{
firstStageCompressor.setThreshold ((SampleType) -10.0);
firstStageCompressor.setRatio ((SampleType) 4.0);
firstStageCompressor.setAttack ((SampleType) 2.0);
firstStageCompressor.setRelease ((SampleType) 200.0);
secondStageCompressor.setThreshold (thresholddB);
secondStageCompressor.setRatio ((SampleType) 1000.0);
secondStageCompressor.setAttack ((SampleType) 0.001);
secondStageCompressor.setRelease (releaseTime);
auto ratioInverse = (SampleType) (1.0 / 4.0);
auto gain = (SampleType) std::pow (10.0, 10.0 * (1.0 - ratioInverse) / 40.0);
gain *= Decibels::decibelsToGain (-thresholddB, (SampleType) -100.0);
outputVolume.setTargetValue (gain);
}
//==============================================================================
template class Limiter<float>;
template class Limiter<double>;
} // namespace dsp
} // namespace juce

+ 98
- 0
modules/juce_dsp/widgets/juce_Limiter.h View File

@@ -0,0 +1,98 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
/**
A simple limiter with standard threshold and release time controls, featuring
two compressors and a hard clipper at 0 dB.
@tags{DSP}
*/
template <typename SampleType>
class Limiter
{
public:
//==============================================================================
/** Constructor. */
Limiter() = default;
//==============================================================================
/** Sets the threshold in dB of the limiter.*/
void setThreshold (SampleType newThreshold);
/** Sets the release time in milliseconds of the limiter.*/
void setRelease (SampleType newRelease);
//==============================================================================
/** Initialises the processor. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the processor. */
void reset();
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
firstStageCompressor.process (context);
auto secondContext = ProcessContextReplacing<SampleType> (outputBlock);
secondStageCompressor.process (secondContext);
outputBlock.multiplyBy (outputVolume);
for (size_t channel = 0; channel < numChannels; ++channel)
{
FloatVectorOperations::clip (outputBlock.getChannelPointer (channel), outputBlock.getChannelPointer (channel),
(SampleType) -1.0, (SampleType) 1.0, (int) numSamples);
}
}
private:
//==============================================================================
void update();
//==============================================================================
Compressor<SampleType> firstStageCompressor, secondStageCompressor;
SmoothedValue<SampleType, ValueSmoothingTypes::Linear> outputVolume;
double sampleRate = 44100.0;
SampleType thresholddB = -10.0, releaseTime = 100.0;
};
} // namespace dsp
} // namespace juce

+ 122
- 0
modules/juce_dsp/widgets/juce_NoiseGate.cpp View File

@@ -0,0 +1,122 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
NoiseGate<SampleType>::NoiseGate()
{
update();
RMSFilter.setLevelCalculationType (BallisticsFilterLevelCalculationType::RMS);
RMSFilter.setAttackTime (static_cast<SampleType> (0.0));
RMSFilter.setReleaseTime (static_cast<SampleType> (50.0));
}
template <typename SampleType>
void NoiseGate<SampleType>::setThreshold (SampleType newValue)
{
thresholddB = newValue;
update();
}
template <typename SampleType>
void NoiseGate<SampleType>::setRatio (SampleType newRatio)
{
jassert (newRatio >= static_cast<SampleType> (1.0));
ratio = newRatio;
update();
}
template <typename SampleType>
void NoiseGate<SampleType>::setAttack (SampleType newAttack)
{
attackTime = newAttack;
update();
}
template <typename SampleType>
void NoiseGate<SampleType>::setRelease (SampleType newRelease)
{
releaseTime = newRelease;
update();
}
//==============================================================================
template <typename SampleType>
void NoiseGate<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
RMSFilter.prepare (spec);
envelopeFilter.prepare (spec);
update();
reset();
}
template <typename SampleType>
void NoiseGate<SampleType>::reset()
{
RMSFilter.reset();
envelopeFilter.reset();
}
//==============================================================================
template <typename SampleType>
SampleType NoiseGate<SampleType>::processSample (int channel, SampleType sample)
{
// RMS ballistics filter
auto env = RMSFilter.processSample (channel, sample);
// Ballistics filter
env = envelopeFilter.processSample (channel, env);
// VCA
auto gain = (env > threshold) ? static_cast<SampleType> (1.0)
: std::pow (env * thresholdInverse, currentRatio - static_cast<SampleType> (1.0));
// Output
return gain * sample;
}
template <typename SampleType>
void NoiseGate<SampleType>::update()
{
threshold = Decibels::decibelsToGain (thresholddB, static_cast<SampleType> (-200.0));
thresholdInverse = static_cast<SampleType> (1.0) / threshold;
currentRatio = ratio;
envelopeFilter.setAttackTime (attackTime);
envelopeFilter.setReleaseTime (releaseTime);
}
//==============================================================================
template class NoiseGate<float>;
template class NoiseGate<double>;
} // namespace dsp
} // namespace juce

+ 103
- 0
modules/juce_dsp/widgets/juce_NoiseGate.h View File

@@ -0,0 +1,103 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
/**
A simple noise gate with standard threshold, ratio, attack time and
release time controls. Can be used as an expander if the ratio is low.
@tags{DSP}
*/
template <typename SampleType>
class NoiseGate
{
public:
//==============================================================================
/** Constructor. */
NoiseGate();
//==============================================================================
/** Sets the threshold in dB of the noise-gate.*/
void setThreshold (SampleType newThreshold);
/** Sets the ratio of the noise-gate (must be higher or equal to 1).*/
void setRatio (SampleType newRatio);
/** Sets the attack time in milliseconds of the noise-gate.*/
void setAttack (SampleType newAttack);
/** Sets the release time in milliseconds of the noise-gate.*/
void setRelease (SampleType newRelease);
//==============================================================================
/** Initialises the processor. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the processor. */
void reset();
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
for (size_t channel = 0; channel < numChannels; ++channel)
{
auto* inputSamples = inputBlock .getChannelPointer (channel);
auto* outputSamples = outputBlock.getChannelPointer (channel);
for (size_t i = 0; i < numSamples; ++i)
outputSamples[i] = processSample ((int) channel, inputSamples[i]);
}
}
/** Performs the processing operation on a single sample at a time. */
SampleType processSample (int channel, SampleType inputValue);
private:
//==============================================================================
void update();
//==============================================================================
SampleType threshold, thresholdInverse, currentRatio;
BallisticsFilter<SampleType> envelopeFilter, RMSFilter;
double sampleRate = 44100.0;
SampleType thresholddB = -100, ratio = 10.0, attackTime = 1.0, releaseTime = 100.0;
};
} // namespace dsp
} // namespace juce

modules/juce_dsp/processors/juce_Oscillator.h → modules/juce_dsp/widgets/juce_Oscillator.h View File


+ 147
- 0
modules/juce_dsp/widgets/juce_Phaser.cpp View File

@@ -0,0 +1,147 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
//==============================================================================
template <typename SampleType>
Phaser<SampleType>::Phaser()
{
auto oscFunction = [] (SampleType x) { return std::sin (x); };
osc.initialise (oscFunction);
for (auto n = 0; n < numStages; ++n)
{
filters.add (new FirstOrderTPTFilter<SampleType>());
filters[n]->setType (FirstOrderTPTFilterType::allpass);
}
dryWet.setMixingRule (DryWetMixingRule::linear);
}
template <typename SampleType>
void Phaser<SampleType>::setRate (SampleType newRateHz)
{
jassert (isPositiveAndBelow (newRateHz, static_cast<SampleType> (100.0)));
rate = newRateHz;
update();
}
template <typename SampleType>
void Phaser<SampleType>::setDepth (SampleType newDepth)
{
jassert (isPositiveAndNotGreaterThan (newDepth, static_cast<SampleType> (1.0)));
depth = newDepth;
update();
}
template <typename SampleType>
void Phaser<SampleType>::setCentreFrequency (SampleType newCentreHz)
{
jassert (isPositiveAndBelow (newCentreHz, static_cast<SampleType> (sampleRate * 0.5)));
centreFrequency = newCentreHz;
normCentreFrequency = mapToLog10 (centreFrequency, static_cast<SampleType> (20.0), static_cast<SampleType> (jmin (20000.0, 0.49 * sampleRate)));
}
template <typename SampleType>
void Phaser<SampleType>::setFeedback (SampleType newFeedback)
{
jassert (newFeedback >= static_cast<SampleType> (-1.0) && newFeedback <= static_cast<SampleType> (1.0));
feedback = newFeedback;
update();
}
template <typename SampleType>
void Phaser<SampleType>::setMix (SampleType newMix)
{
jassert (isPositiveAndNotGreaterThan (newMix, static_cast<SampleType> (1.0)));
mix = newMix;
update();
}
//==============================================================================
template <typename SampleType>
void Phaser<SampleType>::prepare (const ProcessSpec& spec)
{
jassert (spec.sampleRate > 0);
jassert (spec.numChannels > 0);
sampleRate = spec.sampleRate;
for (auto n = 0; n < numStages; ++n)
filters[n]->prepare (spec);
dryWet.prepare (spec);
feedbackVolume.resize (spec.numChannels);
lastOutput.resize (spec.numChannels);
auto specDown = spec;
specDown.sampleRate /= (double) maxUpdateCounter;
specDown.maximumBlockSize = specDown.maximumBlockSize / (uint32) maxUpdateCounter + 1;
osc.prepare (specDown);
bufferFrequency.setSize (1, (int) specDown.maximumBlockSize, false, false, true);
update();
reset();
}
template <typename SampleType>
void Phaser<SampleType>::reset()
{
std::fill (lastOutput.begin(), lastOutput.end(), static_cast<SampleType> (0));
for (auto n = 0; n < numStages; ++n)
filters[n]->reset();
osc.reset();
dryWet.reset();
oscVolume.reset (sampleRate / (double) maxUpdateCounter, 0.05);
for (auto& vol : feedbackVolume)
vol.reset (sampleRate, 0.05);
updateCounter = 0;
}
template <typename SampleType>
void Phaser<SampleType>::update()
{
osc.setFrequency (rate);
oscVolume.setTargetValue (depth * (SampleType) 0.5);
dryWet.setWetMixProportion (mix);
for (auto& vol : feedbackVolume)
vol.setTargetValue (feedback);
}
//==============================================================================
template class Phaser<float>;
template class Phaser<double>;
} // namespace dsp
} // namespace juce

+ 199
- 0
modules/juce_dsp/widgets/juce_Phaser.h View File

@@ -0,0 +1,199 @@
/*
==============================================================================
This file is part of the JUCE 6 technical preview.
Copyright (c) 2020 - Raw Material Software Limited
You may use this code under the terms of the GPL v3
(see www.gnu.org/licenses).
For this technical preview, this file is not subject to commercial licensing.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
namespace juce
{
namespace dsp
{
/**
A 6 stage phaser that modulates first order all-pass filters to create sweeping
notches in the magnitude frequency response.
This audio effect can be controlled with standard phaser parameters: the speed
and depth of the LFO controlling the frequency response, a mix control, a
feedback control, and the centre frequency of the modulation.
@tags{DSP}
*/
template <typename SampleType>
class Phaser
{
public:
//==============================================================================
/** Constructor. */
Phaser();
//==============================================================================
/** Sets the rate (in Hz) of the LFO modulating the phaser all-pass filters. This
rate must be lower than 100 Hz.
*/
void setRate (SampleType newRateHz);
/** Sets the volume (between 0 and 1) of the LFO modulating the phaser all-pass
filters.
*/
void setDepth (SampleType newDepth);
/** Sets the centre frequency (in Hz) of the phaser all-pass filters modulation.
*/
void setCentreFrequency (SampleType newCentreHz);
/** Sets the feedback volume (between -1 and 1) of the phaser. Negative can be
used to get specific phaser sounds.
*/
void setFeedback (SampleType newFeedback);
/** Sets the amount of dry and wet signal in the output of the phaser (between 0
for full dry and 1 for full wet).
*/
void setMix (SampleType newMix);
//==============================================================================
/** Initialises the processor. */
void prepare (const ProcessSpec& spec);
/** Resets the internal state variables of the processor. */
void reset();
//==============================================================================
/** Processes the input and output samples supplied in the processing context. */
template <typename ProcessContext>
void process (const ProcessContext& context) noexcept
{
const auto& inputBlock = context.getInputBlock();
auto& outputBlock = context.getOutputBlock();
const auto numChannels = outputBlock.getNumChannels();
const auto numSamples = outputBlock.getNumSamples();
jassert (inputBlock.getNumChannels() == numChannels);
jassert (inputBlock.getNumChannels() == lastOutput.size());
jassert (inputBlock.getNumSamples() == numSamples);
if (context.isBypassed)
{
outputBlock.copyFrom (inputBlock);
return;
}
int numSamplesDown = 0;
auto counter = updateCounter;
for (size_t i = 0; i < numSamples; ++i)
{
if (counter == 0)
numSamplesDown++;
counter++;
if (counter == maxUpdateCounter)
counter = 0;
}
if (numSamplesDown > 0)
{
auto freqBlock = AudioBlock<SampleType>(bufferFrequency).getSubBlock (0, (size_t) numSamplesDown);
auto contextFreq = ProcessContextReplacing<SampleType> (freqBlock);
freqBlock.clear();
osc.process (contextFreq);
freqBlock.multiplyBy (oscVolume);
}
auto* freqSamples = bufferFrequency.getWritePointer (0);
for (int i = 0; i < numSamplesDown; ++i)
{
auto lfo = jlimit (static_cast<SampleType> (0.0),
static_cast<SampleType> (1.0),
freqSamples[i] + normCentreFrequency);
freqSamples[i] = mapToLog10 (lfo, static_cast<SampleType> (20.0),
static_cast<SampleType> (jmin (20000.0, 0.49 * sampleRate)));
}
auto currentFrequency = filters[0]->getCutoffFrequency();
dryWet.pushDrySamples (inputBlock);
for (size_t channel = 0; channel < numChannels; ++channel)
{
counter = updateCounter;
int k = 0;
auto* inputSamples = inputBlock .getChannelPointer (channel);
auto* outputSamples = outputBlock.getChannelPointer (channel);
for (size_t i = 0; i < numSamples; ++i)
{
auto input = inputSamples[i];
auto output = input - lastOutput[channel];
if (i == 0 && counter != 0)
for (int n = 0; n < numStages; ++n)
filters[n]->setCutoffFrequency (currentFrequency);
if (counter == 0)
{
for (int n = 0; n < numStages; ++n)
filters[n]->setCutoffFrequency (freqSamples[k]);
k++;
}
for (int n = 0; n < numStages; ++n)
output = filters[n]->processSample ((int) channel, output);
outputSamples[i] = output;
lastOutput[channel] = output * feedbackVolume[channel].getNextValue();
counter++;
if (counter == maxUpdateCounter)
counter = 0;
}
}
dryWet.mixWetSamples (outputBlock);
updateCounter = (updateCounter + (int) numSamples) % maxUpdateCounter;
}
private:
//==============================================================================
void update();
//==============================================================================
Oscillator<SampleType> osc;
OwnedArray<FirstOrderTPTFilter<SampleType>> filters;
SmoothedValue<SampleType, ValueSmoothingTypes::Linear> oscVolume;
std::vector<SmoothedValue<SampleType, ValueSmoothingTypes::Linear>> feedbackVolume { 2 };
DryWetMixer<SampleType> dryWet;
std::vector<SampleType> lastOutput { 2 };
AudioBuffer<SampleType> bufferFrequency;
SampleType normCentreFrequency = 0.5;
double sampleRate = 44100.0;
int updateCounter = 0;
static constexpr int maxUpdateCounter = 4;
SampleType rate = 1.0, depth = 0.5, feedback = 0.0, mix = 0.5;
SampleType centreFrequency = 1300.0;
static constexpr int numStages = 6;
};
} // namespace dsp
} // namespace juce

modules/juce_dsp/processors/juce_Reverb.h → modules/juce_dsp/widgets/juce_Reverb.h View File

@@ -53,7 +53,7 @@ public:
//==============================================================================
/** Initialises the reverb. */
void prepare (const juce::dsp::ProcessSpec& spec)
void prepare (const ProcessSpec& spec)
{
reverb.setSampleRate (spec.sampleRate);
}

modules/juce_dsp/processors/juce_WaveShaper.h → modules/juce_dsp/widgets/juce_WaveShaper.h View File


Loading…
Cancel
Save