pushing from windows too. added LiSa files
This commit is contained in:
parent
d8b4beaceb
commit
0fde988d0d
2
LiSa/LiSa Tutorial- the Basics.url
Normal file
2
LiSa/LiSa Tutorial- the Basics.url
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[InternetShortcut]
|
||||||
|
URL=http://dtrueman.mycpanel.princeton.edu/LiSa/LiSa_tutorial.html
|
55
LiSa/LiSa_Basic.ck
Normal file
55
LiSa/LiSa_Basic.ck
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// name: LiSa
|
||||||
|
// desc: Live sampling utilities for ChucK
|
||||||
|
//
|
||||||
|
// author: Dan Trueman, 2007
|
||||||
|
//
|
||||||
|
// to run (in command line chuck):
|
||||||
|
// %> chuck LiSa_readme.ck
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
the LiSa ugens allow realtime recording of audio to a buffer for various kinds
|
||||||
|
of manipulation.
|
||||||
|
|
||||||
|
Below is a simple example demonstrating the basic functionality of LiSaBasic.
|
||||||
|
|
||||||
|
See the LiSaMulti_readme for a command summary and instructions for doing
|
||||||
|
multiple voice playback.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//signal chain; record a sine wave, play it back
|
||||||
|
adc => LiSa saveme => dac;
|
||||||
|
//s => dac; //monitor the input
|
||||||
|
//440. => s.freq;
|
||||||
|
//0.2 => s.gain;
|
||||||
|
|
||||||
|
//alloc memory; required
|
||||||
|
60::second => saveme.duration;
|
||||||
|
|
||||||
|
//set playback rate
|
||||||
|
//1.5 => saveme.rate;
|
||||||
|
|
||||||
|
//start recording input
|
||||||
|
saveme.record(1);
|
||||||
|
|
||||||
|
//1 sec later, start playing what was just recorded
|
||||||
|
1000::ms => now;
|
||||||
|
saveme.rampUp(100::ms);
|
||||||
|
//use saveme.play(1) to start playing without ramp
|
||||||
|
|
||||||
|
//hang for a bit
|
||||||
|
1000::ms => now;
|
||||||
|
|
||||||
|
//rampdown
|
||||||
|
saveme.rampDown(300::ms);
|
||||||
|
//use saveme.play(0) to stop playing without ramp
|
||||||
|
|
||||||
|
500::ms => now;
|
||||||
|
|
||||||
|
//bye bye
|
||||||
|
//-----------------------------------------------------------------------------
|
95
LiSa/LiSa_Multi.ck
Normal file
95
LiSa/LiSa_Multi.ck
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// name: LiSa
|
||||||
|
// desc: Live sampling utilities for ChucK
|
||||||
|
//
|
||||||
|
// author: Dan Trueman, 2007
|
||||||
|
//
|
||||||
|
// to run (in command line chuck):
|
||||||
|
// %> chuck LiSa_readme.ck
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
LiSa allows for multiple voice playback from a live-sampled buffer. Useful
|
||||||
|
for granular sampling (a la [munger~] from PeRColate) and looping (a la LoopLoop,
|
||||||
|
Jamman, Echoplex, etc....). The methods are overloaded, taking a "voice" number
|
||||||
|
as a first arg. if no voice number is specified, LiSa assumes 0=>voice.
|
||||||
|
|
||||||
|
Below is a simple example to show how to crossfade two voices. See also the
|
||||||
|
LiSa_munger directory for other approaches.
|
||||||
|
|
||||||
|
Below the example find a (lengthy) command summary.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
//signal chain; record a sine wave, play it back
|
||||||
|
SinOsc s => Envelope e => LiSa loopme => dac;
|
||||||
|
s => dac;
|
||||||
|
440. => s.freq;
|
||||||
|
0.2 => s.gain;
|
||||||
|
|
||||||
|
//alloc memory
|
||||||
|
6::second => loopme.duration;
|
||||||
|
|
||||||
|
//play s for a bit
|
||||||
|
500::ms => now;
|
||||||
|
|
||||||
|
//sweep the freq for fun
|
||||||
|
Envelope pitchmod => blackhole;
|
||||||
|
pitchmod.duration(2000::ms);
|
||||||
|
pitchmod.value(s.freq());
|
||||||
|
pitchmod.target(880.);
|
||||||
|
|
||||||
|
//confirm that the length of the buffer is what you expect
|
||||||
|
<<<"buffer duration = ", loopme.duration() / 44100.>>>;
|
||||||
|
|
||||||
|
//set times for recording fade in/out and sample loop length
|
||||||
|
100::ms => dur recfadetime;
|
||||||
|
1000::ms => dur mylooplen;
|
||||||
|
e.duration(recfadetime);
|
||||||
|
|
||||||
|
//start recording input; record 1 seconds worth
|
||||||
|
loopme.record(1);
|
||||||
|
e.keyOn(); //can also do without the Envelope and use loopme.recramp(dur) to set a recording ramp
|
||||||
|
|
||||||
|
now + (mylooplen - recfadetime) => time later;
|
||||||
|
while(now < later) {
|
||||||
|
|
||||||
|
pitchmod.value() => s.freq;
|
||||||
|
10::ms => now;
|
||||||
|
|
||||||
|
}
|
||||||
|
e.keyOff();
|
||||||
|
recfadetime => now;
|
||||||
|
loopme.record(0);
|
||||||
|
|
||||||
|
//disconnect input and hangout a bit
|
||||||
|
s =< dac;
|
||||||
|
1000::ms => now;
|
||||||
|
|
||||||
|
//now, manipulate the sample
|
||||||
|
// get a voicenumber; note that this voice won't actually be reserved until you play it
|
||||||
|
loopme.getVoice() => int voice1;
|
||||||
|
|
||||||
|
//we'll play voice 1 forward, and then crossfade it with voice 2 backwards
|
||||||
|
loopme.play(voice1, 1);
|
||||||
|
(mylooplen - recfadetime) => now;
|
||||||
|
|
||||||
|
//just as voice 1 is going to fade, bring in voice 2
|
||||||
|
loopme.getVoice() => int voice2;
|
||||||
|
loopme.rate(voice2, -1.);
|
||||||
|
loopme.playPos(voice2, mylooplen);
|
||||||
|
loopme.voiceGain(voice2, 0.2);
|
||||||
|
loopme.play(voice2, 1);
|
||||||
|
|
||||||
|
//wait until voice 1 had finished fading, then turn off
|
||||||
|
recfadetime => now;
|
||||||
|
loopme.play(voice1, 0);
|
||||||
|
|
||||||
|
//wait for voice 2 to finish
|
||||||
|
1000::ms => now;
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
24
LiSa/LiSa_SndBuf.ck
Normal file
24
LiSa/LiSa_SndBuf.ck
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
//ugens
|
||||||
|
SndBuf buf;
|
||||||
|
LiSa lisa => dac;
|
||||||
|
|
||||||
|
//change this path to your own sample
|
||||||
|
"/Users/dan/Files/Chuck/LiSa_examples/TomVega.wav" => buf.read;
|
||||||
|
|
||||||
|
//set lisa buffer size to sample size
|
||||||
|
buf.samples()::samp => lisa.duration;
|
||||||
|
|
||||||
|
//transfer values from SndBuf to LiSa
|
||||||
|
//works properly for mono; need to skip samples for multichannel
|
||||||
|
for ( 0 => int i; i < buf.samples(); i++ ) {
|
||||||
|
|
||||||
|
(buf.valueAt(i), i::samp) => lisa.valueAt;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//party on...
|
||||||
|
1 => lisa.play;
|
||||||
|
2. => lisa.rate;
|
||||||
|
|
||||||
|
//hang on until it's done...
|
||||||
|
lisa.duration() * 0.5 => now;
|
27
LiSa/LiSa_SndBuf_multichan.ck
Normal file
27
LiSa/LiSa_SndBuf_multichan.ck
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
//this is broken in current release 1.2.1.4-dev-1 (dracula); something changed in SndBuf
|
||||||
|
//will be fixed in next release.
|
||||||
|
|
||||||
|
//ugens
|
||||||
|
SndBuf buf;
|
||||||
|
LiSa lisa => dac;
|
||||||
|
|
||||||
|
//change this path to your own sample
|
||||||
|
"/Applications/Max5/examples/sounds/cello-f2.aif" => buf.read;
|
||||||
|
|
||||||
|
//set lisa buffer size to sample size
|
||||||
|
buf.samples()::samp => lisa.duration;
|
||||||
|
//buf.samples() returns frames now!
|
||||||
|
|
||||||
|
//transfer values from SndBuf to LiSa
|
||||||
|
for ( 0 => int i; i < buf.samples(); i++ ) {
|
||||||
|
|
||||||
|
(buf.valueAt(i * buf.channels()), i::samp) => lisa.valueAt;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//party on...
|
||||||
|
1 => lisa.play;
|
||||||
|
2. => lisa.rate;
|
||||||
|
|
||||||
|
//hang on until it's done...
|
||||||
|
lisa.duration() / lisa.rate() => now;
|
85
LiSa/LiSa_munger1.ck
Normal file
85
LiSa/LiSa_munger1.ck
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// name: LiSa
|
||||||
|
// desc: Live sampling utilities for ChucK
|
||||||
|
//
|
||||||
|
// author: Dan Trueman, 2007
|
||||||
|
//
|
||||||
|
// to run (in command line chuck):
|
||||||
|
// %> chuck LiSa_readme.ck
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
These three example files demonstrate a couple ways to approach granular sampling
|
||||||
|
with ChucK and LiSa. All are modeled after the munger~ from PeRColate. One of the
|
||||||
|
cool things about doing this in ChucK is that there is a lot more ready flexibility
|
||||||
|
in designing grain playback patterns; rolling one's own idiosyncratic munger is
|
||||||
|
a lot easier.
|
||||||
|
|
||||||
|
Example 1 (below) is simple, but will feature some clicking due to playing back
|
||||||
|
over the record-point discontinuity.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
SinOsc s => LiSa l => dac;
|
||||||
|
s=>dac;
|
||||||
|
//freq params
|
||||||
|
s.freq(440.);
|
||||||
|
s.gain(0.2);
|
||||||
|
SinOsc freqmod => blackhole;
|
||||||
|
freqmod.freq(0.1);
|
||||||
|
|
||||||
|
|
||||||
|
//LiSa params
|
||||||
|
l.duration(1::second);
|
||||||
|
//set it recording constantly; loop records by default
|
||||||
|
l.record(1);
|
||||||
|
l.gain(0.1);
|
||||||
|
|
||||||
|
now + 1000::ms => time later;
|
||||||
|
while(now<later) {
|
||||||
|
|
||||||
|
freqmod.last() * 500. + 200. => s.freq;
|
||||||
|
10::ms => now;
|
||||||
|
}
|
||||||
|
|
||||||
|
l.record(0);
|
||||||
|
s.gain(0.);
|
||||||
|
l.recRamp(20::ms);
|
||||||
|
|
||||||
|
l.maxVoices(30);
|
||||||
|
//<<<l.maxvoices()>>>;
|
||||||
|
|
||||||
|
//this arrangment will create some clicks because of discontinuities from
|
||||||
|
//the loop recording. to fix, need to make a rotating buffer approach.
|
||||||
|
//see the next two example files....
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
Std.rand2f(1.5, 2.0) => float newrate;
|
||||||
|
Std.rand2f(250, 750) * 1::ms => dur newdur;
|
||||||
|
|
||||||
|
spork ~ getgrain(newdur, 20::ms, 20::ms, newrate);
|
||||||
|
|
||||||
|
10::ms => now;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun void getgrain(dur grainlen, dur rampup, dur rampdown, float rate)
|
||||||
|
{
|
||||||
|
l.getVoice() => int newvoice;
|
||||||
|
//<<<newvoice>>>;
|
||||||
|
|
||||||
|
if(newvoice > -1) {
|
||||||
|
l.rate(newvoice, rate);
|
||||||
|
//l.playpos(newvoice, Std.rand2f(0., 1000.) * 1::ms);
|
||||||
|
l.playPos(newvoice, 20::ms);
|
||||||
|
//<<<l.playpos(newvoice)>>>;
|
||||||
|
l.rampUp(newvoice, rampup);
|
||||||
|
(grainlen - (rampup + rampdown)) => now;
|
||||||
|
l.rampDown(newvoice, rampdown);
|
||||||
|
rampdown => now;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
128
LiSa/LiSa_munger2.ck
Normal file
128
LiSa/LiSa_munger2.ck
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// name: LiSa
|
||||||
|
// desc: Live sampling utilities for ChucK
|
||||||
|
//
|
||||||
|
// author: Dan Trueman, 2007
|
||||||
|
//
|
||||||
|
// to run (in command line chuck):
|
||||||
|
// %> chuck LiSa_readme.ck
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
These three example files demonstrate a couple ways to approach granular sampling
|
||||||
|
with ChucK and LiSa. All are modeled after the munger~ from PeRColate. One of the
|
||||||
|
cool things about doing this in ChucK is that there is a lot more ready flexibility
|
||||||
|
in designing grain playback patterns; rolling one's own idiosyncratic munger is
|
||||||
|
a lot easier.
|
||||||
|
|
||||||
|
Example 2 (below) demonstrates the rotating buffer approach used in the munger~
|
||||||
|
see after the code for an explanation of this approach. presumably someone
|
||||||
|
smarter than me will dream up a more elegant technique.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//oscillator as source
|
||||||
|
//fun scary sounds!!!
|
||||||
|
SinOsc s=>dac;
|
||||||
|
s.freq(440.);
|
||||||
|
s.gain(0.2);
|
||||||
|
SinOsc freqmod => blackhole;
|
||||||
|
freqmod.freq(0.1);
|
||||||
|
|
||||||
|
//use three buffers
|
||||||
|
LiSa l[3];
|
||||||
|
1::second => dur bufferlen;
|
||||||
|
0 => int recbuf;
|
||||||
|
2 => int playbuf;
|
||||||
|
|
||||||
|
//LiSa params
|
||||||
|
for(0=>int i; i<3; i++) {
|
||||||
|
|
||||||
|
l[i].duration(bufferlen);
|
||||||
|
l[i].maxVoices(30);
|
||||||
|
l[i].clear();
|
||||||
|
l[i].gain(0.1);
|
||||||
|
l[i].feedback(0.5);
|
||||||
|
l[i].recRamp(20::ms);
|
||||||
|
l[i].record(0);
|
||||||
|
|
||||||
|
s => l[i] => dac;
|
||||||
|
}
|
||||||
|
|
||||||
|
l[recbuf].record(1);
|
||||||
|
|
||||||
|
//create grains, rotate record and play bufs as needed
|
||||||
|
//shouldn't click as long as the grainlen < bufferlen
|
||||||
|
while(true) {
|
||||||
|
|
||||||
|
now + bufferlen => time later;
|
||||||
|
|
||||||
|
//toss some grains
|
||||||
|
while (now<later) {
|
||||||
|
|
||||||
|
Std.rand2f(0.5, 2.5) => float newrate;
|
||||||
|
Std.rand2f(250, 600) * 1::ms => dur newdur;
|
||||||
|
|
||||||
|
spork ~ getgrain(playbuf, newdur, 20::ms, 20::ms, newrate);
|
||||||
|
|
||||||
|
freqmod.last() * 400. + 800. => s.freq;
|
||||||
|
|
||||||
|
10::ms => now;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//rotate the record and playbufs
|
||||||
|
l[recbuf++].record(0);
|
||||||
|
if(recbuf == 3) 0 => recbuf;
|
||||||
|
l[recbuf].record(1);
|
||||||
|
|
||||||
|
playbuf++;
|
||||||
|
if(playbuf == 3) 0 => playbuf;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun void getgrain(int which, dur grainlen, dur rampup, dur rampdown, float rate)
|
||||||
|
{
|
||||||
|
l[which].getVoice() => int newvoice;
|
||||||
|
//<<<newvoice>>>;
|
||||||
|
|
||||||
|
if(newvoice > -1) {
|
||||||
|
l[which].rate(newvoice, rate);
|
||||||
|
l[which].playPos(newvoice, Std.rand2f(0., 1.) * bufferlen);
|
||||||
|
l[which].rampUp(newvoice, rampup);
|
||||||
|
(grainlen - (rampup + rampdown)) => now;
|
||||||
|
l[which].rampDown(newvoice, rampdown);
|
||||||
|
rampdown => now;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Rotating Buffer Explanation (from the munger~ source code).
|
||||||
|
|
||||||
|
the munger~ (and scrubber~) use a rotating three-buffer scheme for creating clickless grains.
|
||||||
|
basically, you don't want to be recording new data anywhere in the buffer where a grain might
|
||||||
|
be playing. so, we divide the buffer into three equal parts (B1, B2, B3). at the outset, let's say:
|
||||||
|
|
||||||
|
B1 = the recording buffer part (RB)
|
||||||
|
B2 = a part where nothing is happening (QB, for Quiet Buffer)
|
||||||
|
B3 = a part where grains are playing from (PB)
|
||||||
|
|
||||||
|
let's say each part is N samples long. after we have recorded N sample into B1, we rotate
|
||||||
|
the functionality, so now:
|
||||||
|
|
||||||
|
B1 = PB
|
||||||
|
B2 = RB
|
||||||
|
B3 = QB
|
||||||
|
|
||||||
|
why?
|
||||||
|
|
||||||
|
as long as the grains are guaranteed to be no longer than N samples (adjusted for playback rate) we
|
||||||
|
are assured that none of them will have clicks due to recording discontinuities. we need the Quiet Buffer
|
||||||
|
because when the rotation happens, there may still be grains playing in what was the PB and is now the QB.
|
||||||
|
|
||||||
|
*/
|
140
LiSa/LiSa_munger3.ck
Normal file
140
LiSa/LiSa_munger3.ck
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// name: LiSa
|
||||||
|
// desc: Live sampling utilities for ChucK
|
||||||
|
//
|
||||||
|
// author: Dan Trueman, 2007
|
||||||
|
//
|
||||||
|
// to run (in command line chuck):
|
||||||
|
// %> chuck LiSa_readme.ck
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
These three example files demonstrate a couple ways to approach granular sampling
|
||||||
|
with ChucK and LiSa. All are modeled after the munger~ from PeRColate. One of the
|
||||||
|
cool things about doing this in ChucK is that there is a lot more ready flexibility
|
||||||
|
in designing grain playback patterns; rolling one's own idiosyncratic munger is
|
||||||
|
a lot easier.
|
||||||
|
|
||||||
|
Example 3 (below) uses the same structure as Example 2, but replicates the groovy
|
||||||
|
tune munging from the original munger~ helppatch (with pitch transposition filtering
|
||||||
|
and all!).
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//oscillator as source
|
||||||
|
SinOsc s=>dac;
|
||||||
|
s.freq(440.);
|
||||||
|
s.gain(0.2);
|
||||||
|
|
||||||
|
//play the munger song!
|
||||||
|
Envelope fsmooth => blackhole;
|
||||||
|
spork ~ playtune(250::ms);
|
||||||
|
spork ~ smoothtune(20::ms);
|
||||||
|
|
||||||
|
//transposition table
|
||||||
|
[0, 4, 7, -2, 12, 15] @=> int pitchtable[];
|
||||||
|
|
||||||
|
//use three buffers to avoid clicks
|
||||||
|
LiSa l[3];
|
||||||
|
1::second => dur bufferlen; //allocated buffer size -- remains static
|
||||||
|
0.1::second => dur reclooplen;//portion of the buffer size to use -- can vary
|
||||||
|
0 => int recbuf;
|
||||||
|
2 => int playbuf;
|
||||||
|
|
||||||
|
//LiSa params, set
|
||||||
|
for(0=>int i; i<3; i++) {
|
||||||
|
|
||||||
|
l[i].duration(bufferlen);
|
||||||
|
l[i].loopEndRec(reclooplen);
|
||||||
|
l[i].maxVoices(30);
|
||||||
|
l[i].clear();
|
||||||
|
l[i].gain(0.2);
|
||||||
|
//if you want to retain earlier passes through the recording buff when loop recording:
|
||||||
|
//l[i].feedback(0.5);
|
||||||
|
l[i].recRamp(20::ms); //ramp at extremes of record buffer while recording
|
||||||
|
l[i].record(0);
|
||||||
|
|
||||||
|
s => l[i] => dac;
|
||||||
|
}
|
||||||
|
|
||||||
|
//start recording in buffer 0
|
||||||
|
l[recbuf].record(1);
|
||||||
|
|
||||||
|
//create grains, rotate record and play bufs as needed
|
||||||
|
//shouldn't click as long as the grainlen < bufferlen
|
||||||
|
while(true) {
|
||||||
|
|
||||||
|
//will update record and playbufs to use every reclooplen
|
||||||
|
now + reclooplen => time later;
|
||||||
|
|
||||||
|
//toss some grains
|
||||||
|
while (now<later) {
|
||||||
|
|
||||||
|
Std.rand2f(0, 6) $ int => int newpitch; //choose a transposition from the table
|
||||||
|
Std.mtof(pitchtable[newpitch] + 60)/Std.mtof(60) => float newrate;
|
||||||
|
Std.rand2f(50, 100) * 1::ms => dur newdur; //create a random duration for the grain
|
||||||
|
|
||||||
|
//spork off the grain!
|
||||||
|
spork ~ getgrain(playbuf, newdur, 20::ms, 20::ms, newrate);
|
||||||
|
|
||||||
|
//wait a bit.... then do it again, until we reach reclooplen
|
||||||
|
5::ms => now;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//rotate the record and playbufs
|
||||||
|
l[recbuf++].record(0);
|
||||||
|
if(recbuf == 3) 0 => recbuf;
|
||||||
|
l[recbuf].record(1);
|
||||||
|
|
||||||
|
playbuf++;
|
||||||
|
if(playbuf == 3) 0 => playbuf;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//for sporking grains; can do lots of different stuff here -- just one example here
|
||||||
|
fun void getgrain(int which, dur grainlen, dur rampup, dur rampdown, float rate)
|
||||||
|
{
|
||||||
|
l[which].getVoice() => int newvoice;
|
||||||
|
//<<<newvoice>>>;
|
||||||
|
|
||||||
|
if(newvoice > -1) {
|
||||||
|
l[which].rate(newvoice, rate);
|
||||||
|
l[which].playPos(newvoice, Std.rand2f(0., 1.) * reclooplen);
|
||||||
|
l[which].rampUp(newvoice, rampup);
|
||||||
|
(grainlen - (rampup + rampdown)) => now;
|
||||||
|
l[which].rampDown(newvoice, rampdown);
|
||||||
|
rampdown => now;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//the munger song lives! thanks to luke dubois....
|
||||||
|
fun void playtune(dur notelen)
|
||||||
|
{
|
||||||
|
|
||||||
|
0 => int notectr;
|
||||||
|
[45, 45, 57, 57, 45, 57, 57, 47, 55, 47, 59, 60, 60, 57, 57, 57] @=> int notes[];
|
||||||
|
|
||||||
|
Std.mtof(notes[0]) => fsmooth.value => s.freq;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
//<<<notes[notectr]>>>;
|
||||||
|
Std.mtof(notes[notectr++] + 12) => fsmooth.target;
|
||||||
|
if(notectr == notes.size()) 0 => notectr;
|
||||||
|
notelen => now;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun void smoothtune(dur smoothtime)
|
||||||
|
{
|
||||||
|
fsmooth.duration(smoothtime);
|
||||||
|
while (true) {
|
||||||
|
fsmooth.value() => s.freq;
|
||||||
|
1::ms => now;
|
||||||
|
}
|
||||||
|
}
|
58
LiSa/LiSa_track1.ck
Normal file
58
LiSa/LiSa_track1.ck
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// name: LiSaBasic and LiSaMulti
|
||||||
|
// desc: Live sampling utilities for ChucK
|
||||||
|
//
|
||||||
|
// author: Dan Trueman, 2007
|
||||||
|
//
|
||||||
|
// to run (in command line chuck):
|
||||||
|
// %> chuck LiSa_readme.c
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//demonstrate using track=1 mode with LiSa
|
||||||
|
//
|
||||||
|
//when track == 1, the input is used to control playback position
|
||||||
|
//input [0,1] will control playback position within loop marks
|
||||||
|
//values less than zero are multiplied by -1, so it is possible to use
|
||||||
|
//audio signals [-1, 1] to control playback position, as in waveshaping
|
||||||
|
|
||||||
|
//signal chain; record a sine wave, play it back
|
||||||
|
SinOsc s => LiSa loopme => dac;
|
||||||
|
//s => dac;
|
||||||
|
440. => s.freq;
|
||||||
|
0.2 => s.gain;
|
||||||
|
|
||||||
|
//alloc memory
|
||||||
|
6::second => loopme.duration;
|
||||||
|
1000::ms => loopme.loopEndRec;
|
||||||
|
1000::ms => loopme.loopEnd;
|
||||||
|
|
||||||
|
//set recording ramp time
|
||||||
|
loopme.recRamp(250::ms);
|
||||||
|
|
||||||
|
//start recording input
|
||||||
|
loopme.record(1);
|
||||||
|
|
||||||
|
//1 sec later, stop recording
|
||||||
|
1000::ms => now;
|
||||||
|
loopme.record(0);
|
||||||
|
|
||||||
|
|
||||||
|
//set track mode to 1, where the input chooses playback position
|
||||||
|
//note that you can still record this input
|
||||||
|
1 => loopme.track;
|
||||||
|
s =< loopme; //disconnect sinosc as input
|
||||||
|
Step i => Envelope e => loopme; //use envelope to control playback position
|
||||||
|
1. => i.next;
|
||||||
|
|
||||||
|
//play it forward twice speed
|
||||||
|
500::ms => e.duration;
|
||||||
|
e.keyOn();
|
||||||
|
loopme.play(1);
|
||||||
|
500::ms => now;
|
||||||
|
|
||||||
|
//now backwards half speed
|
||||||
|
2000::ms => e.duration;
|
||||||
|
e.keyOff();
|
||||||
|
2000::ms => now;
|
||||||
|
loopme.play(0);
|
||||||
|
|
||||||
|
//bye bye
|
41
LiSa/LiSa_track2.ck
Normal file
41
LiSa/LiSa_track2.ck
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
//demonstrate using track=1 mode with LiSa
|
||||||
|
//
|
||||||
|
//when track == 1, the input is used to control playback position
|
||||||
|
//input [0,1] will control playback position within loop marks
|
||||||
|
//input values less than zero are multiplied by -1, so it is possible to use
|
||||||
|
//audio signals [-1, 1] to control playback position, as in waveshaping
|
||||||
|
|
||||||
|
//signal chain; record a sine wave, play it back
|
||||||
|
SinOsc s => LiSa loopme => dac;
|
||||||
|
//s => dac;
|
||||||
|
440. => s.freq;
|
||||||
|
0.2 => s.gain;
|
||||||
|
|
||||||
|
//alloc memory
|
||||||
|
6::second => loopme.duration;
|
||||||
|
1000::ms => loopme.loopEndRec;
|
||||||
|
1000::ms => loopme.loopEnd;
|
||||||
|
|
||||||
|
//set recording ramp time
|
||||||
|
loopme.recRamp(50::ms);
|
||||||
|
|
||||||
|
//start recording input
|
||||||
|
loopme.record(1);
|
||||||
|
|
||||||
|
//1 sec later, stop recording
|
||||||
|
1000::ms => now;
|
||||||
|
loopme.record(0);
|
||||||
|
|
||||||
|
|
||||||
|
//set track mode to 1, where the input chooses playback position
|
||||||
|
1 => loopme.track;
|
||||||
|
0.5 => s.freq;
|
||||||
|
1. => s.gain; //need to reset gain if we want to get the full loop length
|
||||||
|
loopme.play(1);
|
||||||
|
loopme.gain(0.1);
|
||||||
|
5000::ms => now;
|
||||||
|
loopme.rampDown(250::ms);
|
||||||
|
500::ms => now;
|
||||||
|
|
||||||
|
|
||||||
|
//bye bye
|
40
LiSa/LiSa_track3.ck
Normal file
40
LiSa/LiSa_track3.ck
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
//demonstrate using track=1 mode with LiSa
|
||||||
|
//
|
||||||
|
//when track == 1, the input is used to control playback position
|
||||||
|
//input [0,1] will control playback position within loop marks
|
||||||
|
//input values less than zero are multiplied by -1, so it is possible to use
|
||||||
|
//audio signals [-1, 1] to control playback position, as in waveshaping
|
||||||
|
|
||||||
|
//signal chain; record a sine wave, play it back
|
||||||
|
SinOsc s => LiSa loopme => dac;
|
||||||
|
//s => dac;
|
||||||
|
440. => s.freq;
|
||||||
|
|
||||||
|
//alloc memory
|
||||||
|
6::second => loopme.duration;
|
||||||
|
1000::ms => loopme.loopEndRec;
|
||||||
|
1000::ms => loopme.loopEnd;
|
||||||
|
|
||||||
|
//set recording ramp time
|
||||||
|
loopme.recRamp(50::ms);
|
||||||
|
loopme.feedback(0.99); //retain some while loop recording
|
||||||
|
|
||||||
|
//start recording input
|
||||||
|
loopme.record(1);
|
||||||
|
|
||||||
|
//1 sec later, this time DON'T stop recording....
|
||||||
|
1000::ms => now;
|
||||||
|
|
||||||
|
|
||||||
|
//set track mode to 1, where the input chooses playback position
|
||||||
|
1 => loopme.track;
|
||||||
|
//this time don't change the freq; scan through zippy quick
|
||||||
|
|
||||||
|
loopme.play(1);
|
||||||
|
loopme.gain(0.01);
|
||||||
|
5000::ms => now;
|
||||||
|
loopme.rampDown(250::ms);
|
||||||
|
500::ms => now;
|
||||||
|
|
||||||
|
//pretty farking scary
|
||||||
|
//bye bye
|
36
LiSa/LiSa_track4.ck
Normal file
36
LiSa/LiSa_track4.ck
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
//ugens
|
||||||
|
SndBuf buf;
|
||||||
|
LiSa loopme => dac;
|
||||||
|
|
||||||
|
//change this path to your own sample
|
||||||
|
"/Users/dan/Files/Chuck/LiSa_examples/TomVega.wav" => buf.read;
|
||||||
|
|
||||||
|
//set lisa buffer size to sample size
|
||||||
|
buf.samples()::samp => loopme.duration;
|
||||||
|
|
||||||
|
//transfer values from SndBuf to LiSa
|
||||||
|
for ( 0 => int i; i < buf.samples(); i++ ) {
|
||||||
|
|
||||||
|
loopme.valueAt(buf.valueAt(i), i::samp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//set sync/track mode to 1, where the input chooses playback position
|
||||||
|
1 => loopme.sync;
|
||||||
|
|
||||||
|
|
||||||
|
//use an oscillator to set playback position
|
||||||
|
SinOsc tracker => loopme;
|
||||||
|
Step off => loopme;
|
||||||
|
|
||||||
|
//tracker parameters; will determine how far into the buffer
|
||||||
|
//to go (gain), with what offset (off) and with what speed (freq)
|
||||||
|
0.05 => tracker.freq;
|
||||||
|
0.2 => tracker.gain;
|
||||||
|
0.3 => off.next;
|
||||||
|
|
||||||
|
//play it back
|
||||||
|
1 => loopme.play;
|
||||||
|
0.5 => loopme.gain;
|
||||||
|
|
||||||
|
while ( true ) { 1::second => now; }
|
44
LiSa/LiSa_track4b.ck
Normal file
44
LiSa/LiSa_track4b.ck
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
//ugens
|
||||||
|
SndBuf buf;
|
||||||
|
LiSa loopme => dac;
|
||||||
|
|
||||||
|
//change this path to your own sample
|
||||||
|
"/Users/dan/Files/Chuck/LiSa_examples/TomVega.wav" => buf.read;
|
||||||
|
|
||||||
|
//set lisa buffer size to sample size
|
||||||
|
buf.samples()::samp => loopme.duration;
|
||||||
|
|
||||||
|
//transfer values from SndBuf to LiSa
|
||||||
|
for ( 0 => int i; i < buf.samples(); i++ ) {
|
||||||
|
|
||||||
|
loopme.valueAt(buf.valueAt(i), i::samp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//set sync/track mode to 1, where the input chooses playback position
|
||||||
|
1 => loopme.sync;
|
||||||
|
|
||||||
|
|
||||||
|
//use an oscillator to set playback position
|
||||||
|
SinOsc tracker => loopme;
|
||||||
|
Step off => loopme;
|
||||||
|
|
||||||
|
//tracker parameters; will determine how far into the buffer
|
||||||
|
//to go (gain), with what offset (off) and with what speed (freq)
|
||||||
|
0.31 => tracker.freq;
|
||||||
|
0.2 => tracker.gain;
|
||||||
|
0.3 => off.next;
|
||||||
|
|
||||||
|
loopme.getVoice() => int v1;
|
||||||
|
loopme.loopStart(v1, 0::ms);
|
||||||
|
loopme.loopEnd(v1, 1600::ms);
|
||||||
|
loopme.play(v1, 1);
|
||||||
|
|
||||||
|
loopme.getVoice() => int v2;
|
||||||
|
loopme.loopStart(v2, 2000::ms);
|
||||||
|
loopme.loopEnd(v2, 6600::ms);
|
||||||
|
loopme.play(v2, 1);
|
||||||
|
|
||||||
|
0.5 => loopme.gain;
|
||||||
|
|
||||||
|
while ( true ) { 1::second => now; }
|
46
LiSa/LiSa_track5.ck
Normal file
46
LiSa/LiSa_track5.ck
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
//ugens
|
||||||
|
SndBuf buf;
|
||||||
|
LiSa loopme => dac;
|
||||||
|
|
||||||
|
//change this path to your own sample
|
||||||
|
"/Users/dan/Files/Chuck/LiSa_examples/TomVega.wav" => buf.read;
|
||||||
|
|
||||||
|
//set lisa buffer size to sample size
|
||||||
|
buf.samples()::samp => loopme.duration;
|
||||||
|
|
||||||
|
//transfer values from SndBuf to LiSa
|
||||||
|
for ( 0 => int i; i < buf.samples(); i++ ) {
|
||||||
|
|
||||||
|
loopme.valueAt(buf.valueAt(i), i::samp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//set sync/track mode to 2, where the input chooses playback position
|
||||||
|
//interpreted as a time value
|
||||||
|
//again, negative values are multiplied internally by -1
|
||||||
|
2 => loopme.sync;
|
||||||
|
|
||||||
|
|
||||||
|
//use an oscillator to set playback position
|
||||||
|
SinOsc tracker => loopme;
|
||||||
|
Step off => loopme;
|
||||||
|
|
||||||
|
//tracker parameters; will determine how far into the buffer
|
||||||
|
//to go (gain), with what offset (off) and with what speed (freq)
|
||||||
|
0.05 => tracker.freq;
|
||||||
|
//we'll loop over half of the buffer
|
||||||
|
loopme.duration() / 4::samp => tracker.gain;
|
||||||
|
//starting at the midpoint
|
||||||
|
loopme.duration() / 2::samp => off.next;
|
||||||
|
|
||||||
|
//play it back
|
||||||
|
1 => loopme.play;
|
||||||
|
0.5 => loopme.gain;
|
||||||
|
|
||||||
|
while ( true ) {
|
||||||
|
|
||||||
|
//monitor where we're playing back from in the buffer
|
||||||
|
<<<off.last() / 44100>>>;
|
||||||
|
50::ms => now;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user