KONTAKT SCRIPTING TUTORIAL – QUINTA PARTE

Written by Antonio Antetomaso on . Posted in Software, Tutorial

Dopo aver introdotto i concetti di base necessari per la programmazione di una interfaccia grafica in ambiente Kontakt in questa puntata entreremo maggiormente nel dettaglio cercando di mostrare come far funzionare questi componenti facendo in modo che svolgano efficacemente il compito a loro destinato dal programmatore. Non penserete mica che basti piazzare quattro potenziometri, tre label, 2 slider e un pulsante? Quella è la facciata del palazzo, ma poi tocca completare gli interni e arredare no?

Di Antonio Antetomaso

Orbene, rimbocchiamoci le mani e iniziamo, ci sarà da divertirsi. Da che cosa iniziamo? Direi dal ricordare che ogni parametro che può essere automatizzato all’interno di Kontakt è accessibile mediante scripting ed è indirizzato dalle variabili built in messe a disposizione dall’interprete.

Va da sè che la cosa più logica da fare è associare ciascun componente grafico inserito nella nostra bella interfaccia ad un determinato parametro di Kontakt di cui vogliamo controllare il comportamento e progettare le righe di codice necessarie affinchè tale associazione avvenga con successo.

Un po’ come quando si progetta una interfaccia grafica per un software a finestre (per chi è pratico naturalmente) e bisogna scrivere il codice associato alla pressione di un pulsante, alla selezione di un valore da una lista e così via. Non ditemi che non avete mai programmato un‘interfaccia in Visual C++? Ah no? Strano….è una cosa comune..

Torniamo seri, ricordate i componenti grafici introdotti la scorsa puntata? Erano un potenziometro rotativo e una label. Come pure, ricordiamo un attimo quanto abbiamo realizzato in uno degli esempi scorsi: abbiamo associato all’evento di pressione di una nota il pilotaggio del parametro di bypass di un effetto. Adesso faremo la stessa cosa associando al potenziometro rotativo il controllo della frequenza di taglio di un filtro. 

Per far questo, una volta dichiarata l’interfaccia, impostata l’altezza e allocato un potenziometro rotativo di valore massimo pari a 1.000.000 (il massimo possibile per un qualunque parametro Kontakt), allochiamo un bel filtro passa basso nel primo slot degli effetti group, così:

Per pilotare l’effetto, ricordate, dobbiamo usare la funzione set_engine_par() specificando il parametro da controllare e i valori da impostare. Si ma la domanda più importante non è cosa dobbiamo fare, ma dove dobbiamo inserire la chiamata a questa funzione. La risposta è nella funzione

 

on_ui_control()

 

end on

 

cioè in una apposita funzione di callback associata al filtro stesso naturalmente. Non basta, questa volta dobbiamo passare alla funzione di callback anche la variabile associata al componente dell’interfaccia destinato al controllo del filtro, il potenziometro appunto. Per cui:

 

on_ui_control($myKnob)

 

end on

 

All’interno della funzione, dicevamo, dobbiamo inserire una opportuna chiamata a set_engine_par() passando come parametri i valori decisi dal potenziometro rotativo. La variabile built-in  da utilizzare per il controllo della frequenza di taglio del filtro passa basso è $ENGINE_PAR_CUTOFF. Per passare come secondo parametro il valore del potenziometro è sufficiente indicare il nome della variabile ad esso associata, così:

 

set_engine_par ($ENGINE_PAR_CUTOFF,$myKnob,…)

 

Andiamo veloci, passeremo 0 come numero del gruppo in cui è presente l’effetto e 0 per lo slot in cui esso è inserito. Dato che non si parla nè di effetti insert nè di send passeremo -1 come ultimo parametro. Alla fine la riga di codice da inserire è la seguente:

 

set_engine_par ($ENGINE_PAR_CUTOFF,$myKnob,0,0,1)

 

In figura l’esempio completo:

Se proverete a muovere il potenziometro visualizzando il pannello degli effetti, noterete come in simultanea si muova anche la frequenza di taglio del filtro passa basso inserito. Carino no?

Un occhio attento potrebbe notare che non c’è alcuna corrispondenza tra il valore effettivo della frequenza di taglio mostrata dal potenziometro del filtro e il valore mostrato dal nostro potenziometro stesso. Perchè non impostare questa corrispondenza mostrando sull’interfaccia principale il giusto valore? Per fare questo abbiamo bisogno di prelevare il valore impostato per la frequenza di taglio direttamente dal filtro e settarlo come etichetta sul nostro potenziometro. Niente di più facile, il tutto si fa con due righe di codice:

 

get_engine_par_disp()

set_knob_label()

 

Non vorrei offendere la vostra intelligenza andando a specificare quale delle due funzioni fa cosa, è lapalissiano no?

Alla prima funzione passeremo ancora il nome del parametro da prelevare, il numero di gruppo e slot e -1 perchè non si tratta nè di effetto insert, nè di effetto send.

