It’s hard to find an example using CGDataProviderCreateDirect, so here’s a quick snippet:

static unsigned int* data; // used for manipulating pixel data directly

const void * getBytePointerCallback(void *info)
	return (void*)data;

@implementation SomeView

- (void)createImage
    CGDataProviderDirectCallbacks callbacks;
    callbacks.version = 0;
    callbacks.getBytePointer = getBytePointerCallback;
    callbacks.releaseBytePointer = NULL;
    callbacks.getBytesAtPosition = NULL;
    callbacks.releaseInfo = NULL;
    float w = self.layer.frame.size.width;
    float h = self.layer.frame.size.height;
    w *= [UIScreen mainScreen].scale;
    h *= [UIScreen mainScreen].scale;
    int numComponents = 4;
    uint dataLength = w * h * numComponents;
    data = malloc(dataLength * sizeof(uint)); // TODO: free
    uint r = 255;
    uint g = 0;
    uint b = 0;
    for(int i = 0; i < dataLength; ++i)
        data[i] = 255 << 24 | b << 16 | g << 8 | r;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGDataProviderRef bitmapProvider = CGDataProviderCreateDirect(data,dataLength,&callbacks);

    CGImageRef bitmap = CGImageCreate(w,
                                      8,    // bits per component
                                      8*numComponents,  // total bits
                                      w*numComponents,  // bytes per row
    self.layer.contents = (__bridge id)(bitmap);

couchdb reader_acl

I installed CouchDB 1.0.1 with MacPorts 1.9.1 and quickly ran into problems:

  • The ‘attachments’ test hung in Chrome 6.0.472.55. I ran the same test in Firefox 3.6.9 and it worked.
  • The ‘reader_acl’ failed with an exception.
  • I couldn’t create an admin.

The couchdb.log certainly had errors but I couldn’t find a solution online. I tried uninstalling the port and reinstalling with no luck. Eventually I gave up and downloaded CouchDBX. Creating an admin worked but it also had problems running the Test Suite (I had to Force Quit).

Then I tried Homebrew. After installation I ran the Test Suite with 100% success and was able to create an admin! Awesome, now I’ll just add org.apache.couchdb to launchctrl…hmm it’s not under /Library/LaunchDaemons or /opt/local/Library/LaunchDaemons. After a little digging I eventually found it under /usr/local/Cellar/couchdb/1.0.1/Library/LaunchDaemons/. Only a few steps remain:

  • Copy org.apache.couchdb.plist into /Library/LaunchDaemons
  • Change the value under the UserName key to your user short name (hint: look under /Users)
  • sudo launchctl start org.apache.couchdb or you can test it for sure by restarting (shortcut key: Control-Command-Eject)

Everything now appears to be in working order.

adding FLEX_HOME and building as3-signals on a mac

Fire up a terminal:

  • cd ~/Library/SDKs
  • git clone

You can find the above url on the as3-signals homepage on github. My personal pref is to put 3rd party libraries under ~/Library/SDKs

If you look inside the as3-signals dir, there is a build.xml file which requires a FLEX_HOME variable to be set. So, I downloaded the Flex 4 SDK and dropped it under /Developer/SDKs/flex_sdk_4. In the terminal, we need to set the env variable FLEX_HOME. First, lets check if you have an existing one defined. In the shell, type

  • env

You should see a list of defined variables. If you need to remove an existing FLEX_HOME, you can do so by typing

  • export -n FLEX_HOME

Otherwise, you can add a new FLEX_HOME by typing:

  • FLEX_HOME=”/Developer/SDKs/flex_sdk_4″
  • export FLEX_HOME

If you type env again FLEX_HOME is now added to the list. Now we can build as3-signals.

  • cd ~/Library/SDKs/as3-signals/
  • ant

Ant looks for a build.xml by default. Upon a successful build you’ll find a .swc in the bin folder.

Note: Setting FLEX_HOME this way will only last for 1 terminal session. If you’d like a more permanent solution, see:

patch 8

As I wade through the tutorials, I stumble upon objects that appear quite handy, like the js object. The js object could have vastly simplified my development of patch 7. How so? Well, like this:


Ahh…so much cleaner than the mess I had before. Modifying the Java code to Javascript was trivial, here’s the code for sketch0.js:

outlets = 0;

// global vars
var offset = 20.0;
var radius = 50.0;
var centerX = 50.0;
var centerY = 50.0;
var x = 0.0;
var y = 0.0;
var angle = 0.0;
var frequency = 2.0;
var counter = 0;
var coordsX = new Array(180);
var coordsY = new Array(180);

function bang()

function radians(angle)
    return angle * Math.PI / 180;

function draw()
    outlet(0, "clear");

    // calculate point
    x = centerX + Math.cos(radians(angle)) * radius;
    y = centerY + Math.sin(radians(angle)) * radius;

    // draw black circle
    outlet(0, "paintoval", offset, offset, radius*2+offset, radius*2+offset, 0, 0, 0);

    // draw red circle (10 pixels in diameter)
    outlet(0, "paintoval", x+offset-5, y+offset-5, x+offset+5, y+offset+5, 255, 0, 0);

    // draw green circle
              0, 255, 0);

    // draw prev point
    for(var i = 0; i < counter; ++i)
        outlet(0, "setpixel", coordsX[i], coordsY[i], 0, 0, 0);

    // cache prev point
    coordsX[counter] = centerX + radius + counter + offset;
    coordsY[counter] = y + offset;

    // adjust counter and angle
    angle -= frequency;
    if(angle <= -360)
        angle = 0;
        counter = 0;

Another possiblity is to swap the lcd object out in favour of jsui, but let’s not get carried away.

sketch 1

