michaelrmmiller
michaelrmmiller on Hacker News
Put another way: any Windows audio device supports WASAPI unless it only ships with an ASIO driver which is unlikely, even in the pro audio space.
The old generalizations about lower salaries and higher hours are no longer true across the board, by the way. As the industry is maturing, a lot of that is changing and the culture around things like crunch is changing for the better.
Higher order ambisonics strikes a pretty good balance in terms of spatial resolution while still being a mixed signal. You can then pair it with objects for specific highlights. Atmos is a 7.1.4 static bed plus dynamic objects, so similar idea. In either case, most of these 3D sound systems support very few dynamic objects. For example, Windows Sonic only supports 15 dynamic objects on Xbox: https://docs.microsoft.com/en-us/windows/win32/coreaudio/spa...
We need to meet our real-time deadline or risk dropping buffers and making nasty pops and clicks. That mastering stage can pretty easily be the limiting (hah) step that causes us to miss the deadline, even if we processed hundreds of tracks in parallel moments before in less time.
The plug-in APIs (AudioUnits, VSTs, AAX) which are responsible for all the DSP and virtual instruments are also designed to process synchronously. Some plug-ins implement their own threading under the hood but this can often get in the way of the host application’s real-time processing. On top of that, because the API isn’t designed to be asynchronous, the host’s processing thread is tied up waiting for the completed result from the plug-in before it can move on.
Add on that many DSP algorithms are time-dependent. You can’t chop up the sample buffer into N different parts and process them independently. The result for sample i+1 depends on processing sample i first.
On the plus side, I've been running Kontakt 5 along with lots of other audio software since 10.15 beta 3 every day and most everything is working alright.
Some other observations:
• Pro Tools' QuickTime video plug-in prevents it from launching because it's a 32-bit only subprocess meant to interact with the now-defunct QuickTime framework. You can delete the plug-in from the application bundle and it will proceed and seems to be working normally.
• EastWest has a nasty crash in PLAY 6 that can be worked around temporarily by removing their internal word builder plug-in.
• Pretty much every iZotope plug-in as of September had a 32-bit non-pkg installer. The software works fine if you copy all the relevant parts from an install on another computer.
• MOTU hardware drivers for anything but the latest Pro Audio line won't work as the drivers are 32-bit at the moment (MIDI interfaces, CueMix-based audio interfaces).
I hear they are planning to update their 32-bit drivers for the older MIDI and audio interfaces with the exception of the PCIe devices. (There are no existing Macs that can run Catalina and the old PCIe interfaces with the exception of the new Mac Pros, but there will be no driver so...)
I myself double majored in Music Composition and Computer Science and have spent my career so far working at their intersection. The strength of their music department was a big part of the reason I applied to and attended MIT.
MOTU crafts industry-standard, award-winning audio technologies. We are known for our high-quality audio interfaces, our professional multi-track recording software, synthesizers, virtual instruments, and effects. Our products are depended upon by musicians like Beyoncé, Danny Elfman, Michael Giacchino, Alan Menkin, Pat Metheny, Alexandre Desplat, Pete Townshend, Cirque du Soleil and Madonna.
We're a small, dedicated team of engineers based right in Harvard Square in Cambridge, MA. We are a different sort of full-stack: from the UI down to the DSP, the drivers, the FPGA and the physical hardware and everything in between. Our latest AVB line of hardware is a networked audio device that can stream hundreds of channels over ethernet following the AVB IEEE standard with just .625ms latency. Each unit has an embedded linux server that allows users to control it and mix in realtime from any device with a browser. Our DAW, Digital Performer, is a standard for film, TV and game composers around the world.
We develop mostly in C++11/14, Python, CoffeeScript and JavaScript. They're not prerequisites by any means, though, and we're always excited to incorporate new technologies.
Interested in the future of digital audio and music creation? Feel free to contact me directly at [email protected].
Thanks for writing the article! I'm much more in this camp of writing thin resource management rather than full-blown wrappers. And even if I were writing a wrapper, I would use these same techniques you're exploring to manage the resource as a member. It removes the need for any boilerplate whatsoever and in one line expresses all you need to know about the semantics of the object.
It also obscures the type of the object. That can be okay if it's only used as a temporary local, but problematic if you ever need to store it as a member or return it from another function. The type signature is verbose and not very descriptive, either. Compare that to:
namespace sdl2 {
using window = std::unique_ptr<SDL_Window, deleter<decltype(SDL_DestroyWindow), SDL_DestroyWindow>>;
}
...
sdl2::window window{SDL_CreateWindow(...)};
If you wanted to do something like what they have, I would create a variant on C++14's std::make_unique. That could look like: template<typename T> struct deleter_traits;
template<> struct deleter_traits<SDL_Window>
{
using custom_deleter = deleter<decltype(SDL_DestroyWindow), SDL_DestroyWindow>;
}
template<typename T, typename... Args> create_unique(Args&&... args)
{
return std::unique_ptr<T, typename deleter_traits<T>::custom_deleter>{new T(std::forward(args))};
}
sdl2::window window = create_unique<SDL_Window>(...);
That looks a lot cleaner to me, at least. And instead of having to write a new function for each type, you just add a new deleter_traits specialization.(I haven't actually compiled any of this so it's probably riddled with syntax errors... hopefully the point still comes across!)
In the end, I find it more readable to see unique_ptr and shared_ptr than raw resources. They describe more than just resource management.
A similar alternative would be to template the deleter on the type of the function and then a specific function. This way you can wrap functions with non-void return values. Something like:
template<typename FuncType, FuncType& F> struct deleter { ... };
using unique_cptr = std::unique_ptr<void, deleter<decltype(free), free>>;
The other cool thing I learned recently is you can actually use the custom deleter to override the wrapped type by typedef'ing pointer in your deleter class. You can use this to wrap C-style file descriptors in a unique_ptr.When I first brought up my career change, she wasn't on board because I didn't have a plan. But now that I am (more) sure of myself and know what I want to do and how, she is happy to support me and I'm exceedingly grateful for that. As long as you're communicating and your family is supporting you, I'd bet you can find a way to make it work.
I was reading about director Ang Lee a few months ago and found some inspiration in his career. After finishing grad school, he spent the next six years unemployed, writing a couple scripts at home and taking care of his two small children while his wife (a molecular biologist) worked. If he had given up then or if his family hadn't believed in him and supported him, he probably wouldn't be where he is now. Everyone's situation is different but I found hope and comfort in his backstory.
I'm very risk-averse but finally worked up the courage to quit and spend my time doing what I love: writing music. I'm slowly bleeding through my savings, but it's worth it. I wouldn't be able to live with myself if I never gave composing a fair shot. In the end, the biggest risk is actually to your ego. There's always another job out there, particularly if you're a software person.
I'm still nervous about the whole thing and worried about my prospects. I still procrastinate. But damn, I'm just much happier these days!
Finally made an account after years of lurking just to say this. Believe in yourself and take a leap. Sometimes it's just what you need to rediscover yourself.