FooBarBaz
FooBarBaz é experimento em livecoding. Apresentado no Festival Contato 2011.
Mais sobre Livecoding.
Códigos
Para os códigos usados no projeto, veja AudioArt.
Vídeos
- live coding presentation, part 1 a basic principles of the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil.
- live coding presentation part1 b: REM and cows about Rapid Eyes Movement (REM) and use of cows in the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil.
- live coding presentation part2 improvisation improvisation part of the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil.
- presentation part3 soundscapes The part where we used soundscapes in the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil.
- presentation part4 improvisation2 ending endind of the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil.
Relembrando o experimento
Renato Fabbri por lists.cs.princeton.edu 28/11/11 para ChucK
This is what I used and it was quite enough given the execussion had another live coder and a PD and mixer improviser:
http://ubuntuone.com/7P9ZFMFVVa9cBr4LZ1xtjg
My replace map doesnt work though (last line of the text file on the link). Any idea? BTW, we live coded for more de 2 thousand people here in Brasil at Festival Contato. Some say about ~5 thousand, i guess ~3,5k. Chuck live-coding with Vim rvl3z. Vilson Vieira, the other live-coder, used Emacs. We projected both desktops at the same time.
cheers!,
Renato
Renato Fabbri 30/11/11 para ChucK
well, i wanted to do any documentation of what i did, so here it goes as it came. No sound, just a visual screenshot (perfect for reading as you hear some music of your preference :P) I did not see how it is and cant look that now. The mpeg files are running ok here, i am using mplayer in linux. But they did not run in Kaffeine and another player (dont reacall its name).
presentation-part1.mpeg http://ubuntuone.com/0w8vde6POCJdUhAfDRCB0G
presentation-part1-REM-and-cows.mpeg http://ubuntuone.com/2biXjEGbLARAG9gyJf8MmL
presentation-part2-improvisation.mpeg http://ubuntuone.com/2l6W8HhAEcw5DTcuLxP2wn
presentation-part3-soundscapes.mpeg http://ubuntuone.com/6UXsfV59e7AnvOtAJjWKAO
presentation-part4-improvisation2-ending.mpeg (uploading) http://ubuntuone.com/55te5BtDx7Fb9DdkPlezLV
Dont know if they are uploaded right, i should put them on Vimeo. I would like to have my partners screens, but he had a problem with his lap. Vilson, where is the code u used to play with? all the best and cheers,
Renato Renato Fabbri
02/12/11 para listamacambira, ChucK
> I like how you make a glorious mess instead of the stark minimalism of > the other livecoding I've seen. I'm not sure how this would scale, but > the difference is exciting.
Thanks! I like that also. The idea is to use the desktop to play and make it more appealing. That bouncing white ball is 'processing'. The cow is 'cowsay'. Some years ago i did what i now call LDP (Linux Desktop Playing) with jack-rack, ardour, audacity, PD, chuck, python and even audacious. That was a really big mess, specially with ABT:
http://trac.assembla.com/audioexperiments/browser/ABeatDetector
Maybe what we are doing is live coding with heritances from LDP.
Anyway, these are the 5 small videos at Vimeo, so anyone can take a look: - live coding presentation, part 1 a basic principles of the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil. http://vimeo.com/33012735 - live coding presentation part1 b: REM and cows about Rapid Eyes Movement (REM) and use of cows in the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil. http://vimeo.com/33018740 - live coding presentation part2 improvisation improvisation part of the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil. http://vimeo.com/33019291 - presentation part3 soundscapes The part where we used soundscapes in the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil. http://vimeo.com/33025717 - presentation part4 improvisation2 ending endind of the live coding presentation we did on 20/11/2011 for about 3,5 thousand people on Festival CONTATO, São Carlos, Brazil. http://vimeo.com/33025913 cheers, rfabbri Vilson Vieira 02/12/11 para Renato, ChucK, listamacambira Hey Kassen and other Chuckists! I think it is interesting to note we used an alternative approach considering the sync between Renato and me. The sound was generated by Renato using ChucK/Vim/Jack and by me using ChucK/Emacs/Jack without sync. The audio from both of us was passed to a Pd patch running on a third computer operated by Gilson Beck, another composer, part of the trio (FooBarBaz). Gilson spatialized and mixed the audio generated by us with a visual interface: the movements of his hands were tracked by a "color tracker" implemented by Ricardo Fabbri on Pd/GEM and the x/y coordinates defined the panning effects. On this way we could mix both audio in certain times, creating a dialogue between my sound, Renato's sound and Gilson's. Unfortunatelly I lost my laptop and all the codes within after the presentation, but I used a screen similar to Renato's recorded screencasts, using ChucK as a live sampler, similar to Thor's ixilang approach. A snippet of the code was saved here: https://gist.github.com/1379142 I think Gilson can send you more details about his Pd patch and some videos about the human body interface tracked by colors. All the best. foo.ck: // manipula esse ["samples/fx/s20.wav"] @=> Foo.name; [0.] @=> Foo.prop; [.25, .15] @=> Foo.rate; [2., 1., 1., 4.] @=> Foo.du; [.8] @=> Foo.gain; foosp.ck: // executa esse primeiro que o foo.ck. e antes de tudo o tg.ck public class Foo {
static string name[]; static float prop[]; static float rate[]; static float du[]; static float gain[];
} ["samples/fx/s22.wav"] @=> Foo.name; [.0] @=> Foo.prop; [1.] @=> Foo.rate; [4.] @=> Foo.du; [0.] @=> Foo.gain; TimeGrid tg; tg.set(1::minute/60/2, 8, 10); tg.sync(); SndBuf buf => JCRev j => dac; .5 => j.gain; .2 => j.mix; 0 => int i; while (true) {
Foo.name[0] => buf.read;
Math.trunc(buf.samples()*Foo.prop[i%Foo.prop.size()]) $ int => buf.pos;
Foo.gain[i%Foo.gain.size()] => j.gain;
Foo.rate[i%Foo.rate.size()] => buf.rate;
tg.beat*Foo.du[i%Foo.du.size()] => now;
i++;
} tg.ck //basic timing operations abbreviated public class TimeGrid {
dur beat;
dur meas;
dur sect;
int nbeat;
int nmeas;
//phase and magnitude of offset
float measPhase;
dur measOffset;
fun void set(dur mybeat, int nb, int nm) {
mybeat => beat;
nb => nbeat;
beat*nbeat => meas;
nm => nmeas;
meas*nmeas => sect;
}
//sync to beat
fun void sync() {
beat - (now % beat) => now;
}
fun void sync(dur T) {
T - (now % T) => now;
}
//how long to sync to this duration
fun dur syncDur(dur T) {
return (T - (now % T));
}
//minimum time
fun dur tmin(dur a, dur b) {
return (a < b) ? a : b;
}
//get beat in relation to section
fun int guess() {
//this approach would not count sections
//return ((now % sect) / beat) $ int;
//this approach is completely global
return (now / beat) $ int;
}
//get the mod rhythm
fun int bmod(int r) {
return (r%nbeat);
}
fun int mmod(int r) {
return (r/nbeat%nmeas);
}
fun int smod(int r) {
return (r/nbeat/nmeas);
}
//section markers
int g;
int b;
int m;
int s;
int i;
int j; //for anything, really
int c; //counter in measure
int d; //counter in section
//events for stuff
Event newMeas;
Event newSect;
//update markers
fun int up() {
guess() => g;
//experimental
if ( b-bmod(g)>0 ) { //if b decreases
0=>c;
newMeas.broadcast();
}
else c++;
//TODO: make a c but for the measure
if ( m-mmod(g)>0 ) { //if m decreases
0 => d;
newSect.broadcast();
}
else d++;
bmod(g) => b;
mmod(g) => m;
smod(g) => s;
i++;
return true;
}
//update the markers of another timeGrid
fun int up( TimeGrid tg ) {
this.up();
b => tg.b;
m => tg.m;
s => tg.s;
g => tg.g;
c => tg.c;
i => tg.i;
j => tg.j;
return true;
}
//pause: make shred wait until input low
//ill-concieved, really!, because it can't monitor a changing input
/*
fun void pause( int a ) {
while ( a ) {
beat=>now;
sync();
}
}
*/
}