volca ardour3 jam
I created a small chuck script that makes ardour jump to a marker using osc messages. These messages get triggered by the midi signals created by my launchpad mini. I also synced my volca bass to the track using midi-clock. Unfortunately ardour doesn´t send midi sync signals when playing in loop mode. So I created a midi track and sent the same note that my chuck script uses to trigger the "jump-to-marker-1" signal to create the loop.
The lower 5 glowing buttons control the mute state of the first 5 tracks.
you can download my chuck code after this video.
All the sounds except the drum loop have been created using a volca bass or a volca keys. The bass sequence is the same I used in my last blogpost only played slower.
The blink and toggle functions are used to create some midi lightshow effects on the launchpad.
MidiIn min;
MidiOut mout;
MidiMsg msg;
OscSend xmit;
min.open(5);
mout.open(5);
xmit.setHost( "127.0.0.1", 3819 );
[-16, -15, 1, 17, 16, 15, -1, -17 ] @=> int scale[];
[-16, -32, -48 ] @=> int scale2[];
[0,0,0,0,0] @=> int mstate[];
for( 0 => int i; i < mstate.cap(); i++) {
toggle(i);
mute(i);
}
while(true) {
min => now;
min.recv(msg);
if ( msg.data1 == 144 && msg.data3 > 0 ) {
<<< msg.data2 >>>;
if ( msg.data2 < 48 ) {
spork ~ blink( msg );
spork ~ jump( msg.data2 - 33 );
} else {
spork ~ toggle( msg.data2 - 64 );
spork ~ mute( msg.data2 - 64 );
}
}
}
fun void jump( int v ) {
if (v == 0) {
xmit.startMsg( "/ardour/transport_play" );
} else {
xmit.startMsg( "/ardour/access_action", "s" );
"Editor/goto-mark-" + Std.itoa( v ) => string str;
str => xmit.addString;
}
}
fun void mute( int channel ) {
<<< channel >>>;
xmit.startMsg( "/ardour/routes/mute", "ii" );
channel + 1 => xmit.addInt;
mstate[channel] => xmit.addInt;
}
fun void blink( MidiMsg m ) {
MidiMsg msg2;
MidiMsg cpy;
m.data1=>cpy.data1;
m.data2=>cpy.data2;
m.data3=>cpy.data3;
60 => msg2.data3;
144 => msg2.data1;
cpy.data2 => msg2.data2;
mout.send( msg2 );
100::ms => now;
63 => msg2.data3;
for( 0 => int i; i < scale.cap(); i++) {
cpy.data2 + scale[i] => msg2.data2;
mout.send( msg2 );
}
100::ms => now;
128 => msg2.data1;
cpy.data2 => msg2.data2;
mout.send( msg2 );
for( 0 => int i; i < scale.cap(); i++) {
cpy.data2 + scale[i] => msg2.data2;
mout.send( msg2 );
mout.send( msg2 );
}
}
fun void blink( MidiMsg m ) {
MidiMsg msg2;
MidiMsg cpy;
m.data1=>cpy.data1;
m.data2=>cpy.data2;
m.data3=>cpy.data3;
60 => msg2.data3;
144 => msg2.data1;
cpy.data2 => msg2.data2;
mout.send( msg2 );
100::ms => now;
63 => msg2.data3;
for( 0 => int i; i < scale.cap(); i++) {
cpy.data2 + scale[i] => msg2.data2;
mout.send( msg2 );
}
100::ms => now;
128 => msg2.data1;
cpy.data2 => msg2.data2;
mout.send( msg2 );
for( 0 => int i; i < scale.cap(); i++) {
cpy.data2 + scale[i] => msg2.data2;
mout.send( msg2 );
mout.send( msg2 );
}
}
fun void toggle( int channel ) {
MidiMsg msg2;
int cpy;
channel=>cpy;
cpy + 64 => msg2.data2;
if ( mstate[ cpy ] == 1 ) {
60 => msg2.data3;
144 => msg2.data1;
0 => mstate[ cpy ];
} else {
15 => msg2.data3;
144 => msg2.data1;
1 => mstate[ cpy ];
}
mout.send( msg2 );
}
See also:
Launchpad Jam Session 2016-06-05
Volca Jam 2014-12-12
volca+bitwig - stepdup
how to create launchpad light effects with chuck