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.
153 lines
3.4 KiB
Plaintext
153 lines
3.4 KiB
Plaintext
(
|
|
var server;
|
|
var win, soundFileView,loadButton, processButton;
|
|
var ksSlider, thSlider;
|
|
var soundFile, audioBuffer, slicesBuffer, slicesArray;
|
|
var addSelections, playFunc, stopFunc;
|
|
var synthDef, synth;
|
|
var synths;
|
|
|
|
var playing, currentSelection, colors, prevColor;
|
|
|
|
playing = Array.fill(10, {false});
|
|
server = Server.default;
|
|
Font.default = Font("Monaco", 16);
|
|
|
|
audioBuffer = Buffer.new;
|
|
slicesBuffer = Buffer.new;
|
|
|
|
colors = Array.fill(64, {Color.rand});
|
|
synths = Array.fill(10, {nil});
|
|
|
|
synthDef = SynthDef(\noveltySegDemo,{|buf, start, end|
|
|
Out.ar(0, BufRd.ar(1, buf, Phasor.ar(1, 1, start, end)));
|
|
}).add;
|
|
|
|
playFunc = {|index|
|
|
var dur;
|
|
currentSelection = index;
|
|
if(playing[index].not){
|
|
synths[index] = Synth(\noveltySegDemo,
|
|
[\buf, audioBuffer.bufnum,
|
|
\start, slicesArray[index],
|
|
\end, slicesArray[index+1]
|
|
]);
|
|
playing[index] = true;
|
|
};
|
|
soundFileView.setSelectionColor(currentSelection, Color.white);
|
|
};
|
|
|
|
stopFunc = {|index| synths[index].free; playing[index] = false;
|
|
soundFileView.setSelectionColor(
|
|
index, colors[index]
|
|
);
|
|
};
|
|
|
|
|
|
win = Window.new("NoveltySegmentation",
|
|
Rect(200,200,800,450)).background_(Color.gray);
|
|
|
|
win.view.keyDownAction_{|view, char, modifiers, unicode, keycode, key|
|
|
if (char.isDecDigit){
|
|
var digit = char.digit;
|
|
if(digit.notNil && slicesArray.notNil){
|
|
playFunc.value(digit - 1);
|
|
}
|
|
}
|
|
};
|
|
|
|
win.view.keyUpAction_{|view, char|
|
|
if(char.isDecDigit){
|
|
stopFunc.value(char.digit - 1);
|
|
}
|
|
};
|
|
|
|
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)]]);
|
|
|
|
processButton = Button(win, Rect(0, 0, 100, 100))
|
|
.minHeight_(150)
|
|
.states_(
|
|
[["Process", Color.grey, Color.grey(0.8)],
|
|
["Wait", Color.grey, Color.grey(0.2)]]
|
|
);
|
|
|
|
ksSlider = Slider(win, Rect(0, 0, 100, 10)).value_(0.5);
|
|
thSlider = Slider(win, Rect(0, 0, 100, 10)).value_(0.5);
|
|
|
|
|
|
loadButton.action_{
|
|
FileDialog({ |path|
|
|
path.postln;
|
|
soundFile = SoundFile.new;
|
|
soundFile.openRead(path[0]);
|
|
audioBuffer = Buffer.read(server, path[0]);
|
|
soundFileView.soundfile = soundFile;
|
|
soundFileView.read(0, soundFile.numFrames);
|
|
});
|
|
};
|
|
|
|
processButton.action_{|but|
|
|
var ks = 2*(ControlSpec(2, 100, step:1).map(ksSlider.value)) - 1;
|
|
var th = ControlSpec(0, 1).map(thSlider.value);
|
|
if(but.value == 1, {
|
|
Routine{
|
|
FluidBufNoveltySlice.process(
|
|
server,
|
|
source:audioBuffer.bufnum,
|
|
indices:slicesBuffer.bufnum,
|
|
kernelSize:ks,
|
|
threshold: th
|
|
);
|
|
server.sync;
|
|
slicesBuffer.loadToFloatArray(action:{|arr|
|
|
slicesArray = arr;
|
|
{ processButton.value_(0);
|
|
addSelections.value(slicesArray)
|
|
}.defer;
|
|
|
|
});
|
|
}.play;
|
|
});
|
|
};
|
|
|
|
|
|
|
|
addSelections = {|array|
|
|
var nSegments = min(array.size, soundFileView.selections.size) - 1;
|
|
soundFileView.selections.do({|sel, i| soundFileView.selectNone(i)});
|
|
nSegments.do({|i|
|
|
soundFileView.setSelectionStart(i, array[i]);
|
|
soundFileView.setSelectionSize(i, array[i+1] - array[i]);
|
|
soundFileView.setSelectionColor(i, colors[i]);
|
|
});
|
|
};
|
|
|
|
win.layout_(
|
|
VLayout(
|
|
[
|
|
HLayout(
|
|
[loadButton, stretch:1],
|
|
[soundFileView, stretch:5]
|
|
), stretch:2
|
|
],
|
|
[
|
|
HLayout(
|
|
[processButton, stretch:1],
|
|
[VLayout(
|
|
HLayout(StaticText(win).string_("Kernel ").minWidth_(100), ksSlider),
|
|
HLayout(StaticText(win).string_(" Threshold").minWidth_(100), thSlider)
|
|
), stretch:5]
|
|
), stretch:2
|
|
]
|
|
)
|
|
);
|
|
|
|
win.front;
|
|
)
|