The goal: use the sliders on my MIDI keyboard to control corresponding sliders in Processing. Here’s a screenshot of the resulting demo that maps 3 sliders to variables used in Examples/Basics/Arrays/Array2D.


Processing doesn’t ship with a collection of standard GUI controls – nor was it meant to. For simple GUI controls, there are external libraries available. I’ll be using controlP5 which you can read about and download here.

To get the new lib working, create a “libraries” folder in your sketches directory. If you don’t know where your sketches directory is located, check the preferences in Processing. Unzip the download and drop the whole thing in the libraries directory. If Processing is already running, you will have to reboot the app before you can import the library. If everything is installed correctly, this example should work.

Messages will be sent to Processing using OpenSoundControl (OSC) – a communication protocol where packets are typically send using UDP sockets. Download the oscP5 lib and install it (don’t forget to restart Processing). Test the OSC lib using this example.

On the Max side, we’ll also need OSC support which will be provided by CNMAT’s collection of objects. I’ve chosen to download the complete package of objects here. Unzipping the file reveals a directory full of files and no instructions on what is to be done with them. I do recognize the .mxo extension as an external – a plugin you can write using the SDK. A search for .mxo in help returns one result:


It turns out that:

  • .mxo or .mxe represent external objects
  • .maxpat and .maxhelp are the new file formats for Max 5
  • .pat, .mxb, and .help are old file formats

Looking under the Max/Cycling ’74 directory, I can see there are folders for: max-externals, msp-externals, and jitter-externals. However, I don’t really want to “pollute” the default installation with 3rd party externals. Fortunately, Max allows us to set additional search paths – allowing us to keep our files wherever we deem appropriate. Place the downloaded CNMAT folder wherever you want (I’ve chosen Max5/CNMAT). In Max, select “File Preferences…” under the Options menu and add the CNMAT path. Below, I’ve set a relative path:


I’m not sure if it’s required, but a restart would be prudent. However, typing “osc” doesn’t reveal anything during autocompletion. Looking in the CNMAT directory, I discover that the objects are uppercase. Typing “OSC” now reveals:


Shaweet. Of course, at this point, I’m still not sure if it actually works, how to use it, or if I should even be using OSC-route in the first place! Fortunately, I saw .help files in the CNMAT directory, so I know that Option clicking the object will bring up a working .help patch. It appears that OSC-route is similar to Max’s route object and not what I’m looking for right now. The CNMAT directory also contains an object named OpenSoundControl, which looks promising, and indeed it is. In Processing, we can test things out by creating a UDP socket to receive messages on port 8080 of localhost:

  oscP5 = new OscP5(this, 8080);
  myRemoteLocation = new NetAddress("", 8080);
  oscP5.plug(this, "foo", "/foo");

public void foo(int value)
  println("int received!!! = " + value);

“Plugs” in oscP5 are used to register callbacks when events are received. Values are parsed from the OSC message and passed in as params to the function – very handy. On the Max side, we can create a simple patch to send an OSC message out a UDP socket on the same port:


Click the “/foo 42″ message to add it to the OSC buffer, then bang to send all packets in the buffer. In Processing’s trace output, we see “int received!!! 42″.


Now that the fundamentals are in place and working, it’s easy to build upon.

On my machine, the controller numbers for sliders are 82, 83, and 28. To find out what controller number your slider is sending, open the ctlin .maxhelp patch and move the slider:


Here’s the Max patch with my controller settings that will generate OSC messages:


In the above patch, “/xDist 62″, “/yDist 68″, and “/circleDist 42″ are all OSC messages that were sent to Processing. All 3 messages will map to plugs in oscP5, triggering functions that adjust the GUI slider values. Here’s the Processing source:

import controlP5.*;
import oscP5.*;
import netP5.*;

ControlP5 controlP5;
Slider xDistSlider;
Slider yDistSlider;
Slider circleDistSlider;

OscP5 oscP5;
NetAddress myRemoteLocation;

float [][] distances;
float maxDistance;
int yDist = round(32 / 8.0f);
int xDist = round(32 / 8.0f);

void setup()
  size(500, 300);


void initOsc()
  oscP5 = new OscP5(this,8080);

  myRemoteLocation = new NetAddress("",8080);
  oscP5.plug(this, "onYDist", "/yDist");
  oscP5.plug(this, "onCircleDist", "/circleDist");

void initDistances()
  // diagonal from center
  maxDistance = dist(width/2, height/2, width, height);
  distances = new float[width][height];

  for(int i = 0; i < width; ++i)
    for(int j = 0; j < height; ++j)
       float dist = dist(width/2, height/2, i, j);
       distances[i][j] = dist / 0.5f;

void createSliders()
  controlP5 = new ControlP5(this);

  xDistSlider = controlP5.addSlider("xDist",
                                    0, // min
                                    127, // max
                                    32, // default value
                                    20, // x
                                    20, // y
                                    100, // width
                                    10); // height

  yDistSlider = controlP5.addSlider("yDist", 0, 127, 32, 20, 40, 100, 10);
  circleDistSlider = controlP5.addSlider("circleDist", 0, 127, 64, 20, 60, 100, 10);

void draw()

  for(int i = 0; i < width; i += xDist)
    for(int j = 0; j < height; j += yDist)
        point(i, j);

  rect(10, 10, 160, 70);

void onXDist(int value)

void onYDist(int value)

void onCircleDist(int value)

void circleDist(int value)
  float val = value / 127.0f;

  for(int i = 0; i < width; ++i)
    for(int j = 0; j < height; ++j)
       float dist = dist(width/2, height/2, i, j);
       distances[i][j] = dist / val;

void xDist(int value)
  xDist = round(value / 8.0f) + 1;

void yDist(int value)
  yDist = round(value / 8.0f) + 1;

And here’s the Max source:


Until next time!