Hi @Thor_Madsen
Thank you!
I will post it again. It was missing neural networks parts (~nn)
s.reboot;
~poll_test = FluidLoadFolder("/Downloads/trompeteCello_NNClass/");
~poll_test.play(s, {"done".postln;});
~src = Buffer(s);
FluidBufCompose.processBlocking(s, ~poll_test.buffer,startChan:0, numChans:1, destination:~src, destStartChan:0, gain: -6.dbamp);
~celloPool = FluidLoadFolder("/Downloads/cello_train/");
~celloPool.play(s, {"done".postln;});
~celloTrain = Buffer(s);
FluidBufCompose.processBlocking(s, ~celloPool.buffer,startChan:0, numChans:1, destination:~celloTrain, destStartChan:0, gain: -6.dbamp);
~trumpetPool = FluidLoadFolder("/Downloads/trumpet_train/");
~trumpetPool.play(s, {"done".postln;});
~trumpetTrain = Buffer(s);
FluidBufCompose.processBlocking(s, ~trumpetPool.buffer,startChan:0, numChans:1, destination:~trumpetTrain, destStartChan:0, gain: -6.dbamp);
FluidWaveform(~trumpetTrain);
//training section autmatically triggered
(
~nmfccs = 13;
~mfccbuf = Buffer.alloc(s,13);
~timbredata = FluidDataSet(s);
~labels = FluidLabelSet(s);
~counter = 0;
~server_train = {
arg buf, label;
OSCdef(\predictions,{
arg msg, innerLabel;
var id = label ++ "%".format(~counter);
if(msg[3] == 1, {
innerLabel = label
}, {
innerLabel = "silence"
});
~timbredata.addPoint(id,~mfccbuf);
~labels.addLabel(id, innerLabel);
~counter = ~counter + 1;
// ~counter.postln;
innerLabel.postln;
},"/prediction");
{
var sig = PlayBuf.ar(1,buf,BufRateScale.ir(buf),doneAction:2);
var mfccs = FluidMFCC.kr(sig,~nmfccs,startCoeff:1,maxNumCoeffs:~nmfccs);
var loudness = FluidLoudness.kr(sig)[0];
var thresh = -40;
var isPredicting = (loudness >= thresh);
var trig = Impulse.kr(60);
FluidKrToBuf.kr(mfccs,~mfccbuf);
SendReply.kr(trig * isPredicting,"/prediction", 1);
SendReply.kr(trig * (1-isPredicting),"/prediction",-1);
sig.dup;
}.play;
};
)
~server_train.(~celloTrain, "cello");
(
~nn = FluidMLPClassifier(s,[5], 1, 1000, 0.1, 0.9,5,0);
// hidden:[5],activation:1,maxIter:1000,learnRate:0.1,momentum:0.9,batchSize:5,validation:0);
)
// run this fitting function for as long as the error is not acceptable
(
~nn.fit(~timbredata,~labels,{
arg loss;
loss.postln;
});
)
// define a querying function on the synth
(
~predictions = Buffer.alloc(s,1);
~server_predictions = {
arg buf;
OSCdef(\predictions,{
arg msg;
var trig, rand, changed;
// trig = Impulse.kr(5);
// rand = TIRand.kr(0, 2, trig);
changed = Changed.kr(msg[3].value.postln);
SendReply.kr(changed.value, '/the_answer', msg[3]);
// msg[3].postln;
},"/prediction");
{
var sig = PlayBuf.ar(1,buf,BufRateScale.ir(buf),doneAction:2);
var mfccs = FluidMFCC.kr(sig,~nmfccs,startCoeff:1,maxNumCoeffs:~nmfccs);
var loudness = FluidLoudness.kr(sig)[0];
var thresh = -40;
var isPredicting = (loudness >= thresh);
var trig = Impulse.kr(30);
FluidKrToBuf.kr(mfccs,~mfccbuf);
~nn.kr(trig * isPredicting,~mfccbuf,~predictions);
SendReply.kr(trig * isPredicting,"/prediction",FluidBufToKr.kr(~predictions));
SendReply.kr(trig * (1-isPredicting),"/prediction",-1);
sig.dup;
}.play;
};
)
// run it with cello or trumpet test sounds...
~server_predictions.(~src);
I believe that is complete.
I run it again and I can get results…
Once again, thank you!