Kontakt: gli script (parte 12)

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

090 KSP

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

091 KSP

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

092 KSP

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.

 093 KSP

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.

 094 KSP

Se invece abilitiamo il pulsante B allora suonando una nota risulterà solamente il gruppo B in riproduzione.

095 KSP

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.

096 KSP

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.

097 KSP

Subito dopo, associamo l’uscita del Bus 1 all’uscita generale del Kontakt.

098 KSP

Suonando una nota appartenente al gruppo A possiamo osservare che esce dal Bus 1.

099 KSP

Assegniamo il Gruppo B al Bus 2.

100 KSP

Assegniamo il Gruppo C al Bus 3.

101 KSP

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)

102 KSP

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”)

103 KSP

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.

104 KSP

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.

105 KSP106 KSP

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.

107 KSP108 KSP

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.

109 KSP

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

 

parte 13

Annunci

Informazioni su silviorelandini

sound designer, docente di tecnologie musicali, direttore iitm
Questa voce è stata pubblicata in Campionamento, Corsi, Software, Sound Designing e contrassegnata con , . Contrassegna il permalink.

Una risposta a Kontakt: gli script (parte 12)

  1. Pingback: Kontakt: gli script (parte 11) | tecnologiamusicale

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...