Skip to content

Console


Many professional instruments need a channel mixer with per-channel volume, panning, send effects, insert effects, and an editable FX chain. Building all of that from scratch for every product would be enormous. IVLS solves this with Console-K7 -- a separate library that provides a full mixer console as a drop-in module.

Console-K7 is not part of the IVLS SDK itself. It ships as its own library, imported into your product via a single import statement. Your product configures it through a set of defines and a configuration macro.

Importing Console-K7


Console-K7 lives in a separate Kontakt library resource named _CONSOLE-K7. You import it at the top of your console configuration file:

import '_CONSOLE-K7/node-import.ksp'

This pulls in all the console nodes, engines, and UI infrastructure. The underscore prefix in the library name is a Kontakt convention for helper libraries that are not user-facing.

Configuration Defines


After importing, you configure the console through a set of defines that tell it where your UI widgets live and how many channels to create:

define CONSOLE_CONFIG.ENABLED_CHANNELS := 4

define CHANNEL_WIDGET_LOCATION    := Console.Channel
define CHANNEL_FX_WIDGET_LOCATION := Console.Channel
define MASTER_WIDGET_LOCATION     := Console.Master
define MASTER_FX_WIDGET_LOCATION  := Console.MasterFx
define EDIT_PANE_WIDGET_LOCATION  := Console.FxEdit
define EDIT_PANE_MODEL_LOCATION   := Console.FxEdit.Models
define GLOBAL_FX_SWITCH           := FxEnable

CONSOLE_CONFIG.ENABLED_CHANNELS sets the number of mixer channels. A four-layer synth might have four channels; a simple instrument might have one.

The widget location defines tell the console where to find the UI panels for channels, master, FX editing, and models. These match the panel names in your Kontakt Creator Tools performance view.

GLOBAL_FX_SWITCH points to a UI button that globally enables or disables FX processing.

The Configuration Macro


The console.config() macro runs inside the console's init and sets up channel names, enabled FX types, edit pane dimensions, and control styling:

macro console.config()
    { Channel names }
    !channel_names[0] := "Keys"
    !channel_names[1] := "Pads"
    !channel_names[2] := "FX"

    { Enable FX processing }
    console.engine.enable_master_ins_fx()
    console.engine.enable_master_send_fx()

    { Edit pane geometry }
    declare const PANE_TOP    := 23
    declare const PANE_BOTTOM := 135
    declare const PANE_LEFT   := 340
    declare const PANE_RIGHT  := 990

    { Control pictures }
    declare @KNOB_PIC    := "CON-knob2"
    declare @SM_KNOB_PIC := "CON-knob1"
    declare @BTN_PIC     := "CON-btn-led"
end macro

You can also enable per-channel FX with console.engine.enable_channel_fx(ch) for specific channels. The Polycore product, for example, enables channel FX for each layer using a Jinja loop.

The UI Callback


When the user interacts with a console control -- adjusting a channel volume, toggling a channel on/off, or changing an FX parameter -- the console dispatches to your console.ui_cb.response() function:

function console.ui_cb.response(ch, slot, type)
    select type
        case console.ui.cb_type.CHANNEL_VOLUME
            { React to volume change on channel ch }
        case console.ui.cb_type.CHANNEL_ENABLED
            { React to channel enable/disable }
            purge.execute()
    end select
end function

The arguments are:

  • ch -- the channel index that changed
  • slot -- the FX slot index (for FX-related events)
  • type -- a constant from console.ui.cb_type identifying what changed

A common pattern is triggering a purge when channels are enabled or disabled, so that disabled channels release their samples from memory.

Snap Locking


The console supports snap locking -- persisting channel states across snapshots. You declare a force-persistent array in your config macro:

declare console.channel_data.force_persistent[] := (-1)

A value of -1 means the channel data follows normal snapshot behavior. You can set specific indices to lock channels against snapshot recall.

Mic Mixer Variant


For instruments with multiple microphone positions (like orchestral libraries), Console-K7 can be configured as a mic mixer instead of a standard channel mixer. The Tokyo Scoring Strings product, for example, uses separate console builds for its board mixer and mic mixer configurations, each with its own set of widget locations and channel names.

The mic mixer variant uses the same console infrastructure but maps channels to microphone positions rather than instrument layers. The configuration pattern is identical -- only the channel names and routing differ.


Console-K7 is a powerful module that would take hundreds of hours to build from scratch. Your product's responsibility is minimal: import it, set the defines, write the config macro, and handle console.ui_cb.response() for any product-specific reactions to mixer changes.