lectures

This is an online learning facility for making electronic music with modern technology.  Technical Support is available if you would like to receive a free consultation.
Call me from this webpage here (enter your own name and number, then press 1 to connect) -

1.3.2014

download this Happy Old Year mix that i DJ'ed (for better or worse).

8.18.2013

download my new record for free!

5.12.2013














3.15.2013
the grok message below corresponds to the grok method above, passing parameters into the inner function.
musicRepeat.js must be the name of a function that corresponds to the task, which is repeated d times at interval e.

it took me a while to figure out how to put a function inside a function, currently reading 'secrets of the javascript ninja' by resig.   good stuff!


2.23.2013
working on the new album, just added a new track to a new dj mix.   Hope you enjoy! 
http://www.mixcloud.com/deepliferecords/dj-ambivalent-good-olde-days-liquid-dnb-mix/


12.15.2012

javascript with arguments

after about a year, i have learned enough about js to be dangerous.  what a year it has been!
here's a screenshot of a patch that accepts 3 arguments, one for pitch, one for velocity, and one for duration.
the javascript adds 7 to one additional note and subtracts 5 from the other additional note.
so, an 80 would yield 80, 75, and 87, or a chord ("c" cord or something).
the idea is to programmatically change chord structures using knobs, but to program in the music "theory".
not sure why i am using so many "quotation" marks, lol.
the javascript is here - 
inlets = 1;
outlets = 9;

function grok(a, b, c)
{
outlet(0,a+7);
outlet(1,b);
outlet(2,c);
outlet(3,a);
outlet(4,b);
outlet(5,c);
outlet(6,a-5);
outlet(7,b);
outlet(8,c);
}

// you can see, all it really does is accept the 3 parameters; a, b, and c. 
then, it adds 7 and subtracts 5 to "a" to make the chord by sending out the three processed note numbers out of the outlets.
it just duplicates b and c, which are velocity and duration.

i need to add the ability to loop a note at some interval and at some duration in number of times.

so, the idea would be to output a "c" chord every second, and do that for 4 repetitions, for example.

extremely basic music sequencing, and it only took a year!  but, in 2013, there should be a lot of theory

integrated into this.  i am reading V.J. Manzo's book - http://www.vjmanzo.com/clients/vjmanzo/mmjformusic.htm

here's the max patch, with the compressed code below.
also, there's a video showing how to send these inputs (arguments/parameters) from another computer, so that many computers / performers / programmers could
input music data -
max patch for note data
<pre><code>
----------begin_max5_patcher----------
1016.3oc2ZsraaiCEcs8WAgPV5ZHR8t6JvrualcyLHfRh1gIRjBTTtoSQ+2K
eX4j1FmvHox7XQhrtgON7bO2CoIx2VuJnjeKoO.7Qv+.Vs5aqWsxDRGX0w2W
EzhuspA2aZVPEuskvjAar+MI4VoI9e+4+5yeDvHjZfjCv0lGBRGAKIBvtAVk
jxYa.XVMnmHA0CB7cQnLUqNfaTu0C9BooQ+TdEAzOTN1WPGUVc0FvARCuhJ+
psmiiitCcpYBWxOPFQWCkQp3CLCDSOFjMzRYMDoY8.OFbGmI6o+OwDCsM7t1
xGjiMdLZGVADJa+kBRkzRdwogpNAPoE5GvDya4YaCA+23LH1WZFjSCtdNY3V
ybF7IAE2LhaZsIFu75OfJBzw99505esYlYomfBED.dS4lJvdtZ4oyJbvdA+F
S9iJ4rs+KSkZ6AY173PoTfqj8fDvNt.TcEWTCTDFfuS0.U+6TelwkjsOXFI4
OYFIJLRmCRP1DhIujEu.IjrojPZI8838jeKgjFG7Pj.54PBiLlMj7qcDKCDD
bZs9.7CJOVSIwPKMYDrv76yONwFvovFJ7WRDAyN8iN2Jmp09ffRLa+iRBQo4
lx1vh6HAT3ylDPAmlBgpwJurKILbYioagSgfHeQMv+lZQWJoVqOHwEsT0MQo
ZVHJIyPIvIRIQAK2xtEeCQuzm+59rBlcMbrQxX+vipYBsZlDCOkFMQBJdQsQ
JdorQfYGsQJliMBL6MsMBJxpBPyxFAl+NxF4HkLSaDXw6VajiENy0FIbIsQx
ReorQhOtoCbVtHouocQfQ4KgKRx6HWDHLaIbQhe25hXqaloIBD81ttov5Wfl
UYCzSkMc3pa.P.BDMeEzz7ZyCuSrjlNQ5J7ssjILyV2LGISwhqXd070hSleA
U1RyNm6PKlKn5BH3BD3hnWpyujZ3pBipxdwJS3tTVvcott2bwcaute9xohyx
HadhedTWnhsonD8UyYugNX9DchFi0iOPpuTERMEWhkRAsbPZub6UmHO0fRaH
mFzelidDspMsLlbLHzbWl+xcmaVm53+bFqmOHpFYsifFjeZcVS5kTl4NXuWa
PwpFgN0nqn00D18OuTMsWiw5yWP8bfSlKvA5M3j5BbB8FbRdJ3D50jUrKvwe
IqHWfieRV+ht3L3Ixu3A5Bd7S5ReW0twOnWQ4Kn+3mPGvCrve5mPGzOF73ox
8bW4Gzqn7UlWsCQOEbPdcyBnKvwerSnKvwS6r6hYHL0ezShK3wimKD4h7wiG
LD4J+3I8iKlOdTN6T4k+NoZgqvwOpmLWgim1Y2E3LQzX+Bp3ttCDQ+wgz.jf
V70bwo+cnBZoL6qlQLPPNPGae1Z8n880+..aaRKA
-----------end_max5_patcher-----------
</code></pre>


music messages from node.js to max



also, i wonder if you could send node messages from a remote host-
koding.com


12.13.2011

lemur iPad demo


Well, the wait is over.  When i got an iPad, i thought to myself, surely "they" will make a lemur app.  This would be a great bargain (i reasoned).  Turns out, that is completely the case :0)

Setup was a breeze on the mac, see www.liine.net for details.  This seems to integrate well with max 6, like this:

