56 logMsg(
"AmbisonicPanner: added %ith input\n",
mInputs.size());
74 logMsg(
"AmbisonicPanner: added %ith input\n",
mInputs.size());
89 unsigned i, c, k, numFrames;
90 unsigned numInputs = mInputs.size();
92 mInBuffer->mNumFrames = numFrames = outputBuffer.mNumFrames;
94 outputBuffer.zeroBuffers();
97 logMsg(
"AmbisonicMixer::nextBuffer");
102 if (outputBuffer.mNumChannels < mNumChannels)
103 logMsg(
kLogError,
"AmbisonicMixer requires %d output channels, found only %d ???\n", mNumChannels, outputBuffer.mNumChannels);
106 for (i = 0; i < numInputs; i++) {
115 for (c = 0; c < mNumChannels; c++) {
116 outPtr = outputBuffer.buffer(c);
117 inPtr = mInBuffer->buffer(c);
118 for (k = 0; k < numFrames; k++)
119 *outPtr++ += *inPtr++;
126 for (c = 0; c < mNumChannels; c++) {
127 outPtr = outputBuffer.buffer(c);
129 for (i = 0; i < numFrames; i++)
130 *outPtr++ *= mInvNumInputs;
201 logMsg(
kLogWarning,
"Reducing decoding order because encoded input does not contain enough channels for specified order.\n Input channels:(%d): horizontal order = %i, vertical order = %i\n",
252 logMsg(
kLogError,
"AmbisonicRotator; Attempted to add control signal to invalid axis channel ???\n");
264 logMsg(
kLogWarning,
"Attempt to set Tilt control for a hybrid order rotator failed.\n");
276 logMsg(
kLogWarning,
"Attempt to set Tumble control for a hybrid order rotator failed.\n");
295 unsigned numFrames = mNumFrames = outputBuffer.mNumFrames;
296 unsigned numChannels = mNumChannels;
297 unsigned greaterOrder = mGreaterOrder;
302 if (outputBuffer.mNumChannels < numChannels) {
303 logMsg(
kLogError,
"AmbisonicRotator needs a buffer with %d channels, found only %d\n", numChannels, outputBuffer.mNumChannels);
304 throw RunTimeError(
"Insufficient number of channels in buffer passed.");
309 inputBuffer = mInputPort->mBuffer;
312 mInputPort->mUGen->nextBuffer(*inputBuffer);
319 for (i = 0; i < mNumChannelsGreaterOrder; i++) {
320 mOutPtr[i] = outputBuffer.buffer(mChannelIndex[i]);
323 for (i = 0; i < numChannels; i++) {
324 mInPtr[i] = inputBuffer->
buffer(mInputChannelIndex[i]);
328 for (i = 0; i < numFrames; i++)
329 for (
unsigned j = 0; j < numChannels; j++)
330 *mOutPtr[j]++ = *mInPtr[j]++;
335 for (i = 0; i < numChannels; i++)
336 mOutPtr[i] = outputBuffer.buffer(mChannelIndex[i]);
339 for (i = 0; i < greaterOrder; i++) {
340 mSinAngle[i] = sinf((i+1) * mTilt);
341 mCosAngle[i] = cosf((i+1) * mTilt);
352 for (i = 0; i < numChannels; i++)
353 mOutPtr[i] = outputBuffer.buffer(mChannelIndex[i]);
356 for (i = 0; i < greaterOrder; i++) {
357 mSinAngle[i] = sinf((i+1) * mTumble);
358 mCosAngle[i] = cosf((i+1) * mTumble);
369 for (i = 0; i < numChannels; i++)
370 mOutPtr[i] = outputBuffer.buffer(mChannelIndex[i]);
373 for (i = 0; i < greaterOrder; i++) {
374 mSinAngle[i] = sinf((i+1) * mRotate);
375 mCosAngle[i] = cosf((i+1) * mRotate);
379 if (mOrder.horizontalOrder)
380 rotateFirstOrderHorizontal();
382 if (mOrder.verticalOrder > 1)
383 rotateSecondOrderVertical();
412 sample temp1, temp2, temp3;
419 *outPtr[4]++ = 0.5 * (
mCosAngle[1] - 1) * (*outPtr[8]) + 0.5 *
mSinAngle[1] * (*outPtr[7]) + 0.25 * (
mCosAngle[1] + 3) * (*outPtr[4]);
434 sample temp1, temp2, temp3, temp4, temp5;
445 *outPtr[9]++ = 0.125 * (3 *
mCosAngle[1] + 5) * (*outPtr[9]) + 1.5 *
mSinAngle[1] * (*outPtr[12]) + 0.515625 * (
mCosAngle[1] - 1) * (*outPtr[13]);
449 *outPtr[13]++ = 0.454545454545 * (mCosAngle[1] - 1) * temp1 + + 1.818181818182 *
mSinAngle[1] * temp4 + 0.125 * (3 + 5 * mCosAngle[1]) * (*outPtr[13]);
450 *outPtr[14]++ = 0.227272727273 * (- mCosAngle[0] + mCosAngle[2]) * temp2 + 0.454545454545 * (
mSinAngle[0] - 3 *
mSinAngle[2]) * temp3 + 0.0625 * (mCosAngle[0] + 15 * mCosAngle[2]) * (*outPtr[14]) - 0.181818181818 * (
mSinAngle[0] + 5 *
mSinAngle[2]) * (*outPtr[15]);
451 *outPtr[15]++ = 0.15625 * (- 3 *
mSinAngle[0] +
mSinAngle[2]) * temp2 + 0.9375 * (- mCosAngle[0] + mCosAngle[2]) * temp3 + 0.12890625 * (
mSinAngle[0] + 5 *
mSinAngle[2]) * temp5 + 0.125 * (3 * mCosAngle[0] + 5 * mCosAngle[2]) * (*outPtr[15]);
474 sample temp1, temp2, temp3;
482 *outPtr[4]++ = 0.5 * (1 -
mCosAngle[1]) * (*outPtr[8]) - 0.5 *
mSinAngle[1] * (*outPtr[6]) + 0.25 * (3 +
mCosAngle[1]) * (*outPtr[5]);
494 sample temp1, temp2, temp3, temp4, temp5;
506 *outPtr[10]++ = 0.125 * (5 + 3 *
mCosAngle[1]) * (*outPtr[10]) - 1.5 *
mSinAngle[1] * (*outPtr[12]) + 0.515625 * (1 -
mCosAngle[1]) * (*outPtr[14]);
509 *outPtr[13]++ = 0.227272727273 * (mCosAngle[0] - mCosAngle[2]) * temp1 + 0.454545454545 * (-
mSinAngle[0] + 3 *
mSinAngle[2]) * temp3 + 0.0625 * (mCosAngle[0] + 15 * mCosAngle[2]) * (*outPtr[13]) - 0.181818181818 * (
mSinAngle[0] + 5 *
mSinAngle[2]) * (*outPtr[15]);
510 *outPtr[14]++ = 0.454545454545 * (1 - mCosAngle[1]) * temp2 + 1.818181818182 *
mSinAngle[1] * temp4 + 0.125 * (3 + 5 * mCosAngle[1]) * (*outPtr[14]);
511 *outPtr[15]++ = 0.15625 * (3 *
mSinAngle[0] -
mSinAngle[2]) * temp1 + 0.9375 * (mCosAngle[0] - mCosAngle[2]) * temp3 + 0.12890625 * (
mSinAngle[0] + 5 *
mSinAngle[2]) * temp5 + 0.125 * (3 * mCosAngle[0] + 5 * mCosAngle[2]) * (*outPtr[15]);
610 #define PYTHAG(a, b) ((at = fabs(a)) > (bt = fabs(b)) ? \
611 (ct = bt/at, at*sqrt(1.0+ct*ct)): (bt ? (ct = at/bt, bt*sqrt(1.0+ct*ct)): 0.0))
614 #define MAX(a, b) (maxarg1 = (a), maxarg2 = (b), (maxarg1) > (maxarg2) ? \
615 (maxarg1) : (maxarg2))
617 #define SIGN(a, b) ((b) < 0.0 ? -fabs(a): fabs(a))
629 int flag, i, its, j, jj, k, l, nm;
630 double c, f, h, s, x, y, z;
631 double anorm = 0.0, g = 0.0, scale = 0.0;
635 double* rv1 =
new double [n];
638 for (i = 0; i < n; i++) {
643 for (k = i; k < m; k++)
644 scale += fabs(a[k][i]);
646 for (k = i; k < m; k++) {
648 s += a[k][i]*a[k][i];
651 g = -
SIGN(sqrt(s), f);
655 for (j = l; j < n; j++) {
656 for (s = 0.0, k = i; k < m; k++)
657 s += a[k][i]*a[k][j];
659 for (k = i; k < m; k++)
660 a[k][j] += f*a[k][i];
663 for (k = i; k < m; k++)
669 if (i < m && i != n - 1) {
670 for (k = l; k < n; k++)
671 scale += fabs(a[i][k]);
673 for (k = l; k < n; k++) {
675 s += a[i][k]*a[i][k];
678 g = -
SIGN(sqrt(s), f);
681 for (k = l; k < n; k++)
684 for (j = l; j < m; j++) {
685 for (s = 0.0, k = l; k < n; k++)
686 s += a[j][k]*a[i][k];
687 for (k = l; k < n; k++)
691 for (k = l; k < n; k++)
695 anorm =
MAX(anorm, (fabs(w[i]) + fabs(rv1[i])));
698 for (i = n - 1; 0 <= i; i--)
704 for (j = l; j < n; j++)
705 v[j][i] = (a[i][j]/a[i][l])/g;
707 for (j = l; j < n; j++)
709 for (s = 0.0, k = l; k < n; k++)
710 s += a[i][k]*v[k][j];
711 for (k = l; k < n; k++)
712 v[k][j] += s*v[k][i];
715 for (j = l; j < n; j++)
716 v[i][j] = v[j][i] = 0.0;
723 for (i = n - 1; 0 <= i; i--)
728 for (j = l; j < n; j++)
735 for (j = l; j < n; j++)
737 for (s = 0.0, k = l; k < m; k++)
738 s += a[k][i]*a[k][j];
740 for (k = i; k < m; k++)
741 a[k][j] += f*a[k][i];
744 for (j = i; j < m; j++)
748 for (j = i; j < m; j++)
753 for (k = n - 1; 0 <= k; k--)
755 for (its = 0; its < 30; its++)
758 for (l = k; 0 <= l; l--)
761 if (fabs(rv1[l]) + anorm == anorm)
766 if (fabs(w[nm]) + anorm == anorm)
773 for (i = l; i <= k; i++) {
775 if (fabs(f) + anorm != anorm)
783 for (j = 0; j < m; j++)
787 a[j][nm] = y*c + z*s;
799 for (j = 0; j < n; j++)
800 v[j][k] = (-v[j][k]);
811 f = ((y - z)*(y + z) + (g - h)*(g + h))/(2.0*h*y);
813 f = ((x - z)*(x + z) + h*((y/(f +
SIGN(g, f))) - h))/x;
816 for (j = l; j <= nm; j++)
831 for (jj = 0; jj < n; jj++)
835 v[jj][j] = x*c + z*s;
836 v[jj][i] = z*c - x*s;
848 for (jj = 0; jj < m; jj++)
852 a[jj][j] = y*c + z*s;
853 a[jj][i] = z*c - y*s;
867 float x,y,z,x2,y2,z2;
870 y = z = y2 = z2 = 0.f;
874 unsigned channel = 1;
880 float cosel = cosf(elevation);
881 x = cosf(azimuth) * cosel;
882 y = sinf(azimuth) * cosel;
884 weights[channel++] = x;
885 weights[channel++] = y;
891 weights[channel++] = z;
898 weights[channel++] = x2 - y2;
899 weights[channel++] = 2.f * x * y;
906 weights[channel++] = 2.f * z * x;
907 weights[channel++] = 2.f * z * y;
908 weights[channel++] = (1.5f * z2) - 0.5f;
913 weights[channel++] = x * (x2 - 3.f*y2);
914 weights[channel++] = y * (y2 - 3.f*x2);
918 float pre = 8.f/11.f;
920 weights[channel++] = z * (x2-y2) * 0.5f;
921 weights[channel++] = x * y * z;
922 weights[channel++] = pre * x * (5.f*z2 - 1.f);
923 weights[channel++] = pre * y * (5.f*z2 - 1.f);
924 weights[channel++] = z * 0.5 * (5.f*z2 - 3.f);
932 float x,y,z,x2,y2,z2;
935 y= z = y2 = z2 = 0.f;
945 float cosel = cosf(elevation);
946 x = cosf(azimuth) * cosel;
947 y = sinf(azimuth) * cosel;
963 weights[4] = x2 - y2;
964 weights[5] = 2.f * x * y;
967 weights[9] = x * (x2 - 3.f*y2);
968 weights[10]= y * (y2 - 3.f*x2);
975 weights[6] = 2.f * z * x;
976 weights[7] = 2.f * z * y;
977 weights[8] = (1.5f * z2) - 0.5f;
980 float pre = 8.f/11.f;
982 weights[11] = z * (x2-y2) * 0.5f;
983 weights[12] = x * y * z;
984 weights[13] = pre * x * (5.f*z2 - 1.f);
985 weights[14] = pre * y * (5.f*z2 - 1.f);
986 weights[15] = z * 0.5 * (5.f*z2 - 3.f);