My name is Memo. I work primarily as a visual artist, and run The Mega Super Awesome Visuals Company. My output ranges from large-scale immersive interactive installations; live music/dance/theatre performances, music videos; to online works and mobile applications. I use a mixture of tools for my work, ranging from traditional computer graphics / animation applications, to writing a lot of my own software - currently mainly with openFrameworks / C++. I split my time between client commissioned projects, self-initiated projects, research and demos.
What kind of work do you share, and where?
For the past few years it has mainly been C++ libraries and demos, shared on my blog (http://www.memo.tv/ ) and GitHub (https://github.com/memo ) - before that Google Code (SVN). In the past I shared some Processing apps, Flash snippets and Quartz Composer files. Generally the stuff I share are either semi-well packaged libraries with easy to use APIs (I spend a lot of time on the APIs, very important for me, more on that later), or minimal demo apps showing how to use or do certain things. E.g. how to make a particle system running on the GPU with OpenCL and reach 1 million particles at 60fps. Or how to use OpenCV optical flow, and feed it into a fluid system, which then drives other things etc. So mainly educational stuff.
How did you get into sharing your work?
I knew about the opensource world for as long as I can remember, mainly because of Linux. But it was really with Drupal that it changed my life. About 6 years ago (2005) when I was a struggling artist, doing anything to make ends meet - including websites, content management system backends etc - I discovered Drupal. An opensource, PHPCMS. Not only was the entire CMS opensource, the community was unbelievably friendly and helpful too. I remember trying to build my first site with drupal many years ago, I kept going on the forum, and posting my dumb questions, and I was amazed at how people - complete strangers - would go out of their way, and take the time to not only answer my question, but often post their own code snippets from past projects which they thought would help me. And even sometimes they would sit down and write short snippets of code specifically to answer my question. This blew me away, and restored my faith in mankind. Having worked in the commercial world, full of sharks eager to stab everyone in the back and nail and claw their way to the top, abusing everyone in their way - here was a community, who took the time to selflessly help complete strangers, for no apparent gain. There were communities of people scattered around the world, determined to help each other. Thats when I started seeing it all as a self-supporting ecosystem, like that ring of 'sitting on the lap of the person behind you, and we all arrange ourselves in a ring, and we are all supporting each other' kind of thing. Does that make sense? hard to explain without a diagram, but nevermind...
So since then, I've felt that for opensource to work, everybody needs to give as much as they can, to support this self-supporting ecosystem. Of course there will be those that only take, and don't give back. But thats fine, there will always be those that give as well.
Why is sharing important to you? Would your work be the same if you weren't sharing?
I share because I feel I have to as part of this ecosystem, but I don't feel consciously obliged, it just comes naturally, subconsciously. I give what I can, and I take in return, it's a natural exchange. And it feels great to see other people doing great work in part thanks to something I have put out there. Actually the answer to this question is reeaaaaly long and related to the questions below so I'll cut it short here and carry on the answer in the following questions.
Who is your audience? You have quite a diverse collection of work from desktop apps like the OKGo 'WTF' effect http://msavisuals.com/holidays2009 to toolkits for coding like MSAFluid http://www.msavisuals.com/msafluid. Do you see your work as contributing new knowledge and understanding? Or are you, as in the case of MSAFluid, acting as an intermediary between more academic research and a sort of artistic/hacker audience?
The stuff I release as opensource, is generally aimed at making things which aren't very accessible. This might be providing simple interfaces for not-so simple simulations (e.g. fluids, physics, particles etc.), or it might be examples of how to do certain complex things. So generally it's aimed at an audience of non-techy creatives.
For me the artist/hacker audience is extremely important - or 'normal' folk as I prefer to think of it. I guess this may be linked to my own growing up. I grew up as a kid in Turkey with not much facilities around to explore a lot of the things I would have loved to explore - even though in Turkish standards I was very privileged to have a computer at an early age and went to a good school with great facilities etc.
Today I get lots of emails from students in Brazil, India and all over the world. These kids have often got nothing less in them than those that goto fancy colleges in more privileged areas but they might not get the same facilities or opportunities to develop their ideas or work. This is also why I was really excited about the Kinect, and I get really pissed off at people who kept saying "it's nothing new, what's the big deal" and they look at the projects coming out saying "we could do all of this before" - I was getting so pissed off that I felt the need to rant about it, then http://memo.tv/kinect_why_it_matters and again now :)
But I digress, I think it's crucial to level the playing field as much as possible. MSAFluid is a great example I always give. Fluid solvers have been around for a while, a lot of them opensource. To use them in a project though, you had to understand how fluid simulations work, what the processes are etc. I'm a big fan of encapsulated little entities of things that do cool things, that are easy to use. Kind of like a car. If the engine of the car wasn't hidden under the hood / behind the dashboard, we wouldn't have as many drivers as we have today. Now when you sit in a car it's really easy! You have a pedal to speed up, a pedal to go slow down, a wheel to go left and right, and a few other bits and bobs. All the complicated stuff is hidden under the hood. If you want to be a race car driver, or an engine designer, it helps to understand every little bit under the hood. But if you just want to use the car to get from A to B you can't really be bothered with all that stuff. That's the approach I take with most of my libraries. I'll build engines (based on blueprints from research labs etc.), and design a simple API on them.
Another portion of the libraries I release, are those of convenience. A good example for this is http://www.msavisuals.com/msainterpolator or http://www.msavisuals.com/msashape3d . These don't even encapsulate any particularly technically challenging topics, they just present an intuitive API to certain very repetitive tasks, I use these in almost every project. I wrote them because I needed them, and I put them out in case anyone else might find them useful.
The libraries I release, aren't necessarily written for the public initially. They are written for me to use in my projects first. Then I go through, tidy them up, work on the API a bit to make them easy to understand, and then release to the public. They aren't meant to be educational. People can look at the source to learn, or they can just use the libraries without understanding the internals.
The demo's however are written purely for releasing to the public, in the hope that people learn from them. Usually I get a lot of emails, forum posts etc. asking "how did you do this in that project, or that in this project". So I'll strip down that aspect of that project to the bare minimum, to the extent that every single line of code left is relevant to that feature, and then I'll release it as a demo of that feature.
How important is it for you that your audience remixes/uses your work rather than just drooling over it?
Very. I don't release work so people can go and sell them, or release as their own. I release work so people learn from them, or build with them. I want people to learn how to do certain things, so they can go and create new work with them that I hadn't thought of. Seeing that sparks new ideas in me. I go and use those new ideas in new projects, release whatever I develop in the process, which in turn sparks people to do newer work, which in turn sparks me... and we all live happily ever after.
When you share work, do you think it's more important to "get it out there" as fast as possible, or do you take the time to clean up your code, document things, think about how people might use it, etc.?
I definitely fall into the latter group. I spend a lot of time cleaning the code, adding comments, and trying to design a nice API for people to use. I don't do this just for other people, but for myself too. Whenever I need a new functionality, I immediately try to design a simple re-usable API for it. I absolutely HATE copy / pasting code between projects, or even within a single project. If I need to do the same or similar stuff in different places, I'll try and make sure my code is parametric enough to accomadate for it, and the API allows it.
If the project is an insane deadline (which it usually is), my code will probably be a right mess to begin with - and will still be a right mess even when the project is completed. But before I release it I will definitely refactor it. This can be quite a time consuming process, but I feel I have to do it, not just for the public, but for myself too. If I want to re-use that code in the next project it has to be cleaned up. In fact I have so much code right now which is waiting to be released, but I haven't yet because I'm not happy with the way it's designed. One example for that is the stereo solver code (calibrates and rectifies two cameras, creates disparity map and depth map) I wrote a year ago, still waiting to be refactored and released :)
You told me once that the logo that appears in corner of "Body Paint" is compared against a checksum to make sure someone doesn't try to put their own logo there. Do you ever do this with your open source work? If not, are you ever worried about your work being misused?
No, and the thought hasn't really crossed my mind. I generally use a permissive license (BSD to be precise), to allow people to do whatever they want with it. Of course I don't want people to just take my work and sell it (more on this in the questions below), but I think it's impossible to regulate. If you put something out there, online, you have to be prepared for it to be abused. Of course it's easy to say "I wish people wouldn't misuse what I've put out there blah blah", but fact is they do. In fact people do far worse things, like killing, raping, destroying lives, nations etc. So there are bigger things in the world to worry about.
Though I do remember someone saying they used deliberately special spellings for variable names, so they could occasionally do searches online for the variables and see if anyone was using their code without credit or permission. I thought that was funny and a great idea, at least just to satisfy your own curiorsity.
Can you give an example of a very positive use of your work, as well as a very unfortunate one?
One of the unsung heroes of what I've released, is MSAQTPlayer ( http://msavisuals.com/msaqtplayer ). I get a lot of thanks and emails from video artists saying they couldn't find any app to play their high resolution video fullscreen across multiple outputs (at a decent framerate) - until MSAQTPlayer came along (it's true! I couldn't find any either, thats why I wrote it). I just got an email a few days ago from a friend who settled on that to run his multiscreen video installation, so that makes me happy :)
And of course when I see lots of cool projects made with MSAFluid or MSAPhysics it's great. MSAFluid has been a good example of a direct benefit of opensource, in that it's been so heavily optimized, firstly by Maa (http://www.lagraine.com/ ) and then Andrew Bell and the Cinder team ( http://libcinder.org/ ). This is a good example of how my releasing the library as opensource has had a very direct benefit to me - I can now use the heavily optimized library too. There really are countless examples of positive uses. I see examples of what people have done, perhaps not even with the specific libraries, but with just a demo I put out, which in turn inspires me to do something else. Another specific example: I released a simple to use C++ wrapper and a few examples for OpenCL for openFrameworks, Rui Madeira made a particle demo with it which I loved, which in turn inspired me to do another demo with it. So it's like a global tag team effort. Also a lot of the code has been ported to other platforms which is also great of course.
Unfortunate uses do exist as well of course, primarily in the fields were money is concerned. I released MSAFluid as a library, but I also released a demo for it, the one with the psychedelic colors, particles etc. (this was heavily inspired by Plasma Pong by Steve Tyler http://en.wikipedia.org/wiki/Plasma_Pong I contacted him for advice when I was writing it, he pointed me in the direction of the papers he used, and I ended up using the same). My demo has ended up being used everywhere, in every single multitouch demo possible. I released the source of my demo to be informative, and show how you could use the fluid library, change the colors, add forces, read velocities etc. I was not expecting it to be used *as is* in so many different contexts. That is a bit upsetting that so many people don't show any effort at all. I even found my source code in a very well known large multitouch framework, with my copyright notices removed and the author of the framework's copyright notice in place (I think this has been addressed now).
The worst is though, when I saw my demo *for sale*. A while ago Eugene Zatepyakin ported my library and demo to AS3 ( http://blog.inspirit.ru/?p=248 ) and released it as opensource. He did a great job porting it to AS3 and it ran amazingly fast and well. A few months ago I saw the whole thing for sale, along with a few other well known opensource flash demos (not by Eugene, but some other people). This website is now down. The world is full of these scumbags, I'm not sure what the best way to deal with them is, other than hope the bad karma gets to them eventually.
How do you see the role of licensing coming into play here? Or is it more a question of individual ethics?
Licensing is relevant, but I think it really comes into play on a much larger scale. Generally it's quite difficult to establish what you think should or shouldn't be allowed. I want people to be able to use what I release in their commercial work. Technically, the guy who was trying to sell MSAFluid is allowed to do that because I released it with a permissive (BSD) license. I want people to be able to do commercial work with it, but of course I don't want people to be able to sell it as is. You'd hope ethics would be enough, but unfortunately it isn't because some people are bastards. I think of all the opensource licenses, none of them really address this issue, probably because it isn't so black and white.
How do you define in words - without shadow of a doubt - when a work is far enough developed from the original, to be able to be used commercially? From another angle: how do I - the author - define and quantify at what point is someone allowed to make commercial use of my code? E.g. "no you can't sell that, you're just using my demo as is", "no you can't sell that, you've just changed the colors", "no you can't sell that, you've just changed the circles to boxes", "ah yes, you can sell that, you've done something brand new with it".
Ultimately I've come to terms with the fact that these people are out there, but they are destined to be bottom feeders, while I - along with everyone else - move forward making new work.
Who would you identify as your peers, and who are your antecedents? Who has inspired you the most when it comes to your process?
Well right now I can say I'm heavily influenced by everyone in the openFrameworks community. Also Processing, Cinder, Flash, Quartz Composer, Max/MSP communities. This is really the world that I'm in. This is a world where you generally share something if you find/make something nice or useful, instead of trying to patent it.
One of the original goals of the internet was to facilitate communication between academic institutes. In other words, the internet has always been about sharing -- and this experiment has been evolving for at least forty years. But we're still learning which kind of communities work and which don't. How do you see online sharing changing in the future? Are there communities you wish existed that don't?
One very interesting online sharing community / paradigm I've come across in the past few years is GitHub / Bitbucket - like social networks for coders. That really made me laugh, but they really are amazing resources for collaborative development. How will it change in the future? What do I wish existed that doesn't? Difficult questions. One thing which isn't as common as I thought it might be, is screen sharing and especially collective screen sharing. Of course screen sharing has been around for ages, but it hasn't become as widespread as say, video chats. Possibly because it is such a pain to setup, and usually doesn't work. Clients don't work with each other, or even if you use the same clients it just doesn't work for some reason. Whereas normal text chats (IM), audio chats (e.g. Skype), video conferencing etc. are all pretty everyday occurrences for most people, live interactive screencasts and screen sharing is still up there in geek land for the true geeks.