Fix in incoherency in generated filter source
There was at least on case where a member `fRecN` had a mismatching size with what the implementation expected, and it raised a compiler warning. Perhaps it's a previous git merge which has created this problem.
This commit is contained in:
parent
91b7a85b57
commit
cd8b56f29e
7 changed files with 100 additions and 97 deletions
|
|
@ -49,6 +49,9 @@ faustgen() {
|
|||
if test ! -z "$bwVar"; then
|
||||
$SED -r -i 's/\b'"$bwVar"'\b/fBandwidth/' "$outfile"
|
||||
fi
|
||||
|
||||
# remove trailing whitespace
|
||||
$SED -r -i 's/[ \t]+$//' "$outfile"
|
||||
}
|
||||
|
||||
for f in \
|
||||
|
|
|
|||
|
|
@ -38,10 +38,10 @@ class faust2chBpf6p : public sfzFilterDsp {
|
|||
FAUSTFLOAT fCutoff;
|
||||
FAUSTFLOAT fQ;
|
||||
double fRec0[2];
|
||||
double fRec3[2];
|
||||
double fRec4[2];
|
||||
double fRec5[2];
|
||||
double fRec3[3];
|
||||
double fRec6[2];
|
||||
double fRec4[3];
|
||||
double fRec7[2];
|
||||
double fRec2[3];
|
||||
double fRec1[3];
|
||||
|
|
@ -203,11 +203,11 @@ class faust2chBpf6p : public sfzFilterDsp {
|
|||
fRec8[0] = ((((fRec0[0] * fRec9[0]) + (fRec6[0] * fRec9[1])) + (fRec7[0] * fRec9[2])) - ((fRec4[0] * fRec8[1]) + (fRec5[0] * fRec8[2])));
|
||||
output1[i] = FAUSTFLOAT((((fRec0[0] * fRec8[0]) + (fRec6[0] * fRec8[1])) + (fRec7[0] * fRec8[2])));
|
||||
fRec0[1] = fRec0[0];
|
||||
fRec3[1] = fRec3[0];
|
||||
fRec5[1] = fRec5[0];
|
||||
fRec6[1] = fRec6[0];
|
||||
fRec4[2] = fRec4[1];
|
||||
fRec4[1] = fRec4[0];
|
||||
fRec5[1] = fRec5[0];
|
||||
fRec3[2] = fRec3[1];
|
||||
fRec3[1] = fRec3[0];
|
||||
fRec6[1] = fRec6[0];
|
||||
fRec7[1] = fRec7[0];
|
||||
fRec2[2] = fRec2[1];
|
||||
fRec2[1] = fRec2[0];
|
||||
|
|
|
|||
|
|
@ -11,32 +11,32 @@ Compilation options: -lang cpp -inpl -double -ftz 0
|
|||
|
||||
#ifndef FAUSTFLOAT
|
||||
#define FAUSTFLOAT float
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
|
||||
|
||||
#ifndef FAUSTCLASS
|
||||
#ifndef FAUSTCLASS
|
||||
#define FAUSTCLASS faust2chPink
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#ifdef __APPLE__
|
||||
#define exp10f __exp10f
|
||||
#define exp10 __exp10
|
||||
#endif
|
||||
|
||||
class faust2chPink : public sfzFilterDsp {
|
||||
|
||||
|
||||
public:
|
||||
|
||||
|
||||
double fRec0[4];
|
||||
double fRec1[4];
|
||||
int fSampleRate;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
void metadata(Meta* m) {
|
||||
|
||||
void metadata(Meta* m) {
|
||||
}
|
||||
|
||||
virtual int getNumInputs() {
|
||||
|
|
@ -81,17 +81,17 @@ class faust2chPink : public sfzFilterDsp {
|
|||
}
|
||||
return rate;
|
||||
}
|
||||
|
||||
|
||||
static void classInit(int sample_rate) {
|
||||
}
|
||||
|
||||
|
||||
virtual void instanceConstants(int sample_rate) {
|
||||
fSampleRate = sample_rate;
|
||||
}
|
||||
|
||||
|
||||
virtual void instanceResetUserInterface() {
|
||||
}
|
||||
|
||||
|
||||
virtual void instanceClear() {
|
||||
for (int l0 = 0; (l0 < 4); l0 = (l0 + 1)) {
|
||||
fRec0[l0] = 0.0;
|
||||
|
|
@ -100,7 +100,7 @@ class faust2chPink : public sfzFilterDsp {
|
|||
fRec1[l1] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
virtual void init(int sample_rate) {
|
||||
classInit(sample_rate);
|
||||
instanceInit(sample_rate);
|
||||
|
|
@ -110,18 +110,18 @@ class faust2chPink : public sfzFilterDsp {
|
|||
instanceResetUserInterface();
|
||||
instanceClear();
|
||||
}
|
||||
|
||||
|
||||
virtual faust2chPink* clone() {
|
||||
return new faust2chPink();
|
||||
}
|
||||
|
||||
|
||||
virtual int getSampleRate() {
|
||||
return fSampleRate;
|
||||
}
|
||||
|
||||
|
||||
virtual void buildUserInterface(UI* ui_interface) {
|
||||
}
|
||||
|
||||
|
||||
virtual void compute(int count, FAUSTFLOAT** inputs, FAUSTFLOAT** outputs) {
|
||||
FAUSTFLOAT* input0 = inputs[0];
|
||||
FAUSTFLOAT* input1 = inputs[1];
|
||||
|
|
|
|||
|
|
@ -38,10 +38,10 @@ class faustBpf6p : public sfzFilterDsp {
|
|||
FAUSTFLOAT fCutoff;
|
||||
FAUSTFLOAT fQ;
|
||||
double fRec0[2];
|
||||
double fRec3[2];
|
||||
double fRec4[2];
|
||||
double fRec5[2];
|
||||
double fRec3[3];
|
||||
double fRec6[2];
|
||||
double fRec4[3];
|
||||
double fRec7[2];
|
||||
double fRec2[3];
|
||||
double fRec1[3];
|
||||
|
|
@ -106,16 +106,16 @@ class faustBpf6p : public sfzFilterDsp {
|
|||
fRec0[l0] = 0.0;
|
||||
}
|
||||
for (int l1 = 0; (l1 < 2); l1 = (l1 + 1)) {
|
||||
fRec3[l1] = 0.0;
|
||||
fRec4[l1] = 0.0;
|
||||
}
|
||||
for (int l2 = 0; (l2 < 2); l2 = (l2 + 1)) {
|
||||
fRec5[l2] = 0.0;
|
||||
}
|
||||
for (int l3 = 0; (l3 < 2); l3 = (l3 + 1)) {
|
||||
fRec6[l3] = 0.0;
|
||||
for (int l3 = 0; (l3 < 3); l3 = (l3 + 1)) {
|
||||
fRec3[l3] = 0.0;
|
||||
}
|
||||
for (int l4 = 0; (l4 < 3); l4 = (l4 + 1)) {
|
||||
fRec4[l4] = 0.0;
|
||||
for (int l4 = 0; (l4 < 2); l4 = (l4 + 1)) {
|
||||
fRec6[l4] = 0.0;
|
||||
}
|
||||
for (int l5 = 0; (l5 < 2); l5 = (l5 + 1)) {
|
||||
fRec7[l5] = 0.0;
|
||||
|
|
@ -167,20 +167,20 @@ class faustBpf6p : public sfzFilterDsp {
|
|||
for (int i = 0; (i < count); i = (i + 1)) {
|
||||
double fTemp0 = double(input0[i]);
|
||||
fRec0[0] = ((fSlow0 * fRec0[1]) + fSlow8);
|
||||
fRec3[0] = (fSlow0 * fRec3[1]);
|
||||
fRec5[0] = ((fSlow0 * fRec5[1]) + fSlow9);
|
||||
fRec6[0] = ((fSlow0 * fRec6[1]) + fSlow10);
|
||||
fRec4[0] = (fTemp0 - ((fRec5[0] * fRec4[1]) + (fRec6[0] * fRec4[2])));
|
||||
fRec4[0] = ((fSlow0 * fRec4[1]) + fSlow9);
|
||||
fRec5[0] = ((fSlow0 * fRec5[1]) + fSlow10);
|
||||
fRec3[0] = (fTemp0 - ((fRec4[0] * fRec3[1]) + (fRec5[0] * fRec3[2])));
|
||||
fRec6[0] = (fSlow0 * fRec6[1]);
|
||||
fRec7[0] = ((fSlow0 * fRec7[1]) + fSlow11);
|
||||
fRec2[0] = (((fRec3[0] * fRec4[1]) + ((fRec4[0] * fRec0[0]) + (fRec7[0] * fRec4[2]))) - ((fRec5[0] * fRec2[1]) + (fRec6[0] * fRec2[2])));
|
||||
fRec1[0] = ((((fRec0[0] * fRec2[0]) + (fRec3[0] * fRec2[1])) + (fRec7[0] * fRec2[2])) - ((fRec5[0] * fRec1[1]) + (fRec6[0] * fRec1[2])));
|
||||
output0[i] = FAUSTFLOAT((((fRec0[0] * fRec1[0]) + (fRec3[0] * fRec1[1])) + (fRec7[0] * fRec1[2])));
|
||||
fRec2[0] = ((((fRec3[0] * fRec0[0]) + (fRec6[0] * fRec3[1])) + (fRec7[0] * fRec3[2])) - ((fRec4[0] * fRec2[1]) + (fRec5[0] * fRec2[2])));
|
||||
fRec1[0] = ((((fRec0[0] * fRec2[0]) + (fRec6[0] * fRec2[1])) + (fRec7[0] * fRec2[2])) - ((fRec4[0] * fRec1[1]) + (fRec5[0] * fRec1[2])));
|
||||
output0[i] = FAUSTFLOAT((((fRec0[0] * fRec1[0]) + (fRec6[0] * fRec1[1])) + (fRec7[0] * fRec1[2])));
|
||||
fRec0[1] = fRec0[0];
|
||||
fRec3[1] = fRec3[0];
|
||||
fRec5[1] = fRec5[0];
|
||||
fRec6[1] = fRec6[0];
|
||||
fRec4[2] = fRec4[1];
|
||||
fRec4[1] = fRec4[0];
|
||||
fRec5[1] = fRec5[0];
|
||||
fRec3[2] = fRec3[1];
|
||||
fRec3[1] = fRec3[0];
|
||||
fRec6[1] = fRec6[0];
|
||||
fRec7[1] = fRec7[0];
|
||||
fRec2[2] = fRec2[1];
|
||||
fRec2[1] = fRec2[0];
|
||||
|
|
|
|||
|
|
@ -38,10 +38,10 @@ class faustHsh : public sfzFilterDsp {
|
|||
double fConst2;
|
||||
FAUSTFLOAT fCutoff;
|
||||
FAUSTFLOAT fQ;
|
||||
double fRec0[2];
|
||||
double fRec1[2];
|
||||
double fRec2[2];
|
||||
double fRec0[3];
|
||||
double fRec3[2];
|
||||
double fRec1[3];
|
||||
double fRec4[2];
|
||||
double fRec5[2];
|
||||
|
||||
|
|
@ -103,16 +103,16 @@ class faustHsh : public sfzFilterDsp {
|
|||
|
||||
virtual void instanceClear() {
|
||||
for (int l0 = 0; (l0 < 2); l0 = (l0 + 1)) {
|
||||
fRec0[l0] = 0.0;
|
||||
fRec1[l0] = 0.0;
|
||||
}
|
||||
for (int l1 = 0; (l1 < 2); l1 = (l1 + 1)) {
|
||||
fRec2[l1] = 0.0;
|
||||
}
|
||||
for (int l2 = 0; (l2 < 2); l2 = (l2 + 1)) {
|
||||
fRec3[l2] = 0.0;
|
||||
for (int l2 = 0; (l2 < 3); l2 = (l2 + 1)) {
|
||||
fRec0[l2] = 0.0;
|
||||
}
|
||||
for (int l3 = 0; (l3 < 3); l3 = (l3 + 1)) {
|
||||
fRec1[l3] = 0.0;
|
||||
for (int l3 = 0; (l3 < 2); l3 = (l3 + 1)) {
|
||||
fRec3[l3] = 0.0;
|
||||
}
|
||||
for (int l4 = 0; (l4 < 2); l4 = (l4 + 1)) {
|
||||
fRec4[l4] = 0.0;
|
||||
|
|
@ -155,26 +155,26 @@ class faustHsh : public sfzFilterDsp {
|
|||
double fSlow6 = (fSlow3 * (fSlow1 + -1.0));
|
||||
double fSlow7 = ((fSlow1 + fSlow5) + (1.0 - fSlow6));
|
||||
double fSlow8 = (1.0 - fSlow0);
|
||||
double fSlow9 = ((((0.0 - (2.0 * fSlow1)) * ((fSlow1 + fSlow4) + -1.0)) / fSlow7) * fSlow8);
|
||||
double fSlow10 = ((2.0 * ((fSlow1 + (-1.0 - fSlow4)) / fSlow7)) * fSlow8);
|
||||
double fSlow11 = (((fSlow1 + (1.0 - (fSlow5 + fSlow6))) / fSlow7) * fSlow8);
|
||||
double fSlow12 = (fSlow1 + fSlow6);
|
||||
double fSlow13 = (((fSlow1 * ((fSlow5 + fSlow12) + 1.0)) / fSlow7) * fSlow8);
|
||||
double fSlow14 = (((fSlow1 * (fSlow12 + (1.0 - fSlow5))) / fSlow7) * fSlow8);
|
||||
double fSlow9 = ((2.0 * ((fSlow1 + (-1.0 - fSlow4)) / fSlow7)) * fSlow8);
|
||||
double fSlow10 = (((fSlow1 + (1.0 - (fSlow5 + fSlow6))) / fSlow7) * fSlow8);
|
||||
double fSlow11 = (fSlow1 + fSlow6);
|
||||
double fSlow12 = (((fSlow1 * ((fSlow5 + fSlow11) + 1.0)) / fSlow7) * fSlow8);
|
||||
double fSlow13 = ((((0.0 - (2.0 * fSlow1)) * ((fSlow1 + fSlow4) + -1.0)) / fSlow7) * fSlow8);
|
||||
double fSlow14 = (((fSlow1 * (fSlow11 + (1.0 - fSlow5))) / fSlow7) * fSlow8);
|
||||
for (int i = 0; (i < count); i = (i + 1)) {
|
||||
double fTemp0 = double(input0[i]);
|
||||
fRec0[0] = ((fSlow0 * fRec0[1]) + fSlow9);
|
||||
fRec1[0] = ((fSlow0 * fRec1[1]) + fSlow9);
|
||||
fRec2[0] = ((fSlow0 * fRec2[1]) + fSlow10);
|
||||
fRec3[0] = ((fSlow0 * fRec3[1]) + fSlow11);
|
||||
fRec1[0] = (fTemp0 - ((fRec2[0] * fRec1[1]) + (fRec3[0] * fRec1[2])));
|
||||
fRec0[0] = (fTemp0 - ((fRec1[0] * fRec0[1]) + (fRec2[0] * fRec0[2])));
|
||||
fRec3[0] = ((fSlow0 * fRec3[1]) + fSlow12);
|
||||
fRec4[0] = ((fSlow0 * fRec4[1]) + fSlow13);
|
||||
fRec5[0] = ((fSlow0 * fRec5[1]) + fSlow14);
|
||||
output0[i] = FAUSTFLOAT(((fRec0[0] * fRec1[1]) + ((fRec1[0] * fRec4[0]) + (fRec5[0] * fRec1[2]))));
|
||||
fRec0[1] = fRec0[0];
|
||||
fRec2[1] = fRec2[0];
|
||||
fRec3[1] = fRec3[0];
|
||||
fRec1[2] = fRec1[1];
|
||||
output0[i] = FAUSTFLOAT((((fRec0[0] * fRec3[0]) + (fRec4[0] * fRec0[1])) + (fRec5[0] * fRec0[2])));
|
||||
fRec1[1] = fRec1[0];
|
||||
fRec2[1] = fRec2[0];
|
||||
fRec0[2] = fRec0[1];
|
||||
fRec0[1] = fRec0[0];
|
||||
fRec3[1] = fRec3[0];
|
||||
fRec4[1] = fRec4[0];
|
||||
fRec5[1] = fRec5[0];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,10 +38,10 @@ class faustLsh : public sfzFilterDsp {
|
|||
double fConst2;
|
||||
FAUSTFLOAT fCutoff;
|
||||
FAUSTFLOAT fQ;
|
||||
double fRec0[2];
|
||||
double fRec1[2];
|
||||
double fRec2[2];
|
||||
double fRec0[3];
|
||||
double fRec3[2];
|
||||
double fRec1[3];
|
||||
double fRec4[2];
|
||||
double fRec5[2];
|
||||
|
||||
|
|
@ -103,16 +103,16 @@ class faustLsh : public sfzFilterDsp {
|
|||
|
||||
virtual void instanceClear() {
|
||||
for (int l0 = 0; (l0 < 2); l0 = (l0 + 1)) {
|
||||
fRec0[l0] = 0.0;
|
||||
fRec1[l0] = 0.0;
|
||||
}
|
||||
for (int l1 = 0; (l1 < 2); l1 = (l1 + 1)) {
|
||||
fRec2[l1] = 0.0;
|
||||
}
|
||||
for (int l2 = 0; (l2 < 2); l2 = (l2 + 1)) {
|
||||
fRec3[l2] = 0.0;
|
||||
for (int l2 = 0; (l2 < 3); l2 = (l2 + 1)) {
|
||||
fRec0[l2] = 0.0;
|
||||
}
|
||||
for (int l3 = 0; (l3 < 3); l3 = (l3 + 1)) {
|
||||
fRec1[l3] = 0.0;
|
||||
for (int l3 = 0; (l3 < 2); l3 = (l3 + 1)) {
|
||||
fRec3[l3] = 0.0;
|
||||
}
|
||||
for (int l4 = 0; (l4 < 2); l4 = (l4 + 1)) {
|
||||
fRec4[l4] = 0.0;
|
||||
|
|
@ -156,25 +156,25 @@ class faustLsh : public sfzFilterDsp {
|
|||
double fSlow7 = (fSlow1 + fSlow6);
|
||||
double fSlow8 = ((fSlow5 + fSlow7) + 1.0);
|
||||
double fSlow9 = (1.0 - fSlow0);
|
||||
double fSlow10 = ((2.0 * ((fSlow1 * (fSlow1 + (-1.0 - fSlow4))) / fSlow8)) * fSlow9);
|
||||
double fSlow11 = (((0.0 - (2.0 * ((fSlow1 + fSlow4) + -1.0))) / fSlow8) * fSlow9);
|
||||
double fSlow12 = (((fSlow7 + (1.0 - fSlow5)) / fSlow8) * fSlow9);
|
||||
double fSlow13 = (((fSlow1 * ((fSlow1 + fSlow5) + (1.0 - fSlow6))) / fSlow8) * fSlow9);
|
||||
double fSlow10 = (((0.0 - (2.0 * ((fSlow1 + fSlow4) + -1.0))) / fSlow8) * fSlow9);
|
||||
double fSlow11 = (((fSlow7 + (1.0 - fSlow5)) / fSlow8) * fSlow9);
|
||||
double fSlow12 = (((fSlow1 * ((fSlow1 + fSlow5) + (1.0 - fSlow6))) / fSlow8) * fSlow9);
|
||||
double fSlow13 = ((2.0 * ((fSlow1 * (fSlow1 + (-1.0 - fSlow4))) / fSlow8)) * fSlow9);
|
||||
double fSlow14 = (((fSlow1 * (fSlow1 + (1.0 - (fSlow5 + fSlow6)))) / fSlow8) * fSlow9);
|
||||
for (int i = 0; (i < count); i = (i + 1)) {
|
||||
double fTemp0 = double(input0[i]);
|
||||
fRec0[0] = ((fSlow0 * fRec0[1]) + fSlow10);
|
||||
fRec1[0] = ((fSlow0 * fRec1[1]) + fSlow10);
|
||||
fRec2[0] = ((fSlow0 * fRec2[1]) + fSlow11);
|
||||
fRec0[0] = (fTemp0 - ((fRec1[0] * fRec0[1]) + (fRec2[0] * fRec0[2])));
|
||||
fRec3[0] = ((fSlow0 * fRec3[1]) + fSlow12);
|
||||
fRec1[0] = (fTemp0 - ((fRec2[0] * fRec1[1]) + (fRec3[0] * fRec1[2])));
|
||||
fRec4[0] = ((fSlow0 * fRec4[1]) + fSlow13);
|
||||
fRec5[0] = ((fSlow0 * fRec5[1]) + fSlow14);
|
||||
output0[i] = FAUSTFLOAT(((fRec0[0] * fRec1[1]) + ((fRec1[0] * fRec4[0]) + (fRec5[0] * fRec1[2]))));
|
||||
fRec0[1] = fRec0[0];
|
||||
fRec2[1] = fRec2[0];
|
||||
fRec3[1] = fRec3[0];
|
||||
fRec1[2] = fRec1[1];
|
||||
output0[i] = FAUSTFLOAT((((fRec0[0] * fRec3[0]) + (fRec4[0] * fRec0[1])) + (fRec5[0] * fRec0[2])));
|
||||
fRec1[1] = fRec1[0];
|
||||
fRec2[1] = fRec2[0];
|
||||
fRec0[2] = fRec0[1];
|
||||
fRec0[1] = fRec0[0];
|
||||
fRec3[1] = fRec3[0];
|
||||
fRec4[1] = fRec4[0];
|
||||
fRec5[1] = fRec5[0];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,31 +11,31 @@ Compilation options: -lang cpp -inpl -double -ftz 0
|
|||
|
||||
#ifndef FAUSTFLOAT
|
||||
#define FAUSTFLOAT float
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
|
||||
|
||||
#ifndef FAUSTCLASS
|
||||
#ifndef FAUSTCLASS
|
||||
#define FAUSTCLASS faustPink
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#ifdef __APPLE__
|
||||
#define exp10f __exp10f
|
||||
#define exp10 __exp10
|
||||
#endif
|
||||
|
||||
class faustPink : public sfzFilterDsp {
|
||||
|
||||
|
||||
public:
|
||||
|
||||
|
||||
double fRec0[4];
|
||||
int fSampleRate;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
void metadata(Meta* m) {
|
||||
|
||||
void metadata(Meta* m) {
|
||||
}
|
||||
|
||||
virtual int getNumInputs() {
|
||||
|
|
@ -72,23 +72,23 @@ class faustPink : public sfzFilterDsp {
|
|||
}
|
||||
return rate;
|
||||
}
|
||||
|
||||
|
||||
static void classInit(int sample_rate) {
|
||||
}
|
||||
|
||||
|
||||
virtual void instanceConstants(int sample_rate) {
|
||||
fSampleRate = sample_rate;
|
||||
}
|
||||
|
||||
|
||||
virtual void instanceResetUserInterface() {
|
||||
}
|
||||
|
||||
|
||||
virtual void instanceClear() {
|
||||
for (int l0 = 0; (l0 < 4); l0 = (l0 + 1)) {
|
||||
fRec0[l0] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
virtual void init(int sample_rate) {
|
||||
classInit(sample_rate);
|
||||
instanceInit(sample_rate);
|
||||
|
|
@ -98,18 +98,18 @@ class faustPink : public sfzFilterDsp {
|
|||
instanceResetUserInterface();
|
||||
instanceClear();
|
||||
}
|
||||
|
||||
|
||||
virtual faustPink* clone() {
|
||||
return new faustPink();
|
||||
}
|
||||
|
||||
|
||||
virtual int getSampleRate() {
|
||||
return fSampleRate;
|
||||
}
|
||||
|
||||
|
||||
virtual void buildUserInterface(UI* ui_interface) {
|
||||
}
|
||||
|
||||
|
||||
virtual void compute(int count, FAUSTFLOAT** inputs, FAUSTFLOAT** outputs) {
|
||||
FAUSTFLOAT* input0 = inputs[0];
|
||||
FAUSTFLOAT* output0 = outputs[0];
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue