BEGIN_UGEN_NAMESPACE

#include "ugen_FFTMagnitudeSelection.h"
#include "ugen_FFTEngine.h"
#include "../core/ugen_Bits.h"

FFTMagnitudeSelectionUGenInternal::FFTMagnitudeSelectionUGenInternal(UGen const& input, 
																	 FFTEngine const& fft, 
																	 const int overlap, 
																	 IntArray const& _bins) throw()
:	ProxyOwnerUGenInternal(NumInputs, _bins.length()-1),
	fftEngine(fft),
	fftSize(fftEngine.size()),
	fftSizeHalved(fftSize / 2),	
	overlap_(overlap < 1 ? 1 : overlap),
	hopSize(fftSize / overlap),
	overlapSize(fftSize - hopSize),
	maxNumBins(fftSizeHalved + 1),
	bins(_bins),
	inputBuffer(BufferSpec(fftSize, 1, true)),
	outputBuffer(BufferSpec(fftSize, 1, true)),
	bufferIndex(fftSize - hopSize),
	magnitudes(BufferSpec(bins.length(), 1, true)),
	outputSampleData(new float*[bins.length()])
{
	ugen_assert(overlap == overlap_);	// should be > 0
	ugen_assert(bins.length() > 0);
	
	inputs[Input] = input;
}
예제 #2
0
BEGIN_UGEN_NAMESPACE

#include "ugen_Correlation.h"
#include "../basics/ugen_BinaryOpUGens.h"
#include "../core/ugen_UGenArray.h"


CorrelationUGenInternal::CorrelationUGenInternal(UGen const& inputA, 
                                                 UGen const& inputB, 
                                                 const int length,
                                                 const int initialDelay) throw() // Will I need the delay?
:	UGenInternal(NumInputs),
    length_(length),
	bufferSize_(length_ * 2),
	initialDelay_(initialDelay),
	buffers(BufferSpec(bufferSize_, NumBuffers, true)),
    window(Buffer::hannWindow(length_)),
    score(Buffer::newClear(length_, 1, true)),
	bufferIndex(initialDelay <= 0 ? 0 : initialDelay >= bufferSize_ ? 0 : bufferSize_ - initialDelay),
    lockedIndexOfMax(-1)
{
	inputs[InputA] = inputA;
	inputs[InputB] = inputB;
    
}
BEGIN_UGEN_NAMESPACE

#include "ugen_BlockDelay.h"

BlockDelayUGenInternal::BlockDelayUGenInternal(UGen const& input) throw()
:	UGenInternal(NumInputs),
	delayBuffer(BufferSpec(UGen::getEstimatedBlockSize(), 1, true)),
	delayBufferSamples(delayBuffer.getData())
{
	inputs[Input] = input;
}
예제 #4
0
karplusUGenInternal::karplusUGenInternal(UGen const& input,
										const float minFreq,
										UGen const& fundamental,
										UGen const& decayTime,
										UGen const& cutoff) throw()