max 6 patch - get OSC from lemur

Here is a very brief demo, apologies for the lack of detail.  Please comment if you have any questions or need help, i will try to assist.  The possibilities for max4live are quite endless, more soon...


12.13.2011

Arduino ADK demo


Last month i mentioned that you could send instructions from an android phone to an accessory.  I purchased an arduino mega adk and a htc wildfire s (black friday, 50% off, radio shack, android 2.3!) to demonstrate communications from the device (android) to the arduino.   I am still confused which is the accessory, but whatevs.  This is a very basic demo, a button on the phone turns an led on and off on the arduino.  You can see the possibilities - yep, Christmas lights!!! (with music coming soon!)





11.26.2011

Cloud to Device Messaging Protocol

This is in preparation for sending instructions to and from android and google app engine (web app), or a midi file from a web app to an android phone which is connected to an accessory (Christmas lights controller).





11.26.2011

Arduino Christmas Lights

Today i have begun creating the Christmas lights that i promised my Niece last year about this time.  The delay has been inexcusable, just too busy really, but finally am making time on this rainy Saturday afternoon.

I still have the arduino diecimila with the sketch uploaded to it via the arduino software.  For some reason on my windows 7 laptop, i could not get this to work, big surprise there. 
On my macbook, i have the sketch working where it accepts voltage on analog pin 0 and graphs it out. 

I have a timer that i made out of 2 555 timers from a make magazine article, that outputs a blinking led and sound via a speaker.  

The idea is to blink Christmas lights according to sound input, in this case, Christmas music!

Here is the processing code that graphs the input of the arduino, from the 555 array.

import processing.serial.*;
Serial port;  // Create object from Serial class
float val;    // Data received from the serial port
int x;
float easing = 0.05;
float easedVal;
void setup() {
  size(440, 440);
  frameRate(30);
  smooth();
  String arduinoPort = Serial.list()[0];
  port = new Serial(this, arduinoPort, 9600);
  background(0);
}
void draw() {
 if ( port.available() > 0) { 
    val= port.read();       
    val= map(val, 0, 255, 0, height); 
  }
  float targetVal = val;
easedVal += (targetVal - easedVal) * easing;
                  stroke(0);
                  line(x, 0, x, height);
                  stroke(255);
                  line(x+1, 0, x+1, height);
                  line(x, 220, x, val);
                  line(x, 440, x, easedVal + 220);  // Averaged value
                  x++;
                  if (x > width) {
x = 0; }
}

//end code

the libraries that i have on my mac in my libraries folder are: arduino, controlP5, oscP5, and rwmidi.

i am running processing 1.2.1 .

i purchased an android phone, the virgin mobile htc wildfire s because it was 50% off on black friday!  i also purchased an arduino mega from radio shack, they finally came to town!  i thought i bought the adk version, but whatever, i will exchange it maybe if possible.

the idea here is to get the adk working, then load a midi file on the android phone, play it back either on the phone, or the arduino speaker, and light up Christmas lights.  Or, play Christmas music on the phone and hold it up to the arduino board with a little microphone, and blink the lights accordingly.  

here is another way to read data from the serial port, from the book "Getting Started with Processing" by Casey Reas and Ben Fry:
import processing.serial.*;
                Serial port;  // Create object from Serial class
float val; // Data received from the serial port
                void setup() {
size(440, 220);
// IMPORTANT NOTE:
// The first serial port retrieved by Serial.list()
// should be your Arduino. If not, uncomment the next
// line by deleting the // before it. Run the sketch
// again to see a list of serial ports. Then, change
// the 0 in between [ and ] to the number of the port
// that your Arduino is connected to.
//println(Serial.list());
String arduinoPort = Serial.list()[0];
port = new Serial(this, arduinoPort, 9600);

}

                void draw() {
if (port.available() > 0) { // If data is available,
                    val = port.read();                 // read it and store it in val
                    val = map(val, 0, 255, 0, height); // Convert the value
}
                  rect(40, val-10, 360, 20);
}

and here is the arduino code for the arduino board, uploaded by the arduino software (not processing or processing code!)
	




   // Note: This is code for an Arduino board, not Processing
                int sensorPin = 0;     // Select input pin
int val = 0;
                void setup() {
Serial.begin(9600); // Open serial port

}

                void loop() {
val = analogRead(sensorPin) / 4; // Read value from sensor
Serial.print(val, BYTE); // Print variable to serial port
delay(100); // Wait 100 milliseconds

}


here is a screenshot from the processing sketch:
processing - visualizing data

here is part 1 of 3, (2 and 3 coming soon) of a tutorial video

Christmas Lights- how to






9.7.2011
Monome app success - Hello Monome

minimal monome setup - howto


so it has been 9 months since i have tackled the monome, and have taken small steps to understand the new serialOSC protocol.

i see that monomeserial is no longer needed, and all that is needed is a few kb installer from the monome site (a service that runs when
the mac boots i suppose), and the patch 2 below, this is basically a text matching game that specifies which column and row (and state)
of the matrix is set or get.  

i have successfully produced a patch that will input keypresses from the device to the max patch, and output led activity from the max patch to the device. patch 1 is just a proof of concept that lights up led's in one row at a time (if it hits on the 1's correctly, my patch is a little iffy, try hitting the toggle a few times on and off).

here is the interface max patch that represents the monome:


