void CsoundObject_writeOpenCLPVSReadPath(CsoundObject *self,
                                         size_t triangleFilterBandsCount,
                                         size_t *bestTriangleBandMatches,
                                         Float32 *paletteSegmentFramesCounts,
                                         Float32 *paletteMagnitudeDifferences,
                                         Matrix32 *triangleBandGains)



{
    
    Float32 frameLengthInSeconds = 1./44100. * 256.;
    for (size_t i = 0; i < triangleFilterBandsCount; ++i) {
        
        Float32 paletteSegmentLengthInSeconds = frameLengthInSeconds * paletteSegmentFramesCounts[i];
        Float32 startFrameInSeconds = (Float32)bestTriangleBandMatches[i] * frameLengthInSeconds;
        Float32 endFrameInSeconds = startFrameInSeconds + paletteSegmentLengthInSeconds;

        Float32 *warpTablePointer, *bandGainTablePointer;
        
        csoundGetTable(self->csound, &warpTablePointer, (SInt32)(warpPathTableBaseNumber + i));
        csoundGetTable(self->csound, &bandGainTablePointer, (SInt32)(bandGainTableBaseNumber + i));

        vDSP_vgen(&startFrameInSeconds, &endFrameInSeconds, warpTablePointer, 1, self->analysisSegmentFramesCount);
        
        vDSP_vsmul(Matrix_getRow(triangleBandGains, i), 1, &paletteMagnitudeDifferences[i], bandGainTablePointer, 1, triangleBandGains->columnCount);
//        vDSP_vsadd(self->frameTimes, 1, &startFrameInSeconds, tablePointer, 1, self->analysisSegmentFramesCount);        
    }
}
예제 #2
0
void WaveformForBuffer(Float32 * begin, size_t length, float w, float h, ofPolyline &outLine, unsigned rate) {
	const size_t size = length / rate;
	
	if(size == 0) {
		outLine.clear();
		return;
	}
	
	if(outLine.size() != size) {
		outLine.resize(size);
	}
	
	float * v = (float *)&outLine[0];
	float zero = 0;
	float half = h / 2.;
	vDSP_vsmsa(begin, rate, &half, &half, v + 1, 3, size); // multiply and add "y"s
	vDSP_vgen(&zero, &w, v, 3, size); // generate "x"s
}
예제 #3
0
TriangleFilterBank32 *TriangleFilterBank32_new(size_t filterCount, size_t magnitudeFrameSize, size_t samplerate)
{
    TriangleFilterBank32 *self = calloc(1, sizeof(TriangleFilterBank32));
    self->filterCount = filterCount;
    self->filterFrequencyCount = filterCount + 2;
    self->magnitudeFrameSize = magnitudeFrameSize;
    self->samplerate = samplerate;
    self->filterFrequencies = calloc(self->filterFrequencyCount, sizeof(Float32));
    self->filterBank = calloc(self->magnitudeFrameSize * self->filterCount, sizeof(Float32));
    Float32 *filterTemp = calloc(self->magnitudeFrameSize * self->filterCount, sizeof(Float32));

    Float32 one = 2;
    Float32 zero = 0;
    
    vDSP_vgen(&zero, &one, self->filterFrequencies, 1, self->filterFrequencyCount);

    for (size_t i = 0; i < self->filterFrequencyCount; ++i) {
        
        self->filterFrequencies[i] = powf(10, self->filterFrequencies[i]);

    }
    
    Float32 minusFirstElement = -self->filterFrequencies[0];
    vDSP_vsadd(self->filterFrequencies, 1, &minusFirstElement, self->filterFrequencies, 1, self->filterFrequencyCount);
    Float32 maximum = self->filterFrequencies[self->filterFrequencyCount - 1];

    vDSP_vsdiv(self->filterFrequencies, 1, &maximum, self->filterFrequencies, 1, self->filterFrequencyCount);
    
    Float32 nyquist = self->samplerate / 2;
    
    vDSP_vsmul(self->filterFrequencies, 1, &nyquist, self->filterFrequencies, 1, self->filterFrequencyCount);
    
    Float32 *magnitudeFrequencies = calloc(self->magnitudeFrameSize, sizeof(Float32));

    vDSP_vgen(&zero, &nyquist, magnitudeFrequencies, 1, self->magnitudeFrameSize);
    
    Float32 *lower = calloc(self->filterCount, sizeof(Float32));
    Float32 *center = calloc(self->filterCount, sizeof(Float32));
    Float32 *upper = calloc(self->filterCount, sizeof(Float32));
    
    Float32 *temp1 = (Float32 *)calloc(self->magnitudeFrameSize, sizeof(Float32));
    Float32 *temp2 = (Float32 *)calloc(self->magnitudeFrameSize, sizeof(Float32));
    

    cblas_scopy((SInt32)self->filterCount, &self->filterFrequencies[0], 1, lower, 1);
    cblas_scopy((SInt32)self->filterCount, &self->filterFrequencies[1], 1, center, 1);
    cblas_scopy((SInt32)self->filterCount, &self->filterFrequencies[2], 1, upper, 1);

   
    for (size_t i = 0; i < self->filterCount; ++i) {
        
        Float32 negateLowerValue = -lower[i];
        vDSP_vsadd(magnitudeFrequencies, 1, &negateLowerValue, temp1, 1, self->magnitudeFrameSize);
        Float32 divider = center[i] - lower[i];
        vDSP_vsdiv(temp1, 1, &divider, temp1, 1, self->magnitudeFrameSize);
        
        for (size_t j = 0; j < self->magnitudeFrameSize; ++j) {
            
            if (!(magnitudeFrequencies[j] > lower[i] && magnitudeFrequencies[j] <= center[i])) {
                
                temp1[j] = 0;
            }
        }
        
        Float32 minusOne = -1;
        vDSP_vsmul(magnitudeFrequencies, 1, &minusOne, temp2, 1, self->magnitudeFrameSize);
        vDSP_vsadd(temp2, 1, &upper[i], temp2, 1, self->magnitudeFrameSize);
        divider = upper[i] - center[i];
        vDSP_vsdiv(temp2, 1, &divider, temp2, 1, self->magnitudeFrameSize);
        
        for (size_t j = 0; j < self->magnitudeFrameSize; ++j) {
            
            if (!(magnitudeFrequencies[j] > center[i] && magnitudeFrequencies[j] <= upper[i])) {
                
                temp2[j] = 0;
            }
        }
        
        vDSP_vadd(temp1, 1, temp2, 1, &filterTemp[i * self->magnitudeFrameSize], 1, self->magnitudeFrameSize);
    }
    
    vDSP_mtrans(filterTemp, 1, self->filterBank, 1, self->magnitudeFrameSize, self->filterCount);
    
    free(lower);
    free(center);
    free(upper);
    free(temp1);
    free(temp2);
    free(magnitudeFrequencies);
    free(filterTemp);
    
    return self;
}