Tuesday, 11 November 2014


I thought it about time I did an update just so it doesn't seem like I've abandoned Red9!

Absolutely nothing could be further from the truth, the Studio Pack is getting some huge upgrades in preparation for the Pro-Pack, lots of extra support for transfer methods to take data between rigs, new animation file format, extensions to the pose format and a ton of other features and tweaks.

So what have we been up to?? In integrating the Pro-pack it's taking time restructuring the codebase, internally we now have 3 different modules running, the main StutioPack, the new Pro-Pack and our own internal systems which now include our new procedural rigging system and facial setup. We're deep in production with a few exciting clients and the new Red9Consultancy business is really starting to take off, thanks to all the support to everybody out there for spreading the news about the StudioPack ;)

Once we've finished the two projects we're working on we're hoping to update the main web-site so everybody can see what we're up to, and hopefully choose Red9 for their consultancy work, or rigging and facial solutions.

If you haven't already been over to the new website go for it:




Wednesday, 16 July 2014

MetaData Develop Conference Talk notes


The talk went well, and I promised I'd make these available so here the links. The PowerPoint has notes on it that I used to remind me but hopefully you'll also find them useful too. The videos that I showed during the talk are also now on Vimeo (just got one more to upload) I recorded these in the studio so they're a bit noisy, they were only intended to be used a video tracks to talk over, but I think they might help if you have the ppt next to you.

So, PowerPoint is here:   Power Point: MetaData in a Maya Production Pipeline


Video 1: MetaData Attribute Handlers
Video 2: MetaData - MetaRig

Video 3: MetaData - MetaFacial in the Crytek Pipelines To follow:

Hopefully you'll find these useful, mail me if you have any questions about the talk, or Red9



Friday, 4 July 2014

Now Autodesk Certified :)

Great news from Autodesk and the Exchange site, Red9 StudioPack is now an Autodesk certified application. The build on the Exchange site has also now been fully updated and wrapped into a solid installer that support Win, OSX and Linux.

Thanks to the guys at Autodesk for spotting an issue with the doc api links.

If you download from the exchange then please remember to add a rating to it, it keeps the app on the featured list.



Friday, 20 June 2014

More Audio goodness

I've just added extra functionality to the Audio handlers in Red9 that hopefully you'll all find useful. 

Firstly I've expanded on the conversion tools to handling timecode, we now have the full complement:

milliseconds_to_Timecode(milliseconds, smpte=True, framerate=None)
milliseconds_to_frame(milliseconds, framerate=None)
timecode_to_milliseconds(timecode, smpte=True, framerate=None)
timecode_to_frame(timecode, smpte=True, framerate=None)
frame_to_timecode(frame, smpte=True, framerate=None)
frame_to_milliseconds(frame, framerate=None)

We're using these internally to process timecode around our MoCap deliveries, converting time to the relevant units as and when required.

I've also added a new function to the Red9_Sound menu in the Trax Editor, 'Sync_BWavs' which is designed to automatically sync multiple BWav files to their internal timecode. BWav's are Braodcast Wav's used when recording audio with timecode as it embeds the data into the wav's header, very useful in production.

The new function processes either the selected audio nodes in Trax, or ALL wavs in the scene, depending on selection. It then inspects the internal BWav's timecode, and if found and valid it will shift the audio nodes in Maya to match their original timecode's, re-syncing them to the original shoots timelines. 

I've also done a few fixes to the AudioNode class, adding the setters that were missing in some of the properties.



Thursday, 5 June 2014

New AnimUI functions....

So a few updates. I've been working on the back-end to the AnimUI a fair bit recently and have exposed a few new options that should be useful to you all.

First one is the matchMethod - this is the code that takes 2 hierarchies and matches them, node for node to them process correctly. This is used by all the anim code calls, copyAttrs/Keys, poseLoad etc so it's a really low level feature. Now this has been there for a while but it wasn't actually hooked up correctly...ooops! There's been a flag to control the matchMethod but it was missing an option, and that in turn has caused a few of you issues.

The new option is 'index' and that turns OFF all the matching code and just takes the 2 hierarchies that the filter found, and zips them together in the order they were found. Why? well this is what Maya native does on all hierarchies, absolutely no intelligence just one to one mapping. It will now allow things like this to match:

AlphaRig_WristCtrl == BetaRig_WristCtrl

previously this would never match as there's no naming match there, other than me allowing you to enter a search and replace to the UI. With the index option it will match, as that node was found as the 4th child of the hierarchy in both rigs. This also means that the Pose's stored for Alpha_Rig will load correctly to Beta_Rig ;)