<pre><code>
----------begin_max5_patcher----------
1197.3ocyZssbaBCD8Y6uBML4wzZVIDW5a86nSlNDrpKsbwCHO0oY5+dAIrM
1wVHaCxZxDHVVHc1Cmc0Js484ybdsbKq1A8Ez2Pyl897YyDM01vrtOOyIOda
RVbsnaNIk44rBtyyxuiy1xEsmVrdCGwKQ4kEk4LzmPqqXMOSW+VGyS9YZwpu
WwR3x4KBB+r6yHJUbCnts2vMWQuz8P+nrfWDmyDSvWqRiy1MboKEsU95u9Dk
rqwhM4oEYLt.nPuwnN8uhw.vMSw99VtguqytsM9u4yau77cRDMC6oLQFaoJh
fD4IHBO58QDvigHZFgWYUpdQiIsVjWfzL+n4IA.+s0L4CzHlZ3UjyqwEqbtN
RvyaOPZjeMueh4okEWDLtcW1OI2N0gmBpKzqCsDCPczAntiAisScA9XIZCL.
04O.0cLXdzTG6OMf9CAt1TrNN42H21eTwqg9BSAKrhfHs40d2tR1MXH18HHM
hrKY7X2plgkgVv1FmuNisXUU5xE+l8lJeeP3mEHTN.gNLQ2RuWK2NBqdNhZv
pCLTyDnhbvRZQDEOLPCt4J4E2yxKtWCu.2.ujGyqR2lvqxTFZSn2A+N61c+s
Ka+Yo0B2Ow88cqmESh1MiUk+Q.lvgho0GE540c+Bm7ljJiWw9fxIIiEqZ4.B
UHU7f1qDAjay+bzDLjvyJXvStf4B7gpP3gG3.B9yzwlIn1ES7DfdBidhnfP7
jodGJhoPm.wA7XnjKDkUq048bENLDgiszUeTivhiNKmPlbNYnDGwRSNBO84M
hCspUeSJ2TvYUMBi.U7imfYjYzJ2KfV7yteu9D.wAmklnWCM4MdzTNiWUh78
bU49fk6yjHYIXXV5VjO9OnvJC4BAxTWwxDxmXeHpk5CAJIHYtSRQhYbh7rPm
H09Pf7DB8oGtN99PDK0GRloJFLvxPPjU4BIkFgJkFxjzhlRkA7fxnmWtZUFS
0VYv6r29WUKLN2N9f.G82qFX7zLhj6tjZrHjfuUEgr9vYgjVnxUnSCHOQjP3
1pd.7fpdvk101h52pWTUJO0ADNPYv..jqlJVtHJZz2+F3ZU6eSakAUdrnA2i
vHzxzEGcBpYrkKpYbjN6wWHKHx3IfLi7QUjDXsIRzc53gSelDCUBoiwhsWBI
BwumCzDWBoAXtiwhsyb3tPODX5YN6pBFZVEMrrvYDYYnMQUzvNOjxgoUAM.4
gsAXXDKnAbo5YLQUlXcbASkQ5KOwLR+fwg8W.pezfvqH0b2I.rB2W4tqvx+t
sHamEpQCD45vPcK0HpuwIdtlW3Em9urjv.Za+XKttbSUxN8xtZbgNL8KY07z
BAd60o1xM2qS+Lc4RVQ+h+kmtbcYiCXGHPubV9WWLcxzcAL4adLACgIp4wDd
HL4YVL4py6NhYwDQCLchivTio1hiNHl.yBIpFPpsvCHhkgIO6CSsmbhIwDXc
xIrNqrPLKl.cvD1rQBvTcwD1bXJTWLAlCS5jUvI.exwjutgLMnFWKdx2BwjY
yJ.6oClLaFcXhtK2YYu6.y52Ag5tDrAwjNwB.yt1BnS13fYWCVG4jgUSZfn.
qCQXyFYRisZRMNhFbC4FGQClv6cfnlO7u4+WzNrH0
-----------end_max5_patcher-----------
</code></pre>


and here is the minified serialOSC that i copied into a second patch that must be running concurrently in order to run 
(need to figure out bpatcher and embed that in patch 1 above)