Alla seconda funzione passeremo la variabile associata al potenziometro e…il risultato della prima funzione naturalmente.

Adesso va molto meglio, tuttavia ancora non abbiamo finito. Eh già perchè, non so se ci avete fatto caso, ma quando si preme il pulsante Apply, il valore mostrato per il nostro potenziometro torna a 0 anzichè mostrare il reale valore della frequenza di taglio minima del filtro passa basso. Niente paura, il tutto si risolve andando a riportare la funzione di impostazione della label anche nel blocco on init.

Ancora non ci siamo, le cose sono migliorate dal punto di vista della label, ma la posizione del potenziometro torna comunque a zero quando si clicca su Apply. Arrrgghhhh!!! Peggio mi sento, direte voi. Ancora niente paura, una bella chiamata alla funzione

 

make_persistent($myKnob)

 

inserita ancora nel blocco on init e la vita ci sorriderà. E adesso il tocco finale, che ne dite di mostrare il valore in Hz visto che il potenziometro dell’effetto utilizza questa modalità di display? E che ci vuole, direte voi, concateno la stringa “Hz” al secondo parametro della funzione set_knob_label() e il gioco è fatto? Provateci un po’….

Come vedete, la cosa “funzionicchia”, nel senso che la scritta compare, però si vede tagliata. Non è evidentemente il modo migliore per raggiungere l’obiettivo. E difatti quello che dobbiamo fare è impostare l’unità di misura per i valori mostrati dal nostro potenziometro. Per fare questo utilizzeremo la funzione

 

set_knob_unit()

 

passando in ingresso, come di consueto, la variabile associata al potenziometro e un’altra variabile built-in di Kontakt, $KNOB_UNIT_HZ di ovvio significato.

 

Adesso le cose funzionano come devono. Prima di chiudere, vorrei offrirvi il dolce affrontando l’ultimo argomento della mini serie: la customizzazione delle interfacce, ovverosia come conferire alle interfacce Kontakt un look’n feel diverso da quello standard e, quindi, (potenzialmente) maggiormente accattivante.

 

Quello che dobbiamo fare è naturalmente trovare il modo di importare in Kontakt un’immagine da associare ai nostri componenti da personalizzare, rendere questa immagine disponibile all’ambiente di scripting e, infine, associarla concretamente ai nostri componenti grafici. Vi assicuro che è più facile a farsi che a dirsi.

 

Iniziamo dal formato dell’immagine:  2 formati ammessi, il PNG e il TGA. I files del secondo tipo devono essere non compressi con una risoluzione di 16 o 24 bit. Le immagini possono includere un canale alpha per la gestione della trasparenza ma ciò non implica che l’interprete Kontakt usi tale prerogativa automaticamente, il tutto andrà opportunamente impostato.

 

Proseguiamo parlando della posizione in cui inserire le immagini perchè vengano viste con successo da Kontakt:

 

~/Documenti/Native Instruments/Kontakt 5/pictures

 

in ambiente MAC OSX, mentre sotto

 

My Documents/Native Instruments/Kontakt 5/pictures

 

in ambiente Windows. Una volta inseriti i nostri file immagine nella giusta cartella possiamo passare allo step successivo, associare l’immagine al componente grafico da codice. Facciamo un esempio con una label:

 

on init

make_perfview

declare ui_label $ui_violin(1,1)

set_control_par_str (get_ui_id($ui_violin), $CONTROL_PAR_TEXT, “”)

    set_control_par_str (get_ui_id($ui_violin), $CONTROL_PAR_PICTURE, “string_main”)

end on

 

Abbastanza semplice, dichiariamo la nostra label, eliminiamo il testo da essa e utilizziamo la funzione set_control_par_str passando in ingresso l’indentificativo della label, il nome del parametro da modificare e il nome del file relativo all’immagine. Kontakt, farà il resto, riconoscendo automaticamente anche il formato dell’immagine.

Da notare come accanto all’immagine, una volta che essa è stata caricata, Kontakt crei un file txt avente il medesimo nome dell’immagine stessa e avente questo contenuto:

 

Has Alpha Channel: no

Number of Animations: 0

Horizontal Animation:  no

Vertical Resizable: no

Horizontal Resizable: no

Fixed Top: 0

Fixed Bottom: 0

Fixed Left: 0

Fixed Right:  0

 

E’ in questo files (in particolare nella prima riga) che si imposta la gestione della trasparenza. Per gli altri parametri vi rimando alla documentazione presente sul manuale dello scripting di Kontakt (il KSP).

 

La stessa cosa può essere fatta per i Knob, ma solo a partire da Kontakt 5. Con l’ultima versione del campionatore, infatti hanno potenziato particolarmente la possibilità di customizzare le interfacce grafiche (Neo Soul Keys, ripeto, ne è un esempio).

 

E se ho Kontakt 4? Esiste un barbatrucco che fa uso degli slider e che vi riporto senza ulteriori convenevoli:

 