So what else, well I've added sort logic to the poseUI. You can do a number of new things in there. Firstly the searchBox takes comma separated searches, so you can add "walk,run,idle' and it will show those as a filter. You'll also notice there's 2 new icons, sort by name, and sort by date. This has been getting on my nerves as my facial library at work is 80+ shapes and if I add a new one I have a lot of scrolling to do!! So sort by date is a godsend.

These are in the GitHub branch and will shortly go into another live release, after testing ;)



Friday, 30 May 2014

Red9 StudioPack v1.43 released

Well another month and another new build, as with the last one, and all future builds, I'll be taking release tags on GitHub that you can just browse to and download directly from there, far easier than Google Drive!


This release is focused on stability in the animationUI. In 1.42 I started to integrate animLayer support but there were some bugs in the way the ui handled the calls so I've gone back to the drawing board and hopefully, come up with integration that guides you through the extar steps as and when you need to.

A few bits of logic to be aware of:

  • CopyKeys has it's own 'mergeLayers' checkBox, this now controls ONLY the copyKeys call from the UI. The animLayer call here is non-destructive.
  • SnapTransforms - over time this has a pre-copyKey's checkbox but I've removed the merge layer logic from it. Instead it now, by default, does an animation merge in the background before running the pre-copy of keys, prior to the snap itself. No animLayers are destroyed or effected, this is purely a backend function.
  • MirrorAnimation - This now will prompt you if you have animLayers on any of the mirror objects, if so it will ask if you want to merge them first. Mirror is the only call that has to act on flattened animLayers and is destructive, you will loose the layers but gain a mirrored anim sequence.

There's many other fixes, PoseBlend now habndles the undoStack correctly, it was caching every iteration of the slider before, not good! Also the poseLib search box now takes comma separated text, so you can filter for multiple tags at the same time.

Main commits:

  • Fix - Red9_Anim - fixes to the poseBlender code so it now handles the undoQueue correctly, as chunks and returns object selection correctly.
  • New - Red9_Anim - Pose search now accepts multiple strings, comma separated ie 'walk,run,idle'
  • Fix - Red9_Anim - fix's in the way that all the commands wrappers in the UI handle AnimLayers - more info and dialog's added to guide you through.
  • New - Red9_Meta - added new call 'getNodeConnections' which will replace the 'getNodeConnectionAttr' in calls, designed to return all connections between a given node and the mNode, with filtering
  • Mod - Red9_Core - added double3 handling to the lockChannels call, this was causing issues when passed double3 like 'translate' 
  • Fix - Red9_Audio - added correct float conversion to all the timecode and framerate conversion functions

Any feedback as usual just ping me



Tuesday, 27 May 2014

Develop Conference - MetaData Coding in a Maya Production Pipeline

Develop Conference Talk

 I'm going to be doing a talk at Develop Conference in Brighton this year, going through how we've integrated the Red9 MetaData API into our production pipelines at Crytek. I'm in the middle of writing the talk and figuring out how much detail to go into.

The conference is happening 8-10 July and the early bird discount prices end soon.


Here's what I'm planning on, but if any of you out there are running MetaData I'd love your input too:

This talk will go through the benefits of integrating MetaData concepts in a Maya production pipeline. Red9 Metadata is Python API, part of the Red9 StudioTools, an open source toolkit freely available on the Autodesk Exchange website and authored by myself.

 In this talk I'll be showing how we've integrated this concept to all aspects of the Crytek Maya animation pipeline. Meta is used in our animation rigs as a separate schema / network to manage data, binding tools to the systems via a generic layer. It's used in our facial systems to manage relationships in code, breaking a complex system into manageable and logical chunks. We also use meta as the entry point for our exporter, the idea of connecting characters to export nodes which in turn connect to time and settings nodes.


  • The background, why? 
  • The basics of the MetaData Api base class, what does it do and what benefits does it give us. 
  • Basics of metaData internal attribute handling and auto-complete. 
  • Factory class aspects, the core of the systems, walking nodes as classes. 
  • Using Maya nodes as class representations to structure your code. 
  • Class inheritance and attribute binding. 
  • Practical examples in production. 
  • Generic nature of metadata, how it lends itself to tool pipelines. 
  • Subclassing, how's it's been heavily subclassed and expanded by the Morpheus2 project. 

See you there!



Thursday, 8 May 2014

V1.42 update....

So anybody who follows me on G+ will have seen the pose on v1.42 and the fact that I caught a big bug in the way that the AnimUi dealt with animLayers, particularly when using the mirror tools. This is now fixed on the GitHub trunk and I'll be releasing a new patched version of v1.42 very soon.

The new build has had a lot of extra work done on the UI to try and make it feel more solid. The mirror tools now work correctly with animLayers, if they are found it'll prompt you that I need to merge them and let you confirm. The SnapTransforms will, if animLayers are found and the pre-copyKeys is set, automatically merge the layers down before processing, then return them once finished.