<pre><code>
----------begin_max5_patcher----------
2555.3oc2b0sbqZqE95jmBF2dw4LmzD8OvdlNS6CPeBZOydvFRBsXvCPZytc
56dAIAFx1VRFij0zKhsiswrzmVeq+g+5961rs58rlMAeJ3mCt6t+596ti+V8
uwcx++tM6SdeWQRC+qsYeVSSxKYadP7YsYu2xe+mZ9RySGpydN+8fmxdOY+g
hwuzgj1culW9xmqy10JNYDJ7QvCAzHR+SPJk+Tziff++vAUm0jU1lzlWU1eL
P46W8VaQVa6WNjI9k1rY7PdtprsLYO+C17ikoIEYA+TUY0fbjmx+jps+52QY
aNw44hDvx21mW1IJbbAMQDZx+StH.QcGy32UH27uLr+M+66uu+gGLD2Ky9iN
49qf8lrh.LRAPyffdImf4OQ4qFDXI371jxW17vRwafF7Vqbtb3Fsdv8uk8EU
XMHtWrwwg70P7izkh04ks8P8W+zRvdRnNrWmbOC6AWB1SVQU8Q6JO0cBTrMP
I70AIJhyYgPi04uDPEoAT0KEyPU3kfpfEfpm0v8.n9Rcd5SEYoOkTTD.TY6l
PEbT9RBFxbrsarN8Y8BnWX6t9nBcdoB7FwIm70.3JreuLrlnAqiFcLdZwa4l
NfqnR9thrjZEPLjqhDxQZAucl5x5fkL5lah524.EUb7PjXGU7DF06RvBPRHb
iOwH6zwOjUlFbnptUq1BRntHbZNSmekvFxlq1QwJhMOWWsu4K62VUnGYHbsl
HrsPFrWgL0c+rYAZwFDOxVDxbslkFrMK55wmkDz712ZaqJUl0G2nhHFeDPOD
vy4X7imtDCUtDs1dcZdRQ0KAcNByp0YlfvWfPlvRJFa1N97k7kjhEZyMIUod
rQ6NOhvCMfEKhHa3ww0Y+ORU4tphpZwAvwtiO.WTDOOH9aVhScr0xzLNrQFQ
gw82eZig.+1Wp98r5YBbzCSdXp.OcSBd7GXxACkqwiObxU6E.nZY9wyV78KF
Sw+tk97uIiFEgHObxWAmKSSz0vqXnL8LwNJFCSUnCJBkgIVO.nkhxiD4WQ4I
JLWO97sPUDTJ20MVTuqXaECLAbaPGsFnhh4qepHf2qy2D413apuVfp1hiX78
VhXkRBMbIt3nPtQ9iNC5zpDahElSIh.XwH8XyRqFGDbaBd8r1GZyZZeZWU4y
406Uo8HfFIBIS02FVHv9k8ylrVkUCKDOEWrVwCPjM9VeGDZNG5fifKTIR5kA
AQlaC5prEAgWOoCudnWxtcuoDl.hlgHxi1DK0K1ZT7IAF7MRsJs2EFPIciJJ
Gpf0wfWpe5KAaHdVjbi7M8pNxv4DkfwBlifgdk4n2ROzzW3thpcIEuV0z4rO
LBhz6vWpGI6QvLEoKw37JXdAr1oCoLb+XYbtzIzHa30h5UpIsAaCx69aqpRX
BFh9iSjBol6hR1m1YdrVDpEd8pSjUkb0AOY4+dlVV0f+cIqBwrTEfQQdUEf+
e8NsT51ZPqRVMPS7asTW5XfWw4pSJSq1GfMEfDpNwVLlGre0zohpjTgIC8fi
HqKVjEi5AitMTKsUngI7UIcYcUUnARuMUnY2qcRjpwhiJiCAQNyTPcxZbeky
GTzsI2HkErLu74Js8YTlycH0RQuPIdWoHTfI3AJgcaYOgca.kcU62mUpB.PL
7jVhfXeUOQViw9R27vHEhPv4DhKnwL1KAA0ZRnnHmnIA8uJ8Ilf4OoN4Ihza
rHER4n8YA.BG6ETsoiGCGbLX9tGnADKxEwQFxEIdAWzn9jCioGsgIJ+mW1m7
cUkk8Bsk6V9J0rbcn5+NaVthhfrU4bJMcz+tj1Dt3bNhuMyqj3vGN2uxU++T
OUPaLVCohL7nVN2T2dZrZo8bXPNKCXzfk7IT1NJ85AUo4MG+YU.ahh1eUvFV
Gro6brPXa1RbEi13W1ruiLrOKf.dM3+ru6Q.C.9u+xn5WQd2IsyHb6Te9mxk
grKZxwMCx84ggqeM2vd5naHA.XL55KL.xxEFf+a9UznO3M8jWyEQG8ccADHE
a8SGUCf1qnB0m9SNk+e.sNuIoUzfTUyt.0WcPCI2bM1hnw5h7T2IYgFiFVdq
Wz.ujzpJNdYm5IhQGBGao54SuQCM2ooi8nrxqHmgg8vNrQp1quIMm9ExFkK6
Ue1CEWTveix1QNa1hrVB0jX+qhCkUsAlDCkzjxvUyF1Vc1mP8tAMBnbz8jwK
KqFiwSDx0NRQX5sor4mq3Li5PeJXHXRCpUJ0l0mAaV8YNuP3z5ynJc4fF8we
JS.wYJfnXuZl199uW6zALzcK4PmDYuV7F5qyfOpCi.5GC+AOgDlsFLGleMj.
7KgtY2CQFgLQ+.SEOeLabw+qOyI4D8OLz6PCut693eKZH4VgNqxVQ0vdwN3a
gODnabCjUTHDY2Q8F5gi58D2nF0CHaGNFB4aCZooyBlj3As8nfA7pQA6xmDU
n3JRiJuvzh.WyjnBY2lIQ8LnwelUW0eUA7XW.fUEcJM+PZ09j7RA77XvOzu6
G7YQkP+ttDPe7yc.nAwZAj0ivVEjfcaTpdqKz92FQwt0f7dy0wvxOwLWNo2V
Pf4Qxeta5Pyc2kTWW8Gl07socLb.Qay1Ks4dphcOUewr1ocIFFFaNYc2AL6m
GQAw7VO9wWXPuD0A2WPNKIE4uLaKgC1bw87UtAaA141tSaSV8YniefzpsLNx
Y.1ZbS3sgadHoLqP4UdAWwPXXRzEFzTEisU0oY0SE0ywLmPjXmvzD9jcEG7X
LIFfd3DuvDsZMBuI0qdBlxONdGr9vMWPNt0+9yA5lp2p2MnTLb+4K33oOMqo
MubDn94iUMN.N9kdMOMMqbJyYed5gpNyZiVQO41twxDv.Yp2U+jujsko96sa
5wIfSkIjI3Dws3Te05lnpbZYBG5VYJz+zw6uee4axTeZzADMxja255uuUoEl
35b.2BSXcvDz8xjNZWj6EIsacwtWlPZjIDx+rhCc6dG0DZGywlBLwhIxs5S8
2fzzJSePvssLwLg28AA255SHSzmbqNNynnBbrsfXCrOQbbz3lv6fL2FMtIYs
PNGuCd6h7k3XbxnvmvNEmHTOcuSqLA8v8tH2hSw9mLYxVWrSknXCLDfbtD4Y
ETgF4etUPlfSD2FhII1CwIj+4VAYDqi4egy438Nl+kEEh4ep3l370s1vgljq
oi0uMgxgOS1JVxLfInDzsY+BMwbIxsxDyC6whYQgS8OYB6esXws0bh5gcXwn
3Ko9W7kTGWtPSJuC1so9xLwwBys3Dzj8NliKWXnIwWRbuLok243F.ahyNTn6
wIsAOQcuLoqylHGy6fFfSPf6kIsAp33fLMJftXm5BFQLUlbHN4gxD1nR85Vc
bLx+hKfXjcbla0wMwNNwwCFlIIsf7vgUi5VdmQcJ2sCTf+MtSFmZmmE6TnaM
CXDkywvjQo.C8PSSNd34B8OYhf8OYhQuhhhahH08O+88+CPyOkUF
-----------end_max5_patcher-----------
</code></pre>



7.30.11

Text to Speech and Speech to Text on Android

Sometimes you might want a document to be read to you, and you might want to tell the computer hosting the document which document you want read to you. 
I will attach the apk file showing how to convert speech to text, which with app inventor is trivial.  
It will be available in the apps section of the site on the sidebar to the left.

Milky Tracker for Android

Here is a tracker that I have been using since windows mobile version 5, called milky tracker, it is an apk file for android 


just install the android sdk and go " adb install ThePathToYourApk\ApkName.apk " without the quotes and with the path and name filled in obviously.  Unfortunately windows phone 7 comes in rather pear-shaped when it comes to music making apps which is quite odd i think.  iOS is good for mobile music making but you can't just load a bunch of wav files without going through a bunch of unecessary itunes file transfer steps.   Android is nice because you can just navigate to the android device in "my computer" on windows or linux methinks and drop samples in \sdcard\<app name>\samples.   I am using the caustic directory as that is a nice sequencer with samples already included like 808, 909, etc.  

