Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Multimedialit I Esercizi
di Federico Martusciello
Tesina di Multimedialit I data 16/03/2016
RIASSUNTO
Verranno esposti i passaggi per la realizzazione degli esercizi assegnati durante lanno
Accademico 2014/2015 relativi al corso di Multimedialit I.
ESERCIZIO 1
Implementare un calcolatore di frequenze della scala cromatica temperata.
1 semitono =
poi la potenza:
In questa seconda parte spiegher come, essendomi reso conto della dispendiosit di spazio
occupata dalla patch implementata in precedenza, si possa ottenere dallo stesso principio, lo
stesso risultato in maniera pi semplice, efficace, e pi opportuno in ambito di programmazione.
Partendo dal principio della patch precedentemente presa in
considerazione creiamo una astrazione:
In questa astrazione risolviamo i calcoli della formula relativa al calcolo
dell'intervallo di mezzo tono e inserendo come argomento #1,#2,#3,
nell'oggetto f, dando dei trigger in modo di avere una inizializzazione a
ogni variazione della variabile,facciamo in modo che i number dei tre
inlet della subpatch varino le variabili # dell'astrazione al variare del float
in entrata negli inlet di p temperscale.
ESERCIZIO 2
Generatore sinusoidale a frequenza casuale :
Implementare
un generatore di numeri casuali compresi tra un minimo e un
massimo variabili.
Ogni
nuovo numero casuale richiesto attraverso un bang varia la frequenza di
un oscillatore di tipo sinusoidale
Il
guadagno in uscita regolato in uscita per mezzo di un potenziometro.
Ogni nuovo numero casuale che varia la frequenza generato automaticamente ogni
m millisecondi. Il parametro m modificabile a piacere dellutente.
Loggetto random un
generatore di numeri
pseudocasuali con un range che
varia da 0 e N1 dove N il
valore dellinlet freddo.
Con i due slider invio il valore
minimo e massimo del range
alle variabili inf (inferiore) e sup
(superiore).
Nella variabile met ci sono i
millisecondi di ritardo tra un
bang e laltro.
Ricevo le variabili e sottraggo il
valore inferiore a quello
superiore.
Sommo 1 per raggiungere il
limite superiore.
Affido il risultato a random e al suo valore di uscita e sommo il limite inferiore in modo da traslare il
range di numeri.
La frequenza cos ottenuta va nellinlet delloggetto osc~ che genera un onda sinusoidale con la
frequenza immessa.
Infine riscalo lampiezza con uno slider che va da 0 a 1.
ESERCIZIO 3
Implementare una interpolazione tra i seguenti valori:
partire
da 600Hz
arrivare
a 1000Hz in 2 secondi
arrivare
a 200Hz in 0.5 secondi e restarvi per 4 secondi
arrivare
a 800Hz in 5.3 secondi
arrivare
a 600Hz in 1 secondo e rimanere fermi su tale valore
ESERCIZIO 4
Implementare un lettore di file sequenziali ogni file ha un nome numerico
progressivo il numero di files in lista finito lesecuzione inizia dallinizio del file
successivo della lista lesecuzione del file successivo inizia al termine del file
precedente.
Siccome lesercizio richiede una lettura di file sequenziale con nome numerico e progressivo, invio
in ingresso al messaggio il numero 1 tramite un loadbang .
Il messaggio 1(start) in ingresso in sfplay~ fa partire la patch.
Al termine della prima lettura sfplay~ invia un bang . Questo bang lo utilizzo per incrementare il
valore tramite loggetto contatore counter e per far partire il campione successivo.
ESERCIZIO 5
Come lesercizio 5 ma lesecuzione di un nuovo file pu iniziare anche su richiesta
espressa dallutente (bang). Prevedere un crossfade fra file di lettura (fade out) e
quello successivo (fade in).
La difficolt di questo esercizio nel gestire 2 linee di lettura separate facendo in modo che al
momento dellinizio del fadeout sulla traccia di sinistra bisogna far partire il fadein su quella
destra. Ho risolto in questo modo:
- la prima parte della patch non altro che un lettore di file sequenziali a cui applicheremo il
Crossfade previsto nell'esercizio.
- per poter risolvere questo esercizio ho creato quindi un piccolo algoritmo contenuto nella
subpatch (p crossfade) in cui tramite l'oggetto curve~ viene creata una rampa per i nostri fade out
e fade in.
L'oggetto curve~ come la line~, ma pu generare curve. Invece di due punti (valore e di tempo)
ne dobbiamo fornire tre (il valore, il tempo e la forma della curva). L'ultimo valore compreso tra
+1.0 e -1.0, con un valore negativo per una curva positiva, ed un valore positivo per una curva
positiva. Ad esempio, per fare una dissolvenza incrociata di 500 ms, andremo a sfumare il file di
lettura con 1, 0 500, -0,5, e allo stesso tempo lo incroceremo col nuovo con 0, 1 500 0.5.
- per poter costruire il Fade out c' bisogno di conoscere la lunghezza in secondi del file audio
ESERCIZIO 6
Leggere il contenuto di un buffer prima a velocit ordinaria, poi a velocit doppia, poi
a velocit variabile nel tempo definita dallutente per mezzo di parametri di controllo.
ESERCIZIO 7
Implementare un panner.
tutto a sinistra 1 0
parzialmente a sinistra 0.75 0.25
al centro 0.5 0.5
parzialmente a destra 0.25 0.75
tutto a destra 0 1
Durante lo spostamento del suono, mentre il fattore di moltiplicazione del canale sinistro
diminuisce il fattore di moltiplicazione del canale destro aumenta ( perch il suono si sposta
gradualmente verso destra).
La somma dei due fattori di moltiplicazione, destro e sinistro, sempre 1.
Una volta che abbiamo i nostri due fattori di moltiplicazione dell'ampiezza dobbiamo, per motivi
esaminati in precedenza nel secondo punto, calcolarne la radice quadrata.
Utilizzeremo un oggetto grafico slider che un cursore che produce numeri interi. Lo slider
configurato, tramite il suo inspector, per produrre valori decimali che variano tra 0 e 1: tramite
questi valori controlleremo la posizione del suono.
Per il canale sinistro i valori vengono sottratti al numero 1 tramite l'oggetto !-, che sottrae al suo
argomento il numero che riceve all'ingresso sinistro per il canale destro i valori non vengono
modificati. In questo modo pi alto sar il valore in uscita a sinistra e minore sar quello a destra e
viceversa:
In entrambi i casi viene calcolata la radice quadrata dei valori dall'oggetto sqrt (che effettua
appunto questo calcolo) e i risultati vengono trasformati in liste dall'oggetto append e poi passati
all'oggetto line~ che ne ''smussa'' i passaggi tra un valore e l'altro utilizzando il valore di 20
millisecondi fornito ad append che corrisponde al tempo in cui si passa da un valore a quello
successivo.
Finalmente i valori in uscita da line~ possono essere usati per moltiplicare l'ampiezza del segnale
in entrambi i canali.
Spostando lo slider a sinistra e a destra muoviamo il suono nella stessa direzione del cursore.
Esercizio 8
Implementare un panner stereofonico secondo la soluzione di Blumlein con le sorgenti
poste a 45e + 45 rispettivamente per il canale sinistro e destro.
Alan Dowler Blumlein ha sviluppato nel 1931 la teoria della spazializzazione stereofonica
ancora oggi utilizzata per le recenti tecniche Ambisonic. Il lavoro di Blumlein considerava
anche la codifica delle differenze di ampiezza e di fase separatamente per ricreare un
immagine spettrale sugli assi orizzontale e verticale su una configurazione di riproduzione
bidimensionale.
Nellesercizio chiesto vengono fornite le relazioni di Blumlein per gestire matematicamente le
ampiezze dei singoli canali.
Come nell'esercizio
precedente ho
implementato un panner,
ma questa volta ho risolto
l'operazione per il
guadagno di destra e
sinistra tramite gli oggetti
expr che contengono
rispettivamente il
moltiplicatore( expr
cos($f1)+sin($f1) ) ed il
moltiplicando (expr
sqrt(2)/2 ).
L'oggetto scale serve ad
attuare una conversione da
gradi (0 360) a randianti (0
6,283185) tramite i suoi
argomenti.
Infine utilizzo l'oggetto !con argomento (sottraendo)
0. affinch l'oggetto mi
inverta gli inlet dei canali
ricevendo dati in ingresso
con la virgola e lasciando
invariati i calcoli delle
operazioni.
Esercizio 9
Produrre in MAX MSP un sistema di codifica e decodifica di messaggi MIDI. Attraverso tali
sistemi necessario inviare/ricevere messaggi MIDI
verso/da device MIDI hardware o software (virtuale).
Per la realizzazione di questo esercizio ho fatto interagire Max MSP e Ableton Live 8.
Prima di tutto creo una traccia midi in Ableton in cui andr ad inserire un suono tramite vst, in
questo caso ACE.
Creo una seconda traccia midi a cui dir di ricevere il segnale audio dalla prima e quindi
direttamente dal nostro vst (ACE).
Ora nello scroll MIDI to imposter MaxMSP1 in modo che il suono venga mandato al nostro
ambiente di programmazione.
Tramite l'oggetto midiin avremo accesso allo scroll da cui potremo selezionare di ricevere i dati da
Ableton.
L'oggetto midiin una uscita dati di ricezione Midi che da ascolto ad una porta specifica Midi e in
output i dati midi ricevuti.
Midiparse interpreta i dati in entrata.
Unpack prende la lista di dati in ingresso, ne separa gli elementi e invia ogni voce a una uscita
separata.
Veniamo alla parte grafica della patch.
In questa patch ho voluto aggiungere una parte video per implementare, in parte, Jitter all'interno
della tesina e per far rendere conto al lettore degli effetti pratici del collegamento Midi tra Ableton e
Max. Ad ogni cambio di nota o ad ogni nota ribattuta si avr infatti un cambio di slide all'interno
della nostra jit.window tramite l'oggetto metro e l'oggetto drunk che, rispettivamente, daranno un
tempo di cambio continuo e sequenziale alle slide ma senza uno schema sequenziale numerico
ben preciso tramite numeri random in uscita.
L'oggetto jit.qt.movie qui ci permette di importare filmati QuickTime tramite il messaggio read.
Esercizio 10
Produrre in Pure Data un sistema di codifica e decodifica di messaggi MIDI. Attraverso tali
sistemi necessario inviare/ricevere messaggi MIDI
verso/da device MIDI hardware o software (virtuale).
Prima di tutto dobbiamo abilitare la porta Midi che ci consentir lo scambio di informazioni tra Pure
Data e il nostro Vst.
Per questo esercizio ho utilizzato il vst FM8 della Native Instrument.
Per prima cosa dal pannello di configurazione Audio Midi entro in Driver IAC:
attivo il dispositivo:
Questo ci permetter di avere comunicazione di dati Midi tra Pure Data e il nostro VST.
Ora nelle impostazioni Midi Audio del VST FM8 andiamo ad attivare il nostro driver IAC (Bus 1) in
input e output.
molto importante che queste operazioni avvengano prima dell'apertura di PD per garantirne il
corretto funzionamento.
Ora creiamo un nuovo progetto in Pure Data e dal pannello scroll Media, clicchiamo su settaggi
Midi e anche qui attiviamo il nostro Driver IAC (Bus 1). In questo modo ora abbiamo il necessario
affinch avvenga uno scambio di messaggi Midi verso/da device.
Infine costruisco una patch che mi permette di verificare il funzionamento del collegamento Midi fra
software.
In questo modo cliccando sul messaggio in entrata (60) in noteout otterremo la nota di do sulla
nostra tastiera del vst.
Per prima cosa sarebbe utile sapere in che posizione ci troviamo del nostro file. Sfplay~ ha un
output apposta per questo, che un timing signal o un sync signal che utilizzeremo per mandare
appunto la posizione del file nella nostra subpatch (p timer).
Questo ci da la posizione della riproduzione in millisecondi in segnale: questo significa che il timing
mandato di continuo.Per un time displayn on ci serve che sia continuo lo far cambiandolo ogni
decimo di secondo. Per farlo possiamo usare snapshot~. Quando diamo un bang a snapshot~
questo ci da una lettura all'infuori del segnale , in questo modo se usiamo un metro ( metro 100)
otterremo il timing su una base regolare.
sfplay~ riproduce il suono continuamente dall'hard disk, e in questo modo non siamo limitati dalla
memoria del computer. Se vogliamo che sfplay sia stereo, dobbiamo applicargli l'argomento 2 che
sar il numero di canali.
(p translate)
a
(ptimer)
Spiegher qui la subpatch contenente il timer.
receive~ file_pos rivece i dati relativi alla posizione del file nel tempo inviategli dal terzo outlet di
sfplay~ e li indirizza nell'inlet di snapshot~ che li converte da dati di segnale a dati numerici da cui
inizieremo i nostri calcoli per ottenere ore, minuti e secondi relativi alla posizione del file nel tempo
timer
La prima cosa che vogliamo sapere
quante ore sono trascorse. 1 ora = 60
minuti, = 60 60 secondi x 1000 ms =
3600000 ms. Quindi se dividiamo il
segnale da 3600000 otteniamo le ore.
Il bit dopo la virgola a pochi minuti (o
frazioni di un'ora). Per sbarazzarsi del
numero intero ed essere lasciato con
decimali, abbiamo bisogno di sottrarre il
numero intero al float. Vi un modo
intelligente per fare questo: expr $ F1- $
i1. Inviamo lo stesso numero in entrambi
gli ingressi, ma il diritto da un lato
costretto ad essere un int. Cos, quando
facciamo la somma, solo il bit dopo la
virgola di sinistra. Questo d i decimi di
ora, cos abbiamo x60 per ottenere
minuti.
Ora abbiamo un'altra rimanenza dopo
la virgola, cos facciamo la stessa (expr
$ f1 = $ i1) per ottenere secondi.
Infine, prendiamo il bit dopo la virgola
di nuovo, e x10 per ottenere 10ths
(decimi di un secondo).
Ora siamo in grado di inviare tutti questi risultati al nostro display. Per fare questo abbiamo
bisogno di fare i numeri in un messaggio formattato. Possiamo usare sprintf, che proviene dalla
programmazione C e C ++. Ci permette di assemblare un messaggio proprio come noi vogliamo
che sia formattato (quindi come un print). Usiamo sprintf% I:% i. % I (il che significa che la
scrittura sar composta da 3 interi separati da due punti).
11 GEM
Tutti gli elementi grafici che stiamo per creare risiedono in una finestra separata rispetto la
finestra di patch principale. Questa nuova finestra detta di visualizzazione GEM . Usiamo
l'oggetto gemwin a cui manderemo in ingresso un toggle (1= accensione: 0= spegnimento ) con
due relativi messaggi, sempre in ingresso al gemwin, create e destroy . Con diversi messaggi di
input , possiamo personalizzare le propriet della finestra di visualizzazione.
ESERCIZI SVOLTI
Translate
Una volta costruita la nostra figura, un cubo ad esempio, tramite il comando cube e considerando
la finestra di visualizzazione Gem come un asse cartesiano, potremo translare la nostra figura
rispettivamente lungo gli assi delle x, delle y e delle z semplicemente aumentando i valori numerici
inseriti in ingresso nei tre inlet del nostro messaggio translate, i quali inlet corrisponderanno
rispettivamente il primo all'asse delle ascisse, il secondo all'asse delle ordinate, e infine il terzo a
quello delle zeta.
Rotate
Secondo lo stesso principio visto in precedenza, ora ruoteremo la nostra figura geometrica sui tre
assi tramite l'oggetto rotate che ha per argomento proprio i tre assi delle x,y e z.
Scale
Lo stesso vale anche per il riscalamento tramite oggetto scale con argomento i tre assi.