Posted by Nikolaus Gradwohl
Tue, 20 Jan 2009 04:29:00 GMT
I wrote a simple osc sequencer in ruby using rosc. The script triggers the drum-kit and the bass i implemented
last week.
the pattern may also be of different length. This allows very interesting polyrythmic loops.
require 'osc'
Host = 'localhost'
Port = 3334
c = OSC::UDPSocket.new
hh = OSC::Message.new('/drum', 's', "hh" )
bd = OSC::Message.new('/drum', 's', "bd" )
sn = OSC::Message.new('/drum', 's', "sn" )
ba = OSC::Message.new('/bass', 'i', 64 )
#c.send sn, 0, Host, Port
bpm = 120
step = 1.0/8;
s = bpm * step / 60.0 ;
snd = [ bd, sn, hh ]
pattern = [
[1, 0, 0, 1, 0, 1, 0, 0 ],
[0, 0, 1, 0, 0, 0, 1, 1 ],
[1, 1, 1, 1, 1, 1, 1, 1 ]
]
bass = [
40, 40, 0, 40, 40, 0, 43, 0,
40, 40, 0, 40, 40, 0, 38, 0 ]
count = 0;
while(true)
(0..2).each { |i|
c.send(snd[i], 0, Host, Port) if pattern[i][count % pattern[i].length] == 1
}
ba.args = [bass[ count % bass.length]]
c.send( ba, 0, Host, Port ) if bass[ count % bass.length ] != 0
sleep s
count+=1
end
Read more...
Tags chuck, osc, ruby | 1 comment
Tweet This!
Posted by Nikolaus Gradwohl
Sat, 17 Jan 2009 12:11:00 GMT
I wrote a simple chuck script that generates a drum loop and a bass-sequence. later i wanted to reuse
the sounds and started to search how to modularize the code.
so i started to convert my instrument declarations in classes. The instrument classes don't get connected
to 'dac' directly. They have a "connect"-method that can be used by the main script.
to run the loop all the scripts must be given on the commandline
chuck Bass.ck DrumSet.ck loop.ck
The main script (loop.ck) instanciates a DrumSet and a Bass class and connects them to "dac". Than
it generates a walking bass and a simple electronic drum loop.
DrumSet drm;
drm.connect( dac );
Bass bass;
bass.connect( dac );
[ 41, 41, 44, 46] @=> int bline[];
0 => int pos;
0 => int count;
while ( true ) {
drm.hh();
if ( count % 2 == 0 ) { drm.bd(); }
if ( count % 4 == 2 ) { drm.sn(); }
if ( count % 2 == 0 ) { spork ~ bass.bass( bline[ pos % 4 ]); }
if ( count % 2 == 1 ) { spork ~ bass.bass( 12 + bline[ pos % 4 ]); }
1 + count => count;
if ( count % 4 == 0 ) { 1 + pos => pos; }
250::ms => now;
}
Read more...
Tags chuck | 1 comment | no trackbacks
Tweet This!
Posted by Nikolaus Gradwohl
Mon, 14 Jul 2008 04:46:00 GMT
as written before,
i have started writing a chuck script that mapps the
midi-data from my iControl to OSC events. I now have set up a proper
project page for the script.
Tags chuck, icontrol, midi, osc | no comments
Tweet This!
Posted by Nikolaus Gradwohl
Thu, 22 May 2008 16:04:00 GMT
I own a m-audio icontrol and some time ago i started to play with
chuck a programming language for making electronic music. today
i managed to link them together and use my icontrol to start and stop
my chuck programms :-)
next thing i will try is to convert the values from the "endless"-knobs to floats
and to pass messages to the sub programms
1 => int device;
MidiIn min;
MidiOut mout;
MidiMsg msg;
// open the device
if( !min.open( device ) ) me.exit();
if( !mout.open( device ) ) me.exit();
[0,0,0,0,0,0,0,0] @=> int on[];
[-1, -1, -1, -1, -1, -1, -1, -1] @=> int ids[];
["beep.ck", "sing.ck", "autoloop.ck", "", "", "", "", "" ] @=> string names[];
while ( true ) {
min => now;
// get the message(s)
while( min.recv(msg) ) {
// print out midi message
<<< msg.data1, msg.data2, msg.data3 >>>;
if ( msg.data1 == 176 && msg.data2 >= 64 && msg.data2 < 72 && msg.data3 == 127 ) {
msg.data2 - 64 => int chan;
if ( on[chan] == 1 ) {
0 => on[chan];
sendOff( chan );
if (ids[chan] > 0) {
Machine.remove( ids[ chan ] )
-1 => ids[chan];
}
} else {
1 => on[chan];
sendOn( chan );
if ( names[chan] != "" ) {
Machine.add( names[chan] ) => ids[chan];
}
}
}
// send( msg.data1, msg.data2, msg.data3 );
}
}
fun void sendOn( int chan ) {
send( 176, 64 + chan , 127 );
}
fun void sendOff( int chan ) {
send( 176, 64 + chan, 0 );
}
fun void send( int d1, int d2, int d3 ) {
MidiMsg msg;
d1 => msg.data1;
d2 => msg.data2;
d3 => msg.data3;
mout.send( msg );
}
Tags chuck, icontrol, osc | no comments
Tweet This!