You can save the *.xm and use elsewhere, perhaps saved to dropbox and pull into iOS via sunvox, wouldn't that be cool?   Copy/paste via the web, as it were!?

Getting Started using the Kinect Sensor on Windows

This is a basic tutorial on how to get setup with a kinect sensor on windows.  If i can do it, anybody can!

Getting Started with Kinect





7.25.11
here is a max patcher for the android app control (also on iOS) that will send and receive data from 
a mobile device over OSC.
<pre><code>
----------begin_max5_patcher----------
1408.3ocyY98aaaCDG+Ym+JH7dva.NJjThTRYO01Art9vJPCv5CMACxRz1by
VRPhNMcA4+8cjTVQNINwNg9GANRxmjnN9gm388nu8jd8GUbintO5bz2P85c6
I85YLoMzq4685OO4lzYI0lKq+bQccxDQ+g1yoD2nL1Oa9Od+BkpHGQVdthEp
YBk5GkB6CneezUMmZbQtJOYt4D8+nX10BkLMY4MJyL1KF8Om5yVZLewbYNzd
F2f1ocpk+moc7wd3FykIpzox7I+ckHUYe3LJyiP8i4zgHZn9RQT+HuPRLlxF
h7C7vsdG7nr9t4YQzFu6jSzaFtgTJW7cv6eDjVjUBdjPds.QvvetjTznmjTj
mfTjmkTgA.o3LZjOfn.CohMaIbmxnzh4yE4pGAouKylHTmlVIRThSSmljOQb
ZkXdw0hKyguVMSBeuXjnRU6AMxxFXlLWjVrHW8v.jMCesAZ5aYbRpnK8dYjR
eofOM.iLbzGyr65fyQSRKlUTYubrWb.gDxGBGo2GDt5QbRLGGslgBrCGJrTG
olJP1Qk9aMV8cTTIkYfV6N9KDQ5RLXiAMX3yW7ATRVVELKXGrTij0HnUjSxE
YHUw1iIriwD8.foZgxvDnCfNCA2B55jYKDZPkn5PKX2rYHvIJWr8ATjH2RJR
7gMfpAIFRs8vf4XXvOFfQMprnVpjE5vHi+u0bwYy5Xy+Q7OrbwjanFUL9sLU
Lg3JnzjMCe.fh9.TBHM.lkEAWfnB8oK97ehFWTgRZHiQkfAclKNOCUZludjb
BZjUiJby0B3DInL43whJnkd.VWQMg+1x5XGg5n.7RoBsj1e+PZa5LHsVNRV1
lyyPyhJkA35fwLw0xTQKPeE49Bc66pqvp80qpFspVVoiI0xGQ5vL.PkSKxEf
YC1pRjJz7hrseJMtie409taP3NfRqsDwTvKqJlclUV4WsY9.tobZIizvMtjw
mGUw3NJNaRAPbachuHp.MUeoYtL.Sf1eJC1vbJu3NhWgcETQXzCAuJWTO82.
TIySLBHHwTnX1HOhGAGtCJ5NvQriv5L2E4PEp8AqNCar1OMFigMigM3wtkZT
GQMKuLBQz+EAGGFdHXmMAv6mkj+u+QaB.kINbBBrlUmlTJbJCINhg3NoCHQG
n.u2srjZSj2Yu6K+9GcIrHwNcJt1bn6h2SWyRGBRXK0BrZoFnH6qqnX0IfxU
hw39cKbh36uCV.w0PpJnYsZ+WOYF95nC2wzgZ10job8vg9JfisPm0RfQfnh6
IP29Xvy1GepE2j0QQIzWHXBmF14PGNjqGUEYxGq.+1A5QvAmOvLCxfgnA5NK
78KlIyDUZCifp4xpGb92.+T+IjMzy+pgn6d1EP9Iicj5Z.1tvH6xcYj92Amc
AO0sAWMgXwQd9L+XJjaLx2KfGxYj0LfDrKlbucZJzkuoAoK6ukCSuhWuwNUL
GGaUkD.iEz.a4V62DqUKxuHsRV1TjkGjn8uzqy3O64+K+5kUtLwQjiPGG2Yc
HI73Cjdj2aBCuunK3e3Snt1KeWhMlivVvJ0nFsG0krHqzrvOcKzJ.Egiva8R
b3pEssQL6RJP1hk3vbIlYXdvOJt4wnsuJgpKVTktb7e4uBK59mT18kh14hz+
n1n6mEdpLKSXN+xN0bYVYAjjowIPW8jiWapOw1DWZkqYW6QZ83GYtjtdpiMW
hd7MvgO5boniuwsfiOWhe74RgGeQ2axKbD990m1jQNR390m1j.7G.yWzmX7.
OFTjBnZgf4A9f.Zch7vXFMdsloDuH3F0U2v8i02eqk8ReD+V6irfPOJmgIq2
LC6wBnwwTSADcM7V6hgaZWbKzpzLLP.g7LbDI.FYXjXuXJIj4ud6fYd.AGRz
EKYZgVKqzKgub2I+OLDOrMA
-----------end_max5_patcher-----------
</code></pre>


alternatively, here's how to send midi from an iOS device to a computer over wifi:
<note> this is the worst possible quality and fattest file size ever for a youtube video, apologies in advance, 
a video made on an android tablet.  you get the gist methinks with the audio.

ipad midi howto


5.20.2011
been learning some supercollider, thanks to David Cottle's "Computer Music with Supercollider" book. 
I found that text to speech does not work with windows or linux yet, but fine with osx 10.4 for some reason, for anyone wondering why
"Hello World".speak; 
doesn't work for them using sc on win7x64 or ubuntu natty.

Getting back into arduino and processing after 4 months of studying some as3, obj-c, and restful web services, brand new to the stuff.

Here's a few nice processing to osc to max links:

I highly recommend www.macprovideo.com, where I submit detailed blog posts, available to check out for free.  I am a subscriber there, and use the training resource extensively. 
Check it out for yourself if you are interested in learning how to produce multimedia.  http://www.macprovideo.com/?affil=122400
 

1.28.11
i have been learning a little about javascript and how you can make interfaces on iOS with json, and control max for live via osc.  
here's the app - http://www.charlie-roberts.com/Control/