Oh and I've added the ability to add multiple search's in the PoseUI search field, so you can filter for "walk,run,idle" which will just show poses that match any of those strings. I'm debating having this as a regex search so you could do more complex filters, either that or have a flag that switches this new behavior to be either additive, or intersection. If Intersection it would find only poses that have 'walk, 'run' and 'idle' in their name.

There are a few other small fixes that have gone in since 1.42 but these are just continued developments.



Wednesday, 23 April 2014

Red9 Studio Pack v1.42 released

So it's been a while since the last release but now everything is on GitHub it should be a lot easier to manage releases, I'm just going to take tags so you get full access to everything. Also the main branch of code is the gitHub trunk so you see any changes as I commit them on a daily basis.


Download is a lot easier than on GoogleDrive, just click on the tag and there's a link to download as a zip.

cheers and keep the suggesttions and comments comming, they do help!


Highlights of the release are also commented up there but just in case:


  • New - Red9_Audio - added BWav support to the AudioNode. This allows you to inspect and retrieve Timecode data from any broadcast wav
  • New - Red9_Audio - added a new 'inspect' item to the Red9 sound menu in the Trax for inspecting the internal properties of the selected sound node
  • Mod - Red9_Anim - Stabilizer wasn't respecting the keyer groups when you set it to just track 'rots' or 'trans'
  • New - Red9_Anim - CopyKeys now deals with animLayer by pre-merging the data to a temp cache before copying the merged data. The original layers are left in tact!
  • New - Red9_Audio - added a function getMediaFileMetaData() which is capable of extracting metaData from most media file types via ffprobe.exe
  • Mod - Red9_Pose - added a filterMap param to the poseCompare call. This can be used as a master core list, only nodes that appear on this will be checked against. Useful for checking core skeleton nodes whilst ingnoring others
  • Mod - Red9_Pose - added an ignoreBlocks to the poseCompare call. This allows the code to ignore complete sections of the compare data, we mainly use this for ['missingKeys'] so that the compare skips them
  • Mod - Red9_Anim - modified the AnimUI behaviour such that the 'CTRL' key modifier is now stored with the UI. If you laucnh the UI with ctrl held it'll toggle between launching as docked or not.
  • Mod - Red9_Anim - exposed the snapTranslates and snapRotatesflags to the snap() call in AnimFunctions Mod - Red9_Core - Mods to the LockChannels class for better behaviour, set hierarchy flag to false by default.
  • New - Red9_Meta - new flag exposed at class level '_forceAsMeta'. This forces the code to ALWAYS return instansiated MetaClass objects when dealing with nodes rather than dag paths.

Tuesday, 15 April 2014

Coding a Maya Production Pipeline with MetaData

Heads up.. I'm going to be doing a presentation at Develop in Brighton this year about how to utilize Red9Meta in a production pipeline, running through some internal examples of the tools and Maya dag structures that we're currently working on at Crytek. 

This will be an overview really, how and why metaData helps not just in constructing complex setups, everything from Exporter, Facial and Rigging pipelines, but also as a light coding api to deal more seamlessly with nodes in Maya.

For all of those doing the Rigging Dojo Character Engineering course, might be a good chance to catchup.

More details to follow but if there's anything in particular that you'd like me to include drop me a mail. 



Wednesday, 19 March 2014

Red9 Sound and Audio handler updates

Finally got round to doing a quick demo of the new AudioNode handler in the Red9 StudioPack. This one shows how you can use the 'compile' function in the sound menu to pre-compile multiple sound nodes in Maya so that you get a complete soundtrack to any playblasts. Anybody who's ever tried animating to multiple sound nodes in Maya, particularly when animating dialog will know how frustrating it is when you then try and playbladt that scene, and only get 1 sound track included!!

I also go through the new inspect code, capable of extracting metaData info from wav files including full support for Broadcast wav's. This is really useful to gain access to thiongs like internal timecode data. There's also extensions capable of extracting metaData from any media format, Mov, avi etc but for that you have to download ffmeg which I use in the inspect call.

I'm really keen to hear from those running MacOs or Linux, does the compiler work for you?

