Snyderphonics Manta Layout

layout screenshot
Inspired on a layout of dhub over at the snyderphonics forum, I created a layout page for the manta.
I decided to have a big pdf scheme for scribblings and a four-on-a-page version in case you want to have four “pages” on your manta (e.g. to be switched with the upper right buttons). Here is the LFSaw Manta Layout.
These two pdfs (1pager, 4pager) are editable in Illustrator (> CS3), so please feel free to modify them to your needs.
I would enjoy to find your derivations in the comments below.

[ Forum Thread, LFSaw Manta Layout, 1pager, 4pager ]

Data Transfer through Sound

2009-SoundCommunication.jpgToday, I stumbled across this article that investigates into using sound as a transfer medium for digital information.

Though this is actually a very old and commonly used method for transferring files back in the 90s (we did this via tty telephone modems), it is kind-of pleasing to see this idea popping up again, and triggered some thoughts about it’s usefulness in cooperative livecoding situations.  

Yes, it would be really fun not have to setup wireless LAN that invisibly and–for the audience–almost magically transfer information from one laptop to another, and, instead, having some sort of musical/non-aweful sound that transmit additional information from one laptop to another.

I wonder if anyone ever thought of this in the SuperCollider / LiveCoding community, but I think it’s worth!

Interactive Python Mode for TextMate

I hereby release TM_InteractivePython.

It is a TextMate Bundle implementing REPL for python. Feedback welcome.
A big thanx goes to technotales for explanation of REPL-modes for vim, and Renick for ponting me to REPL, and of course the SuperCollider community, which inspired me to look for such a way to get python REPL’y to work in TextMate.

Download Instructions here



CC-GNU GPL

This software is licensed under the CC-GNU GPL version 2.0 or later.

Quicksilver update

Though my copy of quicksilver says there is no new quicksilver release around, there is.

I am really happy that some guys are working on it and doing bug tracking and further development. To be hinest, I could not work with my computer without quicksilver.

So, keep on movin’!

Kuler and sclang

This patch extracts color values from the kuler api via a themeID and converts them to Color objects.

