Fondamenti di VVVV - VVVV fundamentals
Transcript
Fondamenti di VVVV - VVVV fundamentals
Fondamenti di VVVV Tutorial introduttivo al software multiproposito VVVV Translated and commented by Lanvideosource www.lanvideosource.net [email protected] www.vimeo.com/lanvideosource www.flickr.com/photos/zeno77 INDICE PREFAZIONE __________________________________________________________________________________ 3 COLLEGARE E MODIFICARE I NODI _____________________________________________________________ 5 PARTIRE DALLA FINE: IL RENDERING ___________________________________________________________ 6 IL PANNELLO DI ISPEZIONE ___________________________________________________________________10 PATCHATE E MOLTIPLICATEVI: GLI SPREADS ___________________________________________________12 ACCEDERE E MODIFICARE I SINGOLI SLICE _____________________________________________________15 I NODI DI INPUT/OUTPUT: LE IOBOX __________________________________________________________17 CREARE INTERFACCE DI CONTROLLO CON LE IOBOX ___________________________________________20 SPREADING AVANZATO_______________________________________________________________________21 GESTIONE SEMPLIFICATA DI ISTANZE MULTIPLE ________________________________________________22 VVVV è un software creato da meso (http://www.meso.net/) circa cinque anni fa. Viene proposto come “kit multiproposito”, sebbene sia pensato principalmente come ambiente di programmazione per il sistema DirectX di windows. Dal punto di vista delle possibilità offerte, permette di generare vettori e forme nello spazio 3d, leggere e proiettare clip e tracce audio, far interagire l’ambiente di programmazione DirectX con tutta una serie di interfacce esterne come controllers midi, Arduino, banchi di controllo luci, ecc. Permette di importare, esportare e modificare modelli creati con Maya, 3D studio o C4D, permette l’utilizzo di plugin esterne come le freeframe, per modificare video o oggetti 3D. Tramite la tecnica del Boygrouping, VVVV ha la possibilità di dividere su più computer lo streaming video, offrendo la possibilità di proiettare su un numero indefinito di proiettori. Due sono le caratteristiche che distinguono VVVV da altri software simili come Max/Jitter, Processing, Pure Data o Quartz Composer: la possibilità di implementare gli shaders e la semplicità nel creare e gestire insiemi di dati. Degli insiemi di dati, detti “Spreads”, ne parleremo più avanti. Gli shaders sono invece dei “programmi”, continuamente sviluppati dalle aziende produttrici di schede video, che vengono fatti girare all’interno di VVVV che permettono di creare in maniera molto semplice effetti, scene o oggetti 3D o 2D. Questo tutorial introduttivo a VVVV rappresenta un primo passo nel mondo di questo software e vi permetterà di familiarizzare con le funzioni di base ed i suoi principi. Vi consiglio di studiarlo con attenzione perché le nozioni che troverete di seguito sono basilari ed assolutamente necessarie per un uso consapevole di VVVV. Finito il tutorial, vi consiglio di incominciare con un po’ di reverse engineering cioè smontate e studiate le patch di quelli più bravi di voi. Ricordate che potrete sempre vedere e modificare qualsiasi patch. Magari iniziate con quelle contenute nella cartella Girlpower all’interno della directory di VVVV. Questo tutorial è la traduzione (con aggiunte ed annotazioni) di quello composto dalla community e che trovate in tre lingue al link: pertanto si ringrazia la comunità VVVV tutta. VVVV gira solo sotto Windows XP e necessita di istallazione delle DirectX9.0c. Non gira in ambiente vista e con le DirectX10. Alcuni link utili per iniziare: Scaricare VVVV (E’ freeware finchè non lo si usa a scopi commerciali!) http://VVVV.org/tiki-download_file.php?fileId=1446 Il sito di VVVV - http://www.VVVV.org/ Altre informazioni sulle possibilità di VVVV - http://www.VVVV.org/tikiindex.php?page=propaganda Il forum di VVVV - http://www.VVVV.org/tiki-forums.php Cosa vuol dire ‘VVVV’? - http://www.VVVV.org/tiki-index.php?page=MeaningOfVVVV Pagine degli utenti VVVV - http://www.VVVV.org/tiki-index.php?page=user Tutorial e patch dimostrative - http://www.VVVV.org/tikiindex.php?page=Documentation 2 Avete avviato VVVV per la prima volta e vi state chiedendo come imparare ad usarlo e come ottenere qualcosa di utile. Prendetevi del tempo e continuate a leggere, in circa 20 minuti avrete completato il vostro primo tutorial e avrete capito il funzionamento base di VVVV. Appena avete avviato VVVV si è aperta automaticamente una patch di esempio per mostrare ciò che si può ottenere. Se volete passare oltre ed iniziare a usare il software non dovete fare altro che cancellare il file Args.txt nella directory di VVVV. Ora chiudete premendo la combinazione classica di windows: ALT+F4. Vi verrà chiesto di salvare il file, per il momento cliccate su Don't save and Close. Avviate di nuovo VVVV e l'esempio di prima è scomparso, tutto ciò che vedrete è una finestra grigia vuota chiamata patch. Benvenuti in VVVV. PREFAZIONE VVVV usa oggetti grafici per la programmazione al posto di un interfaccia testuale. I programmi vengono creati all’interno di patches. Le operazioni individuali o le funzioni vengono rappresentate come moduli, chiamati nodi. Le varie connessioni tra i nodi vengono disegnate e modificate usando il mouse in modo da creare strutture che inviano dati da un nodo all'altro. 3 Generalmente, un nodo, come una funzione, genera o processa dei dati. Alcuni nodi operano una combinazione di queste due operazioni. Ogni nodo può avere vari input e output, rappresentati da piccoli quadrati neri sopra o sotto al nodo stesso, questi quadratini vengono chiamati pins. Facendo un confronto con la programmazione testuale i pins di input rappresentano i parametri/argomenti di una funzione, mentre i pins di output rappresentano ciò che la funzione restituisce. Basta con la teoria. Passiamo alla pratica.. Avete quindi aperta davanti una finestra grigia vuota. E’ un po’ difficile all’inizio capire come inserire i nodi o gli oggetti all’interno della patch o dove si trovino i menù di programma. Sono tutti sotto i pulsanti del mouse: - Premendo il tasto centrale del mouse (oppure SPACE + right button per chi non ce l’ha sul mouse) appare il menù principale del programma da cui è possibile salvare la patch, caricare, cercare dei nodi, copiare/incollare ecc.. Per il momento create una nuova patch premendo CTRL+P (oppure fatelo dal menu’ principale) ed una nuova finestra grigia apparirà esattamente sotto il puntatore. all’interno della nuova patch potrete CREARE DEI NODI cliccando due volte con il sinistro dove vi pare in uno spazio vuoto della patch. Appare il cursore che chiede di digitare il nome del nodo da inserire. Dal momento che all’inizio non conoscerete il nome dei nodi che vi servono, è possibile mostrare una lista dei nodi disponibili (già compresi nella versione scaricabile), premendo il pulsante destro del mouse sul nodo vuoto per scegliere il nodo da creare. Ne sono tanti, ma vedrete che andando avanti con lo studio del programma digiterete direttamente il nome dei nodi che cercate e che vi servono in quel momento. Presto vi renderete conto che è buona norma crearsi delle patch ‘clipboard’ contenenti i nodi che richiamate più spesso, in modo da poterli semplicemente copiare/incollare. Così si crea un NODO. - Cliccate due volte con il sinistro, Incominciate a digitare con la tastiera “IObox” e vi accorgerete che mentre digitate appaiono i nodi che posseggono quel nome. Come potete vedere, il nome di un nodo è diviso in due parti: il nome e la ‘categoria’. Ogni nodo è assegnato ad una categoria (arbitraria) che ne determina la tipologia. Come potete vedere esistono vari nodi con lo stesso nome ma appartenenti categorie diverse. Si potrebbe dire che fanno la stessa operazione ma in domini di informazione diversi. - Create quindi una IObox digitando ‘IObox’ e scegliendo IObox (Value). Vi si è creata una di queste 4 - Adesso copiatela ed incollatela altre due volte con la consueta combinazione ctrl + C , ctrl + V. I nodi si possono copiare ed incollare (con gli stessi valori di input e output) un numero arbitrario di volte. - Create un nodo ‘ADD’ ciccando due volte con il sinistro e digitando il simbolo ‘+’ con la categoria (value) tra le varie versioni dell’ADD. Avete creato quindi una funzione (Addiziona) con tre parametri: due input ed un output. Adesso vanno collegati tra loro i quattro nodi. COLLEGARE E MODIFICARE I NODI Se muovete il puntatore sui ‘pins’ (quei quadratini in alto ed in basso di un nodo) potete ispezionare il valore di input ed output. In genere i pins di input sono quelli in alto e quelli di output sono in basso. Se premete con il destro su un pin e muovete il cursore in alto ed in basso potete cambiare il valore di quel pin oppure ciccando con il destro sul pin potete digitare direttamente il valore dalla tastiera. Se guardate i pin di input ed output del nodo ‘+’ vedrete che sono settati a zero. Possiamo assegnare dei valori ben visibili o LISTE DI VALORI ai pin di qualsiasi nodo utilizzando le IOboxes che avete creato prima. - Collegate l’output di due delle IObox ai due input del nodo ‘+’ semplicemente ciccando con il sinistro sui nodi e collegando, con la linea che si viene a creare, i pin dei nodi. Collegate anche il pin di output del nodo ‘+’ all’input (pin in alto) della terza IObox. Per eliminare un collegamento basterà selezionarlo con un click e premere il tasto DEL. Stessa cosa per cancellare un nodo: click sul nodo e DEL. 5 Cliccando e trascinando un nodo potrete sistemarlo dove volete nella patch, questo non influirà in alcun modo sul suo funzionamento, ma sicuramente influenzerà la leggibilità e ‘manegevolezza’ della patch stessa. Raccomando sin da subito di tentare di essere ordinati nell’architettura della patch (almenochè non si voglia lavorare con il caos…). Si può creare una IObox (value) anche cliccando due volte con il destro sullo stage.. Collegati gli input e gli output del nodo ‘+’ alle IObox, la funzione ADD incomincia a funzionare, sommando i valori contenuti nelle due IObox di input e restituisce ll prodotto dell’operazione attraverso la IObox di output. - Se premete con il destro su una IObox e muovete in alto o in basso potete aumentare o diminuire il valore di una IObox oppure premendo due volte con il destro potrete immettere direttamente il valore. Cambiando i due addendi vedrete cambiare il valore di output. In linea di principio, come abbiamo detto, in VVVV ogni nodo rappresenta una funzione di qualche tipo effettuata sull’input, che dà come risultato l’output. PARTIRE DALLA FINE: IL RENDERING Il VVVV è un software principalmente pensato per creare immagini sfruttando le DirectX di windows (il VVVV utilizza la versione 9) quindi il suo principale (ma non unico) prodotto è rappresentato da una ‘proiezione’. Questa proiezione si definisce, in VVVV, Rendering. Quindi tra i vari moduli che potete creare troverete dei moduli Renderer, di diversi tipi. Tutti questi moduli di renderer sono associati ad una finestra e rappresentano il vostro output video. I moduli Rendrer nella lista appartengono a categorie diverse e vengono utilizzati per renderizzare o visualizzare diversi ‘tipi’ di informazione. - Creare e gestire una finestra di rendering: per il momento create un modulo Renderer della categoria GDI (Renderer (GDI)) cliccando due volte 6 con il sinistro nella patch e digitando Renderer. Dalla lista Scegliete il renderer giusto.. Il renderer GDI, ed in generale i moduli GDI gestiscono principalmente il testo ed effetti di base. Vengono utilizzati dai progettisti grafici principalmente per il debug, la visualizzazione rapida e per scopi didattici. La modalità principale di rendering ed il livello principale di lavoro in VVVV è il DX9 e viene gestito appunto dai moduli DX9 ed EX9 e permette di creare oggetti grafici ed effetti più complessi. Adesso utilizziamo i moduli GDI perché più semplici. Una volta creato il modulo Renderer (GDI), noterete che esso appare come una finestra all’interno patch. Per il momento quello sarà il vostro output video. Se passate con il mouse sui pin di ingresso del Renderer, vedrete gli ‘attributi’ di quella finestra di rendering. Potete visualizzare la finestra di rendering sia all’interno sia all’esterno della patch, come una finestra a parte. Cliccando su un modulo renderer e premendo CTRL + 1 e CTRL + 2 potete switchare tra le due modalità. Inoltre, con CTRL + 3, dopo aver selezionato un renderer, potete metterlo in FULL SCREEN. Per uscire dalla modalità fullscreen premere CTRL + 1 o CTRL + 2. Inoltre, per poter prendere degli screenshot della finestra attiva, basta premere… Questi comandi e modalità di visualizzazione sono comuni a tutti i tipi di renderer. Un po’ di colore. Il renderer che avete creato possiede un pin di input ‘Background Color’ tramite cui potrete decidere il colore di sfondo della scena renderizzata. - Ciccate con il destro sul pin ‘Background Color’ e vi si aprirà un riquadro colorato in cui potete, smanettando opportunamente, cambiare il colore: Con il pulsante destro e muovendo in alto ed in basso potete cambiare la luminosità. Cliccando con il destro e spostando il mouse a sinistra e destra scegliete il colore o la Hue. Tendo premuto CTRL e trascinando il mouse si può modificare invece la saturazione. 7 Cliccate dove vi pare all’esterno della color box per accettare il colore. La vostra patch si presenterà più o meno così.. Chiaramente potete riposizionare la finestra di rendering trascinandola dal bordo oppure potete ingrandirla/rimpicciolirla trascinando l’angolo inferiore destro. Esplorate gli attributi di una finestra di rendering, sono moduli molto importanti e vanno conosciuti bene. Create un modulo Text (GDI) (mi raccomando di scegliere la categoria giusta). Il modulo Text (GDI) che avete appena creato possiede un pin di input Text. Cliccate con il destro e nel box che vi si è aperto digitate qualcosa di non troppo lungo. Il pin ‘Font’ invece permette di scegliere il carattere. - Collegate il pin di output del modulo Text all’input del Reneder (GDI), dovrebbe essere il primo a sinistra. Succede questo. Adesso proviamo un po’ di interazione. Diciamo che vogliamo che il movimento verticale del mouse stabilisca le dimensioni del testo ed che le dimensioni del testo varino tra 15 e 50. 8 E’ molto semplice, in VVVV, catturare la posizione del mouse: Ogni finestra di rendering ha due pin di output, X output ed Y output che restituiscono le coordinate X ed Y del mouse QUANDO IL PUNTATORE PASSA SULLA FINESTRA DI RENDERING. I valori di posizione vanno da -1, -1 (mouse in basso a sinistra) a +1, +1 (mouse in alto a destra). Quindi dobbiamo trasformare questi valori dal range -1 +1 al range 15/50 per ottenere dimensioni leggibili del testo. - Create un modulo Map (Value)? cliccando due volte con il sinistro. Oppure potete fare in un altro modo: trasformate il nodo + (value) che avete creato prima in un Map (Value). Cliccate due volte sul nodo + e sostituite il + digitando ‘Map’ e scegliendo tra i possibili la categoria (Value). E’ quindi possibile trasformare i nodi da un tipo all’altro semplicemente cambiandone il nome. Il modulo Map lo userete all’ossessione e serve per trasformare i valori in input traslandoli da un range ad un altro da voi scelto. Tramite i pin di input, impostate il modulo Map (Value) così: - Source Minimum: -1 Source Maximum: 1 Destination Minimum: 15 Destination Maximum: 50 Mapping: Clamp In questo modo, spostando il mouse in alto ed in basso ingrandirete o rimpicciolirete il testo. Ricordate sempre che quando lavorate avete sempre almeno due valori belli pronti per poter controllare e interagire con il comportamento della vostra patch: le coordinate x ed y del mouse! 9 IL PANNELLO DI ISPEZIONE Poiché siamo partiti dall’inizio, tanto vale dare uno sguardo all’unica altra finestra che vi capiterà di vedere mentre lavorate con VVVV. Ogni modulo, come abbiamo visto, possiede dei pin di input ed output che rappresentano le ‘variabili’ in entrata ed uscita di quel modulo. Sino al momento abbiamo visto che è possibile modificare tali valori (solo quelli in input) in almeno tre modi: cliccando con il destro sul pin e trascinando il mouse, cliccando due volte con il destro sul pin per immettere direttamente un valore oppure collegando ad un pin una IObox impostata con un valore scelto da voi, che si potrebbe definire un modo per creare una variabile o una costante. Esiste anche un altro modo per ‘ispezionare’ e settare un modulo in maniera molto pratica e veloce: l’Inspektor. Per mostrate la finestra di Inspektor associata ad un modulo: cliccare su un modulo e premere CTRL+I. Per esempio, create un modulo Renderer (EX9). Cliccando sul nodo Renderer che vi si è aperto e premendo CTRL + I vi si aprirà la finestra di Inspektor associata ad esso, tramite la quale potrete impostare i parametri del nodo. La finestra dovrebbe apparire simile a questa: 10 Come potete vedere, ci sono tutti i valori dei pin di input e quelli di output. Premendo con il destro su un valore di input e trascinando il mouse in alto ed in basso sarà possibile modificare tutti i valori di input del nodo cui è associato l’inspektor. Noterete, a sinistra di ogni valore, un quadratino che può essere pieno o vuoto. Quando è pieno, quella variabile è visibile come pin di input o output in alto o in basso al nodo. Il quadratino vuoto indica che quella variabile è ‘nascosta’. Questo vi permette di tenere ordine nella patch, rendendo visibili solo i nodi che intendete modificare dal vivo e nascondendo quelli che non andranno modificati. Tenete presente che, se cercate un pin di un nodo ma non lo trovate, è possibile che sia ‘nascosto’. Agendo sull’inspektor potrete renderlo nuovamente visibile come pin. E’ buona norma tenere almeno una finestra Inspektor aperta: imparerete presto che ciò sveltisce notevolmente il lavoro e la modifica dei nodi. Se tenete aperto un solo Inspektor e cliccate su un nodo, quell’inspektor conterrà le informazioni relative a quel nodo. Se volete invece collegare stabilmente una finestra Inspektor ad un nodo, utilizzate il pulsante in alto a sinistra dell’Inspektor ‘Attach to Selection’. Un’altra interessante funzione dell’Inspektor è la possibilità di modificare contemporaneamente più nodi diversi. - - Create più nodi dello stesso tipo (per esempio create tre IObox (Value) oppure tre IObox (Color)). Selezionateli tutti e tre utilizzando il tasto SHIFT oppure cliccando sulla patch e creando un quadrato di selezione attorno ai tre nodi. Chiamate un Inspektor (CTRL + I) e modificatene i valori.. Avrete modificato contemporaneamente tutti i nodi selezionati. Nel caso in cui la selezione multipla comprenda nodi di tipo diverso, l’Inspektor mostrerà SOLO I PIN CHE QUESTI NODI HANNO IN COMUNE. 11 Avete imparato i fondamenti di VVVV: - Creare una nuova patch Creare dei nodi al suo interno Collegare i nodi tra loro Modificare i nodi Utilizzare la finestra di inspektor per modificare i nodi Adesso finalmente passiamo alla pratica, per mostrare una delle caratteristiche principali di VVVV: lo spreading, che si potrebbe tradurre con ‘moltiplicazione’. PATCHATE E MOLTIPLICATEVI: GLI SPREADS Nella maggior parte dei casi, quando avete intenzione di lavorare con istanze multiple di uno o più dati, siano essi valori, colori, file, textures o geometrie, VVVV è in grado di mantenere semplice l’architettura della patch utilizzando la tecnica dello ‘spreading’. La parola ‘spread’ in effetti denota nient’altro che una LISTA. Una lista di valori, colori, stringhe di testo, oggetti, ecc. Un singolo elemento di questa lista viene definito ‘Slice’ che si potrebbe tradurre (se proprio dobbiamo) in ‘fetta’ o semplicemente ‘livello’. Come abbiamo visto prima, ciascun pin di un nodo veicola informazioni di un tipo (valori, colori, trasformazioni, stringhe di testo, ecc.). Ciò che non ho detto è che un singolo pin può trasportare non solo una singola istanza di quell’informazione ma potenzialmente è in grado di trasportare istanze multiple (uno spread, appunto) di quel dato. Generatori di spead - E’ possibile visualizzare il numero di slice veicolate da uno specifico pin fermandocisi sopra con il puntatore. Create un nodo LinearSpread (Spreads) e fermatevi con il puntatore sul pin di output. Indica un bello 0.0000. Adesso settate il pin SpreadCount a 5, magari create una IObox (value) settata a 5 e collegatela a quel pin. Noterete che fermandovi sul pin di output appare un (5) alla destra del valore. 12 Ciò che indica è che l’output del nodo LinearSpread è costituito da 5 slices, in questo caso 5 valori. E’ importante tenere sempre presente che, anche se un pin mostra un solo valore alla volta, potrebbe stare trasportando una intera lista di valori. Quindi sempre occhio al numeretto tra parentesi affianco al valore se non volete andare al manicomio.. Se volete vedere TUTTE LE SLICE veicolate da un pin, bisogna avvalersi dell’amico Inspektor. - Cliccate sul nodo LinearSpread e richiamate un inspektor con CTRL+I. Cliccate con il mouse sul quadratino a destra del valore di output e l’inspektor vi mostrerà la lista dei valori (5 in questo caso) trasportati dal pin di output. Ogni slice è contrassegnata da un numero progressivo, PARTENDO DALLO ZERO. Questo valore viene detto ‘SliceIndex’. Se aumentate il valore del pin SpreadCount, vedrete aggiungersi altri valori della lista. Con un solo nodo avete creato una lista di valori diversi virtualmente infinita! Oltre al nodo LinearSpread, che crea una ‘progressione’ lineare di valori, esistono altri tipi di generatori di liste, sbizzarritevi a creare ‘nuvole di valori’ di varia natura tramite i quali, più avanti, potrete creare dei sistemi particellari. Alcuni generatori di spreads: CircularSpread (Spreads) RandomSpread (Spreads) I (Spreads) GaussianSpread (Spreads) E’ chiaro come sia semplice, in VVVV, creare liste di valori o ‘gruppi’ contenti istanze multiple di un dato. Poiché tutto avviene all’interno di una unica funzione, le risorse richieste al sistema saranno minori rispetto al moltiplicare il nodo stesso molte volte. Lo spreading è una funzionalità che distingue VVVV da altri software 13 in cui la creazione di istanze multiple di un dato è effettuata moltiplicando la struttura stessa della patch. Tutto ciò è molto vantaggioso ad esempio nella creazione e gestione di sistemi particellari, soprattutto considerando le possibilità offerte dai nuovi potenti hardware e le recenti schede video. Come i nodi gestiscono gli spreads Al momento avete un pin (l’output del LinearSpreads) che trasporta 5 slices (valori, in questo caso). A questo punto vi chiederete come un nodo gestisca una serie di istanze di un dato, uno spread. - - Per vedere cosa succede, create un nodo Rendere (GDI) e poi un nodo Point (GDI), che connetterete all’input del Renderer. Il risultato è un segno ‘+’ che appare al centro della finestra di rendering (o alle coordinate assegnate ai pin di input X e Y del nodo Point). Adesso connettete l’output del nodo LinearSpread (Spreads) al pin di input X del nodo Point (GDI) ed osservate il risultato. Cosa succede? In pratica il nodo Point (GDI) gestisce il ‘pacchetto’ da 5 valori in questo modo: genera 5 simboli ‘+’ in corrispondenza delle 5 coordinate X generate dal LinearSpread. La posizione sull’asse verticale rimane invece la stessa poiché avete assegnato un solo valore al pin Y del nodo Point (GDI). Ma cosa succede se assegniamo due spreads diversi ai pin di input X ed Y del nodo Point (GDI)? E cosa succede se questi due spreads hanno dimensioni diverse? Vediamo con un esempio pratico come un nodo di VVVV gestisce due spreads con un numero di slices differenti: - - Duplicate il nodo LinearSpread (Spreads) compreso la IObox collegata ad esso. Impostate il pin SpreadCount del secondo LinearSpread al valore due. L’output di questo LinearSpread sarà formato da 2 slices, in questo caso due valori. Potrete verificarlo fermandovi con il puntatore sul pin di output. Affianco al valore di output c’è un (2). Connettete l’ouput del secondo LinearSpread al pin di input Y del nodo Point (GDI). 14 Ecco cosa succede quando il nodo Point (GDI) riceve 5 coordinate per la X e due per la Y: Il numero di simboli creati dal Point (GDI) è stabilito dallo spread di dimensioni maggiori, quindi 5. Il primo ‘+’ prende il primo slice del pin X ed il primo slice del pin Y. Il secondo ‘+’ prende il secondo slice del pin X e il secondo slice del pin Y Il terzo ‘+’ prende il terzo slice del pin X e di nuovo il primo slice del pin Y Il quarto ‘+’ prende il quarto slice del pin X e di nuovo il secondo slice del pin Y E così via… In generale questo è il modo in cui vengono gestiti gli spreads all’interno di VVVV. Ovviamente, non tutti i pin accettano uno spread. Alcuni pin accettano solo input formati da singole istanze. Per verificare se un nodo di input è in grado di accettare Spreads, ricorrete all’Inspektor. A destra del valore relativo al pin di vostro interesse potrete trovare un simbolo > oppure un simbolo >>. Nel primo caso il pin non accetta uno spread, nel secondo si. ACCEDERE E MODIFICARE I SINGOLI SLICE Supponiamo che vogliamo estrarre e manipolare una singola slice tra quelle che abbiamo generato. Diciamo che vogliamo controllare manualmente la terza slice del primo LinearSpread. - Inseriamo un nodo SetSlice (Spreads) nel modo illustrato qui > 15 Il terzo pin del nodo SetSlice (Spreads) (l’ultimo a destra) indica il numero della slice che vogliamo modificare. Poiché le slice si contano dallo 0, se vogliamo intervenire sulla terza slice dobbiamo impostare questo pin su 2. Il secondo pin del SetSlice rappresenta il nuovo valore che vogliamo assegnare alla slice. Se manipolate quel valore, noterete che il terzo simbolo ‘+’ nel vostro renderer si muove indipendentemente dagli altri. Ecco come si modificano e si estraggono singoli valori da uno spread. Se vogliamo modificare più di un valore contemporaneamente dovremo ricorrere ad un nodo I (Spreads), collegato in questo modo: In pratica, via il nodo I (Spreads) diciamo al SetSlice che vogliamo manipolare tutte le slices dalla prima alla terza. Poi, tramite un altro LinearSpread, creiamo i nuovi tre valori… e così via. La semplicità con cui è possibile creare e modificare liste di valori vi renderà la vita facile quando avrete a che fare con sistemi complessi di dati o sistemi particellari, che possono comprendere anche qualche milione di oggetti e poligoni.. Ricordo che qualche tempo fa stavo creando una visualizzazione della nostra galassia partendo da una mappa stellare che contava circa 23.000 items! Vi consiglio di tenere sempre in considerazione gli spread e le loro potenzialità mentre patchate.. A questo punto, datevi uno sguardo agli help dei nodi (GetSlice (Spreads) , Stallone (Spreads) , Queue (Spreads) and Cons (Spreads), che sono altrettanto divertenti.. E’ sempre bene tener presente che cliccando su un nodo e premendo F1 appare l’help relativo a quel nodo (se quel nodo implementa una patch di aiuto). 16 Passiamo ad approfondire la conoscenza delle IObox, che permettono di creare delle interfacce grafiche per controllare agevolmente le patch in situazioni live. I NODI DI INPUT/OUTPUT: LE IOBOX All’inizio del tutorial avete già fatto la conoscenza con la IObox (Value Advanced), che può essere inserita cliccando due volte con il destro sulla patch. Questo tipo di IObox sostanzialmente gestisce VALORI NUMERICI. E importante sapere che esistono IObox per altre tipologie di dati: * * * * IOBox IOBox IOBox IOBox (String) (Color) (Enumerations) (Node) ‘IObox’ significa proprio modulo di Input/Output poiché questi nodi servono per entrambi i propositi: possono essere utilizzati sia per immettere direttamente un dato o una lista di dati oppure per mostrare l’output da un nodo in funzione. Caratteristiche comuni delle IObox Provate a selezionare tutte le IObox e muovete il puntatore su uno degli angoli di una di esse. Il cursore cambierà e ciò indica che potrete ridimensionare le IObox tutte assieme. Tenendo premuto control potrete ridimensionare lungo una sola dimensione alla volta. A parte le IObox (Node), che sono un po’ diverse, tutte i tipi di IObox condividono alcune caratteristiche in comune: 17 - Selezionate tutte le IObox che avete creato escluso la IObox (Node). Chiamate una finestra Inspektor (CTRL+i), se non ce ne avete già aperta una. - Dalla finestra Inspektor potrete cambiare l’apparenza dei caratteri della IObox ma, cosa più importante, potrete modificare il numero di righe e colonne contenute in una IObox. Diciamo che vogliamo organizzare i dati o valori di una IObox in una ‘lista’ formata da tre valori. Noterete che se proviamo a cambiare il numero di rows, la IObox continuerà a mostrare un solo valore, sebbene la IObox indichi che possiamo inserire altri due valori al suo interno. E’ necessario cambiare il pin ‘SliceCount Mode’ da ‘Input’ a ‘ColsRowPages’. Infatti, quando il pin ‘SliceCount Mode’ è settato a ‘Input’, la IObox adatterà la struttura dei dati contenuti sulla base del tipo di input. Se la IObox non è collegata ad un input, il numero di righe, colonne e pagine è settato di default ad 1. Settando la IObox in ‘ColsRowPages’, le direte che volete creare direttamente una ‘griglia’ di dati, divisi in righe, colonne e pagine. - Cambiate quindi il pin SliceCount Mode in ColsRowsPages. Poi settate il numero di rows, righe, a 3. Noterete nell’Inspektor e dall’aspetto delle IObox che appaiono altre due caselle o slices che adesso possono essere modificate. Spostandovi con il puntatore sul pin di output, noterete affianco al primo valore di output un (3) che indica che l’output della IObox è formato effettivamente da tre valori. - Abilitate dall’Inspektor l’opzione Show SliceIndex e ShowGrid per mostrare i numeri associati alle singole caselle e per visualizzare la IObox come una griglia. 18 Vi consiglio di sperimentare costruendo tabelle con strutture diverse aumentando e diminuendo il numero di righe e colonne, per prendere dimestichezza con le IObox. È molto divertente creare tavolozze di colore che poi utilizzerete nella patch, creando griglie di valori con una IObox (color). Quando invece vogliamo usare una IObox per visualizzare uno spread di dati, conviene settare il pin ‘SliceCount Mode’ ad ‘Input’. Sarà comunque possibile, modificando il numero di righe e colonne, settare il numero massimo di elementi dello spread che vogliamo visualizzare. IOBox (color) IOBox (Value advanced) Generatore di spreads IOBox (Value advanced) Creando rapidamente questa patchettina avrete una IOBox (Color) che ricevere dal RandomSpread 100 valori cromatici casuali e visualizzarli su 5 colonne da 25 slices. Tutto ciò permette di comprendere meglio anche il concetto di ‘spread’. Come si è visto, possiamo creare direttamente delle ‘griglie’ di valori modificando semplicemente la struttura di una IObox. Creando righe o colonne e inserendo più valori diversi avremo creato un insieme di valori, praticamente uno spread. I valori di una IObox, disposti in una griglia, o tabella se preferite, vengono letti generalmente dall’alto in basso o da sinistra a destra. Vi accorgete di questo anche quando osservate i numeri di ‘index’ associati ad un certo slice. Il valore di 19 indice è riportato alla sinistra di una data casella ed è distintivo di un singolo slice di quello spread. L’index si incrementa dall’alto in basso e da sinistra a destra, quando i dati di una IObox sono disposti in righe, colonne e pagine (ricordate excel?). Adesso che avete chiaro il concetto di ‘insieme di valori’ o spread, definirò ciascun elemento dello spread semplicemente uno slice. Infine, è importante ricordare che è possibile navigare e spostarsi ovunque e richiamare o modificare un qualsiasi valore dalla lista usando i nodi GetSlice e SetSlice di cui ho mostrato prima l’applicazione. Per riassumere, esistono almeno due modi per generare un insieme di dati: un generatore di spreads, di cui abbiamo parlato prima, oppure immettendo dei valori in delle IObox settate in righe e colonne. CREARE INTERFACCE DI CONTROLLO CON LE IOBOX Le IOBox servono quindi per immettere dati semplici o disposti in griglie e ‘leggere’ o visualizzare dati di output provenienti da un dato nodo. In pratica servono a controllare e modificare la patch stessa. Una degli aspetti più importanti delle IOBox è che esse possono essere utilizzate per creare vere e proprie interfacce grafiche di controllo della vostra patch. Potrete visualizzare o immettere un dato utilizzando IOBox opportunamente trasformate in pulsanti, rotelle e barre a scorrimento. Studiando le patch più avanzate osserverete come ciascun programmatore (artista?smanettone?) adoperi le IOBox per crearsi almeno una parte di patch che funga da interfaccia e come sia utile crearsi una interfaccia contenente sono i valori e parametri che si vogliono modificare dal vivo. Adesso vedremo come creare pulsanti o barre ed altri elementi grafici di controllo della patch. - Selezionate la IOBox (Value Advanced) ed osservate la finestra di Inspektor. Appaiono altri pin di configurazione relativi unicamente a questo tipo di IOBox. Provate a modificare i valori e divertitevi a trasformare le IObox in elementi di controllo per esempio per ottenere palette di colori o set di slides. 20 Prima di partire con il patching sfrenato, è bene approfondire l’uso degli spread per svelare altre proprietà di questa tecnica. Ricordo, anche in questo caso che, come per la maggior parte dei moduli, cliccando su un nodo e premendo F1, appare un tutorial relativo a quel nodo! Vi consiglio di avvalervi degli help continuamente, per scoprire gli usi e le funzioni che un dato nodo possiede ed in che contesti può venire utile. SPREADING AVANZATO Adesso che avete imparato come adoperare le IObox, diamo uno sguardo nello specifico a come i nodi operano con gli spreads. I due esempi in alto danno l’idea di cosa succede all’interno di un nodo, se esso ha a che fare con spread contenenti un differente numero di elementi. Notate che i primi due e gli ultimi due grafici riportano lo stesso risultato. - Per regola un nodo guarda innanzitutto il numero di items contenuti in tutti gli spreads che riceve. Il numero di slices dell’input più numeroso viene utilizzato per calcolare il numero di slices dell’output. Il numero di spread dell’input meno numeroso viene internamente ridimensionato 21 al numero di slices massimo, riempiendo semplicemente le slices di differenza tra i due input, ripetendo i valori. Se questo paragrafo vi ha confuso più che aiutarvi, non preoccupatevi: spesso le cose più semplici sono più difficili a spiegarsi che a farsi. Se farete un po’ di esperimenti con le slices e gli spreads, comprenderete questa regola a livello pragmatico. Ad esempio date uno sguardo a questo.. GESTIONE SEMPLIFICATA DI ISTANZE MULTIPLE Supponiamo che avete un RoundRect (GDI) diviso linearmente in spreads lungo la coordinata X. Adesso desiderate che ogni primo rettangolo sia disegnato in verde ed ogni secondo rettangolo si disegnato in rosso. Questa operazione è molto semplice se si “incrociano” spreads contenenti un numero diverso di slices. Date un occhio a questa patch.. Come potete vedere, mentre agli input X ed Y vengono mandati 5 valori tramite il LinearSpread (Spreads), al pin del colore vengono inviati soltanto due colori quindi verranno disegnati 5 oggetti ed i due colori verranno ripetuti alternatamene nei 5 elementi. Ma allora come si fa per ottenere una griglia di 5x5 rettangoli? Per prima cosa potreste semplicemente connettere l’output del LinearSpread (Spreads) all’input Y del RoundRect (GDI). Guardate cosa succede: 22 Il RoundRect continua a disegnare sé stesso solo 5 volte poiché il numero massimo di slices in output è ancora 5. La prima coordinata X è la stessa per prima coordinata Y, la seconda coordinata X è la stessa per la seconda coordinata Y e così via risultando in un ordine ascendente. Come superare questo problema? In VVVV esiste un nodo che si rivela molto utile quando avete il proposito di generare una struttura a griglia o una griglia di valori. Utilizzate il nodo Cross (2D) come è mostrato nello screenshot qui sotto: Cosa fa il nodo Cross? Cross dà semplicemente in output 25 slices per X e per Y che sono il risultato di tutti i possibili incroci delle slices in input. Notate anche che la distanza tra i rettangoli può essere gestita tramite il secondo input del LinearSpread (Spreads). 23 Infine, aggiungiamo un pizzico di interazione, che non fa mai male. Diciamo che vogliamo conoscere la distanza del centro di ciascun rettangolo dal puntatore del mouse. Esiste un nodo che permette di fare questo: Points2Vector (2D), che calcola la distanza tra due punti. Connettete il nodo Points2Vector (2D) come mostrato qui sotto e capirete cosa significano quei 25 numeri mostrati dalla IObox in basso a destra: Esatto. Points2Vector (2D) restituisce le 25 distanze di ciascuno dei punti che formano la griglia dalla coordinata del mouse. Adesso, tramite il nodo Map (Value), mappate queste distanze ad un range ragionevole, cosicché potrete utilizzare tali valori come valori di dimensione per i quadrati formati dal RoundRect (GDI). Passando con il puntatore su un rettangolo, esso verrà rimpicciolito tanto più quanto si trova vicino al puntatore. 24 Adesso, se volete, aumentate e diminuite a piacimento il numero di spread generate dal LinearSpread e noterete che non importa con quanti quadrati o istanze volete lavorare, la patch rimarrà sempre pura e semplice come il primo giorno. 25