here's a code example of one button on an iPad to communicate with max -
//simple.js
loadedInterfaceName = "simple";
interfaceOrientation = "portrait";


pages = [ [
{
     "name" : "myButton",
     "type" : "Button",
     "x" : 0, "y" : 0,
     "width" : .25, "height" : .25,
}

],

];

here's the max patch to receive the osc data, a 0 for toggle off, a 1 for toggle on - 
<pre><code>
----------begin_max5_patcher----------
387.3ocwT9sSBCCEF+5tmhldMnqcCi5cJO.bAbmgXJqGgZ1ZW15TPBu611sI
fAcHjHWz0ru1dNeme8OqCPjY5kPIAeO9ILBsN.g7RNATy+HRFeYRJuzOMhBd
WO6URu5gLvRiWNuPpLspunUlR4GfaDJ6pvF4btIYgTM+4BHwTmynvP6v3HF0
2E69xrR3oMqQUkoqLofwm81HIE9jZMR+3cSphm4SJ4gBIOkrMFRUaHnNsMAA
tO8NuZVWlzuv5N.ec1pGqLFs5DH.cfunq6nza6.ArF0ZIypbnNNDROa6qEsC
ghtbDZTNnFqqThg1TWnSc62gg+cHwX9SFzatw2MHrCHE8qPx1FMd3DYFLgO+
fHic4PVkH2V2f7M.ScvBmnx3mvMKF0yp67WrnwrNHF8GI1g3C8L3iOdjTo56
u63KBm99PqTWUjz5llyy3skg.JMRE2HsW91Nm38lyBoP.pce.ISJx01WrZr.
d5A2.OVGYOtfoc3nn+UGQOBFwNCGY+YSvmf+vImi
-----------end_max5_patcher-----------
</code></pre>

youtube video link explaining the details here - http://www.youtube.com/watch?v=6fpiLoN43Ms

control javascript



of course you could add this max patch into max for live, and make knobs and buttons according to the documentation on the control website per the above link.  

what i really want to know how to do is to implement behaviour with javascript, possibly using while, for, and if statements in order to loop around in a composition for interesting playback of json-based music structures, or maybe just javascript to communicate midi note data to ableton live and let the virtual instruments do the sound design, and leave the "sheet music" to javascript.  Json really takes the role of the interface to remix or dj the sheet music if you will.  






things to learn: 
unity - get a cube to rotate, transform, change color, scale, etc based on udp data sent from max
javascript - eloquentjavascript.net is a super fantastic learning resource
p2pu.org - check it out, part of mozilla drumbeat
xhtml tutorials up on macprovideo.com - html5 and css3 info.  
reaktor
adobe cs5 - 3d possibilities, perhaps an interface like monome arc, only virtual - check the monome community for a flash file someone has made to sketch out a design using flash
flex/flash builder site
android honeycomb
windows phone 7
eclipse helios, perhaps orion
i0S
learn more about math, like a 3d scientific calculator
stereoscopic 3d and make your own goggles
make - tons of great tutorials up on arduino and 555, including midiuino
basic stamp - rfid possibilities with visual studio
learn about intel parallel tools for visual studio
integrate websites with linkedin profile
google storage for developers, gwt, and google apps script for websites
monome apps - mlrv2 and how udp works with monome in general
ni komplete - study all the great virtual instruments
learn how to put data on a blue ray disc for interactive movie content
vizzie with ableton live
update tumblr account with js101 course
read javascript the good parts, and javascript the definitive guide
guitar and max msp integration
guitar and reaktor guitar synth
learn how to make psn games, didn't they settle on openstep or gnustep?
figure out how to push a vm to citrix receiver from citrix xenserver
online Bible in js/json w/ audio - html5, css3, js, caching (offline app) - put up on google app store for free
figure out sampling in maschine
release new album - the red rings - with visuals to accompany music - in a web app
-silverAir
-tallWallTranslucentHall(turquoiseTurtle mix)
-dub, dubstep, neurofunk, tech-house

make a website that monitors a data source such as temperature or rfid check-ins





1.17.11
added git repository for javascript, processing sketches, and max patches


1.16.11

i am trying to vj with ableton, so I have the audio going into ableton ok with the below, but how do i get the video into ableton?
surely it is possible, as you can drop a quicktime file in ableton.  The idea is to get sound and visuals generated from ableton, and then save the output, much like how you would 
traditionally bounce an audio project once done.  
I want to create a cube in open gl and have it rotate or something as a proof of concept.  I would like the colors red, green, and blue to change on the cube's sides 
according to the audio, like bass, mid, treble corresponding to red, green, and blue maybe.  Need to study jitter, vizzie, and this new vizzable collection for max for live someone has made. http://zealousy.com/2011/01/vizzable/

Also need to get some code up on gitorious or github, or maybe google code.  The *.js, *.maxpat, *.amxd with presets of *.adv, and the live pack should all probably hosted in an open source 
repository in the future to keep everything organized.  More soon...

and the max patch discussion with the compressed patch here up on www.cycling74.com 's forums



