Download:
The direct download link for the software is:
3d Early Access Documentation
There a preliminary manual available for the 3d Hardware and Software; it has been updated for release 11:
The manual is also viewable from the MIConsole3d > Help > Open MIO Manual… menu command. This command checks for updated versions of the manual and will download it from the MH server for you if there is a new version available. If your local version is up-to-date, it will simply open the PDF for you. If you plan of accessing the manual offline, you should use this command to download it while you are online, so that it will be available offline.
Component Versions
The component versions in this release are:
Package Version: |
pb11 |
Updated |
MIO Console Version: |
6.0.0 [6451] |
Updated |
Firmware Version: |
6.0.160 |
Updated |
Driver Version: |
2.1.03 |
Updated |
This document covers the changes since Release 10-138.
Release 11 of Metric Halo’s 3d software includes over 230 features, performance enhancements, and bug fixes; its a huge update. We strongly recommend everyone update to this version of the software and firmware.
New Plugins
We have made all the plugins from the Metric Halo Production Bundle available on the hardware; we are including these plugins for use on the hardware at no charge for 3d owners. The native versions of these plugins continue to be licensed separately, and are available for use in AU, VST and AAX hosts.
The plugins listed below are now available for instantiation on the hardware. This allows them to be used with zero latency during tracking, monitoring and live-mixing. It also makes them available for mixing recordings made with Session.
These plugins include the full feature set of the Production Bundle plugins, including things like the embedded SpectraFoo Real time Spectrum Analyzer. The 3d versions of the Production Bundle plugins share user presets with the Native Production Bundle plugins, so presets saved with the MH Preset system are usable in all versions of the plugins.
- ChannelStrip
- Dirty Delay
- Character
- TransientControl
- Precision DeEsser
- MultibandExpander
- MultibandDynamics
- HaloVerb
- Thump
In addition we have added a number of new processors that are currently exclusive to the MIO3d platform:
And in collaboration with Make Believe Studios:
- MBEQ
- MB Parallel 1, 2, & 3+4
- MB Good Math
Boot States / Snapshots
This version of MIOConsole3d (and the associated firmware) provides support for saving Boot States and Snapshots to the hardware. The only difference between Boot States and Snapshots is that Boot States are automatically applied by the hardware when it is booting up; Snapshots must be recalled manually. The Boot State is just a Snapshot that is recalled automatically during boot. In the following, we refer to both Boot States and Snapshots as Snapshots.
When you save a snapshot to the hardware, everything required to restore the current running state of the hardware is gathered up and stored on the hardware. This includes:
- Routing
- Mixer Gains
- Pans
- Mutes
- DSP plugins
- DSP settings
- Interbox Routing
- Clock source
- Sample Rate
- Computer Routing (including SCP)
When the Snapshot is recalled, the state of the running system is restored to state it was in when the snapshot was saved. This reflects the state of the entire MHLink domain.
The state of all the signal processing in the system is configured for the sample rate the system was running at when the Snapshot was saved. The Snapshot will recall the Sample Rate, if the boxes are on internal clock. Changing the sample rate (either from the front panel or via an external clock) will not update the coefficients for the DSP (unless MIOConsole3d is running and connected to the domain), so the sample rate cannot be changed with boot-states or Snapshots if there is any DSP processing that is sample rate dependent (e.g. EQ, Comp, Delay etc.); if the sample rate is changed, the incorrect coefficients from the snapshot’s sample rate will continue to be used.
In the case of a multibox system, this includes all the complex routing between the boxes. As a result, for a multibox system to recall properly, everything must be connected in exactly the same way it was when the Snapshot was saved (e.g. all boxes must be connected in the same order with the same ports used for the connections). If this rule is not followed, the recall will happen correctly, but the physical ports will not match the routing stored in the Snapshot, and the signals will not route properly.
When the system is powered up (or rebooted), the hardware will check to see if there is a valid boot-state snapshot stored on the box. If there is, it will be asserted onto the hardware, and then the last state of the hardware gain controls (that is stored separately) will be restored; this means that if you change gains on the unit when it is running stand-alone with a boot state, and then you power cycle it, it will come back the way it was before you turned it off.
The system sets a non-volatile flag when asserting a snapshot; the flag is cleared after the snapshot is fully asserted. If the system detects the flag during boot, that indicates that the Hardware crashed while asserting the boot state snapshot and the HW will skip the boot-state. The flag will get cleared if you save a new boot state or erase the boot state.
If you run into some problem with the boot state (or simply want to temporarily avoid loading it during boot), you can hold down the front panel Mute button (or the up-arrow button on the ULN-2/3d) while booting the box; if the Mute button is depressed during boot the HW will skip loading the boot state.
You can recall a snapshot from the ULN-8/LIO-8 front panel “Preset” page or from the ULN-2 up/down buttons.
In the case of the ULN-8/LIO-8 front panel, the recall will be broadcast to all other boxes in the domain, so you can recall an entire domain snapshot at once.
Snapshots and Boot states are intended for using the hardware without MIOConsole3d. They are appropriate for the following use cases:
- Pre-configuring routing and/or processing to use with a system that doesn’t have MIOConsole Available (e.g. Windows, Linux, iOS, Android)
- Pre-configured routing and processing for standalone fixed installation or conversion (e.g. as a sidecar for a console or a front-end for a recorder)
- Pre-configuring fixed routing to allow the use of the HW with a Mac without having to launch MIOConsole3d (e.g. to configure the MIO as a “dumb” interface/ converter)
While it is safe to launch MIOConsole3d or connect to a computer running MIOConsole3d, doing so will assert the console state onto the HW, replacing the running bootstate/snapshot (but not changing the state stored in non-volatile memory on the hardware).
Note: It is not (currently) safe to load a snapshot while MIOConsole3d is running and attached to a domain; doing so will replace the running state of the HW without MIOConsole3d being able to synchronize with the hardware; this will eventually cause the hardware to crash.
Please see the manual for more details.
Enhanced control over Record Monitoring modes
We have added support for User control over mixer input monitor mode and also added input monitor buttons to strips, to select manual input monitor mode.
The Mixer Mode preference controls the overall record monitor mode:
- Console (no Session Playback)
- Session (use Session as DAW)
- Auto (switches modes based on transport state)
The Input Monitor Mode preference controls the record monitor mode when the mixer is in Session mode:
- Manual: Input ONLY when Input Button is On
- RE: Input whenever Record Enabled
- Mixed: Input+Session Playback whenever Record Enabled; Input only when punched in for RE track
- Auto: Session Playback in Everything except Record Enabled + Recording
- Tape: Input when Stopped or Recording (if Record Enabled)
All the combinations are summarized in the table below:
Mackie Control Surface enhancements
We have improved some features of the Mackie Control Surface Support:
- Enable Strip selection via the strip Select button
- Adhoc linking (updates links based on selection from surface)
- Modifier key support (modifier keys on surface work like keyboard)
- Make Record button on transport behave like the record button in the UI (e.g. respect countoff setting)
- Allow scrolling session from surface (via arrow cluster)
- Support autoscroll/repeat of Session from surface
EQ GUI enhancements
These changes apply to all the plugins with EQ transfer functions:
- Improved performance when drawing spectrum
- Added support for multiple band selection and ad-hoc linking (shift click to extend selection, or drag selection lasso)
- Added support to show readout of current cursor position in transfer functions:
Changes for GUI rendering engine
Since 10-138, we have developed some additional infrastructure changes the low-level User Interface code that greatly enhance performance (and correspondingly reduce CPU load), by working around time consuming operations in the OS graphics libraries. This version of MIOConsole3d includes a large number of GUI performance enhancements that are improve on the user experience on Big Sur (which introduced a number of performance regressions). Luckily, all the improvements also carry over to earlier macOS versions, so everyone should see substantially improved GUI performance and lower CPU load.
MIOConsole3d includes a number of different user-selectable GUI rendering engines. With the current version of the code, based on our current testing we belive that the optimal engine selection is as follows:
- All machines (both Intel and Apple Silicon): Layer Backed
That being said, on Intel machines, especially older ones on older OSes, you may find that OpenGL performs better. It is best to try both engines and see which works better on your computer.
Changes for Big Sur (macOS 11) and newer
The MHLinkDriver is still a Kernel Extension as Apple has not replaced the Kernel Programming Interfaces required for MHLink with DriverKit interfaces. Updating the driver still requires User Consent, and will require a reboot.
After installing the driver:
- Open the Security & Privacy System Preferences.
- Authenticate to make changes.
- Allow the system to load your kext.
- Wait for the system to load the kext and rebuild the auxiliary kext collection.
- Reboot to load the new auxiliary kext collection.
Changes for Apple Silicon
This build of MIOConsole is Apple Silicon Native. It also includes the Apple Silicon Native version of the MHLink driver, and will automatically choose the correct version when installing the driver.
The software is at full-parity between Intel and Apple Silicon with the exception of one feature: EuCon support. EuCon support relies on Avid providing Apple Silicon EuCon support, which is not available yet. When running MIOConsole3d native on Apple Silicon, EuCon will not be available. If you run it in Rosetta (using the Intel slice) then EuCon is available. Check with Avid for EuCon compatibility on Big Sur.
On Apple Silicon (M1), you need to ensure that your Secure Boot settings are configured to allow third-party drivers. Big Sur will warn you of this if your Secure Boot settings do not allow third-party drivers, but the instructions may be confusing.
You need to reboot into recovery and set the Secure Boot mode to Reduced Security, and check the check box allowing “Kernel Extensions from Identified Developers”.
Apple’s instructions for this are:
- Reboot your Mac with Apple silicon into Recovery mode.
- Set the security level to Reduced security.
- Allow the loading of third-party kexts.
- Reboot back to macOS.
After the Secure Boot settings have been changed, you can install the driver, and follow these steps to authorize it being loaded:
- Open the Security & Privacy System Preferences.
- Authenticate to make changes.
- Allow the system to load your kext.
- Wait for the system to load the kext and rebuild the auxiliary kext collection.
- Reboot to load the new auxiliary kext collection.
Bug fixes
There are a lot of bug fixes and performance enhancements both big and small; they are listed below in the detailed release notes.
MIOConsole3d - New Features and Enhancements (since pb10-138)
- Deploy Build for Arm
- Use preset Ids for Generic Preset tracking
- Add Boot States and Snapshots for the HW
- Set tooltip for item rows so that if the item is shortened the tooltip can display the full name
- Make default Mixer Mode “Auto” and input monitor mode “Tape”
- MBEQ Add tooltip with details for using transfer function gestures
- Firmware version check for support for immediately executed commands
- Add tooltips for Solo modes
- Add tooltip for Take Mode marker template
- Add support to map source and destination to closest existing source or destination in unit channel list
- Add support to indicate selected strips on MCU surface
- Add support to get parameter group from nickname
- Add support to erase bootstate and presets from HW
- Add support to dynamically update current rendering mode and make Layer backed the default mode (given current performance characteristics)
- Add support for using index parameter item description list
- Add support for setting modifier state for adhoc linking from surface
- Add support for sending immediately processed command if firmware supports it
- Add support for scrolling session from the control surface (MCP)
- Add support for autorepeat for scroll and zoom from MCP
- Add support for remote analysis buffers
- Add support for plugin UIs to control help mode
- Add support for getting a parameter value from a nickname
- Add support for generic presets
- Add support for freq, gain, note readout in EQ transfer functions
- Add support for controlling visibility of Session Metadata and Take note in the Session transport bar
- Add support for compare ignore in Generic Presets
- Add support for asserting state to HW (so we can capture it in the bootstate log)
- Add support for Mackie Control “Select” button toggles strip select
- Add support for MHDetectorGainHistory
- Add support for LinkManager to ParameterValues
- Add support for Input Monitoring Modes
- Add support for Generic Presets to plugin insert selector
- Add more defined edge to tiles
- Add menu item to Enable or Disable the MHLink Driver timestamp PLL for debugging purposes
- Save and Restore driver PLL enabled state
- Add input monitor buttons to Session window track headers
- Add implementation of CVDisplayLink based timer
- Add UI rescale support
- Add Stereo (2.1 and 2.2) path configurations for MC
- Add Thump Plugin
- Add SuperGate Plugin
- Add Sonic EQ Plugin
- Add Production Bundle Category for plugins
- Add Precision De Esser Plugin
- Add MultibandExpander Plugin
- Add MultibandDynamics Plugin
- Add MHTransientControl Plugin
- Add Dirty Delay Plugin
- Add MHCharacter Plugin with PB UI
- Add MHChannelStrip Plugin
- Add MH HaloVerb Plugin
- Add Filtered Sample and Hold block
- Add suport for individual windows to set tooltip time
- Tag opaque images correctly to reduce CPU load
- Avoid CoreGraphics image colorspace bottlenecks to reduce CPU load
- Avoid CoreGraphics image bit depth bottlenecks to reduce CPU load
- Avoid CoreGraphics over painting windows to reduce CPU load
MIOConsole3d - Bug Fixes (since pb10-138)
- Return disabled knobs to previous appearance in Analog pane
- Remove ellipsis from plugin tiles so more useful characters are shown
- Make static data static
- Fix build on arm with floating point exception polyfill routine
- [ 0009768 ] Rename “Auxes” > “Aux Buses” and Groups > “Group Buses”; fix spelling of Buses
- [ 0009672 ] Fix graphic caching issue that prevents box details for offline box showing as “Offline”
- [ 0009622 ] Ensure each SonicEQ instance properly tracks its own sample rate so that when the SR changes, coefficients are properly updated.
- [ 0009459 ] Close audio device when playback stops (if nothing is record enabled) to reduce resource consumption
- [ 0009397 ] Ensure all data moved when an ordered list is moved (makes loaded markers show up properly
- [ 0009397 ] Catch exception if marker file does not have correct format so that the app doesn’t crash loading an incorrectly formatted file
- [ 0009245 ] Ensure we only show Foo analyzer if there are analysis buffers available
- [ 0009196 ] SuperGate: Properly handle case when Open and Close thresholds overlap
- [ 0009195 ] SuperGate: Fix memory stomper in analyzer with stereo instance
- [ 0009194 ] Ensure bubble controls stay visible in Detector+Gate history; indicate if the value is below the visible range
- [ 0009167 ] Restore ability to load old .miopresets by allowing older than current version presets to be processed
- [ 0009166 ] Ensure that blinking mute state does not get set on a bus fader, as it cannot be cleared
- [ 0009163 ] Flush widget background caches when UI is assigned to a UI host (seems to fix graphic glitch)
- [ 0009163 ] Ensure that cached images are correctly re built; fix un initialized background color flag
- [ 0009162 ] SuperGate: Fix DSP bug for Attenuation set to 0 and Attack or Release set to 0
- [ 0009154 ] Plugins: Fix multiple plugin UIs analyzers interfering with each other (due to false sharing of collection buffer)
- [ 0009153 ] DirtyDelay: Only instantiate link manager when DD stereo (and thus has linkable parameters)
- [ 0009143 ] Handle case where user plugin preset directory does not yet exist (avoid crash on save of preset)
- [ 0009131 ] SonicEQ: Ensure that all bands are fully bypassed when turned off
- [ 0009128 ] Ensure Toggling Bypass on plugin does not trigger a compare button update
- [ 0009123 ] Properly fix enablement of ripple controls for first order filter types (only show for band stop)
- [ 0008997 ] Ensure target is valid before attempting to add or remove it from a DCA or Link Group
- [ 0008993 ] Ensure that an incorrect template string does not result in an unhandled exception
- [ 0008989 ] Add guard to protect against crash if cached symbol file cannot be opened
- Fix crash when audio device goes away by deferring notification
- Validate slot owner before dereferencing
- Validate and map channel source + destination when applyUnitAddressMap during mapping
- Validate MHGenericPreset before using it
- Use mapper to determine correct selection indexes when displaying currently selected preset
- Use dynamic color for fader readout in mixer
- Use correct API when getting driver PLL enabled status
- Use PlugInNameForSlot for insert slot names
- Update build number script to use tags from git describe
- Update Transfer Function curve when bypass state changes
- Update MIOStrip to conform to changes to metering changes in DSP
- Stutter start idling when idle starts up
- Request that Analyzer data gather command is executed immediately, rather than queued
- Rename and recategorize plugins to clarify what they are
- Remove plural from “Auto Enable” menu item for TF context menu
- Remove extra space
- Remove domain from category (required by changes to support Generic Presets)
- Remove “ideally”
- Reduce size of rings in Channelstrip
- Reduce SonicEQ UI size to 80%
- Properly set underlying background color so pane buttons render properly
- Properly configure popup like controls from parameter value list
- Performance: Switch backing image back to ARGB and tag it with Opaque to avoid CG image processing
- Performance: Set scribble strip bounds once, correctly
- Performance: Buffer scribble strips
- Performance: Buffer group name labels
- Performance: Buffer aux send widgets
- Performance: Buffer Unit details pane
- Patch fishhook so that that it properly aligns mprotect calls with page alignment as required (for Rosetta on Monterey)
- Only update variable in kernel when changing PLL mode if the value will change
- Only show input enable button on supported tracks
- Mask Delay primitives and building block categories from plugin insert category list
- Map to user domain for current category when doing Preset “Save as”
- Make transport buttons on control surface respect countoff
- Make sure we don’t overrun a buffer
- Make preset selector popup at mouse click rather than border of control
- Make Sonic filter interpolation faster; newly allocated Section feedback coefficients immediate with faster summing interpolation
- Log plugin window teardown
- Limit parameter range
- Increase size of tooltip text
- Improve tool tip appearance
- Improve layout for parameter window for faders
- FractionalDelay: fix delay parameter limits
- Fix typo and release proper holder so as to not leave a pointer dangling
- Fix stuck host channel assignments when adding new strips
- Fix spurious enable of processor sections in ChannelStrip when opening UI
- Fix spelling
- Fix sentinel value (should be -1 rather than 1)
- Fix select linking so that toggling a selected strip doesn’t unselect all of em
- Fix ripple controls
- Fix regression in popup menus that prevented initial state from being set on preset recall (due to states not being allocated early enough)
- Fix popup window opening under always on top windows when displayed during app activation
- Fix plugin categories for SampleAndHold and GoodMath
- Fix meter count for ChannelStrip
- Fix layout of output knobs in Analog I/O Pane window to adjust for changes required to support plugins
- Fix initializers to deal with added constructors
- Fix initial UI sample rate
- Fix incorrect record enable; input monitor; and input select controls on Metronome strip
- Fix for build on Big Sur
- Fix feedback knob scaling
- Fix crash if global key-command file includes an invalid command
- Fix crash from over release of reference count when new box is added to domain during topology scan
- Fix conflict for Point<>
- Fix build for ARM with ffts
- Fix background in “Configure Mixer Strip Controls”
- Fix adhoc linking so that it doesn’t clear the linkingDisabled bit spuriously
- Fix UI and Filter types for Dirty Delay Mono
- Fix Sonic Coefficient calculator in the case of ill-conditioned parameters
- Fix ChannelStrip central column layout
- Fix Box panes showing offline if the root box is taken offline
- Explicitly remove current pref page before deleting it so that macOS doesn’t call back in during destruction
- Explicitly hide CueWindow and MC window before they are torn down
- Ensure trigger settings are properly restored from prefs
- Ensure that preset identity is preserved when a preset entry is updated (e.g. Save, vs. Save As…), and make Compare button realize that the setting has been updated
- Ensure plugin remote buffer data is included in boot states
- Ensure new monitor modes don’t interfere with Metronome playback
- Ensure mapped domain channel list is consolidated before using it
- Ensure mAnalysisBuffer is initialized in Id when Id is created
- Ensure implementation packages are tagged to hosts so we don’t get confused addresses
- Ensure delay loads all relevant presets
- Ensure auto enable doesn’t fire when loading a preset in ChannelStrip
- Ensure all windows are torn down before removing domains during quit
- Ensure Transfer function Sample Rate is updated
- Ensure MHDetectorGainHistory limits generic parameters to valid range
- Dynamically compute parameters to ignore on compare in DirtyDelay
- Draw flat background for plugin UIs if no backing image is set
- Don’t show Input Monitor on tracks that don’t support it (e.g. busses)
- Don’t draw MHGrid if we are asked to paint during destructor (due to Big Sur requesting a redraw during window destruction)
- Don’t crash if plugin can’t be instantiated
- Do not draw CueWindow background since content is opaque
- Disable notifications during MonitorController teardown
- Disable non-functional EuCon on ARM
- DirtyDelay: Set the proper parameter recall order so that the delay times and linking are properly managed on preset recall
- DirtyDelay: Adjust label to clarify the sense of the Wet/Dry knob in
- Control Surface ad hoc linking fixes
- Clip threshold parameter to range when dragging it higher
- Avoid horizontal scrollbar when plugin window has vertical scrollbar
- Allow setting font and scalar simultaneously on MHNumericGlyphCache so we only rebuild once
- Adjust lane and channel sizing computation so that multichannel segments don’t shrink out of sight
- Add tolerance to allow tests to pass with Accelerate (this might not be correct)
- Add support for setting created Popup entries with indexed parameter names
- Add support for meters to generic wrapper
- Add missing support for parameter recall order
- Add guards to ensure we have a root unit to render
- Add guard to protect against buffer overrun when reading parameter nickname
- Add guard for nullptr
- Add const correctness for GetGenericParameterValue
Firmware Changes (since 6.0.118)
- Recall gain persistent state after loading boot state
- Enable front panel controller to use preset controller for showing preset status and recalling presets
- Enable command interface to use preset controller for saving presets from host
- Add MHPresetController for managing snapshots and presets
- Add support to bypass loading boot state by holding Mute button down during boot
- Add support for loading and applying bootstate
- Add support for firing and responding to snapshot recall packets
- Add support for erasing boot state + snapshots
- Add support for Immediately processed remote commands
- Increase logging limit, since the EQs now request long buffers
- Fix up flush console output buffer to respect current async buffer write
- Put preset indicator for ULN 2 in the correct FP bitmap slot so that it is visible on the HW
- Mute all existing routes before recalling snapshot state data
- Move Preset save process to task queue so that the box does not go offline while the data is saved to flash (maybe)
- Interpret response from FFS read + write correctly (its only an error code if it is negative)
- Improve abort handler
- Fix sense of legacy mute and dim button to match HW behavior
- Fix monitor knob ring turning off headphone is muted
- Fix coordination between iogain, front panel, and persistence for mute and dim
- Defer snapshot recall until task time so we don’t deadlock on the flash subsystem, only recall snapshot on button press and not when it is released
- Add panic message if the flash state machine is called from an interrupt context
- Fix USB channel count recall so that asymmetrical I/O counts are possible
- Add Product string to additional USB descriptor to work around new USB name bug in Big Sur 11.4
- Properly distinguish between LIO-8 and ULN-8 for product name in USB
MHLink Driver Changes (since 2.1.01)
- Built-In MHLink driver Apple Silicon support
- Fix type in PCMSInt32Swap for arm
- Apply delta limit to the instantaneous delta rather than the filtered delta to protect against outliers; hopefully this will avoid the catastrophic under and overruns that some people are seeing with the driver