before we became skinnerbox- the quatro-successful teen idols we are, or in other words - before everything went wrong, we have been making improvised electro-acoustic music using everything from prepared pianos to chainsaws + reverb tail of at least 7 min(sorry for that) . as our successful musical marriage is turning 8 years old this november we decided to put some of the old stuff online for free download
the link contains a zip file with two folders. the first is excerpts from 2002/3 and the second is a complete one hour piece for electric guitar , mobile phone and a minimoog named "constellation#1" (2003).
and yet another m4l patch this week.. this time, the "sbx_prmtr_schain" which let you take an incoming signal and use it to modulate parameters of any device or plugin inside live. it has some cool features such as envelope, modulation range, eq and offset. click on "help" for further info....
here´s a tiny helpful m4l patch we wrote to store playing clips in ableton live and come back to them later. as we dont work we scenes but rather improvise with a huge sound pool its very handy to be able to come back to a certain musical idea from 2 minutes ago just by pressing a button ;)
pressing cue will keep the current clips in a "buffer" and pressing call will launch them. the random button will randomly trigger samples in the session. currently only for 6 channels, but should be no problem to expand.
an improved code,written by olaf. the main virtue of this one against the old one is that the multiplexing section is now "outputing" a string of input+i.d, so you could easily tag your inputs. there is however some decoding to be done on the max/msp side as shown on the foto below.
the 595 part is still credited to sebastian tomczak aka little scale.
// 16x4x3 www.openskinnerbox.blogspot.com , 2010
//Pin connected to ST_CP of 74HC595 int latchPin = 8;
//Pin connected to SH_CP of 74HC595 int clockPin = 12;
////Pin connected to DS of 74HC595 int dataPin = 11;
byte data1;
byte data2;
byte data3;
// ----------------------------- MUXES ------------------------------- const byte APin = 2; // Pins for 4051-Control const byte BPin = 3; // ... const byte CPin = 4; // ... byte row = 0; // store bin code byte r0 = 0; // Input selection value... byte r1 = 0;
byte r2 = 0;
byte count = 0; // just a count // ------------------------------------------------------------------- const byte numControls = 40; // Amount of Knobs const byte ctrlOffset = 1; // start scanning at this Controller (min 1 !!!) const byte hysteresis = 10; // Hysteresis (0 = off) byte analogInputPin; // Pin for analog Input int value; // read analog Input to here int oldValue [numControls]; // Value read last time int lowerLimit[numControls]; // Hysteresis window int upperLimit[numControls]; // ... const byte startbyte = 254; // data block indicators... const byte stopbyte = 255; // ... byte lobyte = 0; // 5 bit... byte hibyte = 0; // and the other 5 bit of the value // =================================================================== voidsetup()
{
for (count=0; count// clear Hysteresis-Windows
{
lowerLimit[count] = 0;
upperLimit[count] = lowerLimit[count] + hysteresis;
}
// -------------SETUP ARDUINO----------------- pinMode(APin, OUTPUT); // Set 4051-Control Pins as Outputs... pinMode(BPin, OUTPUT);
pinMode(CPin, OUTPUT);
digitalWrite(APin, LOW); // set the 4051 to Input 0... digitalWrite(BPin, LOW);
digitalWrite(CPin, LOW);
// ===================================================================================== // ===================================== M A I N ======================================= // ===================================================================================== voidloop()
{
for (count=(ctrlOffset-1); count<(numControls+ctrlOffset-1); count++)
{
switch (count+1)
{
// case 29: break; // following inputs are not connected, so don´t check them! // case 31: break; // case 40: break; // case 41: break; case 42: break;
case 43: break;
case 44: break;
case 45: break;
case 46: break;
case 47: break;
default:
{
// -------------------- set the MUXES --------------------- row = count & 7; // wrap count between 0 and 7 r0 = row & 1;
r1 = (row >> 1) & 1;
r2 = (row >> 2) & 1;
digitalWrite(APin, r0); // set 4051 Input... digitalWrite(BPin, r1);
digitalWrite(CPin, r2);
// ---------------------------------------------------------
analogInputPin = count >> 3; // div. count by 8
value = analogRead(analogInputPin);
if ((value<=upperLimit[count]) && (value>=lowerLimit[count])) // no change... { } // ... no operation. else { // Otherwise set new Hysteresis-window... if (value>upperLimit[count])
{
upperLimit[count] = value;
lowerLimit[count] = upperLimit[count] - hysteresis;
}
else {
lowerLimit[count] = value;
upperLimit[count] = lowerLimit[count] + hysteresis;
}
lobyte = value >> 5; // ... split value... hibyte = value & 31;
Serial.print(startbyte); // ... and send out a packet! Serial.print(count);
Serial.print(lobyte);
Serial.print(hibyte);
Serial.print(stopbyte);
over the past years we´ve been constantly asked what technological means we apply while making music. it is not a secret that we are both big fans of DIY electronics and software and encourage open source philosophy. the purpose of this blog is to present the tools and ideas that we have developed(and developing) throughout the time.