Archive for April, 2010

April 23, 2010

A Pixel Bender-based synthesizer

The subject of using Pixel Bender for audio processing on the Flash platform comes up a lot. Audio processing is very processor-intensive and math-heavy, so it would seem natural to leverage Pixel Bender to improve performance of audio within a SWF. At some point, last year, I was talking to Justin Everett-Church about doing a demo for Flash Player 10.1 multi-touch features. A synth seemed like a good idea, and it would let me kill two birds with one stone. So I coded up a synth (with a lame Flex UI) and Justin took that and made it pretty and added multi-touch support. That 2nd part of the demo never worked out the way we meant it too (missed the MAX 2009 keynote by this much). After that, I planned on cleaning up the code and posting it, but I got busy shipping CS5 and well, 7 months later, I finally got around to posting it. Right now it is just the playable demo with the crummy Flex UI.

It is a total processor hog, on purpose. I basically wanted to use it to push the limit of what could be done in the player, so I kept adding more filters and processors to it until the audio started to break up on my Core Duo 2 Mac Book Pro and then stepped back just a little. It turns out that you can actually do a ton of audio processing interactively in the player leveraging Pixel Bender. This was also designed to run as an AIR app, which means that if you really want to play with it, close all your other tabs. Really.

UI for synth

Pixel Bender Synth Experiment

I’ll be posting all the code on the page eventually.

Some techy details:

  • Each Pixel Bender shader is encapsulated within an Actionscript class and launched via a ShaderJob.
  • Each Pixel Bender filter processes two samples at once to double throughput.
  • The synth uses three Pixel Bender Shaders as does the Reverb, the other filters use one.
  • The delay-based filters (reverb/delay) are using simple bit-bucket style delay in actionscript, but the delayed signals are mixed back with the main signal via Pixel Bender shaders.
  • All signal paths are stereo. When mixing two stereo inputs, a pixel4 representing the 2 sets of stereo channels is used. When processing/generating a single stereo signal, a pixel4 representing two sequential stereo samples is used.
  • The filters are ordered as such:
    Pixel Bender Synth Block Diagram

Will post more info soon. Ask any questions in the comments. Thanks!

6:20 PM Permalink
April 12, 2010

New Pixel Bender Features in Adobe CS5

There was a lot of work on Pixel Bender, under the hood, for CS5. One of the main things that you’ll see in your CS5 apps is significant performance improvements when running Pixel Bender on the CPU. We partnered with Intel to drastically improve our X86 and X64 Pixel Bender performance on Windows and Mac. We also did significant amounts of work ourselves to improve our threading and Pixel Bender jitting. This means much faster Pixel Bender renders in After Effects, Photoshop and the Pixel Bender Toolkit in CPU-mode.

For Flash developers, the Pixel Bender Toolkit now includes a live Flash preview so that you can see EXACTLY what your image processing filters or blends will look like in the player. We’ve also added many of the top feature requests from the community.

There were a ton of other tweaks we did that you won’t notice (except in increased performance or stability) in many of Adobe’s other applications. It is just one more way that we think that CS5 is the most outstanding collection of Adobe apps ever!

3:47 PM Permalink
April 1, 2010

Preprocessor Macros in Pixel Bender

Did you know that you could use C-Style macros in Pixel Bender? This capability has always been there, but Ralph Hauwert pointed out to me that we haven’t really told folks about it. Similar to with a C-Compiler, these macros essentially are replaced with the code that is defined by them. Since it happens in the Pixel Bender pre-processor, it works fine for Pixel Bender bytecode too.

Just a little Pixel Bender tip for your Thursday coding.

Here is an example:

kernel NewFilter
<   namespace : "Your Namespace";
    vendor : "Your Vendor";
    version : 1;
    description : "your description";>
{
    input image4 src;
    output pixel4 dst;
    #define Blah(clr) clr.r = 1.0;

    void
    evaluatePixel()
    {
        dst = sampleNearest(src,outCoord());
        Blah(dst);
    }
}
1:24 PM Permalink

Intro to Pixel Bender at Winnepeg Flash User’s group tonight

Darren Osadchuk is giving a talk on getting started with Pixel Bender tonight in Winnepeg.

more info on the Flash in the Peg Adobe Groups page.

11:58 AM Permalink