in this tutorial we will work with sublime 3 and macros. A macro works almost like a function. We use them like functions and we can use arguments to pass variables to alter or individualize several parameters inside a macro.
But instead of returning any values or executing any code, a macro is “printing” the whole code from inside it, whenever and wherever it gets called.
So we can use macros like factories to even create other functions, callbacks or any other code fragments. Preferably whenever we have repetitive code patterns so that we don’t have to write them again and again.
In the second part of this article we build a small synth with one FX using several kind of macros to create 4 fully functional knob units.
Download all files to this tutorial
- working synth with a nice retro lead (sampled)
- Open Resource Container: all image files
- NKI & KSP file: the working script
Note: all the code below doesn’t work if you put it into Kontakt as is. It needs to be compiled with sublime first (use F5 key)!
first we learn how macros basically work and in the second part (premium) we use them to create a fully functional line of knobs to control a FX. Each knob will be framed by 2 labels (above and below) holding the knobs name and the knob’s values. Another macro will be used for the “on ui_control” callback.
2. macro basics
Sometimes we need global variables from outside a macro. As we can only declare them inside the on init callback we should declare all new variables immediately as soon as we are using them so that we don’t lose track.
declare macros like a function
this example outputs “$c is now 10”
macro my_macro (#a#,#b#) // #a# and #b# are arguments we use to pass values into the macro, the hashtags are required //any code in here will be printed where the macro gets called $c := #a# + #b# //$c is a global variable which has to be declared inside the on init callback before we call the macro. message("$c is now " & $c) end macro on init declare $c //make sure you declare $c before calling the macro my_macro(3,7) //this calls the macro passing 3 and 7 end on
this is how the above looks compiled (the way we put it into Kontakt)
on init declare $c $c := 10 message("$c is now " & $c) end on
We can use macros to declare other functions or callbacks like “on ui_control” and use it to create all kinds of code elements we can imagine
this macro creates a slider with a custom image and also positions it
macro declare_knob (#name#,#posx#,#posy#,#width#,#height#,#image#) declare ui_slider $knob_#name#(0,1000000) make_persistent($knob_#name#) $knob_#name# -> width := #width# $knob_#name# -> height:= #height# $knob_#name# -> pos_x:= #posx# $knob_#name# -> pos_y:= #posy# $knob_#name# -> text := "" $knob_#name# -> default_value := 1000000 / 2 $knob_#name# -> mouse_behaviour := -400 $knob_#name# -> picture := "#image#" end macro on init make_perfview set_ui_height_px(200) set_ui_color(9666666h) //declare_knob (#name#,#posx#,#posy#,#width#,#height#,#image#) declare_knob(volume,220,112,40,40,knob_fx) declare_knob(pan,268,112,40,40,knob_fx) declare_knob(tuned,364,112,40,40,knob_fx) declare_knob(speed,412,112,40,40,knob_fx) end on
as each knob (or slider) has the exact same code pattern we can bundle them into one macro. All individual parameters like position and size can be passed. We can then call the macro in the on init callback as many times as we want and create many many knobs in no time with only one line of code for each knob.
3. The advanced usage of macros
now that we understand macros we can proceed to a more complex example and declare multiple ui elements and
on ui_control callbacks.
We will create a group of several knobs to control the LoFi FX. One group holds several knob units containing a top label, the knob itself and a sub label for the knob’s value (see image). Whereas the bottom label will display the current knob’s value when turning the knob. On release it falls back to the original label.
We are sorry that this post was not useful for you!
NOTE: highly negative votes may be removed without any reasonable given feedback!
Tell us how we can improve this post?