ref: d92a4578490a554a34b3e81dd16129c6c96f3dcc
dir: /dsp/piano.h/
//Parameters for piano.dsp //©Romain Michon (rmichon@ccrma.stanford.edu), 2011 //licence: FAUST-STK // translated to C static double lookupValue(double *points, int numpoints, double x) { // Note: Assumes points are monotonically increasing in X! int i=0; while (x>points[i*2] && i<numpoints) i++; if (i==0) return points[1]; if (i>=numpoints) return points[(numpoints-1)*2+1]; double ratio = (x - points[(i-1)*2]) / (points[i*2] - points[(i-1)*2]); return points[(i-1)*2+1]*(1-ratio) + points[i*2+1]*(ratio); } #define lookup(t,x) lookupValue(t, nelem(t)/2, x) /* PianoDriver.sb */ static double noteOffDelayTime[] = { 89.000,3.000, 93.000,2.000, 95.000,1.500, 99.782,1.020, 108.000,0.300, }; /* pianoDriverC.sb */ /* Coupling Filter */ static double singleStringDecayRate[] = { 21.000,-1.500, 24.000,-1.500, 28.000,-1.500, 29.000,-6.000, 36.000,-6.000, 42.000,-6.100, 48.000,-7.000, 52.836,-7.000, 60.000,-7.300, 66.000,-7.700, 72.000,-8.000, 78.000,-8.800, 84.000,-10.000, 88.619,-11.215, 92.368,-12.348, 95.684,-13.934, 99.000,-15.000 }; static double singleStringZero[] = { 21.000,-1.000, 24.000,-1.000, 28.000,-1.000, 29.000,-1.000, 32.534,-1.000, 36.000,-0.700, 42.000,-0.400, 48.000,-0.200, 54.000,-0.120, 60.000,-0.080, 66.000,-0.070, 72.000,-0.070, 79.000,-0.065, 84.000,-0.063, 88.000,-0.060, 96.000,-0.050, 99.000,-0.050 }; static double singleStringPole[] = { 21.000,0.350, 24.604,0.318, 26.335,0.279, 28.000,0.250, 32.000,0.150, 36.000,0.000, 42.000,0.000, 48.000,0.000, 54.000,0.000, 60.000,0.000, 66.000,0.000, 72.000,0.000, 76.000,0.000, 84.000,0.000, 88.000,0.000, 96.000,0.000, 99.000,0.000 }; static double releaseLoopGain[] = { 21.000,0.865, 24.000,0.880, 29.000,0.896, 36.000,0.910, 48.000,0.920, 60.000,0.950, 72.000,0.965, 84.000,0.988, 88.000,0.997, 99.000,0.988 }; static double detuningHz[] = { 21.000,0.003, 24.000,0.003, 28.000,0.003, 29.000,0.060, 31.000,0.100, 36.000,0.110, 42.000,0.120, 48.000,0.200, 54.000,0.200, 60.000,0.250, 66.000,0.270, 72.232,0.300, 78.000,0.350, 84.000,0.500, 88.531,0.582, 92.116,0.664, 95.844,0.793, 99.000,1.000 }; static double stiffnessCoefficient[] = { 21.000,-0.850, 23.595,-0.850, 27.055,-0.830, 29.000,-0.700, 37.725,-0.516, 46.952,-0.352, 60.000,-0.250, 73.625,-0.036, 93.810,-0.006, 99.000,1.011 }; static double strikePosition[] = { 21.000,0.050, 24.000,0.050, 28.000,0.050, 35.000,0.050, 41.000,0.050, 42.000,0.125, 48.000,0.125, 60.000,0.125, 72.000,0.125, 84.000,0.125, 96.000,0.125, 99.000,0.125 }; static double EQGain[] = { 21.000,2.000, 24.000,2.000, 28.000,2.000, 30.000,2.000, 35.562,1.882, 41.000,1.200, 42.000,0.600, 48.000,0.500, 54.000,0.500, 59.928,0.502, 66.704,0.489, 74.201,0.477, 91.791,1.000, 99.000,1.000 }; static double EQBandwidthFactor[] = { 21.000,5.000, 24.112,5.000, 28.000,5.000, 35.000,4.956, 41.000,6.000, 42.000,2.000, 48.773,1.072, 57.558,1.001, 63.226,1.048, 69.178,1.120, 72.862,1.525, 80.404,2.788, 97.659,1.739 }; /* PianoDriverA */ /* HammerFilter */ static double loudPole[] = { 21.000,0.875, 23.719,0.871, 27.237,0.836, 28.996,0.828, 32.355,0.820, 36.672,0.816, 40.671,0.820, 45.788,0.812, 47.867,0.812, 54.000,0.810, 60.000,0.800, 66.000,0.800, 72.000,0.810, 78.839,0.824, 84.446,0.844, 89.894,0.844, 96.463,0.848, 103.512,0.840, 107.678,0.840 }; static double softPole[] = { 21.000,0.990, 24.000,0.990, 28.000,0.990, 29.000,0.990, 36.000,0.990, 42.000,0.990, 48.000,0.985, 54.000,0.970, 60.000,0.960, 66.000,0.960, 72.000,0.960, 78.000,0.970, 84.673,0.975, 91.157,0.990, 100.982,0.970, 104.205,0.950 }; static double normalizedVelocity[] = { 0.000,0.000, 0.170,0.318, 0.316,0.546, 0.460,0.709, 0.599,0.825, 0.717,0.894, 0.841,0.945, 1.000,1.000 }; static double loudGain[] = { 21.873,0.891, 25.194,0.870, 30.538,0.848, 35.448,0.853, 41.513,0.842, 47.434,0.826, 53.644,0.820, 60.720,0.815, 65.630,0.820, 72.995,0.853, 79.060,0.920, 85.270,1.028, 91.624,1.247, 95.668,1.296, 99.000,1.300, 100.000,1.100 }; static double softGain[] = { 20.865,0.400, 22.705,0.400, 25.960,0.400, 28.224,0.400, 31.196,0.400, 36.715,0.400, 44.499,0.400, 53.981,0.400, 60.000,0.350, 66.000,0.350, 72.661,0.350, 81.435,0.430, 88.311,0.450, 93.040,0.500, 96.434,0.500 }; /* Soundboard */ static double sustainPedalLevel[] = { 21.000,0.050, 24.000,0.050, 31.000,0.030, 36.000,0.025, 48.000,0.010, 60.000,0.005, 66.000,0.003, 72.000,0.002, 78.000,0.002, 84.000,0.003, 90.000,0.003, 96.000,0.003, 108.000,0.002 }; static double DryTapAmpT60[] = { 21.001,0.491, 26.587,0.498, 34.249,0.470, 40.794,0.441, 47.977,0.392, 55.000,0.370, 60.000,0.370, 66.000,0.370, 71.934,0.370, 78.000,0.370, 83.936,0.390, 88.557,0.387, 92.858,0.400, 97.319,0.469, 102.400,0.500, 107.198,0.494 }; static double DryTapAmpCurrent = 0.15; static double DCBa1[] = { 21.000,-0.999, 24.000,-0.999, 30.000,-0.999, 36.000,-0.999, 42.000,-0.999, 48.027,-0.993, 60.000,-0.995, 72.335,-0.960, 78.412,-0.924, 84.329,-0.850, 87.688,-0.770, 91.000,-0.700, 92.000,-0.910, 96.783,-0.850, 99.000,-0.800, 100.000,-0.850, 104.634,-0.700, 107.518,-0.500 }; /* pianoDriverB */ /* High Notes */ static double secondStageAmpRatio[] = { 82.277,-18.508, 88.000,-30.000, 90.000,-30.000, 93.451,-30.488, 98.891,-30.633, 107.573,-30.633 }; static double r1_1db[] = { 100.000,-75.000, 103.802,-237.513, 108.000,-400.000 }; static double r1_2db[] = { 98.388,-16.562, 100.743,-75.531, 103.242,-154.156, 108.000,-300.000 }; double r2db[2*2] = { 100.000,-115.898, 107.858,-250.000 }; double r3db[2*2] = { 100.000,-150.000, 108.000,-400.000 }; double secondPartialFactor[2*2] = { 88.000,2.000, 108.000,2.100 }; double thirdPartialFactor[2*2] = { 88.000,3.100, 108.000,3.100 }; double bq4_gEarBalled[6*2] = { 100.000,0.040, 102.477,0.100, 104.518,0.300, 106.000,0.500, 107.000,1.000, 108.000,1.500 }; #define getValueDryTapAmpT60(x) lookup(DryTapAmpT60, x) #define getValueSustainPedalLevel(x) lookup(sustainPedalLevel, x) #define getValueLoudPole(x) lookup(loudPole, x) #define getValuePoleValue(x) lookup(poleValue, x) #define getValueLoudGain(x) lookup(loudGain, x) #define getValueSoftGain(x) lookup(softGain, x) #define getValueDCBa1(x) lookup(DCBa1, x) #define getValuer1_1db(x) lookup(r1_1db, x) #define getValuer1_2db(x) lookup(r1_2db, x) #define getValuer2db(x) lookup(r2db, x) #define getValuer3db(x) lookup(r3db, x) #define getValueSecondStageAmpRatio(x) lookup(secondStageAmpRatio, x) #define getValueSecondPartialFactor(x) lookup(secondPartialFactor, x) #define getValueThirdPartialFactor(x) lookup(thirdPartialFactor, x) #define getValueBq4_gEarBalled(x) lookup(bq4_gEarBalled, x) #define getValueStrikePosition(x) lookup(strikePosition, x) #define getValueEQBandWidthFactor(x) lookup(EQBandwidthFactor, x) #define getValueEQGain(x) lookup(EQGain, x) #define getValueDetuningHz(x) lookup(detuningHz, x) #define getValueSingleStringDecayRate(x) lookup(singleStringDecayRate, x) #define getValueSingleStringZero(x) lookup(singleStringZero, x) #define getValueSingleStringPole(x) lookup(singleStringPole, x) #define getValueStiffnessCoefficient(x) lookup(stiffnessCoefficient, x) #define getValueReleaseLoopGain(x) lookup(releaseLoopGain, x) //Harpsichord static double loopFilterb0[] = { 35.000,0.94373, 36.000,0.94731, 46.000,0.94731, 47.000,0.96202, 52.000,0.96202, 53.000,0.97477, 58.000,0.97477, 59.000,0.97733, 64.000,0.97733, 65.000,0.97971, 70.000,0.97971, 71.000,0.97971, 76.000,0.97971, 77.000,0.98698, 82.000,0.98698, 83.000,0.98462, 86.000,0.98462, 87.000,0.98611, }; static double loopFilterb1[] = { 35.000,0.60010, 36.000,-0.59124, 46.000,-0.59124, 47.000,-0.21243, 52.000,-0.21243, 53.000,-0.39280, 58.000,-0.39280, 59.000,-0.48307, 64.000,-0.48307, 65.000,0.51965, 70.000,0.51965, 71.000,0.51965, 76.000,0.51965, 77.000,-0.42463, 82.000,-0.42463, 83.000,0.85655, 86.000,0.85655, 87.000,0.68851, }; static double loopFilterb2[] = { 35.000,-0.00360, 36.000,-0.12249, 46.000,-0.12249, 47.000,-0.16044, 52.000,-0.16044, 53.000,-0.21680, 58.000,-0.21680, 59.000,-0.16346, 64.000,-0.16346, 65.000,0.22162, 70.000,0.22162, 71.000,0.22162, 76.000,0.22162, 77.000,-0.14973, 82.000,-0.14973, 83.000,0.24937, 86.000,0.24937, 87.000,0.14838, }; static double loopFiltera1[] = { 35.000,0.5941, 36.000,-0.65928, 46.000,-0.65928, 47.000,-0.24222, 52.000,-0.24222, 53.000,-0.41402, 58.000,-0.41402, 59.000,-0.50837, 64.000,-0.50837, 65.000,0.51263, 70.000,0.51263, 71.000,0.51263, 76.000,0.51263, 77.000,-0.43976, 82.000,-0.43976, 83.000,0.85396, 86.000,0.85396, 87.000,0.68332, }; static double loopFiltera2[] = { 35.000,-0.02641, 36.000,-0.10275, 46.000,-0.10275, 47.000,-0.15842, 52.000,-0.15842, 53.000,-0.21653, 58.000,-0.21653, 59.000,-0.15833, 64.000,-0.15833, 65.000,0.22025, 70.000,0.22025, 71.000,0.22025, 76.000,0.22025, 77.000,-0.14583, 82.000,-0.14583, 83.000,0.24405, 86.000,0.24405, 87.000,0.14370, }; #define getValueLoopFilterb0(x) lookup(LoopFilterb0, x) #define getValueLoopFilterb1(x) lookup(LoopFilterb1, x) #define getValueLoopFilterb2(x) lookup(LoopFilterb2, x) #define getValueLoopFiltera1(x) lookup(LoopFiltera1, x) #define getValueLoopFiltera2(x) lookup(LoopFiltera2, x) //bass static double bassLoopFilterb0[] = { 24.000,0.54355, 26.000,0.54355, 27.000,0.55677, 29.000,0.55677, 32.000,0.55677, 33.000,0.83598, 36.000,0.83598, 43.000,0.83598, 44.000,0.88292, 48.000,0.88292, 51.000,0.88292, 52.000,0.77805, 54.000,0.77805, 57.000,0.77805, 58.000,0.91820, 60.000,0.91820, 61.000,0.91820, 63.000,0.94594, 65.000,0.91820, }; static double bassLoopFilterb1[] = { 24.000,-0.36586, 26.000,-0.36586, 27.000,-0.37628, 29.000,-0.37628, 32.000,-0.37628, 33.000,-0.60228, 36.000,-0.60228, 43.000,-0.60228, 44.000,-0.65721, 48.000,-0.65721, 51.000,-0.65721, 52.000,-0.51902, 54.000,-0.51902, 57.000,-0.51902, 58.000,-0.80765, 60.000,-0.80765, 61.000,-0.80765, 63.000,-0.83230, 65.000,-0.83230, }; static double bassLoopFiltera1[] = { 24.000,-0.81486, 26.000,-0.81486, 27.000,-0.81147, 29.000,-0.81147, 32.000,-0.81147, 33.000,-0.76078, 36.000,-0.76078, 43.000,-0.76078, 44.000,-0.77075, 48.000,-0.77075, 51.000,-0.77075, 52.000,-0.73548, 54.000,-0.73548, 57.000,-0.73548, 58.000,-0.88810, 60.000,-0.88810, 61.000,-0.88810, 63.000,-0.88537, 65.000,-0.88537, }; #define getValueBassLoopFilterb0(x) lookup(BassLoopFilterb0, x) #define getValueBassLoopFilterb1(x) lookup(BassLoopFilterb1, x) #define getValueBassLoopFiltera1(x) lookup(BassLoopFiltera1, x)