thanks (don't forget the donate button...cough...)


Wednesday, 12 March 2014

Red9 goes all GIT!

Well this has been asked for by many of you for a while so I'm finally sorting it out, pushing Red9 repository up onto GitHub. I've always used a private SVN server but this should give people more exposure to the changes happening on a daily basis.


Still getting by head round GIT so bear with me


Friday, 7 March 2014

New Pose Saver tools and features

Well it's been a while since I did a demo so here's one that goes through the upgrades to the poseSaver in v1.41.

New PoseBlending: Pose Blending is a new feature that allows you to mix in a percentage of any pose to the current state of your controllers. When you RMB>PoseBlend you get a new slider UI that controls the mix. Note that when this slider is launched the current state of the rig is CACHED against it's current state so please be aware of that. I had to do this to get the slider to react fast enough to make it worth doing.

New MaintainParents: Another big update to the poseLoader. This one allows the pose code to 'hold' or maintain a given set of attributes during pose load. This not only returns the given attrs back to their current state prior to loading the pose, but it also recalculates the pose at the same time. This means that even if a pose is stored with all the controllers in one parent space and your current controller is in a different space, the original stored pose will still be reached, but it'll be recalculated in the current space ;)

This relies on the 'relative space' flag and is only available in this mode as I use this mechanism to do the psace compensation.

Any comments, suggestions or bugs let me know


Monday, 3 March 2014

Broadcast Wav support

New Sound file inspector:

Anybody who's dealt with moCap sessions where you're recording audio will have probably run into the broadcast wav format, an extension of the standard wav but containing a whole extra chunk of metaData specifically aimed at syncing data around studio's. The key is that it includes an internal timecode for the wav, usually pumped into it from the studio's timecode generator so that video, audio and moCap all has the same reference and can be kept in sync.

In order to use this at work, and because we use the Red9_AudioNode as a basis for all Maya audio functions, I've added in full BWav support to the Red9.AudioNode this is both at a simple inspect level (Wav Inspector - launched from the Red9_Sound menu in the Trax Editor seen below) and full support from the code side, so you can cast any sound node to a Red9_AudioNode and just run the .bwav_getHeader(). This builds up an internal dict with all the header data bound to it.

If the wav isn't a Bwav then you still get the main header data, it just omits the BroadcastWav block from the UI.

This has been an absolute pain in the arse to extract as I've had to get deep into binary chunks to fine where in the file stream the Bwav header data block exists!

Anyway, this will be in the next release, unless you want to give it a whirl in which case drop me a mail



Friday, 21 February 2014


Wow, it's been a while since I posted anything, I've been meaning to do some Vimeo demos going through the new stuff in StudioPack v1.41 but just been too busy at work fire fighting to get round to it.

Have people found the 'AudioCompiler', or even the PoseBlending or MaintainParent functionality in the poseSaver, I really must do some demos next week if I get time!

I'm looking at supporting animLayers in the CopyKeys code, question is, what would people like in terms of functionality when copying anim data between 2 sources...
Should it:

  • A: sample the data from the src node, merge the animData in memory and push that to the destination as single baked anim curves. Basically baking the data on the fly but not touching the original. 
  • B: push the destination nodes into the corresponding animLayers of the source and copy the data per layer. Kind of reconstructing the animLayers memberships for the destination. The issue here is what do you do if the destination node already has animLayers?
  • C: just not bother, animLayers are Satan's Testicles and Autodesk should add this kind of support from the core!

I really wish Autodesk would do something with animLayers, either write the rest of it or kill it dead as from a pipeline and production point of view it causes so many issues!


Saturday, 11 January 2014

Red9 Studio Pack v1.41 ;)

Well I think I'm finally happy with the build to release, another one packed with fixes and new features. The big one for this is the addition of an audio compiler, thanks to the guys at pydub and particularly James Robert for the additional methods in the pydub module. Open source rocks when you can tap the brains of others like that.

So for those who didn't read the previous post the AudioCompiler, found in the red9 sound menu in the Trax Editor, is designed to allow you to have multiple sound tracks in Maya and playblast the damn things!! All you do is run the compiler which will generate a brand new wav file and activate it, more over if you've already run it it will just continually update the currently compiled file.

There's also a lot of extra work done on the PoseSaver (as always!) this seems to be getting a lot of use around the community and I'm really keep to push it as far as possible. In this build you'll find a new option on the rmb menu, Pose Blender... yes does exactly that, allows you to mix in, interactively, a percentage of any pose. At the moment this is limited to non-relative poses as it's mixing the values and not doing any world-space calculation. Even so it's ideal for facial or finger poses. It'll also work with the hierarchy checkbox off so you can dial in percentages of a pose on selected nodes only.

I've also exposed the 'maintain parents' functionality to all, if you take a look in the Morpheus or Stewart presets you'll see a new block, [rig data] it's kind of self explanatory once you see it. It's just another entry that tells the code what attributes to hold during pose Loading.

More fixes to the Mirror setups too, as we batter the hell out of this stuff at work I keep catching issues, or rather Rob Howes does, always nice to sit next to somebody coding with your stuff on a day to day basis who'll quite happily slap me and get me to fix stuff there and then!

Anyway, as usual the release is on the Google drive, just follow the download link.

I'd love to hear from more people running this stuff, experiences of using it and suggestions, I also need to hear from more folk on MacOS or Linux. Big thanks to all those who send nice messages and suggestions, it's because of these that I do this and that many of the features get implemented, such as the poseMixer.