Affrontiamo ora una tematica nuova. Supponiamo di costruire un Instrument costituito da 3 gruppi (A, B, C) sui quali sono mappati dei suoni diversi come ad esempio un suono percussivo, un pad, un piccolo loop. Vogliamo dare la possibilità all’utente di poter suonare i tre suoni in maniera indipendente e con varie combinazioni del tipo A+B, B+C, A+C, A+B+C potendo controllare i volumi dei singoli suoni per creare dei bilanciamenti timbrici.
Per prima cosa occorre creare dei pulsanti in grado di abilitare i tre suoni. Un pulsante si crea con la ui_button <nome pulsante> e si dichiara ovviamente nella callback init. Il pulsante relativo al gruppo A pertanto è:
on init
declare ui_button $A
end on
Per abilitare la performance view ovviamente inseriamo la solita istruzione.
on init
declare ui_button $A
make_perfview
end on
Cambiamo il nome del pulsante A in “Percussion” ipotizzando che nel gruppo A sia mappato un suono percussivo.
on init
declare ui_button $A
set_text ($A, “Percussion”)
make_perfview
end on
Un pulsante può avere due stati operativi, essere acceso (valore 1) oppure essere spento (valore 0). Se vogliamo che il nostro pulsante di default sia acceso occorre assegnare tale valore.
on init
declare ui_button $A
set_text ($A, “Percussion”)
$A := 1
make_perfview
end on
Il pulsante quando è acceso diventa di colore chiaro mentre è scuro quando risulta spento. Il passo successivo consiste nell’abilitare il Gruppo A quando tale pulsante risulta acceso e a disabilitarlo quando risulta spento. A tal fine possiamo usare la callback note e il ciclo if.
on note
if ($A=1)
allow_group (0)
else
disallow_group (0)
end if
end on
Il gruppo A potrà essere suonato solamente se il pulsante A risulta acceso. Ripetiamo le stesse procedure per creare i pulsanti B e C rinominati poi “Pad” e “Loop”. Per prima cosa creiamo gli altri due pulsanti e scegliamo per essi la condizione pulsante spento.
on init
declare ui_button $A
set_text ($A, “Percussion”)
$A := 1
declare ui_button $B
set_text ($B, “Pad”)
$B := 0
declare ui_button $C
set_text ($C, “Loop”)
$C := 0
make_perfview
end on
Cliccate su apply e vedrete i tre pulsanti in fila. Solamente il pulsante A risulta acceso.
Inseriamo ora le istruzioni per far si che premendo il pulsante B si abiliti il gruppo B, il pulsante C abiliti il gruppo C.
on note
if ($A=1)
allow_group (0)
else
disallow_group (0)
end if
if ($B=1)
allow_group (1)
else
disallow_group (1)
end if
if ($C=1)
allow_group (2)
else
disallow_group (2)
end if
end on
Suonando una nota mappata, nella situazione attuale, solamente il gruppo A risulterà attivo.
Se invece abilitiamo il pulsante B allora suonando una nota risulterà solamente il gruppo B in riproduzione.
Possiamo migliorare la nostra Performance View incolonnando i tre pulsanti. In questo caso occorre inserire nella callback init le due istruzioni.
move_control ($B, 1,2)
move_control ($C, 1,3)
In tal caso il pulsante B viene spostato sulla riga 2 mantenendo la posizione della colonna 1 mentre il pulsante C viene collocato sulla riga 3.
Quando si disabilitano i gruppi potrebbe essere interessante poter scaricare dalla memoria RAM i campioni che li costituiscono. Questo è possibile tramite la funzione purge_group (<ID gruppo>,<valore>). Se il parametro <valore> è pari a 0 allora i campioni vengono scaricati mentre se è pari ad 1 vengono ricaricati. Dobbiamo quindi dire al KSP di scaricare i campioni quando il pulsante risulta spento e di caricarli quando risulta acceso. Questa operazione occorre farla all’interno della callback ui_control dedicata. Poichè i pulsanti sono tre occorre definire tre callback: on ui_control ($A) è dedicata alle azioni che accadono se si agisce sul pulsante A.
on ui_control ($A)
if ($A=0)
purge_group (0,0)
else
purge_group (0,1)
end if
end on
on ui_control ($B)
if ($B=0)
purge_group (1,0)
else
purge_group (1,1)
end if
end on
on ui_control ($C)
if ($C=0)
purge_group (2,0)
else
purge_group (2,1)
end if
end on
Occorre ora inserire delle manopole per poter controllare i volumi dei tre gruppi. Per prima cosa assegniamo l’uscita audio di ogni gruppo ad uno dei sedici bus disponibili. Si seleziona il gruppo A e nella sua uscita selezioniamo il Bus 1.
Subito dopo, associamo l’uscita del Bus 1 all’uscita generale del Kontakt.
Suonando una nota appartenente al gruppo A possiamo osservare che esce dal Bus 1.
Assegniamo il Gruppo B al Bus 2.
Assegniamo il Gruppo C al Bus 3.
Creiamo tre manopole per il controllo dei volumi dei bus 1,2 e 3 nella callback init.
declare ui_knob $LevA (0,1000000,1)
declare ui_knob $LevB (0,1000000,1)
declare ui_knob $LevC (0,1000000,1)
Possiamo rinominarle.
declare ui_knob $LevA (0,1000000,1)
set_text ($LevA, “Livello A”)
declare ui_knob $LevB (0,1000000,1)
set_text ($LevB, “Livello B”)
declare ui_knob $LevC (0,1000000,1)
set_text ($LevC, “Livello C”)
La callback init ora è la seguente:
on init
declare ui_switch $A
$A:=1
set_text ($A, “Close”)
declare ui_button $B
$B :=0
set_text ($B, “Reverb”)
declare ui_button $C
$C :=0
set_text ($C, “Delay”)
move_control ($B, 1,2)
move_control ($C, 1,3)
declare ui_knob $LevA (0,1000000,1)
set_text ($LevA, “Livello A”)
declare ui_knob $LevB (0,1000000,1)
set_text ($LevB, “Livello B”)
declare ui_knob $LevC (0,1000000,1)
set_text ($LevC, “Livello C”)
make_perfview
end on
Ora colleghiamo le manopole create alla manopola del volume dei bus.
A tal fine possiamo utilizzare all’interno della callback ui_control dedicata alla manopola creata il comando set_engine_par che ha la seguente sintassi:
set_engine_par (<parametro>,<valore>,<gruppo>,<slot>,<generic>)
Questo comando controlla parametri di Kontakt e i pulsanti di bypass.
<parametro> è il parametro che deve essere controllato con una variabile interna.
<valore> è il valore che va impostato per il parametro (l’intervallo di valori è sempre da 0 a 1000000 ad eccezione degli switch che è 0 o 1).
<gruppo> è l’indice del gruppo (partendo da zero) nel quale risiede il parametro specificato. Se il parametro è relativo al volume dell’istrument o di un bus occorre inserire -1.
<slot> è l’indice relativo allo slot (partendo da zero) dello specifico parametro. Si applica solamente ad un gruppo/istrument effects, modulators e intensità di modulazione. Per gli effetti in gruppo/instrument questo parametro indica lo slot dove risiede l’effetto. Per i modulators e le intensità delle modulazioni questo parametro indica l’indice che si può trovare usando il comando find_mod (<group-idx>,<mod-name>). Per tutte le altre applicazioni occorre impostare il parametro a -1.
<generic> si applica ad un effetto e ai modulators interni. Per gli effetti occorre scrivere 1 (Insert effect) o 0 (Send effect). Per i bus il parametro indica il bus attuale e occorre inserire $NI_BUS_OFFSET+[0-15] dove il numero nella parentesi quadra (che non va inserita ma è qui utilizzata solamente per indicare che va inserito uno di quei numeri) indica uno dei 16 bus. Per i modulatori interni il parametro indica la modulation slider che può essere trovata usando il comando find_target (<group-idx>,<mod-idx>,<target-name>). Per tutte le altre applicazioni impostare questo parametro a -1).
Nel nostro caso occorre dire che la manopola controllerà quella del volume del bus 1, pertanto occorrerà scrivere:
on ui_control ($LevA)
set_engine_par ($ENGINE_PAR_VOLUME, $LevA, -1, -1, $NI_BUS_OFFSET+0)
end on
Cliccate su apply e provate a muovere la manopola LevA. Automaticamente si muoverà anche la manopola Volume del bus 1.
Se confrontiamo i valori delle due manopole troviamo che una indica i decibel (-5,31 dB) mentre quella creata il valore 81429. Sarebbe il caso di trasformare il valore della manopola LevA a quello del Volume del bus. A tal fine possiamo usare il comando set_knob_label (<variabile>,<testo>) il cui compito sarebbe quello di assegnare una stringa testo ad una manopola. Invece di inserire il testo si può utilizzare il comando get_engine_par_disp (<parametro>,<gruppo>,<slot>,<generic>) che mostra la stringa di testo di uno specifico parametro (nel nostro caso il valore della manopola volume del bus).
<parametro> è il parametro che deve essere controllato.
<gruppo> è l’indice del gruppo (partendo da zero) nel quale risiede il parametro specificato. Se il parametro è relativo al volume dell’istrument o di un bus occorre inserire -1.
<slot> è l’indice relativo allo slot (partendo da zero) dello specifico parametro. Si applica solamente ad un gruppo/istrument effects, modulators e intensità di modulazione. Per gli effetti in gruppo/instrument questo parametro indica lo slot dove risiede l’effetto. Per i modulators e le intensità delle modulazioni questo parametro indica l’indice che si può trovare usando il comando find_mod (<group-idx>,<mod-name>). Per tutte le altre applicazioni occorre impostare il parametro a -1.
<generic> si applica ad un effetto e ai modulators interni. Per gli effetti occorre scrivere 1 (Insert effect) o 0 (Send effect). Per i bus il parametro indica il bus attuale e occorre inserire $NI_BUS_OFFSET+[0-15] dove il numero nella parentesi quadra (che non va inserita ma è qui utilizzata solamente per indicare che va inserito uno di quei numeri) indica uno dei 16 bus. Per i modulatori interni il parametro indica la modulation slider che può essere trovata usando il comando find_target (<group-idx>,<mod-idx>,<target-name>). Per tutte le altre applicazioni impostare questo parametro a -1).
Nel nostro caso il parametro è controllato dalla variabile interna $ENGINE_PAR_VOLUME.
on ui_control ($LevA)
set_engine_par ($ENGINE_PAR_VOLUME, $LevA, -1, -1, $NI_BUS_OFFSET+0)
set_knob_label ($LevA, get_engine_par_disp ($ENGINE_PAR_VOLUME, -1, -1, $NI_BUS_OFFSET+0))
end on
Premendo su apply ora le due manopole mostrano gli stessi valori.
Praticamente set_knob_label () è usato per cambiare il valore mostrato di una manopola e get_engine_par_disp () per associare il valore a quello della manopola del volume del bus 1.
E’ presente un problema. Nel momento in cui si clicca su apply o quando si carica lo script da un preset o si ricarica ad esempio lo strumento in un sequencer vedremo il valore della manopola creata resettata a 0. Invece, per vedere il valore della manopola del volume relativo al bus 1 occorre copiare il comando set_knob_label () nella callback init ed utilizziamo poi il comando make_persistent ().
on init
declare ui_switch $A
$A:=1
set_text ($A, “Close”)
declare ui_button $B
$B :=0
set_text ($B, “Reverb”)
declare ui_button $C
$C :=0
set_text ($C, “Delay”)
move_control ($B, 1,2)
move_control ($C, 1,3)
declare ui_knob $LevA (0,1000000,1)
set_text ($LevA, “Livello A”)
set_knob_label ($LevA, get_engine_par_disp ($ENGINE_PAR_VOLUME, -1, -1, $NI_BUS_OFFSET+0))
make_persistent ($LevA)
declare ui_knob $LevB (0,1000000,1)
set_text ($LevB, “Livello B”)
declare ui_knob $LevC (0,1000000,1)
set_text ($LevC, “Livello C”)
make_perfview
end on
Come ultima operazione dobbiamo dire che l’unità utilizzata nella manopola creata è il decibel in quanto il volume del bus è espresso in decibel. Per compiere questa operazione utilizziamo il comando set_knob_unit (<nome controllo>, $KNOB_UNIT_<unità>). Le unità possibili sono: HZ, DB, ms, %, Octave, Semitone.
on ui_control ($LevA)
set_engine_par ($ENGINE_PAR_VOLUME, $LevA, -1, -1, $NI_BUS_OFFSET+0)
set_knob_label ($LevA, get_engine_par_disp ($ENGINE_PAR_VOLUME, -1, -1, $NI_BUS_OFFSET+0))
set_knob_unit ($LevA, $KNOB_UNIT_DB)
end on
Premete su apply per vedere l’unità di misura comparire dopo il valore mostrato per la manopola realizzata.
La stessa operazione occorre ripeterla per le altre due manopole pertanto il nostro script completo sarà il seguente:
on init
declare ui_button $A
set_text ($A, “Percussion”)
$A := 1
declare ui_button $B
set_text ($B, “Pad”)
$B := 0
declare ui_button $C
set_text ($C, “Loop”)
$C := 0
move_control ($B, 1,2)
move_control ($C, 1,3)
declare ui_knob $LevA (0,1000000,1)
set_text ($LevA, “Livello A”)
set_knob_label ($LevA, get_engine_par_disp ($ENGINE_PAR_VOLUME, -1, -1, $NI_BUS_OFFSET+0))
make_persistent ($LevA)
declare ui_knob $LevB (0,1000000,1)
set_text ($LevB, “Livello B”)
set_knob_label ($LevB, get_engine_par_disp ($ENGINE_PAR_VOLUME, -1, -1, $NI_BUS_OFFSET+1))
make_persistent ($LevB)
declare ui_knob $LevC (0,1000000,1)
set_text ($LevC, “Livello C”)
set_knob_label ($LevC, get_engine_par_disp ($ENGINE_PAR_VOLUME, 1, -1, $NI_BUS_OFFSET+2))
make_persistent ($LevA)
make_perfview
end on
on note
if ($A=1)
allow_group (0)
else
disallow_group (0)
end if
if ($B=1)
allow_group (1)
else
disallow_group (1)
end if
if ($C=1)
allow_group (2)
else
disallow_group (2)
end if
end on
on ui_control ($A)
if ($A=0)
purge_group (0,0)
else
purge_group (0,1)
end if
end on
on ui_control ($B)
if ($B=0)
purge_group (1,0)
else
purge_group (1,1)
end if
end on
on ui_control ($C)
if ($C=0)
purge_group (2,0)
else
purge_group (2,1)
end if
end on
on ui_control ($LevA)
set_engine_par ($ENGINE_PAR_VOLUME, $LevA, -1, -1, $NI_BUS_OFFSET+0)
set_knob_label ($LevA, get_engine_par_disp ($ENGINE_PAR_VOLUME, -1, -1, $NI_BUS_OFFSET+0))
set_knob_unit ($LevA, $KNOB_UNIT_DB)
end on
on ui_control ($LevB)
set_engine_par ($ENGINE_PAR_VOLUME, $LevB, -1, -1, $NI_BUS_OFFSET+1)
set_knob_label ($LevB, get_engine_par_disp ($ENGINE_PAR_VOLUME, -1, -1, $NI_BUS_OFFSET+1))
set_knob_unit ($LevB, $KNOB_UNIT_DB)
end on
on ui_control ($LevC)
set_engine_par ($ENGINE_PAR_VOLUME, $LevC, -1, -1, $NI_BUS_OFFSET+2)
set_knob_label ($LevC, get_engine_par_disp ($ENGINE_PAR_VOLUME, 1, -1, $NI_BUS_OFFSET+2))
set_knob_unit ($LevC, $KNOB_UNIT_DB)
end on
Pingback: Kontakt: gli script (parte 11) | tecnologiamusicale