Applications Local and Web-based applications Software Directories Need to get better about software that fulfills two categories.  Software Licensing Best Practices There are four main types of Software licenses, and this is my preference order: Cloud sign-in License File Locked to a device (like a dongle) Locked to a computer Additionally, some software is one-and-done, and you have to pay for any upgrade. Other software is subscription based. Other software you can buy a version and get upgrades for free for a while (typically a year) and then pay for an upgrade later when you want/need.  It is good practice to always name your computer and restart it before you license any software. When you license software, it ican be dependent on the computer name and renaming after licensing can cause some havoc. On Mac computers, the name is in the Sharing preference pane, on Windows, just hit the start menu and type “computer name.” License Models Per Software The list below is an attempt to classify these things so you don’t accidentally lock software to a device by accident. This has happened to me when I’ve made the assumption that a program is cloud, when in-fact, it is locked to a computer.  Adobe is registered locally but can be unregistered locally or via their website or other machine. Each license gives you 2 seats that you can use simultaneously.  Ableton Live is registered locally but can be unregistered locally or via their website. I think it’s 2 seats but I’m not really sure. I’ve never gotten a “too many seats” warning though (as of Ableton 10) Disguise Designer is locked to a computer or locked to a dongle. Dongles cost a little bit of money but they often give them out for free. I have two or three lying around.  DVS (Dante Virtual Soundcard) is locked forever on a computer hardware. It’s only $50 though. 1 license / 1 seat. Madmapper needs to be registered and unregistered on the computer locally. Don’t wipe computers with a mad license or you’ll be begging support@garagecube.com for help. Each license gives you 2 seats that you can use simultaneously. Don’t be like me! Remember to remove licenses off show machines before they disappear into the black holes that some companies consider storage. I have a 4-channel media server with a bonus FX4 and a $400 monitor, left in the tile ceiling of the CDMX airport. Never getting that back 🙃 Maxon One is registered locally but can be unregistered locally or via their website or other machine. Each license gives you 1 seat.  QLab is registered locally but can be unregistered locally or via their website.  V4 Each license gives you 3 seats that you can use simultaneously.  V5 Each license gives you 2 seats that you can use simultaneously. Vectorworks is registered locally but can be unregistered locally or via their website or other machine. Each license gives you 1 seat.    Software To Design, Create, & Edit A lot of this software is cross-platform. If it isn't, chances are there's an analog with a different name.  Some software has breakout pages for pro-tips and tutorials.  Software To Design, Create, & Edit Ableton Live Audio editor and music composer - great for mixtapes Adobe After Effects (AE) VFX, Compositing, Motion Graphics Adobe Audition (AU) Audio Editing Adobe Bridge (BR) Local file management, batching, renaming Adobe InDesign (ID) Making decks, presentations, making books, making portfolios Adobe Lightroom (LR) Raw editing and photo library mgmt/ cloud services Adobe Media Encoder (AME) Export, watch-folders, transcode Adobe Photoshop (PS) Photo editing, still compositing  Adobe Premiere Pro (PR) Video Editing, Titles, Color Apple Keynote Making decks and presentations, but you can use it for a lot of things Apple Pages Contemporary ClarisWorks.    It's just like Office or Google Docs except you don't have to pay for it and your data isn't being tracked 🙃 Avid Video NLE Software   I’ve never used it, and it's never been a requirement or a desired software for any company or project I’ve worked on. I’ve only seen it in the wild once or twice. That said: it is used for feature film and documentaries and sometimes tour dorks use it to edit their show before they throw it into Disguise 🤢 BMD DaVinci / Resolve Great and free video NLE and color software, but I need ADLs (Adobe Dynamic Link) too much. My need to have things colored does not outweigh the need for me to easily speak with After Effects.   EDLs (Edit Decision Lists) are a pain in the ass that should be done by the editor’s assistant’s assistants. Good luck verifying any speed ramps!! The BMD universe and Adobe CC interpret speed ramping differently. The solve is to either bake the ramp before an EDL, or do your color before your ramp! EXIFTOOL A command line file auditing tool.   Very similar to FFPROBE, which is FFMPEG’s auditing tool. Slightly different. I tend to use EXIF to pull metadata details from video files so I can remember what lens was on the camera, or what aperture, etc. FFMPEG / FFPROBE Command line/terminal transcode, packaging of audio and video files. Very powerful. Faster than AME but steep learning curve for non-code folks.  Handbrake An FFMPEG top that's very very good. Been around forever.  Immersive Designer Pro (IDP) A dongle locked x64 only projection engineering tool. It’s pretty great, but it is Windows only and x64, so you can’t run it on ARM or Apple Silicone (even using Parallels).   Much of these tools can be manually rebuilt in Vectorworks with one massive piece missing: you can NDI or spout/syphon into IDP for real time previz and mapping tests. Very powerful. Every few months I try to run this on Paralells and it continues not to work (April 2023, last checked). iZotope RX Audio Editor Noise removal, steam creation, audio swiss army knife. Pricey but best in class utilities.  Jokyo HAP Encoder A proprietary new version of the HAP encoder. It is an evolutionary version of the OG Vidvox HAP → Disguise HAP. Jokyo’s encoder is much better with banding and noise within gradients and introduces a new HAP format as well (HAPr). The tweakable options with Jokyo are superior as well. Can recommend.  Neat DeNoise A great video / photo denoise tool (plugin for AE/PR), get its own section in software because it's so good.  Omnigraffle A paid drawing app that is great for flow charts, system diagrams, projector rasters, etc. Better than drawing manually in Vectorworks, but harder than drawing automatically in Vectorworks (using ConnectCAD).  ShutterEncoder A front end GUI (or “top”) for FFMPEG, FFPROBE, EXIFTOOL and more. Very good. Will do the trick for 90% of use cases. Thanks Melinda Sihalath for this one.  Sketchup (SKP) A simpler tool for CAD that was free for at least a decade before it was sold by Google to another company. Lots of Millenials know how to use it. There is a free “viewer” companion app. Topaz Video Enhance AI A+ video upscale and restoration tool Vectorworks (VWX) CAD for theatrical and event design (but also for architecture, landscaping things). There is a free “viewer” companion app.    Really good for projection engineering even if you're doing it manually (the built-in projector tools are not so thorough)     Software To Display, Interact, & Perform A lot of this software is cross-platform. If it isn't, chances are there's an analog with a different name.  Some software has breakout pages for pro-tips and tutorials.  Software To Display, Interact, & Perform Ableton Live Audio editor and music composer - great for mixtapes Garagecube MadMapper (Mad / MM) Projection Mapping & Blending, Pixel & LED mapping   I use it for those things, but also: Load-Testing Quick + Dirty Media Review Quick + Dirty Media Audits  Garagecube Modul8 VJ party time Isadora (Izzy) A node based creative software that’s a great tool to quickly build multimedia projects with. Good for performance, theater, dance, etc.  Open Frameworks (OF) Creative code and scripting environment QLab Mac only audio / video cue system. Generally speaking, the standard tool for show audio control. This is a good thing to know how to use. It’s video capabilities are great for cueing as well, but not great for mapping IMHO. Pro-Tip NDI your video cue to another program or Syphon out for final output.  Resolume VJ software; multi-display; video generators; cueing.  TouchDesigner Like Isadora but does more things (except projection map as well). All the Izzy dorks now use Touch.  Unity Like Unreal, but now kind of like “Beta” - By that I mean penultimate. Though I think it still has logic advantages.  Unreal Engine A video game engine that CT uses for complex and interactive playback where game logic is helpful or there is a requirement for real-time realistic rendering VDMX Affordable, accessible, multi-platform custom playback and mapping software. Software For Data & Management Software For Data, Numbers, & Management AirTable Super powerful spreadsheet adjacent tool that's great for managing all kinds of data.  Kanban, Gantt, Automation, Calendars. Really great.    I've heard it called "a better smarsheet" but I don't know what that is. Apple Numbers It's just like Excel or Google Sheets except you don't have to pay for it and your data isn't being tracked 🙃 Google Sheets Probably the best spreadsheet purist tool out there. Excel feels like ancient technology in comparison (though in some cases, you still need to use it).  Software For Communications Discord Slack for board-game nerds iMessage Contemporary AIM Slack Discord for businesses and political action Calculators, Unit Conversion, & Measurements This section is a combination of apps and web apps that will help you do tons of different math things and save you some time.  Standalone Calculator Applications Netmedia.dev’s Timecode Calculator Mac OS App Timecode Calculator. I've asked them to add in custom timecode... let's see! Numi A contextual calculator that will save custom functions, define variables, as well as formulas and you can use markdown within a calculator set (thanks to Sean Leo for this one). Highly recommended.  Units Master Converting things like feet and meters, also a calculator for feet / inches / fractions. All about size things. You can do a lot of this in-line in Vectorworks, but this is a little faster. Their hotkeys are a little weird and can’t find the doc right now but “F” will do feet (not ‘) and “I” will do inches (not “).  Or just use a spreadsheet 😉 - Google Sheets is free and good. Apple’s Numbers is free and fine – the better feature is that Apple’s Keynote and Pages have tables that allow you to use spreadsheet formulas. Microsoft’s Excel is good, too, just bulky as hell and why pay for something if you can get it for free… oh yeah because nothing is free in this life.  Here’s an example Numi recipe for calculating file transfer times over x bandwidth: // manual entry // // enter target file size MBs in variable vFileSizeMB // vFileSizeMB = 3370363.64 MB = 3,370,363.64 MB vFileSizeBG = vFileSizeMB in GB = 3,370.36 GB vFileSizeTB = vFileSizeMB in TB = 3.37 TB // enter bandwidth in megabits per second // vMbiPS = 700 Mb = 700 Mb // auto calc // vMByPS = vMbiPS in MB = 87.5 MB vEstimateSeconds = vFileSizeMB/VMByPS = 38,518.44 VEstimate = vEstimateSeconds*1seconds in hours = 10 h 41 min 58 s Web Application Calculators FOV Calculator for when you need to calculate the field of view for a camera based on sensor size / lens MM / etc. Very useful. The person who made this is a very smart psychopath.  Projector Central Throw Distance Calculator Brand agnostic. Definitely the go-to calculator for quick things. Good for estimating brightness. Usually not as up to date as brand calculators – there’s a lag for new projectors and lenses. You should always verify with brand calculators and sometimes, you just need to get the projector on a bench and try it out. There are some calculators that are off, but it’s usually marginal and it’s rare.  Projector Screen Rando Calculators Collection of projector calculators - fL, viewing angle, throw distance etc. They’ve got most projector, models. If they don’t check a manufacturer directly. Remember a .5:1 throw isn’t 100% 1:1 between models. Chip sizes change this match just a little bit. Point being :5:1 on one model isn’t the same as .5:1 on another, but they’re close!  Proportional Calculator For when you’re feeling lazy about doing proportional algebra and you don't want to open a Google Sheet or use Numi or a calculator. PPD Calculator Viewing Angle and Screen Door Math Custom Calculators My buddy Avery built out a calculator to determine a max scale based on a series of values .    The goal with this tool was to be able to find what the largest scale possible is that results in whole numbers based on multiple numbers. You need whole numbers when you’re working with pixels!  Brand Specific Projector Calculators BARCO throw calculator Epson throw calculator NEC throw calculator Optoma throw calculator PANAsonic throw calculator Measuring Documents Digitally For when you don’t want to open Vectorworks, or when you want to get information quick + dirty If you’re given a ground plan or elevations and they are to-scale (eg ¼” = 1’0”), you can open up the Preview app (on a mac), press Command-I, go over to the crop options, and change the units to inches.   Then you make a selection box in preview, and get the approximate dimensions of that selection.   In this example, I’ve made a selection that is 1x1” (the width and height).   This is the equivalent of 4x4’ in ¼” scale.  A good way to verify whether or not the drawing is to the scale that it is indicated to be using, is to measure it against something you “know” In ¼” scale:  sheet goods are often 4x8’ AKA 1x2” doors are often 2’6”-3’ wide AKA 0.625-0.75” Any scale indicators on the page (annotated dimensions FTW) A spec for something that you can look up (like projector dimensions, for example) Unfortunate Caveat: It is fairly typical to receive drawings with indicated scales that are wrong or are inconsistent from drawing to drawing on a single page. This is something I’ve dealt with from MEPs, GCs, Architects, Scenic Designers and Manufacturers!  The best thing to do is ask for something with a correctly indicated scale, but that isn’t always possible.  Or learn some 3D CAD and/or 3D visual fx software and ask for the CAD! Software Utilities General Use Tools 1Password If you’re not using 1Password, or a program like it, do so immediately. 1Password is a tool that you use to track all your password and login information. You just need to know the primary password and have the secret key on hand somewhere for initial setup. I use 1Password across multiple devices, systems, and OS’ to track all my passwords. It’ll change your life. Worth every penny. DropBox offers a similar service for free (with a Pro account or higher), but I’ve never bothered. I’m sure it’s fine, but don’t know anyone who uses it! DaisyDisk Mac OS application that indexes drives / folders so that utilization can be better analyzed through visualization. If you’re trying to free up some space, or you have some unknown bloat, this is a good tool to find out why and where (see also Grand Perspective).  Czkawka Duplicate file finder and more! Requires some homebrew commands to be able to use the GUI version.  FreeFileSync Free, donation ware. Very similar to Sync Folders Pro, but available across different operating systems and more widely used. Have seen the fastest possible web transfers using this program. Thanks to Dylan Steenkamp for this gem.  Grand Perspective Mac OS application that does exactly the same thing as DaisyDisk except it’s way less sexy. The block format, however, may be preferred over DD, which has files represented circularly. I thought they stopped developing a while ago, but they are still going as of summer 2023. Happy to see that! Jump Desktop Enterprise screenshare tool with really low latency used for Post Production work (and good for almost everything else, too).  Magnet Mac OS level shortcut that allows you to use hotkeys to arrange application windows. Very good, but some Magnet shortcuts have conflicts with specific software, like After Effects. This automatically disables Magnet shortcuts when that is the active app. This is rare! I believe conflicts can be avoided, but it is a manual process of cross checking between apps. I’ll update here if/when I figure out a smarter way to fix that.     Another bug is that Adobe Illustrator will work dumb slow in some cases with Magnet enabled.  MonitorControl Gives you control of Audio and Brightness settings for external monitors. You know when you plug in a display and you can’t mute or use the Mac volume buttons to change the levels? This allows you to use your OS volume and brightness keys to control an external monitor – just make sure to allow it to work in Privacy & Security → Accessibility Parallels A way to run Windows OS on an Apple ARM Silicone. On older devices (MacIntel), BootCamp is preferable. On ARM, you can’t run contemporary AAA games, but you can run Star Wars Battlefront II (the OG one from 2005).  Parsec A screenshare software that is very reliable and has a good frame rate. Developed originally by Unity for cloud gaming. Good for remote management, but has a very annoying setup protocol that I’ll breakout here at some point. Can hit servers with tons of screens, but not Mosaic. Windows/Mac.  Restart on Crash Windows utility that you can set to automatically launch a crashed program. Be warned: increase the timeout so you don’t launch tons of application instances. Also, doesn’t work if theres a system dialog that hangs the program…  ScreenConnect A nicely priced screenshare software with tons of iT features, tiered access levels, managed accounts, the ability to brand the application to your company. Can hit servers with up to 8ish screens, including Mosaic. Windows/Mac. Latency aggressive for post-production work but good for IT.  Sync Folders Pro Great auto-sync, backup, merge tool. Build and save actions. Recommended. Velja Mac OS level shortcut application that allows you prompt for browser selection for any link clicked on the OS level, or to set rules to open specific browsers, or do specific actions based on a link type.    Here’s some rules I set up so that all things google happen in Firefox. This means that I can be logged into G-Suite in Firefox, but not use it for anything except for G-Suite (except google.com for searching). If logged out of Google in Safari, this prevents Google from tracking my searches against my email data. I originally created this information with Google Docs and I’m surprised I haven’t got a DDS agfp9jadgm’;dgz aefdsii ///// shutdown /s /  VLC (Video Lan Client) A utilitarian AV player for Mac/Windows that’s been around since forever. It can play most, but not all, things. It’s free. You can playlist assets. A very good swiss army knife. Has command line controls, too!   WebKiosk A lockdown app for Mac OS by xproline.io to turn a Mac into a locked kiosk running a WebApp. Paid version. Used it in 2024 for a bunch of webapp demos and it works real good. Link .  WiFi Explorer Mac OS application that allows you to see all the available wifi networks around you. This can help you narrow down channel usage to prevent congestion. It's also helpful to determine WAP placement. Some pro-tips here .  WinDirStat A Windows application that does the same thing as DaisyDisk or Grandperspective: visually indexes hard drive utilization to help manage computer storage.  Adobe After Effects All Things After Effects After Effects Introduction & Hotkeys Learning After Effects, and becoming really good in After Effects is maybe the best gateway drug to creative visual applications. If you use it a lot, you’ll learn a ton about editing, graphics, layout, 3D, compositing, scripting to make your life easier, templating, workflow management and optimization, render farms, what’s possible with plugins, and color correction (to name just a few). These things have other suites of programs dedicated to just that one thing. The skills you learn in AE will translate to these other programs and vice versa. In some cases, AE is better than its competition or sister programs. Good example of that? AE is 10x better at keying out backgrounds than Photoshop. It’s also got a much better suite of color correction. So I find myself sometimes using AE to do select work that I used to do in Photoshop.  I’ve probably logged more flight hours in After Effects than any other program. I’m a utilitarian expert and can do spec work, I’m just not good enough to make sick marketing animations for social media under creative directors who say “make it pop.” Usually my work in AE is clean-up, finishing, post supervision animatics, compositing, or content templates for complex multi-channel media projects. I sometimes use it to make things for my creative practice, but it’s been a while.  Hotkeys After Effects shortcuts are  critical  to a speedy workflow. Here are some of my favorites – oh, and you can easily create your own, too! Shift, Command, and Option are all modifier keys.  The below shortcut keys are for Mac, but if you substitute Command (⌘) for Control, they should work on Windows as well.  Overall ⌘ + Option + ; App settings ⌘ + 0-9 Workspace Panels ` Make selected panel full-window Shift + ~  Collapse / Expand selected panel Timeline Navigation and Controls    I/O Go to in, go to out B/N Set In, Set Out Page Up / Page Down ⌘ + ← / ⌘ + → Move the timeline indicator Forward and Back a Frame  (hold shift and the hotkey to advance 10 frames or reverse 10 frames) ⌘ + ↑ / ⌘ + ↓ Select layer above / below ⌘ + Option + ↑ / ⌘ + Option + ↓ Move layer up / down in stacking order Option + Page Up / Option + Page Down Nudge a layer forward / back 1 frame Keyframe   S Scale P Position R Rotation T Opacity EE Expose Expressions U Expose all variables with keyframes Misc ⌘ + Shift + / Add to Render Queue ⌘ + K Comp Settings ⌘ + / Add selected item to comp (from project window) After Effects Scripts & Plugin Directory Scripts are additional tool panels in After Effects that allow you to speed things up. Scripts are also used for automation – like a "Find & Replace" script.  Plug-Ins are closer to programs... within a program.  High-level difference between the two: a script is run manually and/or can be added as a UI panel. A Plug-in lives in Effects & Presets.  AE Scripts  AE Scripting is time saving. Most of my scripts come from aescripts.com . I probably own about 50. Some are donation-ware. Try to donate if/when you can! Not all AE scripts exists at this URL and not all tools on this URL are technically “scripts” – some are plugins.  AE-apprepend Free - god bless the people responsible for this. This handy script will add a prefix or suffix to everything in your render queue (like “-422” for example).  AE Global Renamer If you have a comp tree that has a variable, you can build your comp tree to have things like “ProjectName-%AssetName-Render” and folders in your project bin like “%AssetName” and you can find and replace that variable using this script. Or add a suffix or prefix to certain comps. Fantastic.  Auto Crop 3 This crops a nested precomp to a rectangle representing whatever is in the current frame. I use this a ton for Projection Mapping and template work so that I can build a key content comp and then have renderers comps that only target certain areas/surfaces.  Comp Buddy Light wrap and edge blur – not as thorough as Redgiant's Supercomp, but does the job.  Find and Replace in Expressions Thank god for Troy Yarnell, whoever you are. Does it exactly what it says. Useful for (among other things) when you have expressions referencing a controller and the controller needs to move somewhere else.  LockProperties This will lock selected properties of a layer - like position, or scale, for example. Great for templates.  MatchCompDuration This will change comp duration of selected layers in a comp to match the CTI, the comp duration or with custom duration. Options: include nested layers, include locked layers. Monospacer Allows you to make any font a monospace font, useful when you want to have a custom timecode display.   Move Anchor Point 4 A click of a button will change the anchor point to the top left, bottom right, center etc, of a layer based on A) the layer B) the comp C) selection RD Comp Setter Free  - Change FPS, resolution, duration etc of comps very quickly and/or in a batch.  Render Frame at Markers So you need to export a ton of stills from an After Effects comp for some reason? Can also be used to export stills from a finished product – way faster to use this tool in After Effects than to manually export a ton of stills using Premiere. Give Lloyd some money for this  Name Your Own Price tool.  True Comp Duplicator This duplicates a comp and all of its nested comps with select variables / inclusions / exclusions. You can duplicate a whole chain of comps, but you can set it to not duplicate a key resource comp. Also great for template building or reusing. At some point I’ll write out a TCD workflow example. I use it a lot.  AE Plugins Many of these also work in Premiere, with more limited functionality.  Blace Plugins Several tools that use machine learning and/or AI  Depth Scanner An “AI” tool that you can use to create faux depth in an image (think DOF). This tool works incredibly well off-label as a way to create foreground / background mattes. Blace makes some other matte and greenscreen tools, but I’m guessing those use a similar AI method. To crank it up, throw some levels on a luma matte.  Local Diffusion This is their generative AI plugin. It’s incredible. After playing with it a ton on my Mac M1 (would be better on a Windows PC w/ a nice RTX card),    I’ve found a combination that works quite nicely:   Approx ~3 seconds to render a frame in a 1080 sequence where the source video is some XT3 content with a LUT on it. 23.976.    The tool can be incredibly finicky rendering. You can’t render an export properly… You have to ram-preview and then export. This takes a long time, so you need to be patient! Otherwise, it will crash. I suspect there’s a memory leak, as it will crash during use, too. This makes using it for production extremely limited. More to come on that.  Boris FX & Mocha   Lots of good repair stuff as part of a CONTINUUM license. Boris’ full suite is stellar, too, but it’s expensive to have everything. I can recommend Sapphire for fun FX.    Mocha has a free limited version attached to After Effects that is a superior tracking and masking tool over the built in AE tools. That said: AE’s masking and tracking covers 70% of my use cases and I’m often too lazy to take the extra step to work faster and smarter in Mocha 🤦‍♀️   Digital Anarchy's Flicker Free Helps repair media that has rolling refresh bands due to incompatible shutter speeds and frame rate combinations with non-continuous lighting sources like CFL bulbs or projection lamps. This doesn't fix all the problems, but it does fix many many of them. Highly recommended.    This plug has been around for a decade and sometimes works magic, and other times, doesn’t. Shot a concert at 120fps and 1/120.3 and it took care of it. Doesn’t do as good of a job with rolling refresh bands (like on an LED screen or in projection). A good reminder to : ALWAYS CHECK YOUR FOOTAGE!   Mister Horse   Used to be a buy once and occasionally pay to upgrade. Now it’s a subscription model.   Great motion plug for AE (and Premiere). Can recommend a few different plugins. The text one, the background one, the shapes one, the transition one.    Neat Video Reduce Noise    A plugin that reduces noises very well. Best in class for noise reduction.   Red Giant / Maxon    Many different tools, below are some of my favorites.    Colorista Color Correction suite Form Another particle system. Magic Bullet / Looks Color and looks effect chain suite. Gateway drug. Mir Another particle system. Particular A particle systems generator tool with a ton of options and presets. Good for snow, rain, smoke, fog, weird shit.  Primatte Green screen / color key tool when Keylight doesn’t get you there SuperComp A tool that allows you to comp things way better. Lightwrap, color matching, etc. If you’re doing a ton of greenscreen, this tool is critical!  Video Copilot Andrew Kramer's plug-in and script company. He used to update frequently, but now I think he works at ILM. Even though the tools are beginning to show their age, they're still some of the best.    Element 3D Gives you some very basic 3D capabilities in AE. Pretty decent for basic 3D integration. Not for modeling, but incredibly useful.  FX Console #1 must have IMHO.   A  free plugin that allows you turn pretty much anything into a key-command. Works like Spotlight / Alfred but within After Effects. Optical Flares Custom optical flares. Not radically different than Red Giants’ version, but it’s a perpetual license which is sometimes preferred.  After Effects Expressions Expressions in After Effects is basically in-line scripting (language = JavaScript) within an effect or transform. It's incredibly powerful and useful.  Expressions Resources Great resource: http://www.motionscript.com/ Another great resource  https://ae-expressions.docsforadobe.dev/ "If Else" How To  https://www.premiumbeat.com/blog/use-ifelse-statements-effects/ Info on time expressions in After Effects https://ae-expressions.docsforadobe.dev/time-conversion.html How to parse comp names for things like lower 3rds: https://lova.tt/split-sourcetext-from-comp-name Sample Expressions This is where I dump some useful AE expressions that I use often.  Remember that you can copy and paste expressions by selecting the expression, then going to File→Copy Expression Only and then pasting it onto a layer that has the same variables - it will automatically paste that expression on the same property! Layer Controls Using another Layer’s visibility (eye) to turn off/on another layer (apply to opacity) target = thisComp.layer("MyComp") ; o1 = [100] ; o2 = [0] ; if (target.active == true) {o1} else {o2} ; Using a Checkbox Control to toggle an effect on or off thisComp.layer("FX CONTROLS").effect("FX ON / OFF")("Checkbox")*100 Using a Checkbox Control to toggle a layer on or off if (comp("CompName%%%").layer("GRID CONTROL").effect("CheckboxName%%%")("Checkbox") > 0 ) {100} else {0}; Text Source text populates from timecode in current timecode format  (numbers or 0:00:00:00) timeToCurrentFormat() Source text populates in frame number format timeToFrames() Source text populates in frame number format with leading digits frames = timeToFrames(time, 60); // Replace fps with your actual frames per second value framesString = pad(frames, 5); // 5 is the desired # of digits, adjust as needed function pad(num, size) { var s = num + ""; while (s.length < size) s = "0" + s; return s; } framesString; Source text populates frame number in number format with prefix timeX = timeToFrames() "frame: "+timeX Source text for a text layer is comp name compName = thisComp.name Source Text Parses From Comp Name (ie, if comp name = “FARTS//Jeff Bezos”, it will populate “Jeff Bezos” in the text field). Learned this from ukrmedia ( source ) compName = thisComp.name thisComp.name.split("//")[1] Position & Scale This will automatically scale, and keep proportional, a layer to fit a comp based on width scaleX = thisComp.width*(100/thisLayer.width); scaleY = thisComp.width*(100/thisLayer.width); [scaleX, scaleY] This will automatically position a 200x200px box (shape layer) to fit into a 200x200 (per box) grid and place it in the third box from the closest corner. The “-1” multiplier determines which corner in polar terms (X,Y). -1, -1 for top left; 1, -1 for top right; -1, 1 for bottom left; 1, 1 for bottom right.  positionX = -1*[Math.floor(thisComp.width/2)-(Math.floor(thisComp.width/2)%200)-300]; positionY = -1*[Math.floor(thisComp.height/2)-(Math.floor(thisComp.height/2)%200)-300]; [positionX, positionY] Using the size of an object to set the anchor point as the top left of that object  mathX = content("Rectangle 1").content("Rectangle Path 1").size[0]; mathY = content("Rectangle 1").content("Rectangle Path 1").size[1]; x=value[0]+mathX/2-mathX; y=value[1]+mathY/2-mathY; [x,y] After Effects Gotchas Color After Effects and Premiere interpret color differently for some, but not all, footage types – so if you throw a LUT on a clip via Lumetri and then apply all the same settings in both applications, to the same clip, the color might be different. I figured this out when doing a quick and dirty color correct, thought my footage was borked, and then looked at it in Premiere – where it looked… fine. After Effects can be stupid slow using Lumetri. In general, Premiere’s version of Lumetri is superior and you won’t take any significant performance hit. It’s just a bummer because color correcting in-comp is a superior work flow for VFX.  Performance After Effects can be really slow, but it is very good in telling you why it’s slow [in almost all ways]. In most cases, you can just wait, but if you’re rendering a lot of very big things, you can make a significant improvement to render speeds by doing a little composition tweaking. Maybe Fast Box Blur looks good enough instead of Lens Blur (it probably doesn’t, but you should check anyway).  Your first thing should be to always purge the memory and disk cache. Once you’ve filled up the cache, After Effects functions like a complete idiot. After Effects does not remind you that your cache is full, you have to remember to do this when performance begins to drag.  To analyze why else your composition is taking so long to render, you can really dig through the program.  At the very bottom of the timeline is a little button called “Expand or Collapse the Render Time pane.” This toggle will show you down to the sub-settings of an effect why your rendering is taking so long.  In the image above, it’s telling me that “another layer” is taking 880ms per frame to render. Of that, 724ms are effects. Of that, 699ms is Lumetri, and 25ms is CC tiler. The very bottom tells me the Frame Render Time is 886ms. In this example, the other layers only represent 6ms per frame to render. What this tells me is that Lumetri is quite slow in this scenario. Can I use a different effect stack to speed it up and reach the same image goals? Is it faster to pre-process the color in another application?  After Effects Randos Want to create a 360 scene so someone can watch your video in VR or pan and scan? Here’s How to take a 3D scene and then make it rectilinear. Want to automatically scale and center an object using After Effects?  Use track motion and create a clean track for Position, Scale, Rotation. Apply that data to a null. Create a 3D camera. Parent the Null to the camera. Then, make your target layer a 3D layer. Donezo!  Effects Manager Plugin borked? Launch the effects manager within After Effects and disable it. Select the Dropdown menu: Effect → Effects Manager After Effects Sorting Order This doesn’t follow ASCII or Mac OS sorting, which is frustrating and annoying. Pick a lane, nerds! space ! $ & % etc Numbers  _ @ etc Letters ~ etc Adobe Premiere Pro The world's most commonly used NLE Premiere Introduction & Hotkeys Think Final Cut Pro 7 circa 2006, but with bugs that have been unsolved for over a decade. If you understand how to use NLEs and you’re using it as a simple NLE, then Premiere is great. If you want to do anything scripted, automated, or complex it’s brutal to use versus using After Effects. That said, it’s fine. It renders things quick and performs fairly well. It is not my favorite application but I’ve spent a ton of time in there. It's a love/hate relationship.  Hotkeys Premiere has a handy tool for letting you find and modify keyboard shortcuts.  Shift, Command, and Option are all modifier keys.  The below shortcut keys are for Mac, but if you substitute Command (⌘) for Control, they should work on Windows as well.  Overall ` Make selected panel full-window Timeline Navigation and Controls   +/- Adjusts zoom level of timeline.  Shift++ and Shift+- Adjust the height of all tracks simultaneously.  I/O Mark In, Mark Out ↑ ↓ Navigates between cut points on targeted tracks ⌘ + ← / ⌘ + → Nudge a clip forward or back 1 frame (adding Shift as a modifier moves it 10 frames forward or back) Keyframe       Misc ⌘ + Option + K Keyboard Shortcuts 😎 F Matches clip i/o from timeline into the source (newer versions of Premiere require this gets manually set up in shortcuts) Premiere Plugin Directory Premiere Pro Plugins Many of these also work in After Effects , with more advanced functionality.  Boris FX   Lots of good repair stuff as part of a CONTINUUM license. Boris’ full suite is stellar, too, but it’s expensive to have everything. I can recommend Sapphire for fun FX.    Be warned : performance aint great for these plugins on Apple Silicone M1/M2 (as of 2024) vs. the same plugins in After Effects.      Digital Anarchy's Flicker Free Helps repair media that has rolling refresh bands due to incompatible shutter speeds and frame rate combinations with non-continuous lighting sources like CFL bulbs or projection lamps. This doesn't fix all the problems, but it does fix many many of them. Highly recommended.    This plug has been around for a decade and sometimes works magic, and other times, doesn’t. Shot a concert at 120fps and 1/120.3 and it took care of it. Doesn’t do as good of a job with rolling refresh bands (like on an LED screen or in projection). A good reminder to : ALWAYS CHECK YOUR FOOTAGE!   Knights of the Editing Table : Excalibur A $120 plugin that allows you turn pretty much anything into a key-command.    Works like SPOTLIGHT but within Premiere.    #1 must have IMHO. Like FX Console, but for Premiere.  Mister Horse   Used to be a buy once and occasionally pay to upgrade. Now it’s a subscription model.   Great motion plug for AE (and Premiere). Can recommend a few different plugins. The text one, the background one, the shapes one, the transition one.    Neat Video Reduce Noise    A plugin that reduces noises very well. Best in class for noise reduction.   Red Giant / Maxon    Many different tools, below are some of my favorites.    Colorista Color Correction suite Magic Bullet / Looks Color and looks effect chain suite. Gateway drug. Primatte Green screen / color key tool when Keylight doesn’t get you there Premiere Gotchas Network Drive Won’t Show Up in PR Media Browser You want to link media from a network drive, but it won’t show up in PR media browser. To get around this: Just uncheck “use media browser” and your network drive will show up.  Something Isn’t Working That Worked 5 minutes Ago Restart Premiere Adobe Others Some other software that is less used, or is very simple. Adobe Audition Someone should do a write up here. It's a perfectly fine audio editor with some pretty good frequency based noise removal (noise print).  Plugins RX 7 PRO (now RX8) - Very good at removing elements of a track. Can be used to make acapellas or instrumentals. Some tracks perform better than others. Can also be used to reduce background noise. InstantDialogueCleaner  _ Does exactly what it says to varying degrees of success.  Adobe Lightroom I use Lightroom (not classic tho) to store all of my photos and I pay for the 2TB plan as part of my Creative Cloud license (this costs more than the basic). It’s pretty good. I don’t recommend for slightly more complex photo processing (use Lightroom Classic if you want, but really any complexity you can’t achieve in LR, just use Photoshop ). You can still use Bridge for bulk processing - though it doesn’t always work the way you think (as is traditional with Bridge).  Like Classic, this better looking Lightroom: You can still copy and paste settings and select which settings you want to copy and paste. Like copy and paste attributes or copy and paste values, etc. Pro-tip: applying those settings to >1 photo simultaneously requires grid view. Bad design.  If you have a ton of photos in your sync’d Lightroom library and desire a local copy, there’s a secret Adobe app called Lightroom Downloader . This will download your entire library to a target folder local to your computer (or an external). Note that: Every time you do this, you do the entire library. It doesn’t look for changes or new photos and just backup those for subsequent backups.  You need to leave it running, without a restart, until it’s done. Quitting and continuing is unlikely to be successful.   Adobe Illustrator I know Illustrator pretty well. Some dumb gotchas over the years. Here are some of them.  SVGs from AI Vectors Are Ragged So you’ve got a final logo in Illustrator and every time you export it to SVG, the path is distorted with little spikes? EASY fix. Note the decimal places changed to “3”. Congratulations! Fixed. Source .   Google Sheets Formula Hot Sheet Formula HotSheet I’ve been using Excel / Google Sheets since 2002 or so. This isn’t a breakdown of the basics, but rather, a place where I dump more complex formulas for reference later.  Some Low-Hanging-Fruit Here’s a formula that tells you what the date is today =today() Here’s a formula that calculates the days between two dates (where E5 is date 1, and E4 is date 2) =DAYS(E5,E4) Here’s a that will concat a separate date & time field, and keep it formatted as you desire =TEXT(B12, "M/DD/YYYY")&" "&TEXT(C12, "h:mmam/pm") Concatenating more than one date and/or time requires using the TEXT function, otherwise you’ll end up with numbers that don’t mean anything to you.  Timecode These formulas will take 00:00:00:00 formatted timecode 30fps or 60fps timecode and convert it to frame count (where cell B5 = timecode) or perform calculations or convert from frame count back to formatted timecode. Note, these only work for WHOLE FRAME timecode (eg, 23.976 won’t work). 30fps =SUM(SUM(SUM(MID(B5, 4,2)*60)+SUM(MID(B5,7,2)*1))*30,N("FPS"))+SUM(RIGHT(B5,2)*1) Where B2 = FPS cell and A2:A is a range of timecode to add -  =SUMPRODUCT(IFERROR(SPLIT(A2:A,":")*{B2*3600,B2*60,B2,1})) 60fps =SUM(SUM(SUM(MID(B5, 4,2)*60)+SUM(MID(B5,7,2)*1))*60,N("FPS"))+SUM(RIGHT(B5,2)*1) Where B2 = FPS cell and A2:A is a range of timecode to add -  =SUMPRODUCT(IFERROR(SPLIT(A2:A,":")*{B2*3600,B2*60,B2,1})) Converting Frame Count Duration (eg "156") Into formatted timecode . Where C2 = total frame count and B2 = FPS =TEXT(TIME(0,0,C2/B2),"hh:mm:ss") &":"& TEXT(MOD(C2,B2),"00") Performing a Timecode Calculation  from formatted timecode (math happens over frame counts), then converting it back to proper timecode format. Where B2 = FPS, A2:A = Range =TEXT(TIME(0,0,SUMPRODUCT( IFERROR(SPLIT(A2:A,":")*{B2*3600,B2*60,B2,1}) )/B2),"hh:mm:ss") &":"&TEXT(MOD(SUMPRODUCT(RIGHT(A2:A,2)),B2),"00") Automatic Population Based on IF Here’s a formula that will automatically populate a cell with whatever’s furthest to the right in a column (from column C through column ZZ, row 4) =ArrayFormula((IFERROR(LOOKUP( 2, 1 / ( C4:ZZ4 <> "" ), C4:ZZ4 ),""))) Here’s a formula that will automatically populate a cell with a most recent date from a header row if the array’s data row contains text. The 5th row is the dat e row. The 7th row is the dat a row.  =ArrayFormula(IFERROR(LOOKUP(2,1/(G7:Z7>0),$G$5:$Z$5),"None")) Conditional Formatting Oddly, you need to apply absolute cell references (either column or row, depending on formula goal) if you want conditional formatting to copy and paste and stay relational, you apply the absolute technique. This will keep things relational in a conditional formatting copy/paste.  This will apply conditional formatting if the referenced cell (A1) contains the word “Cat”. Literally, if A1 contains “Cat”, then toggle on, else toggle off:  =if(regexmatch($A1,"Cat"),1,0) This will apply conditional formatting if the referenced cell (A1) contains the word “someword” where “someword” is case sensitive =if(REGEXMATCH($A1,"(?i).*someword.*"),1,0) This will apply conditional formatting in a cell if the reference cell is checked (using the inserted checkbox function). In this example, this applied in cell E7. So if D7 is checked, E7 will follow the conditional formatting rule.  =IF($D7,1,0) This will apply conditional formatting in a cell if the reference cell is checked (using the inserted checkbox function). In this example, this applied in cell E7. So if D7 is checked, E7 will follow the conditional formatting rule.  =IF($D7,1,0) This will do the exact same thing, with different syntax: =$D7=TRUE This set of conditional format will apply based on the number of days ago, where $E7 represents the target cell (self). This conditional format can be copied and applied to a range without changing the formula. The first time you put it in it needs to refer to the correct cell, but then will work from there. Applies conditional formatting if the current cell date is between 0 and 6 days ago  ​​=IF((((DAYS($E7, TODAY()))>=-6)*((DAYS($E7, TODAY()))<=0))=1,1,0) Applies conditional formatting if the current cell date is between 7 and 13 days ago =IF((((DAYS($E7, TODAY()))>=-13)*((DAYS($E7, TODAY()))<=-7))=1,1,0) Applies conditional formatting if the current cell date is between 14 and 20 days ago =IF((((DAYS($E7, TODAY()))>=-20)*((DAYS($E7, TODAY()))<=-14))=1,1,0) Applies conditional formatting if the current cell date is more than 20 days ago =IF(DAYS($E7, TODAY())<-21,1,0) This will apply conditional formatting to the most recent date as a header row. The first cell reference here has to be the first cell in the range (eg G5) and it applies to all of row 5.  =G5=MAX($5:$5)   Google Sheets How-To Need Leading Zeros?  Set number format to “custom number format” and enter the number of zeros for the number of digits you need. For example, a custom number format of “00” will turn “1” into “01” and “14” will just stay “14”. You can also this in formula by saying =TEXT(SomeCell,”0000”) . If some Cell is B6 and B6 = 16, than that formula will return 0016.  Need Unique Row IDs? This took a surprising amount of effort.   If you’ve got a note tracker or just need to create unique IDs for rows that persist through a sort or a filter or an insert of rows, and you don’t it to get all wonky, follow the steps below First , put a head in A1 called “Computed IDs”, then put a formula in A2 that counts all of the existing IDs and then adds ONE. It’s looking for the last portion of an ID string that is always the same number of digits (alpha/numeric). The first note would come with an ID that looks like this: [240212-0001] You’ll need to populate one row with the first ID for the formula to work from there.  Here’s the formula to put in A2 =TEXT(TODAY(),"YYMMDD")&"-"&TEXT((MAX(ArrayFormula(VALUE(MID(A3:A,9,4))))+1),"0000") It is recommended that you delete all unused rows before you proceed to next steps, otherwise you’ll generate 1000 ids on blank rows.  Second , in Apps Script (Extensions→Apps Script) create a new script called MakeIDs.gs This script will print whatever’s in cell A2 down all of column A. It will never repeat a number or replace an existing ID. It does this through a LOOP, so it does one empty row, then another, etc. The only time it will reuse a number is when you delete the last renaming number (because it no longer exists, it doesn’t know that it used to exist).  It will put that value in brackets. You can change that very easily to be in a different cell or remove the brackets entirely.  function MakeIDs() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var valueToCopy = "[" + sheet.getRange("A2").getValue() + "]"; // Adding "[" at the beginning and "]" at the end var columnAValues = sheet.getRange("A3:A").getValues(); // Adjusted range to start from A3 var i = 0; while (i < columnAValues.length) { if (columnAValues[i][0] === "") { sheet.getRange(i + 3, 1).setValue(valueToCopy); // Adjusted row index to match starting row break; // Exit loop after copying to the first empty cell in column A } i++; } if (i === columnAValues.length) { // All cells in column A are populated, stop the function return; } else { // Call the function recursively to continue copying until all cells are populated MakeIDs(); } } Third You want to create a way to run this command, so create another script in Apps Script called “FillMenu” (you can change ‘CustomMenu’ to whatever name you want).  function onOpen() { var spreadsheet = SpreadsheetApp.getActive(); var menuItems = [ {name: 'Make IDs', functionName: 'MakeIDs'}, ]; spreadsheet.addMenu('CustomMenu', menuItems); } Now, refresh the Google Sheet in your web browser and a new menu item will come up called CustomMenu and a command called MakeIDs. Run it and watch your cells populate with new numbers. Add more rows, click it again. Huzzah! Google Sheets - Super Menu w/ Apps Script Add a sweet fuckin' menu in Google Sheets that will shave off hours of your life. After all, time is the only resource you can never get back.  Replace fill color   (replaceFillColor) - Finds all cells with hex color and replaces the hex color of your choosing Select matching cells (selectMatchingCells) - This one is so tight, you can find all cells that match certain conditions and bulk edit them.   Copy (Formula Safe) - this copies formats and formulas of a selection Paste (Formula Safe) - this copies formats and formulas of a selection, formulas references are absolute and aren't transposed (unless they are referenced within the copied selection, and then the self-reference updates). You're welcome!!! Here's the Apps Script /** * Tech Almanac Tools — utilities under a sub menu: *   1. Replace fill color   (replaceFillColor) *   2. Select matching cells (selectMatchingCells) *   3. Copy (Formula Safe) - this copies formats and formulas of a selection *   4. Paste (Formula Safe) - this copies formats and formulas of a selection, formulas references are absolute and aren't transposed (unless they are referenced within the copied selection, and then the self-reference updates). You're welcome!!! * "Select matching cells" needs a companion HTML file named "MatchDialog". */ function onOpen() { SpreadsheetApp.getUi()   .createMenu('Tech Almanac Tools')   .addItem('Replace fill color…', 'replaceFillColor')   .addItem('Select matching cells…', 'selectMatchingCells')   .addSeparator()   .addItem('Copy (formula-safe)', 'formulaSafeCopy')   .addItem('Paste (formula-safe)', 'formulaSafePaste')   .addToUi(); } /* ============================================================ * TOOL 1 — Replace fill color * ============================================================ */ function replaceFillColor() { const ui = SpreadsheetApp.getUi(); const sheet = SpreadsheetApp.getActiveSheet(); const findResp = ui.prompt(   'Replace fill color',   'Color to FIND (hex, e.g. #cfecff):',   ui.ButtonSet.OK_CANCEL ); if (findResp.getSelectedButton() !== ui.Button.OK) return; const findColor = normalizeHex(findResp.getResponseText()); if (!findColor) {   ui.alert('That doesn\'t look like a valid hex color. Try something like #cfecff.');   return; } const replaceResp = ui.prompt(   'Replace fill color',   'Color to REPLACE it with (hex, e.g. #ffffff):',   ui.ButtonSet.OK_CANCEL ); if (replaceResp.getSelectedButton() !== ui.Button.OK) return; const replaceColor = normalizeHex(replaceResp.getResponseText()); if (!replaceColor) {   ui.alert('That doesn\'t look like a valid hex color. Try something like #ffffff.');   return; } const range = sheet.getDataRange(); const backgrounds = range.getBackgrounds(); const startRow = range.getRow(); const startCol = range.getColumn(); const matchedA1 = []; for (let r = 0; r < backgrounds.length; r++) {   for (let c = 0; c < backgrounds[r].length; c++) {     if (backgrounds[r][c].toLowerCase() === findColor) {       backgrounds[r][c] = replaceColor;       matchedA1.push(sheet.getRange(startRow + r, startCol + c).getA1Notation());     }   } } if (matchedA1.length === 0) {   ui.alert('No cells with fill ' + findColor + ' found on "' + sheet.getName() + '".');   return; } sheet.setActiveRangeList(sheet.getRangeList(matchedA1)); const confirm = ui.alert(   'Confirm replacement',   'Found ' + matchedA1.length + ' cell(s) with ' + findColor +   ' on "' + sheet.getName() + '".\n\nReplace their fill with ' + replaceColor + '?',   ui.ButtonSet.OK_CANCEL ); if (confirm !== ui.Button.OK) return; range.setBackgrounds(backgrounds); SpreadsheetApp.getActive().toast('Replaced ' + matchedA1.length + ' cell(s).', 'Done', 5); } /** * Normalize a user-entered hex string to lowercase 6-digit form (#rrggbb). * Accepts "#cfecff", "cfecff", "#abc", "abc". Returns null if invalid. */ function normalizeHex(input) { if (!input) return null; let h = input.trim().toLowerCase().replace(/^#/, ''); if (/^[0-9a-f]{3}$/.test(h)) {   h = h.split('').map(function (ch) { return ch + ch; }).join(''); } if (/^[0-9a-f]{6}$/.test(h)) return '#' + h; return null; } /* ============================================================ * TOOL 2 — Select matching cells * ============================================================ */ function selectMatchingCells() { const html = HtmlService.createHtmlOutputFromFile('MatchDialog')   .setWidth(320)   .setHeight(460); SpreadsheetApp.getUi().showModalDialog(html, 'Select matching cells'); } /** Called by the dialog on load, to show which cell is the reference. */ function getActiveCellAddress() { const sheet = SpreadsheetApp.getActiveSheet(); return sheet.getName() + '!' + sheet.getActiveCell().getA1Notation(); } /** * Called by the dialog. `options` is an object of booleans keyed by attribute. * Selects every cell on the active sheet that matches the reference cell on * all enabled attributes. Returns { count } or { error }. */ function runMatch(options) { const sheet = SpreadsheetApp.getActiveSheet(); const range = sheet.getDataRange(); const startRow = range.getRow(); const startCol = range.getColumn(); const numRows = range.getNumRows(); const numCols = range.getNumColumns(); // Reference cell position relative to the data range. const active = sheet.getActiveCell(); let refR = active.getRow() - startRow; let refC = active.getColumn() - startCol; if (refR < 0 || refC < 0 || refR >= numRows || refC >= numCols) {   return { error: 'Select a cell that contains data first, then run this again.' }; } // Read only the attribute matrices we actually need. const data = {}; if (options.background)   data.background   = range.getBackgrounds(); if (options.fontColor)    data.fontColor    = range.getFontColors(); if (options.fontWeight)   data.fontWeight   = range.getFontWeights(); if (options.fontStyle)    data.fontStyle    = range.getFontStyles(); if (options.fontFamily)   data.fontFamily   = range.getFontFamilies(); if (options.fontSize)     data.fontSize     = range.getFontSizes(); if (options.numberFormat) data.numberFormat = range.getNumberFormats(); if (options.hAlign)       data.hAlign       = range.getHorizontalAlignments(); if (options.vAlign)       data.vAlign       = range.getVerticalAlignments(); if (options.wrap)         data.wrap         = range.getWraps(); const hasAttr = Object.keys(data).length > 0; if (!hasAttr && !options.merge) {   return { error: 'Pick at least one condition to match on.' }; } // Build merge maps: dimensions string per cell + which cells are anchors. const mergeDims = []; const isAnchor = []; for (let r = 0; r < numRows; r++) {   mergeDims[r] = new Array(numCols).fill('1x1');   isAnchor[r] = new Array(numCols).fill(true); } const merges = range.getMergedRanges(); merges.forEach(function (m) {   const mr = m.getRow() - startRow;   const mc = m.getColumn() - startCol;   const rows = m.getNumRows();   const cols = m.getNumColumns();   const dim = rows + 'x' + cols;   for (let r = mr; r < mr + rows; r++) {     for (let c = mc; c < mc + cols; c++) {       if (r >= 0 && c >= 0 && r < numRows && c < numCols) {         mergeDims[r][c] = dim;         isAnchor[r][c] = (r === mr && c === mc);       }     }   }   // Snap the reference to its merge anchor if it sits inside this merge.   if (refR >= mr && refR < mr + rows && refC >= mc && refC < mc + cols) {     refR = mr;     refC = mc;   } }); // Reference values. const ref = {}; Object.keys(data).forEach(function (k) {   ref[k] = norm(k, data[k][refR][refC]); }); const refMerge = mergeDims[refR][refC]; // Scan and collect anchor cells that match on every enabled attribute. const matched = []; for (let r = 0; r < numRows; r++) {   for (let c = 0; c < numCols; c++) {     if (!isAnchor[r][c]) continue; // skip interior cells of merges     let ok = true;     for (const k in data) {       if (norm(k, data[k][r][c]) !== ref[k]) { ok = false; break; }     }     if (ok && options.merge && mergeDims[r][c] !== refMerge) ok = false;     if (ok) matched.push(sheet.getRange(startRow + r, startCol + c).getA1Notation());   } } if (matched.length === 0) return { count: 0 }; sheet.setActiveRangeList(sheet.getRangeList(matched)); return { count: matched.length }; } /** Normalize values so equivalent formats compare equal (colors are case-folded). */ function norm(key, val) { if (key === 'background' || key === 'fontColor') return String(val).toLowerCase(); return val; } // ── Formula-Safe Copy ──────────────────────────────────────────────────────── function formulaSafeCopy() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const range = sheet.getActiveRange(); // Store the A1 notation and sheet name in script properties const props = PropertiesService.getScriptProperties(); props.setProperty('FSC_RANGE',  range.getA1Notation()); props.setProperty('FSC_SHEET',  sheet.getName()); SpreadsheetApp.getUi().alert(   `Copied ${range.getA1Notation()} — now select your destination cell and run Paste (formula-safe).` ); } // ── Formula-Safe Paste ─────────────────────────────────────────────────────── function formulaSafePaste() { const ui    = SpreadsheetApp.getUi(); const props = PropertiesService.getScriptProperties(); const srcRangeNotation = props.getProperty('FSC_RANGE'); const srcSheetName     = props.getProperty('FSC_SHEET'); if (!srcRangeNotation || !srcSheetName) {   ui.alert('Nothing copied yet — run Copy (formula-safe) first.');   return; } const ss       = SpreadsheetApp.getActiveSpreadsheet(); const srcSheet = ss.getSheetByName(srcSheetName); const srcRange = srcSheet.getRange(srcRangeNotation); // Grab formulas (as strings) and display values separately const formulas = srcRange.getFormulas();       // raw formula strings, e.g. "=A1+B1" const values   = srcRange.getDisplayValues();  // what the cell shows if not a formula // Source range bounds const srcRow  = srcRange.getRow(); const srcCol  = srcRange.getColumn(); const srcRows = srcRange.getNumRows(); const srcCols = srcRange.getNumColumns(); // Destination anchor const dest    = ss.getActiveSheet().getActiveRange(); const destRow = dest.getRow(); const destCol = dest.getColumn(); // Row/col offset from source to destination const rowOffset = destRow - srcRow; const colOffset = destCol - srcCol; // Regex matches cell addresses like B4, $B$4, B$4, $B4 const cellRef = /(\$?)([A-Za-z]{1,3})(\$?)(\d+)/g; /**  * If the address falls within the source range, shift it by the paste offset.  * Anchored ($) axes are never shifted, matching normal paste behaviour.  * Addresses outside the source range are left untouched.  */ function shiftIfInRange(colAnchor, colLetter, rowAnchor, rowNum) {   const col = columnLetterToIndex(colLetter.toUpperCase());   const row = parseInt(rowNum, 10);   if (row >= srcRow && row < srcRow + srcRows &&       col >= srcCol && col < srcCol + srcCols) {     const newCol = colAnchor ? col : col + colOffset;     const newRow = rowAnchor ? row : row + rowOffset;     return (colAnchor ? '$' : '') + columnIndexToLetter(newCol) +            (rowAnchor ? '$' : '') + newRow;   }   return (colAnchor ? '$' : '') + colLetter.toUpperCase() +          (rowAnchor ? '$' : '') + rowNum; } // Build payload: rewrite intra-range references, pass external refs through as-is const payload = formulas.map((row, r) =>   row.map((formula, c) => {     if (formula === '') return values[r][c];     return formula.replace(cellRef, (match, ca, cl, ra, rn) =>       shiftIfInRange(ca, cl, ra, rn)     );   }) ); const destRange = ss.getActiveSheet().getRange(   destRow, destCol, payload.length, payload[0].length ); // Copy formatting first, then overwrite with values/formulas srcRange.copyTo(destRange, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); destRange.setValues(payload); } // ── Helpers ────────────────────────────────────────────────────────────────── function columnLetterToIndex(letters) { let n = 0; for (let i = 0; i < letters.length; i++) {   n = n * 26 + (letters.charCodeAt(i) - 64); } return n; } function columnIndexToLetter(n) { let s = ''; while (n > 0) {   const rem = (n - 1) % 26;   s = String.fromCharCode(65 + rem) + s;   n = Math.floor((n - 1) / 26); } return s; } Here's the MarchDialog.html for the Select Matching Cells Modal
Matching against reference cell:
Select all
Misc AirTable Wow wow wow AirTable continues to impress.  Formula Things Formula Reference Formulas in AirTable are Excel / Google Sheets adjacent, but the syntax is a bit different.  Here’s a conditional IF to apply contingency to a line item: IF({CONT} = BLANK(),0,SUM(ESTIMATE*.2)) “CONT” is field name “BLANK” is if the box is checked Here’s a conditional SWITCH to apply different contingency numbers on a line item: SWITCH( {CONT}, "Buffer", SUM(ESTIMATE*.2), "Something", SUM(ESTIMATE*.22), "None", 0 ) Here’s a conditional IF IF( {Watts/Unit} = 0,0, SUM(({Watts/Unit}/{Volts/Unit})*IF(OR(Calc = "R&D",Spare = 1),0,Qty))) It’s saying if watts are filled out, complete the formula to calculate for Amps, then multiply by quantity to get the calculated Amps unless it is a spare unit or it’s used for R&D.  A further change: IF({Watts/Unit} = 0,0,SUM({Watts/Unit}/SWITCH( Volts, "110v",110, "208v",208) ) *IF(OR({Budget Calc} = "R&D",Spare = 1),0,Qty) ) Adding this switch makes the Volts column attached to a variable switch. Based on voltage selection, calculate amps. If I add in additional voltage options, I will need to manually create that switch in the Volts column and then add it to the script. Here’s a formula that will concat two date strings DATETIME_FORMAT({Start Day / Time}, 'ddd') & " - " & DATETIME_FORMAT({Start Day / Time}, 'MMM') & " " & DATETIME_FORMAT({Start Day / Time}, 'DD') & " From " & DATETIME_FORMAT({Start Day / Time}, 'hh:mm') & " to " & DATETIME_FORMAT({End Date / Time}, 'LT') Extensions You can install extensions that do a variety of things. Some are paid if by third-party. Can recommend “Page Designer” (buggy, but functional) and “Charts. Third-Party Tools DocsAutomator - Highly recommended tool that takes the concept of AirTable's Page Designer and makes it... good. Really good. This is a paid tool, but the capabilities it adds are great. There's a bit of learning curve.  PDF Hell Editing a PDF If you need to edit a PDF, you can manually add text, remove text, or move elements around using the edit tools in Adobe Acrobat. This is useful for filling out forms, adding signatures to documents, etc.  Editing a Locked PDF These CAD PDFs from the manufacturer won’t let me import them into Vectorworks or some document from my employer that I need to fill out won’t let me add text to fill it out If you need to edit a PDF that won’t let you because it’s locked, if you “print” it via Apple Preview and then save to PDF , the document’s locks go away. Congratulations, you’ve just gotten around one of the easiest-to-manipulate document-integrity flaws you can imagine.  Reducing the Size of a PDF You just exported an awesome deck from Keynote or InDesign or even Google Slides and you want to email it to a client but it’s too-damn-big?   If you have a PDF that is huge because of the images within it, you can optimize the PDF with Adobe Acrobat. Do not use the option called “Reduce” because it compresses the images down to low quality and they’re all yucky and blocky. The move is to select File→Save As Other→Optimized PDF   The secret sauce here is in tweaking the quality and downsampling PPI. The screenshot is a good formula. 110MB PDF becomes 4MB. Congratulations, Dad! Screen Sharing Definitely recommend ConnectWise’s ScreenConnect most. TeamViewer is good, too, as it allows for local use (VNC without www). Parsec is good for low latency things like editing or gaming. JumpDesktop is even better for editing and “virtual” displays. You can also share a screen via iMessage on a mac desktop, this is especially good for Family Tech Support™. On a local network, you can screen share from Mac to Mac directly via the Screen Sharing utility. It is fantastic. RIP  Back To My Mac . ScreenConnect allows you to create a branded client application, send commands to a computer without logging in, and has ‘backstage’ mode which gives you access to a few select system resources without the host display seeing things.  In Screen Share world, “ Host ” means the computer you are remotely screen sharing to (what’s not in front of you physically), and “ Client ” means the computer you are remotely screen sharing from (in front of you physically).  ScreenConnect has a max count of screens, but allows for Mosaic (odd resolutions). Parsec seems to have a higher max screen count, but does not allow for odd resolutions. In other words, you might need Parsec to set up a multi-display server, but once a Mosaic is set up, you want to use ScreenConnect . There’s also a bug where certain configs on Hosts do not work on Mac clients.  Parsec Specific Gotchas Incredibly convoluted setup process.  Once you have an account all set up and you want access from your client: Download and install Parsec on target (host) computer Click “Setup as Team Computer” Input your Team ID (from Parsec dashboard online, top left) Input your Secret Key (provided when you first setup Parsec, I reco putting this as a note in your Parsec 1Pass) In the Dash, assign the computer to a group (first create a group) Now reload the Parsec App on your receiving machine Ripping Ethical Consideration I know, it’s 2023 2025, and ripping continues to be “not a cool thing” to do. That said, sometimes you need to rip something from another source program for sampling or auditing purposes or your client is being annoying about giving you exports and you needed the assets yesterday. There are definitely ethical reasons you may need to rip audio and video, so here’s my write up and suggestions. Audio Ripping I recommend Audio HiJack , it allows you to rip audio from a specific application (or system wide), and you can set rules to “start a new file after .5 seconds of silence,” for example.  If you can’t rip internally for some reason, you can do the old play from one source, record on another device trick . Another computer. A Zoom H5. Whatever.  If you want to automatically name audio tracks, use MusicBrainz . This application goes through your file and checks it against a massive online library. It will automatically name if it’s a clear winner. If there are options, it will give you a choice. It’s using the same technology iTunes used when you went to rip a CD into Mp3s in 2002.  Video Ripping You used to be able to just screen record, but you can’t anymore. Workarounds include installing NDi or Spout/Syphon tools that allow you to send from a browser window, then you can just record that NDi or Spout/Syphon stream.  If you can’t do that, or the frame rate is trash, you’ll need to use a capture card on a secondary device - where you output a computer’s video and input it to a capture card on another computer or recording device. Black Magic recorder is a good example.  If you can’t do that, get a nice and clean matte screen that is high resolution, set up a tripod, match the frame rate (ish) and match the refresh rate with your shutter speed and shutter angle.  For ripping something like youtube, you can always dig around for gross downloaders, but search no further than Youtube-DL which allows you to download (some) Youtube URLs. There is a bit of a learning curve and you have to do it through terminal, but if you are familiar with a tool like FFMPEG, this will feel easy for ya.  Youtube-DL & Cheat Sheet Youtube-DL doesn’t always work and is sometimes left for periods of time where it’s not updated, check out other versions – like ytdl-org yt-dlp uses the same syntax as youtube-dl Installing yt-dlp via homebrow brew install --formula yt-dlp Using ytdl, here's a sample syntax to download the best available MP4 yt-dlp -f mp4 'url'  Vectorworks Vectorworks Pro Tips Start building and refining your workspace immediately - panel layout, contextual menus, etc. Learn those hot-keys, and make your own Use a full size keyboard w/ NUMPAD (otherwise, GFL!!) Start learning how to make and use records/symbols/drawing labels Keep Don Ward’s top 10 cheat sheet handy Vectorworks for Projection Design If you want to learn VWX as a tool for projection design. I can teach ya the basics to get started in an afternoon or two … But it’s a deep dive.  There is’t a linear path to learn Projection design in VWX, unless you are doing traditional trade-show and event set ups. In which case - look no further than the built in “Screen” tool. To me, and most who work in the Creative Tech field - this tool is almost useless. In the hundreds of projectors I’ve engineered and hung, less than 10 were hung “traditionally.” True for you, too?  If you have complex designs in mind or projection that isn’t on screens: building it out is more of a DiY adventure. Projection Viz (link below) is a great alternative to the built in Screen tool, and Landru’s tool set will allow you to create arrays and do other complicated things.  VWX is extremely valuable as an engineering tool, but it’s also great with how you can create your own tools and workflows within. Scripts galore! Make your own plug-ins! Design your own metadata! Collate the information from the metadata in an exciting way! Here’s an example of how I used VWX as an emulation tool while combining my projection mapping skills. I’ve also used VWX to design layouts in my apartment. That’s something a lot of people   My advice is: Take the intro to VWX spotlight workshop seminar. It happens weekly on Vectorworks University and it is free. They say it’s a webinar but the vibe I get is that it’s pre-recorded… ! Essential first step though IMHO.  Take the intro to VWX course “ Core Concepts ” (16 hours) on VWX University (also free). This class was produced by Don Ward for VWX ~2020.  Then, take the intermediate course , also 16 hours, also Don Ward. He’s my absolute favorite VWX teacher - think he left the company in 2021.  Then: Learn how to produce a frustum, modify it, attach it to a projector symbol, etc.  For the University classes; a lot of things have changed, but a lot of things have stayed the same. If you’re lost, your best bet is to consult the forums. If you can’t find something it’s like a 50/50 chance it’s in a different place or straight up just doesn’t exist anymore. VWX is kind of like Google in that way - constantly updating but not necessarily repairing . We lovers of VWX openly acknowledge this great flaw.  Try the plug-in: ProjectionViz 2 https://benghiatlighting.com/software/product/projectionviz-2/ Try the Landru Plug-ins: https://www.landrudesign.com/DefaultFrameSet.htm?VSandSpotlight.htm~LandruMnFrm Vectorworks Plugins ProjectionViz 1 or 2 This is a paid plugin for Vectorworks that does a much better job at emulating projection clipping and is a much better projection tool than what VWX has built in. You can read about it all over the VWX forums, but their built in projection tool is really just for traditional PRJ installs - think classrooms or trade shows. It is terrible for all things non-standard. 90% of the time I don’t use either tool and custom draw frustums instead. I’ve been burned so many times in the past that I do frustum verification no-matter-what. As of April 2023, there is a bug that broke Renderworks rendering + PViz. The developer of the plug-in and VWX are aware and the bug is in their to-do list. As of fall 2024, this is still true.  Vectorworks Projector and Hardware Library VWX has done a pretty good job of putting projectors and cages in their built-in library, but it’s missing a lot of things - mainly new products made after 2018 or so. Yikes !  I have a massive library of projectors and lenses that I’ve collected or made myself over the years. Please hit me up if you’re looking for something - I may have it! Nothing is perfect but it’s pretty damn close enough for jazz. Epson and Panasonic are particularly good at distributing their 3D CAD. If not on website, ask their sales’ teams. Can’t give out that info here but hit me up and I’m happy to connect you! Also happy to share the 3D models I have.  I also have some select Chief hardware that I’ve made.  Vectorworks Round-Tripping VWX to GrandMA Workflow To export model, must be in SPOTLIGHT workspace (or add MVR functionality to Designer (or Architect or Landmark - if you’re a psychopath) Switch to Spotlight Workspace Turn off all things you don’t want to export Export —> MVR (visible only) Roundtripping, I.e., importing an MVR back into VWX doesn’t work currently. All geometry comes back broken.  To bring that file into MA First Show hidden files on windows in order to display ProgramData in C File Explorer Options —> View —>Show Hidden Files Navigate to ProgramData/MALightinhgTechnology/gma3_x.x.x/shared/resource/lib_mvr Import MVR In grandMA3, go to [Menu] → {Patch} Press {Import MVR} in the lower right corner Choose the correct drive from the top right corner Select the desired file and import it Exit out of Patch, saving changes This will import the file at 0,0 and the floor is the same as VWX.