1.14.11
the very basics of javascript in max msp
//jsNoteMaker.maxpat
<pre><code>
----------begin_max5_patcher----------
1079.3oc4Y0raaiCD9r8SgfNmMfyv+D2a6KPeAJJVnDqlpTaofHErY2h9tuV
yPaK2ZaQBQzCpGhQFRJ4uuONbFNi+15U4Oz9dUWd1el8wrUq915UqngFFXk2
dU9tx2ebaYGsr7cUcckOUkeGOWe068z3aaae4Cs8UYpLPHDGlu4sc0Maq5oG
F8C941l9t5+qZXL.uWbZssu0eXwfeTdn9+8kJFl44YexO0Kk8O9k5lm96Wqd
rmm0H2+5xjCuzLma3Sn3dwwmndCA11Gd9OTl7QvoobG89y+qWqK2lOLw2Wud
3i6BTX1i9Gpd8h7Fhg2303ccSe9cY4OT17zsk.gcf2ngnuVPFhKKBncoJBHw
dmYZMPBKTMPaTjFnBPCvEpFnbDucx.z.Yh0fp+Y+q8mBT1rOH4d5bQsQFi1H
twNuRSgAAJRfFtIsU+Rn8txuVMP84y6q5S74sskjWA+O27nARAFPIIMbRiqJ
P5k5YCIcdPZrSe3.JVphfltq.DRTRboFkTVXYQ.CPDjKUQ.jrH.AHBpEStBo
oXfoJPOctBT+aXtBoxw0T3lNWAtTKp.E3HQXhbEKVQ.ojDfNfpJfkZtBPykU
qCHgIrTKspPyZP.kU.hESpBPwWXzFPYEteCyT.HKIt.ppv7KQedtK6Pi4t+4
t4qRtq1Tt6l3uaFWkq.A7W.Cs277TXBG8n4aqa9w1aRe+CietZ1091qOdfMG
5OX1IDropqutorutsYzhfyVyWp2ropY7gnc0adocePEOFx9zE2ZCERCeaESf
HYjPRVntWuWzkTDMEez9bKaA6NWLrPK0N0YSC6Tz.ijFV5LGnTiowYVLMzVY
BogYJZHijFZKsabCZvMzR4bCKzIRBMzSPCL1cCFw.iXkxdAqB5RTJCPDdvJA
DQMEQhc+PJH3wPW5LGsR.XkSAVUjfEFqyRDSEX+Au3q3pqiCsdOXfu8jRVv2
nZrEh7Q18Qizdq4xDLTl.gyDeHEO1sfZDS7VHvkLvGuIq4xDHTlfgyDeLd+8
ZOxD4EXh0kLlnCgIQdV3fOigaliVczJEnEBAsQ4AQpoTv0SXEGslIZG988BS
aiwKALiQagIYnUE.ZQSjQE43fH2EGuCw4VRt2WRM48SVykIxPYRDdI9zOgvj
BQxXBFJShvCxm0G4duqQBzma4YhRfIiIgbgdTG6E1HeFku8XV6QqTfVHDzFg
GjWMOfVmLUnc3mGJLsMFuDoaDZUBWxPaHU1IhyQ.slQ0Q4NUTUBv5TtAPj07
gbMDdrBlhTBVbJvFasDB4n6jfxSVyErgDOvEmKKBTfMI26Gn3j0LAaHQCbwE
L.rpwX0nSIVCQWivI.35vNfUkKUXEBI8VjY279nH2NKzwsy5bKMWtCuEPVyk
HPfDIFODNx.BbaeYBblg0vUHvWwxlfh3EARiHbd3fwSyB1G6mYwdiuu9+ALx
Y8.O
-----------end_max5_patcher-----------
</code></pre>

//loopNote.js
inlets = 3;
outlets = 9;


function repeater_function()
        {
       
                velocity = 100;
                pitch = 60;
                duration = 80;
                outlet (1, velocity);
                outlet (0, pitch);
                outlet (2, duration);
                
         }

function repeater_function2()
        {
       
                velocity = 104;
                pitch = 64;
                duration = 80;
                outlet (4, velocity);
                outlet (3, pitch);
                outlet (5, duration);
                
         }

function repeater_function3()
        {
       
                velocity = 107;
                pitch = 67;
                duration = 80;
                outlet (7, velocity);
                outlet (6, pitch);
                outlet (8, duration);
                
         }
function loopNote(repeatInput, spacing)
{


t = new Task(repeater_function);
     
                t.interval = spacing;
                t.repeat(repeatInput);

t = new Task(repeater_function2);
     
                t.interval = spacing;
                t.repeat(repeatInput);

t = new Task(repeater_function3);
     
                t.interval = spacing;
                t.repeat(repeatInput);

}



basic stamp 2 code for rfid reader.
this could be such that
1) a tag would be taped to the pick guard of an electric guitar and activate a distortion effect or virtual pedal
when coming into close proximity to the antenna
2)2 cards laid on 2 turntables to trigger events per revolution of the vinyl record
proof of concept coming up this week...
sample code and info up at www.parallax.com/rs

rfid demo



'=========================================================================
'
'   File....... RFID_basic.BS2
'   Purpose.... RFID Tag Reader
'   Author..... (c) Parallax, Inc. -- All Rights Reserved
'   E-mail..... support@parallax.com
'   Started....
'   Updated.... 02 Mar 2005
'
'   {$STAMP BS2}
'   {$PBASIC 2.5}
'
' =========================================================================


' -----[ Program Description ]---------------------------------------------
'
' Reads tags from a Parallax RFID reader and displays ID to debug screen


' -----[ Revision History ]------------------------------------------------


' -----[ I/O Definitions ]-------------------------------------------------

Enable          PIN     0                       ' low = reader on
RX              PIN     1                       ' serial from reader



' -----[ Constants ]-------------------------------------------------------

#SELECT $STAMP
  #CASE BS2, BS2E, BS2PE
    T2400       CON     396
  #CASE BS2SX, BS2P
    T2400       CON     1021
  #CASE BS2PX
    T2400       CON     1646
#ENDSELECT

Baud            CON     T2400

LastTag         CON     3


#DEFINE __No_SPRAM = ($STAMP < BS2P)            ' does module have SPRAM?


' -----[ Variables ]-------------------------------------------------------

#IF __No_SPRAM #THEN
  buf           VAR     BYTE(10)                ' RFID bytes buffer
#ELSE
  Char       VAR     BYTE                    ' character to test
#ENDIF

tagNum          VAR     NIB                     ' from EEPROM table
idx             VAR     BYTE                    ' tag byte index



' -----[ Initialization ]--------------------------------------------------

Reset:
  HIGH Enable                                   ' turn of RFID reader



' -----[ Program Code ]----------------------------------------------------

Main:
  LOW Enable                                    ' activate the reader
  #IF __No_SPRAM #THEN
    SERIN RX, T2400, [WAIT($0A), STR buf\10]    ' wait for hdr + ID
  #ELSE
    SERIN RX, T2400, [WAIT($0A), SPSTR 10]
  #ENDIF
  HIGH Enable                                   ' deactivate reader

Display_Tag:
  DEBUG "Tag Identification number is: ", CR
    FOR idx = 0 TO 9                            ' scan bytes in tag

      #IF __No_SPRAM #THEN
        DEBUG buf(idx)
      #ELSE
        GET idx, Char                        ' read char from SPRAM
        DEBUG Char
      #ENDIF
    NEXT
  DEBUG CR
  PAUSE 500
  GOTO main                              ' repeats code