on init
declare ui_slider $knob (1,5)
set_control_par_str(get_ui_id($knob),$CONTROL_PAR_TEXT,””)
set_control_par_str(get_ui_id($knob),$CONTROL_PAR_PICTURE,”test_knob”)
set_control_par(get_ui_id($knob), $CONTROL_PAR_MOUSE_BEHAVIOUR, -500)
end on

Ci sono tuttavia un paio di cosette da considerare quando si usano gli sliders:

  • Bisogna creare manualmente le label che mostrano i valori assunti dallo slider;
  • Se l’animazione utilizzata per lo slider contiene più frame di quanti sono i suoi valori, lo slider si comporterà comunque come deve ma la posizione grafica verrà ancorata al valore numerico più vicino, con un piccolo scatto del componente grafico al rilascio del mouse.
Bene amici, è tutto, ma veramente tutto. Al link trovate uno zip contenente i due esempi analizzati all’interno della puntata.
Spero che questa mini serie sia stata di vostro gradimento. Vi auguro buon divertimento con Kontakt e buona musica.

Tags: , ,

Trackback from your site.

Comments (13)

  • mauro

    |

    ecco….la parte piu importante non l’ho capita!!! da dove prendo le immagini per personalizzare il mio strumento? non è chiaro!!….sorry!!

    Reply

      • Antonio Antetomaso

        |

        Le immagini devi costruirtele tu rispettando le specifiche imposte dall’ambiente di Kontakt alla mano.

        GIMP alla mano (o Photoshop o altro..) e passa la paura. Oppure si cerca in rete, come nel caso dell’esempio fornito a corredo.
        Un saluto.

        Reply

  • Mauro

    |

    grazie,infatti stavo gia procedendo a fare proprio cosi e in effetti funziona alla grande….non vorrei essere d’impiccio…ma…se faccio un potenziometro ex novo…come faccio poi a farlo funzionare?
    grazie per l’eventuale risposta e buone feste!

    Reply

    • Antonio Antetomaso

      |

      In realtà quello che cambia è solo l’immagine associata al potenziometro, ma il controllo è quello standard di Kontakt. Per farlo funzionare devi seguire quanto spiegato nella serie di articoli, associando cioè una funzione di callback all’evento di rotazione, che istruisca Kontakt sul comportamento desiderato. Il “trucco” è sempre lo stesso. Buone feste anche a te.

      Reply

  • mauro

    |

    anche il manuale è piuttosto vago a proposito…mi pare di aver capito che bisogna creare una animazione…per esempio un potenziometro con 100 posizioni deve avere 100 animazioni diverse…ora io credo (e spero) di aver capito male…puoi fare un esempio pratico? poi giuro non disturbo piu…grazie! a proposito buone feste anche a te!!

    Reply

  • Enrico Cosimi

    |

    purtroppo, posso confermati che se vuoi vedere il movimento in 100 posizioni, devi fare le 100 bitmap individuali… è così per tutti i programmi 😐

    Reply

    • Antonio Antetomaso

      |

      Confermo, devi creare 100 fotogrammi in sequenza nei formati supportati da Kontakt. Ci sono però programmi che possono aiutarti.
      Antonio.

      Reply

  • mauro

    |

    si….ormai mi stavo rassegnando all’idea…non riesco ad immaginare quando devi dare 10.000 movimenti…mi pare impossibile.
    quello che pero mi sfugge è: come inserire nel programma queste posizioni multiple…vorrei semplicemente una stringa (o due) di esempio per almeno due posizioni…il resto (se il parkinson non mi assale) dovrei riuscire da me.Purtroppo anche il manuale in inglese è molto vago in proposito.Vi ringrazio ancora per la splendida pubblicazione e di nuovo buone feste!!!

    Reply

  • mauro

    |

    Alt…!! fermi tutti!!! m’è arrivata l’illuminazione!! in effetti non m’era chiaro come inserire 100 immagini nel programma e farle funzionare…ora invece ho trovato nel web sia un programmino che la soluzione del caso percio ora vado a smanettare ringraziandovi ancora!!!

    Reply

    • Antonio Antetomaso

      |

      Grazie a te per l’interesse. Cmq, si, se giri su Internet di esempi ne trovi a sufficienza. Come pure, altra cosa che ti suggerisco di fare è di prendere una libreria Kontakt già fatta con i custom UI controls, aprire l’editor e studiarti il codice. Non è proprio immediato immediato, ma è la soluzione migliore. Naturalmente non riuscirai a modificare il codice…ma leggerlo si. A presto.

      Reply

  • diobolik

    |

    grazie per il numero mancante; potrei essere un robot. Ma se fossi un robot, forse, non sarei qui.

    Sono a chiedere se qualcuno può aiutarmi a programmare i Vertical sliders in K5. Non sono un rookie. Ne ho fatto uno, ma stranamente mi va a rovescio. Cos’è che determina il range di scorrimento dello slider?
    Ho uno slider fatto di 10 steps.

    Reply

Leave a comment

Inserisci il numero mancante: *

ga('send', 'pageview');