From f369bf7d8a86a22b3fa4250818f42ae95a37db7b Mon Sep 17 00:00:00 2001
From: Caleb Kemere <ckemere@gmail.com>
Date: Sat, 30 Nov 2013 13:18:33 -0600
Subject: [PATCH] Noise gate implemented next to volume on top of screen. Works
 but levels are too abrupt.

---
 Source/Processors/AudioNode.cpp           | 24 ++++++++++++++++++++---
 Source/Processors/AudioNode.h             |  1 +
 Source/Processors/Editors/AudioEditor.cpp | 18 ++++++++++++++---
 Source/Processors/Editors/AudioEditor.h   |  3 ++-
 4 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/Source/Processors/AudioNode.cpp b/Source/Processors/AudioNode.cpp
index 988381f32..cf5b9ae43 100755
--- a/Source/Processors/AudioNode.cpp
+++ b/Source/Processors/AudioNode.cpp
@@ -26,7 +26,7 @@
 #include "Channel.h"
 
 AudioNode::AudioNode()
-    : GenericProcessor("Audio Node"), audioEditor(0), volume(0.00001f), 
+    : GenericProcessor("Audio Node"), audioEditor(0), volume(0.00001f), noiseGateLevel(0.0f),
     bufferA(2,10000),
     bufferB(2,10000)
 {
@@ -136,6 +136,13 @@ void AudioNode::setParameter(int parameterIndex, float newValue)
         // volume level
         volume = newValue*0.1f;
 
+    }
+    else if (parameterIndex == 2)
+    {
+        // noiseGateLevel level
+        noiseGateLevel = newValue*0.01f; // not sure about this scaling???
+        std::cout << "Changed noiseGateLevel: " << noiseGateLevel << std::endl;
+        
     }
     else if (parameterIndex == 100)
     {
@@ -316,6 +323,7 @@ void AudioNode::process(AudioSampleBuffer& buffer,
                                    remainingSamples, //  number of samples
                                    gain       // gain to apply
                                   );
+
                     }
 
                     orphanedSamples = nSamples - samplesToCopy2;
@@ -334,7 +342,7 @@ void AudioNode::process(AudioSampleBuffer& buffer,
                                    gain       // gain to apply
                                   );
 
-                        backupBuffer->addFrom(0,       // destination channel
+                          backupBuffer->addFrom(0,       // destination channel
                                    samplesInBackupBuffer,           // destination start sample
                                    buffer,      // source
                                    i,           // source channel
@@ -344,7 +352,17 @@ void AudioNode::process(AudioSampleBuffer& buffer,
                                   );
 
                     }
-
+                    
+                    // HERE IS WHERE WE NEED TO NOISE GATE
+                    float *leftChannelData = buffer.getSampleData(0);
+                    float *rightChannelData = buffer.getSampleData(1);
+                    float gateLevel = noiseGateLevel/(float(0x7fff));
+                    for (int i=0; i < buffer.getNumSamples(); i++) {
+                        if (abs(leftChannelData[i])  < gateLevel)
+                            leftChannelData[i] = 0;
+                        if (abs(rightChannelData[i]) < gateLevel)
+                            rightChannelData[i] = 0;
+                    }
                 }
             }
 
diff --git a/Source/Processors/AudioNode.h b/Source/Processors/AudioNode.h
index e0f6a901a..8a7d20b2c 100755
--- a/Source/Processors/AudioNode.h
+++ b/Source/Processors/AudioNode.h
@@ -103,6 +103,7 @@ private:
     Array<int> leftChan;
     Array<int> rightChan;
     float volume;
+    float noiseGateLevel;
 
     /** An array of pointers to the channels that feed into the AudioNode. */
     Array<Channel*> channelPointers;
diff --git a/Source/Processors/Editors/AudioEditor.cpp b/Source/Processors/Editors/AudioEditor.cpp
index 054ddbcb5..c66463b34 100755
--- a/Source/Processors/Editors/AudioEditor.cpp
+++ b/Source/Processors/Editors/AudioEditor.cpp
@@ -98,13 +98,21 @@ AudioEditor::AudioEditor(AudioNode* owner)
     //
     addAndMakeVisible(audioWindowButton);
 
-    volumeSlider = new Slider("High-Cut Slider");
+    volumeSlider = new Slider("Volume Slider");
     volumeSlider->setRange(0,100,1);
     volumeSlider->addListener(this);
     volumeSlider->setTextBoxStyle(Slider::NoTextBox,
                                   false, 0, 0);
     addAndMakeVisible(volumeSlider);
 
+    noiseGateSlider = new Slider("Noise Gate Slider");
+    noiseGateSlider->setRange(0,100,1);
+    noiseGateSlider->addListener(this);
+    noiseGateSlider->setTextBoxStyle(Slider::NoTextBox,
+                                  false, 0, 0);
+    addAndMakeVisible(noiseGateSlider);
+
+    
     //acw = new AudioConfigurationWindow(getAudioComponent()->deviceManager, (Button*) audioWindowButton);
 
 }
@@ -119,7 +127,8 @@ void AudioEditor::resized()
 {
     muteButton->setBounds(0,0,30,25);
     volumeSlider->setBounds(35,0,50,getHeight());
-    audioWindowButton->setBounds(90,0,200,getHeight());
+    noiseGateSlider->setBounds(85,0,50,getHeight());
+    audioWindowButton->setBounds(140,0,200,getHeight());
 }
 
 bool AudioEditor::keyPressed(const KeyPress& key)
@@ -208,7 +217,10 @@ void AudioEditor::buttonClicked(Button* button)
 
 void AudioEditor::sliderValueChanged(Slider* slider)
 {
-    getAudioProcessor()->setParameter(1,slider->getValue());
+    if (slider == volumeSlider)
+        getAudioProcessor()->setParameter(1,slider->getValue());
+    else if (slider == noiseGateSlider)
+        getAudioProcessor()->setParameter(2,slider->getValue());
 }
 
 void AudioEditor::paint(Graphics& g)
diff --git a/Source/Processors/Editors/AudioEditor.h b/Source/Processors/Editors/AudioEditor.h
index 7120d4b25..6891cce8f 100755
--- a/Source/Processors/Editors/AudioEditor.h
+++ b/Source/Processors/Editors/AudioEditor.h
@@ -131,7 +131,8 @@ private:
     AudioConfigurationWindow* acw;
 
     Slider* volumeSlider;
-
+    Slider* noiseGateSlider;
+    
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AudioEditor);
 
 };
-- 
GitLab