wordBins

(

var str = "";

Array.fill(27, {|i| ((i+97).asAscii!i ++ " ")!i}).flatten(2).do{|it|

str = str ++ it

};

d = str.wordBins(3)

)

// use SwingOSC for proper umlauts in visualization

(

var win, extX, extY, winRect, view, fontName, strings, numbers, countSpec, sizeSpec, alphaSpec, colorSpec, sFactor = 0.25;

#numbers, strings = (d.flop);

strings = strings.collect{|str|

var y = "\"\"";

str.do({|char|

y = y ++ " ++ 0x" ++ char.ascii.asHexString.copyToEnd( 6 )++".asAscii"

});

};

countSpec = [numbers.minItem, numbers.maxItem].asSpec;

sizeSpec = [10, 60].asSpec;

alphaSpec = [1, 0.2].asSpec;

colorSpec = [0.2, 1].asSpec;

extX = 1440;

extY = 900;

winRect = GUI.window.screenBounds;

fontName = "GillSans-Light";

win = GUI.window.new("", winRect, border: false);

win.view.keyDownAction_{|me, char| (char == $q).or{char == 27.asAscii}.if{win.close}};

win.view.background = Color.white;

view = GUI.userView.new(win, win.view.bounds);

view.drawFunc = {

var numAppearance, val;

strings.do{|str, i|

numAppearance = numbers[i];

val = countSpec.unmap(numAppearance);

GUI.pen.font = GUI.font.new(fontName, (sizeSpec.map(val)).asInteger);

GUI.pen.color = Color.red(colorSpec.map(val), alphaSpec.map(val));

GUI.pen.stringCenteredIn(str, Rect((extX*(1-sFactor)).rand, (extY*(1-sFactor)).rand, extX*sFactor, extY*sFactor));

/*str.drawCenteredIn(

Rect((extX*0.5 -50).rand, (extY*0.5 -250).rand, 50, 250),

Font(fontName, (sizeSpec.map(val)).asInteger),

Color.red(colorSpec.map(val), alphaSpec.map(val))

);*/

};

};

view.keyDownFunc_(win.view.keyDownAction);

win.fullScreen;

win.front;

win.view.focus

)