:	UGenInternal(NumInputs) // Initialise the UGenIntenal's UGen inputs array using the enum size.
{
	inputs[Input] = input;
	inputs[Fundamental] = fundamental;
	inputs[DecayTime] = decayTime;
	inputs[Cutoff] = cutoff;
	//..
	buffer = Buffer(BufferSpec((1/minFreq) * UGen::getSampleRate() + 50, 1, true));
	writePosition = 0;
}
void BlockDelayUGenInternal::prepareForBlockInternal(const int actualBlockSize, const unsigned int /*blockID*/, const int /*channel*/) throw()
{
	int previousBlockSize = uGenOutput.getBlockSize();
	
	if(actualBlockSize > delayBuffer.size())
	{
		delayBuffer = Buffer(BufferSpec(actualBlockSize, 1, true));
		delayBufferSamples = delayBuffer.getData();
	}
	else if(previousBlockSize != actualBlockSize)
	{
		delayBuffer.clear();
	}
	
	uGenOutput.prepareForBlock(actualBlockSize); // only prepare the output block
}
예제 #6
0
HarmonicOsc::HarmonicOsc(Buffer const& harmonicWeights, UGen const& freq, Buffer const& initialPhase) throw()
{	
	int numChannels = ugen::max(freq.getNumChannels(), initialPhase.size());
	
	initInternal(numChannels);
	
	Buffer table(BufferSpec(8193, 1, true));
	
	for(int harmonic = 1; harmonic <= harmonicWeights.size(); harmonic++)
	{
		float amp = harmonicWeights.getSampleUnchecked(0, harmonic-1);
		table += Buffer::line(8193, 0.0, harmonic * twoPi).sin() * amp;
	}
	
	table = table.shrinkSize();
	for(unsigned int i = 0; i < numInternalUGens; i++)
	{
		internalUGens[i] = new TableOscUGenInternal(freq, initialPhase.wrapAt(i), table);
	}
}
예제 #7
0
파일: UGenPlugin.cpp 프로젝트: 0x4d52/ugen
void UGenPlugin::setStateInformation (const void* data, int sizeInBytes)
{
	const String pluginName = UGenUtility::stringToSafeName(JucePlugin_Name);
	
    // use this helper function to get the XML from this binary blob..
    XmlElement* const xmlState = getXmlFromBinary (data, sizeInBytes);

    if (xmlState != 0)
    {
        // check that it's the right type of xml..
        if (xmlState->hasTagName (pluginName))
        {
            // ok, now pull out our parameters..
			for(int index = 0; index < UGenInterface::Parameters::Count; index++)
			{
				String parameterName = UGenUtility::stringToSafeName(String(UGenInterface::Parameters::Names[index]));
				parameterName += "_";
				parameterName += String(index);		// try to ensure the name is unique, not foolproof
				parameters[index] = (float) xmlState->getDoubleAttribute (parameterName,
                                                                          calculateNormalisedParameter(index, getParameterNominal(index)));
			}
            
			menuItem = xmlState->getIntAttribute("menuItem", UGenInterface::MenuOptions::LowPass);
			menu2Item = xmlState->getIntAttribute("menu2Item", UGenInterface::MenuOptions2::DualMono);
            
            const String relative = xmlState->getStringAttribute("irFile", String::empty);
            if(relative.isNotEmpty())
                loadIR(File::getSpecialLocation(File::userHomeDirectory).getChildFile(relative));
            
//            lastPath = xmlState->getStringAttribute("lastPath", String::empty);
            selectedTab = xmlState->getIntAttribute("selectedTab", -1);
            
            
            const int ampEnvNumLevels = xmlState->getIntAttribute("ampEnvNumLevels", 0);
            const int ampEnvNumTimes = xmlState->getIntAttribute("ampEnvNumTimes", 0);
            
            if ((ampEnvNumTimes >= 1) && (ampEnvNumLevels == (ampEnvNumTimes + 1)))
            {
                Buffer ampEnvLevels = BufferSpec(ampEnvNumLevels);
                Buffer ampEnvTimes  = BufferSpec(ampEnvNumTimes);
                
                for (int i = 0; i < ampEnvLevels.size(); i++)
                    ampEnvLevels.setSampleUnchecked(i, (float)xmlState->getDoubleAttribute(String("ampEnvLevel")+String(i), 0.0));
                
                for (int i = 0; i < ampEnvTimes.size(); i++)
                    ampEnvTimes.setSampleUnchecked(i, (float)xmlState->getDoubleAttribute(String("ampEnvTime")+String(i), 0.0));
                
                ampEnv = Env(ampEnvLevels, ampEnvTimes, EnvCurve::Linear);

            }
            else ampEnv = getDefaultEnv();
            
            const int filterEnvNumLevels = xmlState->getIntAttribute("filterEnvNumLevels", 0);
            const int filterEnvNumTimes = xmlState->getIntAttribute("filterEnvNumTimes", 0);
            
            if ((filterEnvNumTimes >= 1) && (filterEnvNumLevels == (filterEnvNumTimes + 1)))
            {
                Buffer filterEnvLevels = BufferSpec(filterEnvNumLevels);
                Buffer filterEnvTimes  = BufferSpec(filterEnvNumTimes);
                
                for (int i = 0; i < filterEnvLevels.size(); i++)
                    filterEnvLevels.setSampleUnchecked(i, (float)xmlState->getDoubleAttribute(String("filterEnvLevel")+String(i), 0.0));
                
                for (int i = 0; i < filterEnvTimes.size(); i++)
                    filterEnvTimes.setSampleUnchecked(i, (float)xmlState->getDoubleAttribute(String("filterEnvTime")+String(i), 0.0));
                
                filterEnv = Env(filterEnvLevels, filterEnvTimes, EnvCurve::Linear);
                
            }
            else filterEnv = getDefaultEnv();

            processEnvs();
            
            sendChangeMessage();
        }

        delete xmlState;
    }
}