WIP towards a 'rasterBuffer' approach, waiting on interface decisions and scaling decisions

nix
Ted Moore 4 years ago
parent ee18bdda02
commit 2d4c89ba77

@ -17,8 +17,8 @@ FluidWaveform : FluidViewer {
var <win; var <win;
*new { *new {
arg audioBuffer, slicesBuffer, featureBuffer, parent, bounds, lineWidth = 1, waveformColor, stackFeatures = false, showSpectrogram = false, spectrogramColorScheme = 0, spectrogramAlpha = 1, showWaveform = true, normalizeFeaturesIndependently = true; arg audioBuffer, indicesBuffer, featureBuffer, parent, bounds, lineWidth = 1, waveformColor, stackFeatures = false, rasterBuffer, rasterColorScheme = 0, rasterAlpha = 1, showWaveform = true, normalizeFeaturesIndependently = true;
^super.new.init(audioBuffer,slicesBuffer, featureBuffer, parent, bounds, lineWidth, waveformColor,stackFeatures,showSpectrogram,spectrogramColorScheme,spectrogramAlpha,showWaveform,normalizeFeaturesIndependently); ^super.new.init(audioBuffer,indicesBuffer, featureBuffer, parent, bounds, lineWidth, waveformColor,stackFeatures,rasterBuffer,rasterColorScheme,rasterAlpha,showWaveform,normalizeFeaturesIndependently);
} }
close { close {
@ -34,11 +34,11 @@ FluidWaveform : FluidViewer {
} }
init { init {
arg audio_buf, slices_buf, feature_buf, parent_, bounds, lineWidth, waveformColor,stackFeatures = false, showSpectrogram = false, spectrogramColorScheme = 0, spectrogramAlpha = 1, showWaveform = true,normalizeFeaturesIndependently = true; arg audio_buf, slices_buf, feature_buf, parent_, bounds, lineWidth, waveformColor,stackFeatures = false, rasterBuffer, rasterColorScheme = 0, rasterAlpha = 1, showWaveform = true,normalizeFeaturesIndependently = true;
Task{ Task{
var sfv, categoryCounter = 0, xpos, ypos; var sfv, categoryCounter = 0, xpos, ypos;
waveformColor = waveformColor ? Color(*0.dup(3)); waveformColor = waveformColor ? Color(*0.6.dup(3));
this.createCatColors; this.createCatColors;
@ -61,79 +61,73 @@ FluidWaveform : FluidViewer {
}; };
}); });
if(audio_buf.notNil,{ if(rasterBuffer.notNil,{
if(showSpectrogram,{ var condition = Condition.new;
var magsbuf = Buffer(audio_buf.server); var colors;
var condition = Condition.new;
var colors;
// TODO: no need for this to be a switch statement.
spectrogramColorScheme.switch(
0,{
colors = this.loadColorFile("CET-L02");
},
1,{
colors = this.loadColorFile("CET-L16");
},
2,{
colors = this.loadColorFile("CET-L08");
},
3,{
colors = this.loadColorFile("CET-L03");
},
4,{
colors = this.loadColorFile("CET-L04");
},
{
"% spectrogramColorScheme: % is not valid.".format(thisMethod,spectrogramColorScheme).warn;
}
);
FluidBufSTFT.processBlocking(audio_buf.server,audio_buf,magnitude:magsbuf,action:{
magsbuf.loadToFloatArray(action:{
arg mags;
fork({
var img = Image(magsbuf.numFrames,magsbuf.numChannels);
mags = (mags / mags.maxItem).ampdb.linlin(-120.0,0.0,0,255).asInteger;
mags.do{
arg mag, index;
// colors[mag].postln;
img.setColor(colors[mag], index.div(magsbuf.numChannels), magsbuf.numChannels - 1 - index.mod(magsbuf.numChannels));
};
UserView(win,Rect(xpos,ypos,bounds.width,bounds.height)) // TODO: no need for this to be a switch statement.
.drawFunc_{ rasterColorScheme.switch(
img.drawInRect(Rect(0,0,bounds.width,bounds.height),fraction:spectrogramAlpha); 0,{
}; colors = this.loadColorFile("CET-L02");
},
1,{
colors = this.loadColorFile("CET-L16");
},
2,{
colors = this.loadColorFile("CET-L08");
},
3,{
colors = this.loadColorFile("CET-L03");
},
4,{
colors = this.loadColorFile("CET-L04");
},
{
"% spectrogramColorScheme: % is not valid.".format(thisMethod,rasterColorScheme).warn;
}
);
condition.unhang; rasterBuffer.loadToFloatArray(action:{
magsbuf.free; arg vals;
},AppClock) fork({
}); var img = Image(rasterBuffer.numFrames,rasterBuffer.numChannels);
}); vals = (vals - vals.minItem) / (vals.maxItem - vals.minItem);
condition.hang; vals = (vals * 255).asInteger;
vals.do{
arg val, index;
img.setColor(colors[val], index.div(rasterBuffer.numChannels), rasterBuffer.numChannels - 1 - index.mod(rasterBuffer.numChannels));
};
UserView(win,Rect(xpos,ypos,bounds.width,bounds.height))
.drawFunc_{
img.drawInRect(Rect(0,0,bounds.width,bounds.height),fraction:rasterAlpha);
};
condition.unhang;
},AppClock)
}); });
condition.hang;
});
if(showWaveform,{ if(showWaveform,{
var path = "%%_%_FluidWaveform.wav".format(PathName.tmp,Date.localtime.stamp,UniqueID.next); var path = "%%_%_FluidWaveform.wav".format(PathName.tmp,Date.localtime.stamp,UniqueID.next);
audio_buf.write(path,"wav"); audio_buf.write(path,"wav");
audio_buf.server.sync; audio_buf.server.sync;
sfv = SoundFileView(win,Rect(xpos,ypos,bounds.width,bounds.height)); sfv = SoundFileView(win,Rect(xpos,ypos,bounds.width,bounds.height));
sfv.peakColor_(waveformColor); sfv.peakColor_(waveformColor);
// sfv.rmsColor_(Color.black); // sfv.rmsColor_(Color.black);
sfv.drawsBoundingLines_(false); sfv.drawsBoundingLines_(false);
sfv.rmsColor_(Color.clear); sfv.rmsColor_(Color.clear);
// sfv.background_(Color.white); // sfv.background_(Color.white);
sfv.background_(Color.clear); sfv.background_(Color.clear);
sfv.readFile(SoundFile(path)); sfv.readFile(SoundFile(path));
sfv.gridOn_(false); sfv.gridOn_(false);
File.delete(path); File.delete(path);
});
}); });
if(slices_buf.notNil,{ if(slices_buf.notNil,{

@ -0,0 +1,48 @@
(
~raster = {
arg rasterBuffer;
var colors;
colors = CSVFileReader.readInterpret(FluidFilesPath("../Resources/color-schemes/%.csv".format("CET-L16"))).collect{
arg row;
Color.fromArray(row);
};
rasterBuffer.loadToFloatArray(action:{
arg vals;
"n vals in raster buffer: %".format(vals.size).postln;
fork({
var img = Image(rasterBuffer.numFrames,rasterBuffer.numChannels);
var min = vals.minItem;
var max = vals.maxItem;
var range = max - min;
"min: %".format(min).postln;
"max: %".format(max).postln;
"range: %".format(range).postln;
vals = (vals - min) / range;
vals = (vals * 255).asInteger;
vals.do{
arg val, index;
img.setColor(colors[val], index.div(rasterBuffer.numChannels), rasterBuffer.numChannels - 1 - index.mod(rasterBuffer.numChannels));
};
img.plot;
},AppClock);
});
};
)
// show mels
~drums = Buffer.read(s,FluidFilesPath("Nicol-LoopE-M.wav"));
~rasterBuffer = Buffer(s);
FluidBufMelBands.processBlocking(s,~drums,features:~rasterBuffer,numBands:512,windowSize:1024,action:{"done".postln});
FluidBufSTFT.processBlocking(s,~drums,magnitude:~rasterBuffer,windowSize:1024,action:{"done".postln});
FluidBufMFCC.processBlocking(s,~drums,features:~rasterBuffer,windowSize:1024,action:{"done".postln});
FluidBufChroma.processBlocking(s,~drums,features:~rasterBuffer,action:{"done".postln});
~rasterBuffer.postln;
~raster.(~rasterBuffer);
Loading…
Cancel
Save