@@ -7,14 +7,14 @@ extern "C"
77{
88#include " Spleeter4Stems.h"
99}
10- enum { PARAM_DUMMY , PARAM__MAX };
10+ enum { PARAM_ORDER , PARAM__MAX };
1111const char paramName[PARAM__MAX][2 ][12 ] =
1212{
13- {" dummy " , " val " },
13+ {" Channel " , " order " },
1414};
1515const float paramValueRange[PARAM__MAX][5 ] =
1616{
17- { 0 .0f , 1 .0f , 0 .5f , 1 .0f , 1 .0f }
17+ { 0 .0f , 3 .0f , 0 .0f , 1 .0f , 1 .0f }
1818};
1919#include < userenv.h> // GetUserProfileDirectory() (link with userenv)
2020const int BUFLEN = 512 ;
@@ -28,7 +28,6 @@ BOOL getCurrentUserDir(char* buf, DWORD buflen)
2828 CloseHandle (hToken);
2929 return TRUE ;
3030}
31- // #define DLINESUBWOOFER
3231class MS5_1AI : public AudioProcessor , public AudioProcessorValueTreeState ::Listener
3332{
3433public:
@@ -42,32 +41,87 @@ class MS5_1AI : public AudioProcessor, public AudioProcessorValueTreeState::List
4241 for (i = 0 ; i < PARAM__MAX; i++)
4342 treeState.addParameterListener (paramName[i][0 ], this );
4443 fs = 44100 ;
44+ order = 0 ;
4545 char dir[512 ];
4646 getCurrentUserDir (dir, 512 );
47- Spleeter4StemsInit (&msr, 2048 , 128 , dir);
48- setLatencySamples (LATENCY);
47+ for (i = 0 ; i < 4 ; i++)
48+ coeffProvPtr[i] = malloc (getCoeffSize ());
49+ // Load coeff
50+ char file1[17 ] = " \\ drum4stems.dat" ;
51+ char file2[17 ] = " \\ bass4stems.dat" ;
52+ char file3[26 ] = " \\ accompaniment4stems.dat" ;
53+ char file4[17 ] = " \\ vocal4stems.dat" ;
54+ size_t len1 = strlen (dir);
55+ size_t len2 = strlen (file1);
56+ char *concat = (char *)malloc (len1 + len2 + 1 );
57+ memcpy (concat, dir, len1);
58+ memcpy (concat + len1, file1, len2 + 1 );
59+ FILE *fp = fopen (concat, " rb" );
60+ fread (coeffProvPtr[0 ], 1 , 39290900 , fp);
61+ fclose (fp);
62+ free (concat);
63+ len2 = strlen (file2);
64+ concat = (char *)malloc (len1 + len2 + 1 );
65+ memcpy (concat, dir, len1);
66+ memcpy (concat + len1, file2, len2 + 1 );
67+ fp = fopen (concat, " rb" );
68+ fread (coeffProvPtr[1 ], 1 , 39290900 , fp);
69+ fclose (fp);
70+ free (concat);
71+ len2 = strlen (file3);
72+ concat = (char *)malloc (len1 + len2 + 1 );
73+ memcpy (concat, dir, len1);
74+ memcpy (concat + len1, file3, len2 + 1 );
75+ fp = fopen (concat, " rb" );
76+ fread (coeffProvPtr[2 ], 1 , 39290900 , fp);
77+ fclose (fp);
78+ free (concat);
79+ len2 = strlen (file4);
80+ concat = (char *)malloc (len1 + len2 + 1 );
81+ memcpy (concat, dir, len1);
82+ memcpy (concat + len1, file4, len2 + 1 );
83+ fp = fopen (concat, " rb" );
84+ fread (coeffProvPtr[3 ], 1 , 39290900 , fp);
85+ fclose (fp);
86+ free (concat);
87+ setLatencySamples (16384 );
88+ msr = 0 ;
4989 }
5090 MS5_1AI::~MS5_1AI ()
5191 {
52- Spleeter4StemsFree (&msr);
92+ Spleeter4StemsFree (msr);
93+ if (coeffProvPtr[0 ])
94+ {
95+ for (int i = 0 ; i < 4 ; i++)
96+ free (coeffProvPtr[i]);
97+ coeffProvPtr[0 ] = 0 ;
98+ }
5399 }
54100 AudioProcessorValueTreeState::ParameterLayout createParameterLayout ()
55101 {
56102 std::vector<std::unique_ptr<RangedAudioParameter>> parameters;
57103 for (int i = 0 ; i < PARAM__MAX; i++)
58- parameters.push_back (std::make_unique<AudioParameterFloat>(paramName[i][0 ], paramName[i][0 ], NormalisableRange<float >(paramValueRange[i][0 ], paramValueRange[i][1 ]), paramValueRange[i][2 ]));
104+ parameters.push_back (std::make_unique<AudioParameterFloat>(paramName[i][0 ], paramName[i][0 ], NormalisableRange<float >(paramValueRange[i][0 ], paramValueRange[i][1 ], paramValueRange[i][ 4 ] ), paramValueRange[i][2 ]));
59105 return { parameters.begin (), parameters.end () };
60106 }
61107 void parameterChanged (const String& parameter, float newValue) override
62108 {
63109 if (parameter == paramName[0 ][0 ])
64110 {
111+ order = (int )newValue;
65112 }
66113 }
67114 // ==============================================================================
68115 void prepareToPlay (double sampleRate, int maximumExpectedSamplesPerBlock) override
69116 {
70117 fs = (int )sampleRate;
118+ if (msr)
119+ {
120+ Spleeter4StemsFree (msr);
121+ free (msr);
122+ }
123+ msr = (Spleeter4Stems*)malloc (sizeof (Spleeter4Stems));
124+ Spleeter4StemsInit (msr, 1536 , 256 , coeffProvPtr);
71125 }
72126 void releaseResources () override
73127 {
@@ -83,9 +137,37 @@ class MS5_1AI : public AudioProcessor, public AudioProcessorValueTreeState::List
83137 const int n = buffer.getNumSamples ();
84138 // input channels
85139 const float *inputs[2 ] = { buffer.getReadPointer (0 ), buffer.getReadPointer (1 ) };
86- float * const outputs[8 ] = { buffer.getWritePointer (0 ), buffer.getWritePointer (1 ),
140+ float *tmpPtr1, *tmpPtr2;
141+ float * outputs[8 ] = { buffer.getWritePointer (0 ), buffer.getWritePointer (1 ),
87142 buffer.getWritePointer (2 ), buffer.getWritePointer (3 ), buffer.getWritePointer (4 ),
88143 buffer.getWritePointer (5 ), buffer.getWritePointer (6 ), buffer.getWritePointer (7 ) };
144+ if (order == 1 )
145+ {
146+ tmpPtr1 = outputs[0 ];
147+ tmpPtr2 = outputs[1 ];
148+ outputs[0 ] = outputs[2 ];
149+ outputs[1 ] = outputs[3 ];
150+ outputs[2 ] = tmpPtr1;
151+ outputs[3 ] = tmpPtr2;
152+ }
153+ else if (order == 2 )
154+ {
155+ tmpPtr1 = outputs[0 ];
156+ tmpPtr2 = outputs[1 ];
157+ outputs[0 ] = outputs[4 ];
158+ outputs[1 ] = outputs[5 ];
159+ outputs[4 ] = tmpPtr1;
160+ outputs[5 ] = tmpPtr2;
161+ }
162+ else if (order == 3 )
163+ {
164+ tmpPtr1 = outputs[0 ];
165+ tmpPtr2 = outputs[1 ];
166+ outputs[0 ] = outputs[6 ];
167+ outputs[1 ] = outputs[7 ];
168+ outputs[6 ] = tmpPtr1;
169+ outputs[7 ] = tmpPtr2;
170+ }
89171 // output channels
90172 int i, offset = 0 ;
91173 while (offset < n)
@@ -94,7 +176,7 @@ class MS5_1AI : public AudioProcessor, public AudioProcessorValueTreeState::List
94176 outputs[2 ] + offset, outputs[3 ] + offset, outputs[4 ] + offset,
95177 outputs[5 ] + offset, outputs[6 ] + offset, outputs[7 ] + offset };
96178 const int processing = min (n - offset, OVPSIZE);
97- Spleeter4StemsProcessSamples (& msr, inputs[0 ] + offset, inputs[1 ] + offset, processing, ptr);
179+ Spleeter4StemsProcessSamples (msr, inputs[0 ] + offset, inputs[1 ] + offset, processing, ptr);
98180 offset += processing;
99181 }
100182 }
@@ -133,8 +215,10 @@ class MS5_1AI : public AudioProcessor, public AudioProcessorValueTreeState::List
133215private:
134216 int isStandalone;
135217 // ==============================================================================
136- Spleeter4Stems msr;
218+ void *coeffProvPtr[4 ];
219+ Spleeter4Stems *msr;
137220 int fs;
221+ int order;
138222 AudioProcessorValueTreeState treeState;
139223 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MS5_1AI)
140224};
0 commit comments