You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.5 KiB
Plaintext
115 lines
2.5 KiB
Plaintext
(
|
|
var server;
|
|
var win, soundFileView, loadButton, loopButton;
|
|
var sliders;
|
|
var soundFile, audioBuffer, destBuffer;
|
|
var synthDef, synth;
|
|
var sl1, sl2, sl3, sl4;
|
|
|
|
server = Server.default;
|
|
Font.default = Font("Monaco", 16);
|
|
|
|
audioBuffer = Buffer.new;
|
|
destBuffer = Buffer.new;
|
|
|
|
|
|
synthDef = SynthDef(\nmfDemo,{|bufnum, a1, a2, a3, a4|
|
|
var p = PlayBuf.ar(4, bufnum, loop:1);
|
|
var mix = (a1*p[0]) + (a2 * p[1]) + (a3*p[2]) + (a4*p[3]);
|
|
Out.ar(0, Pan2.ar(mix));
|
|
}).add;
|
|
|
|
|
|
|
|
win = Window.new("NMF4",
|
|
Rect(200,200,800,450)).background_(Color.gray);
|
|
|
|
soundFileView = SoundFileView.new(win)
|
|
.gridOn_(false)
|
|
.waveColors_([Color.white]);
|
|
|
|
loadButton = Button(win, Rect(0, 0, 100, 100))
|
|
.minHeight_(150)
|
|
.states_([["Load", Color.grey, Color.grey(0.8)],
|
|
["Wait", Color.grey, Color.grey(0.2)]]
|
|
);
|
|
|
|
loopButton = Button(win, Rect(0, 0, 100, 100))
|
|
.minHeight_(150)
|
|
.states_(
|
|
[["Play", Color.grey, Color.grey(0.8)],
|
|
["Stop", Color.grey, Color.grey(0.2)]]
|
|
);
|
|
|
|
sliders = Array.fill(4, {|i|
|
|
var s = Slider(win, Rect(0, 0, 100, 10)).value_(0.5);
|
|
s.action_{
|
|
var sym = ("a"++(i+1)).asSymbol;
|
|
synth.set(sym, ControlSpec(0, 1).map(s.value));
|
|
}
|
|
});
|
|
|
|
|
|
loadButton.action_{
|
|
FileDialog({ |path|
|
|
path.postln;
|
|
|
|
soundFile = SoundFile.new;
|
|
soundFile.openRead(path[0]);
|
|
|
|
soundFileView.soundfile = soundFile;
|
|
soundFileView.read(0, soundFile.numFrames);
|
|
Routine{
|
|
audioBuffer = Buffer.read(server, path[0]);
|
|
server.sync;
|
|
FluidBufNMF.process(server,
|
|
audioBuffer.bufnum,destination:destBuffer.bufnum, components:4
|
|
);
|
|
server.sync;
|
|
destBuffer.query;
|
|
server.sync;
|
|
{loadButton.value_(0)}.defer;
|
|
}.play;
|
|
});
|
|
};
|
|
|
|
loopButton.action_{|but|
|
|
var a1 = ControlSpec(0, 1).map(sliders[0].value);
|
|
var a2 = ControlSpec(0, 1).map(sliders[1].value);
|
|
var a3 = ControlSpec(0, 1).map(sliders[2].value);
|
|
var a4 = ControlSpec(0, 1).map(sliders[3].value);
|
|
|
|
if(but.value == 1, {
|
|
synth = Synth(\nmfDemo,
|
|
[\bufnum, destBuffer.bufnum, \a1, a1, \a2, a2, \a3, a3, \a4, a4]);
|
|
},{
|
|
synth.free;
|
|
});
|
|
};
|
|
|
|
|
|
win.layout_(
|
|
VLayout(
|
|
[
|
|
HLayout(
|
|
[loadButton, stretch:1],
|
|
[soundFileView, stretch:5]
|
|
), stretch:2
|
|
],
|
|
[
|
|
HLayout(
|
|
[loopButton, stretch:1],
|
|
[VLayout(
|
|
HLayout(StaticText(win).string_("source 1 ").minWidth_(100), sliders[0]),
|
|
HLayout(StaticText(win).string_("source 2 ").minWidth_(100), sliders[1]),
|
|
HLayout(StaticText(win).string_("source 3 ").minWidth_(100), sliders[2]),
|
|
HLayout(StaticText(win).string_("source 4 ").minWidth_(100), sliders[3])
|
|
), stretch:5]
|
|
), stretch:2
|
|
]
|
|
)
|
|
);
|
|
|
|
win.front;
|
|
)
|