It requires 
- the XML quark by Jens Gulden (wow! thanx) for parsing the xml stuff and
- the wslib quark by wouter snoei (wow, too!) for Meta_Color:newHex
- a valid kuler dev-key (see http://kuler.adobe.com/api/ for details)


// Process Kuler rss feed for Color extraction

(
~getFeed = {
arg
fileName,
kulerKey, // insert your kuler key
themeID(347630); // ID of a kuler theme

"curl \"http://kuler-api.adobe.com/rss/search.cfm?itemsPerPage=20&startIndex=0&searchQuery=themeID:%&key=%\" > /tmp/%"
.format(themeID, kulerKey, fileName).unixCmd;
};
~xml2color = {|fileName|
DOMDocument("/tmp/%".format(fileName))
.getElementsByTagName("kuler:swatch")
.collect{|swatch|
swatch.getElementsByTagName("kuler:swatchHexColor")
.collect(_.getText)
}.flatten.collect{|str|
Color.newHex(str)
}
};
~tidy = {|fileName|
"rm /tmp/%".format(fileName).unixCmd;
};
~show = {|color, bounds(Rect(30,300, 100, 30))|
var window;
var extent = bounds.extent.asArray;
window = Window.new("ColorTest", bounds, false);
window.drawHook = {
3.do{|i|
Pen.color = Color.gray(i * 0.5);
Pen.fillRect(
Rect.fromArray([i*(extent.first/3),0] ++
(extent * [1/3, 1]))
);
};
Pen.color = color;
Pen.fillRect(Rect.fromArray(extent*0.1 ++ extent * 0.8));
};
window.front;
}
)
(
{
~fileName = "%.xml".format(Date.getDate.stamp);
~getFeed.value(~fileName, "your Kuler key here");
2.wait;
"less /tmp/%".format(~fileName).unixCmd;
a = ~xml2color.value(~fileName);
1.wait;
~tidy.value(~fileName)
}.fork;
)

a.do{|c| ~show.(c)}

Efficiency

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.

[Knuth, Donald. Structured Programming with go to Statements, ACM Journal Computing Surveys, Vol 6, No. 4, Dec. 1974. p.268.]

word cloud

Lfsaw-Scwiki
A word cloud for SuperCollider3 on osX regarding all open documents excluding this one and the post window.
The Picture shows the research part of my supercollider wiki.


(
var index = 0, size, bj = 0;

a = Document.allDocuments.asSet
.remove(Document.current)
.remove(Document.post).collect{|doc|

doc.string.stripRTF
//.toLower
// replace \n, \t with blank
.tr($\t, $ ).tr($\n, $ )
// remove paren
.tr($(, $ ).tr($), $ ).tr(${, $ ).tr($}, $ ).tr($[, $ ).tr($], $ )
// remove *:,.?
.tr($*, $ ).tr($:, $ ).tr($,, $ ).tr($., $ ).tr($?, $ )
.tr($/, $ )
.split($ )
// reject stopwords < 4 chars (including " ")
.reject{|str| str.size < 4}
}.asArray.flatten.sort;

size = a.size;
b = Array.fill(size, "");
c = Array.fill(size, 1);

while({index < (size-1)}, {
b[bj] = a[index];
((a[index].toLower) == (a[index+1].toLower)).if({
c[bj] = c[bj] + 1;
}, {
bj = bj + 1;
});
index = index+1;
});
c = [c, b].flop.reject{|it| it.last == ""}.sort({|a, b| a.first < b.first});
)

d = c.select{|chunk| chunk.first > 2 }

(
var win, extX, extY, winRect, view, fontName,
chunks, countSpec, sizeSpec, alphaSpec, colorSpec;
chunks = d;
countSpec = [chunks.flop.first.minItem, chunks.flop.first.maxItem].asSpec;
sizeSpec = [10, 160].asSpec;
alphaSpec = [1, 0.2].asSpec;
colorSpec = [0.2, 1].asSpec;

extX = 800;
extY = 600;
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 str, numAppearance, val;
chunks.do{|chunk, i|
# numAppearance, str = chunk;
val = countSpec.unmap(numAppearance);

str.drawCenteredIn(
Rect((extX+200).rand, (extY-100).rand, 400, 350),
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
)

Base


(
~duau.play;
~duau = {|t_gate = 0, t_gate2 = 0, freq = 80|
var src;
src = SinOsc.ar(
Phasor.ar(t_gate, [20, 21], freq, 10),
pi,
2
).softclip.sum;

src = CompanderD.ar(src, src,
thresh: EnvGen.ar(Env([0,1,0], [0.1, 0.1]), gate: t_gate),
slopeBelow: 0.022,
slopeAbove: 0.1,
clampTime: 0.2,
relaxTime: 0.00002
) * EnvGen.ar(Env([0,1,0], [0.0001, 2]), gate: t_gate2)!2;
src.softclip
}
)
~duau.set(\t_gate, 1, \t_gate2, 1, \freq, 76)
~duau.set(\t_gate, 1, \t_gate2, 1, \freq, 96)

Technorati Tags: ,

Livecoding Practice II

Done without the function posted in the last post, but I like it anyhow:


s.boot;
p = ProxySpace.push(s);
ProxyMixer(p)
History.start;

~tacker.clear
~tacker.fadeTime = 10;
~tacker = {|amp = 0.1, freq = 60|
var in;
var lf = {LFSaw.ar(Phasor.ar(
Impulse.ar(2/5, 2.0.rand),
120,
1,
TRand.kr(0.5 * freq, freq, Impulse.ar(50))
))}!10;
in = lf.collect{|lf|
(Impulse.ar(lf.exprange(15, 1000)) * lf.range(0.1, 1))
}.sum * 0.1;
(Pan2.ar(in, WhiteNoise.ar(1)) * 20 * amp).softclip
}
~tacker.play

~filta = {|freq = 10000, rq = 0.1|
RLPF.ar(~tacker.ar, freq, rq)
}

Spec.add(\wet, [0, 1].asSpec)
~outa = {|wet = 0.1| (wet * ~filta.ar) + ((1-wet) * ~tacker.ar)}
~cutta = {
~outa.ar * LFPulse.ar(Line.kr(10, 20, 300))
}

Spec.add(\dt, [0, 1].asSpec)
~tacker1 = {|dt = 0.2| DelayN.ar(~cutta.ar, 1, dt)}
p.free(10)

Technorati Tags: , ,

Livecoding Practice

sometimes it makes sense to practice livecoding. In order not to use the same UGens and Patterns over and over again, I wrote this little recurrent function which collects all available UGens and chooses one for you to use.

f = {|ugen|
ugen.subclasses.notNil.if({
ugen.subclasses.collect({|ugen| f.(ugen)}) ++ [ugen]
}, {
[ugen]
})
}

f.(UGen).flat.choose

enjoy!

Update: redFrik pointed me to this little patch AdC wrote some time ago. It is much fancier then mine, but you have to post your solutions and score here.

[ redFrik | AdC | livecoding ]

Spiritus Coloris

Spcoloris-Blumengiessen-Klein
On Friday, 15th of June, René Tünnermann, Matthias Zenker and myself will present the latest in sonobotanics, an exhibition of Spiritus Coloris, a colorvorous plant normally invisible and not perceivable vegetable form of life. More information may be found here.

Update:
It was much work, but in the end it was really great! Thanx to all participating and experiencing and believing in and to Sp.Coloris. Pictures and sounds (and videos?) will follow soon.

[ Sonobotanics home | Exhibition home | in this blog ]

Technorati Tags:

Description of Live Coding

If you’re building a house that you plan to live in for a few decades, you’d better make sure it has a good framework. Live coding is more like making a fort out of cardboard boxes — it goes up REALLY FAST and you have a hell of a lot of fun playing in it, and when the game’s over, nobody cares if it falls down 2 seconds later.

[ James Harkins, in a mail to the sc users mailinglist on mai, 31 2007 17:27:04 MESZ ]

SETO


The Framework for TUIO-based tangible computing with SuperCollider now is called SETO – SuperCollider Environment for Tangible Objects.

You may install it in SuperCollider by evaluating

Quarks.checkoutAll;
Quarks.install("TUIO") // still the old name...

and then restarting the interpreter.
If you have a GUI app (Cocoa or SwingOSC atm.) you may want to use TUIOServer:gui to see the recognized objects and their states.
More information can be found at the SETO home and the TUIO home.
Have fun and feel free to contact me if something isn’t working right.

[SETO home | TUIO home]