Sei sulla pagina 1di 23

Corsi Accademici di Musica Elettronica DCPL34

Conservatorio A.Casella, L'Aquila

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.

Nella patch di Max Msp ho inserito


uno slider per scegliere la frequenza
di riferimento.
Il valore dello slider va nellinlet di un
sottoprogramma chiamato
temperascale.
Negli outlet, invece, escono i valori
delle frequenza del sistema
temperato a 12 intervalli.

La scala prodotta secondo il temperamento equabile si ottiene, dividendo l'ottava in dodici


parti uguali poich l'ottava rappresentata dal rapporto 2:1, l'intervallo pi piccolo quello che,
moltiplicato per se stesso dodici volte (cio elevato alla 12) d 2. Esso corrisponde al
semitono temperato:

1 semitono =

scala_temperata si occupa, quindi, di


implementare la formula per il calcolo
degli intervalli.

Siccome la radice si pu scrivere sotto


forma di potenza in questo modo:

Per ogni intervallo ho calcolato prima


questa frazione:

poi la potenza:

infine ho moltiplicato il tutto per la


frequenza di riferimento.

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.

Incapsuliamo questa astrazione tramite comando (cmd+shift+E) e la salviamo nella stessa


cartella di provenienza della patch principale.

Creiamo poi una subpatch, con stesso nome ( in questo caso p


temperscale).
Gli argomenti di p temperscale ( 440 3 12) indicano le tre variabili #
dell'astrazione.

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

Loggetto line~ accetta una lista di valori con un messaggio.


Tutti i messaggi in line~ vengono inviati contemporaneamente.
(Nella parte superiore della patch ho inserito le stringhe per singoli messaggi per l'attivazione
manuale di ognuno uno per volta per verificarne il funzionamento)

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.

sfplay~ accetta file di tipo AIFF.


Per inizializzare un file mandiamo il comando (messaggio)
open a sfplay~, poi gli diamo 1 (start).
Il messaggio (open) prende un argomento da specificare,
in questo caso una variabile $1, file in una cartella correlata
.
open setta il "current" file: quello che ricomincia quando il
messaggio 1 viene mandato e usato come default per il
preload message.

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

l'oggetto buffer~ tramite messaggio read mi


permette di caricare un file audio e tramite
l'oggetto info~ ,con suo stesso argomento, di
avere la durata complessiva del frammento.
Cos facendo ho potuto ,tramite messaggio s
Audio_ e r Audio_ mandare i dati di ogni
campione caricato sequenzialmente direttamente
nel messaggio in ingresso a curve~ di fade out
della subpatch (p crossfade).

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.

In questo esercizio ,tramite l'oggetto buffer~ , apro la


finestra di scelta del file audio da processare.
Buffer~ lavora come un buffer di memoria in cui i samples
vengono immagazzinati.
Il messaggio replace un messaggio per la lettura.
L'oggetto groove~ un variable-rate, looping, sampleplayback che si riferisce alle informazioni audio contenute
nell'oggetto buffer~ che ha come argomento lo stesso
nome dato al buffer.
groove~ ha bisogno anche di un secondo argomento
opzionale che ne specifica il numero dei canali di output.
L'oggetto sig~ converte un numero float o intero in un
segnale.
Ho aggiunto uno slider, settato per valori da 0 a 1.5 (ove 0 corrisponde a velocit 0 del file, 0.5 alla
velocit dimezzata, 1 alla velocit normale e 1.5 al doppio della velocit di esecuzione) che mi
permette di modificare per parametri la velocit di esecuzione del file contenuto nel buffer di
memoria.

ESERCIZIO 7
Implementare un panner.

Iniziamo posizionando un suono nel fronte


stereofonico.
per farlo dobbiamo:

calcolare un fattore di moltiplicazione


per il volume dei due canali: se ad
esempio vogliamo un suono tutto a
sinistra, il fattore di moltiplicazione per
il canale sinistro sar 1 e il fattore per il
canale destro sar 0 se vogliamo un
suono al centro, sia il fattore per il
canale sinistro, sia quello per il canale
destro, saranno 0.5 se infine vogliamo
un suono a destra, il fattore di sinistra
sar 0 e quello di destra 1. Per le
posizione intermedie si utilizzano i
relativi valori intermedi.

Tenere conto che l'intensit del suono


percepito proporzionale alla potenza
del segnale, cio proporzionale al
quadrato dell'ampiezza. Questo
significa che prima di usare i fattori di
moltiplicazione dell'ampiezza
dobbiamo calcolarne la radice
quadrata.

Vediamo per iniziare il primo punto:


I fattori di moltiplicazione per il canale destro e il canale sinistro sono complementari l'uno rispetto
all'altro: quando il primo aumenta, il secondo diminuisce e viceversa. Simuliamo ad esempio uno
spostamento del suono da sinistra a destra, e vediamo come devono essere impostati i fattori di
moltiplicazione per i due canali:

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:

se a sinistra il valore 0.75, a destra avremo 1 0.75 = 0.25


se il valore a sinistra 0.15 a destra avremo 1 0.15 = 0.85

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.

Progetto personale: Timer programmabile

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

La subpatch si occupa semplicemente di convertire i dati da hh:mm:ss


ms tramite l'oggetto translate.
In questo modo avremo per comodit i nostri parametri per settare il
punto di start e di stop in hh:m:s mentre i dati in ingresso a seek sono
'translati' in millisecondi.

(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.

Finestra di visualizzazione Gem.

Cliccare prima di tutto sul messaggio


create per creare la finestra di
visualizzazione, dopodich su gli altri
messaggi inseriti nella patch che ci
andranno a modificare le impostazioni
all'interno della finestra e infine sul toggle
per lanciarle e visualizzarle.

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.

Trasliamo il cubo a nostro piacimento lungo gli assi cartesiani:

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.

Sfere illuminate rotanti


In questa Patch a differenza delle precedenti non abbiamo un solo oggetto statico,il quale in
precedenza era un cubo, ma due in rotazione l'uno attorno l'altro e il tutto illuminato dall'oggetto
lighting 1.
Notiamo alcuni oggetti in pi, tra cui sphere in cui gli argomenti sono dimensione della sfera e
segmenti che la compongono ( se ne mettessi tre sarebbe immediato che otterremmo un
triangolo), l'oggetto color che avr come argomento dei numeri che ci daranno il colore
dell'oggetto e l'oggetto separator.
Separator in quanto se qui non fosse utilizzato, una delle catene rotazionali avrebbe una rotazione
extra. Con il separatore, in sostanza, entrambi gli oggetti saranno translati, ma la rotazione
all'interno di un ramo non influenzer quella dell'altro.
Infine troviamo un counter che da 0 (punto di partenza della sfera) andr a 359 ( punto di arrivo)
nel tempo indicatogli dal metro e tramite loadbang dar inizio ad un nuovo giro.

Potrebbero piacerti anche