1.6.11

I learned a *very little* bit about javascript in max msp today.  A happy day!!!  
what this patch does is the following:
the message "do it" on the top left pings the repeater_function.js file to the right.

the js repeater_function.js object is a javascript object in max that contains the value repeater_function.js, which is the file to the right that happens when the "do it" message is clicked.

t is a variable that contains the result of constructing a new task object with the argument "repeater_function", this is the name of a function in the line below it.

the repeater_function function posts "um" to the max window below once a second 5 times.  i don't think that the post() does anything but put a space after "um", i intended it to separate each "um".
but that happens at the end of the doit function.

the t variable's interval property is defined to be 1000 ms, and the repeat method of the t variable has an argument of 5 which means repeat 5 times.
the post() just prints the subsequent "um"'s on a new line in the max window below.

So this can really be a sequencer;  "send a kick drum out twice per second" = 120 bpm!

What came to mind next is to inherit some data from the processing code like last week's posts and pass that into some of these javascript functions and then you could have multiple voices triggered independently within the same function based on different tasks maybe, or maybe changing the interval property on the task programmatically.

hmmm....




Electronic Music Network


1.1.11
www.projbox.org kit processing patch per below code controlling vizzie in max msp for custom vj controller

vj controller demo





12.30.10
make your own midi controller

make your own midi controller


www.projbox.org
Figure 1: max patch to break osc message from 4 potentiometers into data you can scale to 0-127 midi cc's

Processing code, first tab:
/*
**  projBoxMaxMidi
*/

void setup() {
  size(400, 400);
  setupProjBox();
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,5555);
  myRemoteLocation = new NetAddress("127.0.0.1",5555);
}

void draw() {
  background(0);
  projBox.getData();
  drawGraph();
   
   
}

void drawGraph() {
  stroke(255);
  for(int i=0; i<projBox.totalRows; i++) {
    float x = 0;
    float y = i*height*.25+10;
    float w = map(projBox.knobs[i], 0,1023,0,width);
    float h = height*.125;
    fill(255*projBox.switches[i]);
    rect(x, y, w, h);
     float targetVal = w;
  
  /* in the following different ways of creating osc messages are shown by example */
  OscMessage myMessage = new OscMessage( "processing" );
  myMessage.add(targetVal); 

  /* send the message */
  oscP5.send(myMessage, myRemoteLocation);
    
  }
}



...second tab
import processing.serial.*;
import cc.arduino.*;
import oscP5.*;
import netP5.*;
Serial port; // Create object from Serial class
float val; // Data received from the serial port
int x;
float easing = 0.05;
float easedVal;
OscP5 oscP5;
NetAddress myRemoteLocation;
/*
**  projBox setup
 */

Arduino arduino;
ProjBox projBox;

void setupProjBox() {
  println(Arduino.list());
  // change arduinoName to your arduino from the list
  // i.e. "/dev/tty.usbserial-A800eItJ"
  String arduinoName =  Arduino.list()[0]; 
  
  arduino = new Arduino(this, arduinoName, 57600);
  projBox = new ProjBox();
}

/*
**  projBox Class
 */

class ProjBox {

  int[] knobPins = new int[4];

  int knobPin1 = 1;
  int knobPin2 = 2;
  int knobPin3 = 3;
  int knobPin4 = 4;

  int[] switchPins = new int[4];

  int switchPin1 = 2;
  int switchPin2 = 3;
  int switchPin3 = 4;
  int switchPin4 = 5;

  int[] ledPins = new int[4];

  int ledPin1 = 6;
  int ledPin2 = 9;
  int ledPin3 = 10;
  int ledPin4 = 11;

  int totalRows = 4;

  int[] knobs = new int[totalRows];
  int[] switches = new int[totalRows];
  int[] leds = new int[totalRows];

  int ledMax = 64; // 3.3 volts (typical maximum voltage for LED)

  ProjBox() {

    arduino.pinMode(switchPin1, Arduino.INPUT);
    arduino.pinMode(switchPin2, Arduino.INPUT);
    arduino.pinMode(switchPin3, Arduino.INPUT);
    arduino.pinMode(switchPin4, Arduino.INPUT);

    arduino.digitalWrite(switchPin1, Arduino.HIGH);
    arduino.digitalWrite(switchPin2, Arduino.HIGH);
    arduino.digitalWrite(switchPin3, Arduino.HIGH);
    arduino.digitalWrite(switchPin4, Arduino.HIGH);

    arduino.pinMode(ledPin1, Arduino.PWM);
    arduino.pinMode(ledPin2, Arduino.PWM);
    arduino.pinMode(ledPin3, Arduino.PWM);
    arduino.pinMode(ledPin4, Arduino.PWM);

    for(int row=0; row<totalRows; row++) {
      knobs[row] = 0;
      switches[row] = 0;
      leds[row] = 0;
    }
  }

  void getData() {
    knobs[0] = arduino.analogRead(knobPin1);
    knobs[1] = arduino.analogRead(knobPin2);
    knobs[2] = arduino.analogRead(knobPin3);
    knobs[3] = arduino.analogRead(knobPin4);

    switches[0] = arduino.digitalRead(switchPin1);
    switches[1] = arduino.digitalRead(switchPin2);
    switches[2] = arduino.digitalRead(switchPin3);
    switches[3] = arduino.digitalRead(switchPin4);
    //
    ledDisplay();
  }

  void ledDisplay() {
    for(int row=0; row<totalRows; row++) 
      leds[row] = floor(map(knobs[row], 0,1023,0,ledMax));
    //

    arduino.analogWrite(ledPin1, leds[0]);
    arduino.analogWrite(ledPin2, leds[1]);
    arduino.analogWrite(ledPin3, leds[2]);
    arduino.analogWrite(ledPin4, leds[3]);
  }
}



12.29.10

Processing Open Sound Control to Max


7.30.11 v2

Control Ableton Live, Max Msp, Max for Live, Reaktor, Supercollider, etc with Control for Android using Open Sound Control

Note: I will begin posting to the bottom of this page per new post, since google sites likes to place focus on the bottom of the page when it loads.  This way scrolling to the top is not necessary to see the latest post.   Perhaps RSS/atom is in order.

Control your sound with Android



Comments