26 giugno 2011

Studio: da Glass verso l'uscita dal Minimalismo

Qualche tempo fa (anni?) mi sono appassinato al Minimalismo Americano (ed andando indietro nel tempo a "quello francese") ed ho iniziato a studiare perché "funziona". Come è possibile che un ritmo costante ed una armonia semplice (ma non banale) regalino tanto piacere sia all'ascoltatore sia all'esegutore? Per quanto riguarda l'armonia -forse- il minimalismo si è piazzato alla fine di un periodo di esasperazione nella musica classica e al principio della musica pop come la intendiamo noi oggi. Il ritmo invece richiede -secondo me- una spiegazione <> Glass si è appassionato al buddismo e all'India, dove si hanno prove di conoscenza delle leggi che legano suono a onde celebrali (non una conoscenza scientifica, direi piuttosto una "intuizione") [se siete interessati: http://en.wikipedia.org/wiki/Brainwave_entrainment e relativi riferimenti] e ne ha ricavato una personale commistione "fra Mozart (studiato con la Boulanger) ei chakra". Tutti questi discorsi pseudo-filosifici servono per inquadrare la musica, ma certo non riescono a

Appreso questo, mi è venuta voglia di sperimentare: scelti due brani (Truman sleeps e piano angel) ho iniziato a lavorarci. Ho cambiato tonalità al primo, e ne ho estratto il giro armonico; il secondo mi è servito come riferimento per le figure ritmiche. Quello che ho aggiunto di mio è stato

1) dare figure ritmiche diverse alle due mani, notando che lo sfasamento (tanto caro a Reich e fonte di ispirazione per Glass) funziona meglio con numeri primi

2) ripetere la stessa figura ritmica, alternando però le note dell'arpeggio con note alterate (cosa molto poco usata da Glass) per creare anche uno sfasamento tonale

Il risultato è "poco musicale" ma l'effetto è utilizzabile con successo in brani alienanti :)

Di seguito il codice LilyPond riesumato da un Beckup, relativo file PDF e MIDI.

%%%

%This program is free software: you can redistribute it and/or modify
%it under the terms of the GNU General Public License as published by
%the Free Software Foundation, either version 3 of the License, or
%(at your option) any later version.
%
%This program is distributed in the hope that it will be useful,
%but WITHOUT ANY WARRANTY; without even the implied warranty of
%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%GNU General Public License for more details.
%
%You should have received a copy of the GNU General Public License
%along with this program. If not, see .

%Author: Giulio Masetti

%E-mail: masetti@mail.dm.unipi.it or 106ohm@gmail.com

%%%

\version "2.12.3"


destra = \relative c'' {
\clef treble
\key c\major
%modulo 4
a16 c e a a, c e a a, c e a a, c e a
a, c e a a, c e a a, c e a a, c e a
%
a, c f a a, c f a a, c f a a, c f a
a, c f a a, c f a a, c f a a, c f a
%
g, c e g g, c e g g, c e g g, c e g
g, c e g g, c e g g, c e g g, c e g
%
gis, b e gis gis, b e gis gis, b e gis gis, b e gis
gis, b e gis gis, b e gis gis, b e gis gis, b e gis
%modulo 6
\times 2/6 {a8 e c a c e} \times 2/6 {a e c a c e} \times 2/6 {a e c a c e} \times 2/6 {a e c a c e}
a16 e c a c e a e c a c e a e c a
%
\times 2/6 {a'8 f c a c f} \times 2/6 {a8 f c a c f} \times 2/6 {a8 f c a c f} \times 2/6 {a8 f c a c f}
a16 f c a c f a f c a c f a f c a
%
\times 2/6 {g'8 e c g c e} \times 2/6 {g8 e c g c e} \times 2/6 {g8 e c g c e} \times 2/6 {g8 e c g c e}
g16 e c g c e g e c g c e g e c g
%
\times 2/6 {gis'8 e b gis b e} \times 2/6 {gis8 e b gis b e} \times 2/6 {gis8 e b gis b e} \times 2/6 {gis8 e b gis b e}
gis16 e b gis b e gis e b gis b e gis e b gis
% %modulo 6 variazioni
% \times 2/6 {a'8 e c a c e} \times 2/6 {a f c a c e} \times 2/6 {a e c a c e} \times 2/6 {a f c a c e}
% a16 e c a c e a f c a c e a e c a
% %
% \times 2/6 {a'8 f c a c f} \times 2/6 {g8 e c a c f} \times 2/6 {a8 f c a c f} \times 2/6 {g8 e c a c f}
% a16 f c a c f g e c a c f a f c a
% %
% \times 2/6 {g'8 e c g c e} \times 2/6 {gis8 e c g c e} \times 2/6 {g8 e c g c e} \times 2/6 {gis8 e c g c e}
% g16 e c g c e gis e c g c e g e c g
% %
% \times 2/6 {gis'8 e b gis b e} \times 2/6 {gis8 e b gis c e} \times 2/6 {gis8 e b gis b e} \times 2/6 {gis8 e b gis c e}
% gis16 e b gis b e gis e b gis c e gis e b gis

%modulo 7
\times 2/7 {a8 c a' e c a c} \times 2/7 {a c a' e c a c} \times 2/7 {a c a' e c a c} \times 2/7 {a c a' e c a c}
a16 c a' e c a c a c a' e c a c a c
%
\times 2/7 {a8 c a' f c a c} \times 2/7 {a c a' f c a c} \times 2/7 {a c a' f c a c} \times 2/7 {a c a' f c a c}
a16 c a' f c a c a c a' f c a c a c
%
\times 2/7 {g8 c g' e c g c} \times 2/7 {g c g' e c g c} \times 2/7 {g c g' e c g c} \times 2/7 {g c g' e c g c}
g16 c g' e c g c g c g' e c g c g c
%
\times 2/7 {gis8 b gis' e b gis b} \times 2/7 {gis8 b gis' e b gis b} \times 2/7 {gis8 b gis' e b gis b} \times 2/7 {gis8 b gis' e b gis b}
gis16 b gis' e b gis b gis16 b gis' e b gis b gis b
%
a1
}

sinistra = \relative c {
\clef bass
\key c\major
%modulo 3
a16 c e a, c e a, c e a, c e a, c e a, c e a, c e a, c e a, c e a, c e a, c
%
a c f a, c f a, c f a, c f a, c f a, c f a, c f a, c f a, c f a, c f a, c
%
g c e g, c e g, c e g, c e g, c e g, c e g, c e g, c e g, c e g, c e g, c
%
gis b e gis, b e gis, b e gis, b e gis, b e gis, b e gis, b e gis, b e gis, b e gis, b e gis, b
%modulo 4
a c e a a, c e a a, c e a a, c e a
a, c e a a, c e a a, c e a a, c e a
%
a, c f a a, c f a a, c f a a, c f a
a, c f a a, c f a a, c f a a, c f a
%
g, c e g g, c e g g, c e g g, c e g
g, c e g g, c e g g, c e g g, c e g
%
gis, b e gis gis, b e gis gis, b e gis gis, b e gis
gis, b e gis gis, b e gis gis, b e gis gis, b e gis
% %modulo 4 variazioni
% a, c e a a, c e a a, c e a a, c a c
% a c e a a, c e a a, c e a a, c a c
% %
% a c f a a, c f a a, c f a a, c a c
% a c f a a, c f a a, c f a a, c a c
% %
% g c e g g, c e g g, c e g g, c g c
% g c e g g, c e g g, c e g g, c g c
% %
% gis b e gis gis, b e gis gis, b e gis gis, b gis b
% gis b e gis gis, b e gis gis, b e gis gis, b gis b

%modulo 3, 4 e 2
a, c e a, c e a, c e a a, c e a a, c
a c e a, c e a, c e a a, c e a a, c
%
a c f a, c f a, c f a a, c f a a, c
a c f a, c f a, c f a a, c f a a, c
%
g c e g, c e g, c e g g, c e g g, c
g c e g, c e g, c e g g, c e g g, c
%
gis b e gis, b e gis, b e gis gis, b e gis gis, b
gis b e gis, b e gis, b e gis gis, b e gis gis, b
%
a1
}

\score {
\new PianoStaff <<
\set PianoStaff.instrumentName = #"Piano "
\new Staff = "destra" \destra
\new Staff = "sinistra" \sinistra
>>
\midi{
\context {
\Score tempoWholesPerMinute = #(ly:make-moment 120 4)
}
}
\layout { }
}

file PDF e file MIDI

19 aprile 2011

Seminario Calcolo Scientfico

Argomento: come scegliere matrici di linearizzazione per problemi polinomiali agli autovalori.

Potete andare sul server gitorius http://git.phc.unipi.it e cercare il mio seminario [così potrete sempre trovare ua versione aggiornata, qualora io ci rimetta le mani...] in pdf, oppure in sorgente LaTex.

È presente anche del codice in FORTRAN90 relativo a sperimentazioni varie.


10 marzo 2011

Prendere dimestichezza con Google App Engine

Ho trovato il tempo di impratichirmi con Google App Engine, in particolare inglobando il codice per calcolare la lunghezza totale dei filmati preferiti su YouTube dentro una applicazione web, realizzata con il supporto di Google App Engine. Non è stato complicato, ed effettivamente al momento il risultato è spartano, ma è stato molto istruttivo. Oltre al guadagno intellettuale ho riscontrato un notevole miglioramento delle prestazioni del mio codice, cosa buona e giusta.

Adesso, volendo continuare con questo filone, sarebbe interessante fornire la mia applicazione web di una grafica più carina (con qualche disegno, codice html e css, ecc.)

Il risultato lo trovate qui (mettete il vostro nome utente di YouTube e cliccate Go!)

16 febbraio 2011

Childgrove: ballata popolare scozzese

Sempre alla ricerca di temi musicali da rielaborare, e da suonare, ho trovato questo splendido libro: "Complete Scottish and English country dance master for recorders" e subito mi ha colpito Childgrove. Ho ascoltato e trascritto, in LilyPond, questo tema e due variazioni (tratte da una versione che ho ascoltato e, secondo me, molto istruttive). Nel libro si trova una seconda voce, probabilmente scritta dalla O'Scannell, che non ho elaborato -per ora-

Ecco lo spartito al momento attuale.


9 febbraio 2011

Contare tempo malato passato su YouTube

Per prendere pratica con le API dello zio Google, gdata, e per non dimenticarmi come si programma in Python, ho scritto questo programmino che scandaglia i preferiti di un utente YouTube (username="106ohm", per esempio) e ne estrae la durata in secondi; sommando le durate si ottiene una stima di quanto una persona è malata di youtubite...

Ho riscontrato i seguenti problemi:

1. con yt_service.GetYouTubeVideoFeed(uri) si possono estrarre Feed di massimo 50 Entry: bisogna fare un ciclo generale -io l'ho fatto di 20 Entry*- che modifica l'uri; dunque è necessario conoscere lo schema dell'uri...

2. yt_service.GetYouTubeVideoFeed(uri) smatta se riceve un uri non corretto. Nel nostro caso significa che sono finiti i chuck, e dunque ci si può fermare (occorrono due controlli dunque sulla suddetta: il primo per assicurarsi che favorites_feed_chuck non sia vuota, il secondo per assicurarsi che contenga informazioni sensate)

3. anche se la entry è non vuota potrebbe non essere definito entry.media.duration.seconds (capita per esempio quando un utente segna un video come preferito, ma questo viene ritirato in seguito dall'autore o dai gestori) e dunque c'è bisogno di un try in più.

4. Convertire in modo brutale i secondi in anni, giorni, ore, minuti e secondi è una palla.

=>Inizio codice

#!/usr/bin/env python

#importo cio' che mi occorre
import gdata.youtube
import gdata.youtube.service

#inizializzo questo oggetto prima di fare qualsiasi cosa
yt_service= gdata.youtube.service.YouTubeService()

##
#DEFINIZIONE FUNZIONI UTILI
##


#definisco una funzione per estrarre informazioni dalle entry
def PrintEntryDetails(entry):
print 'Video title: %s' % entry.media.title.text
## print 'Video published on: %s ' % entry.published.text
## print 'Video description: %s' % entry.media.description.text
## print 'Video category: %s' % entry.media.category[0].text
## print 'Video tags: %s' % entry.media.keywords.text
## print 'Video watch page: %s' % entry.media.player.url
## print 'Video flash player URL: %s' % entry.GetSwfUrl()
## print 'Video duration: %s' % entry.media.duration.seconds

# non entry.media attributes
#print 'Video geo location: %s' % entry.geo.location()
## print 'Video view count: %s' % entry.statistics.view_count
## print 'Video rating: %s' % entry.rating.average

# show alternate formats
## for alternate_format in entry.media.content:
## if 'isDefault' not in alternate_format.extension_attributes:
## print 'Alternate format: %s | url: %s ' % (alternate_format.type, alternate_format.url)

# show thumbnails
## for thumbnail in entry.media.thumbnail:
## print 'Thumbnail url: %s' % thumbnail.url

#definisco una funzione che lancia PrintEntryDetails per ogni entry di un dato feed

def PrintVideoFeed(feed):
for entry in feed.entry:
PrintEntryDetails(entry)

##
#FINE DEFINIZIONE FUNZIONI
##


##stampo i primi 20 video preferiti
##username="106ohm"
##uri= 'http://gdata.youtube.com/feeds/api/users/%s/favorites?v=2&start-index=1&max-results=20' % username
##favorites_feed = yt_service.GetYouTubeVideoFeed(uri)
##PrintVideoFeed(favorites_feed)



#sommo le durate dei video preferiti

username="106ohm"
max_results=20
uri= 'http://gdata.youtube.com/feeds/api/users/%s/favorites?v=2&start-index=1&max-results=%s' % (username, max_results)
favorites_feed_chuck = yt_service.GetYouTubeVideoFeed(uri)
count = 0
chuck=0
start_index=1
while favorites_feed_chuck is not None:
for entry in favorites_feed_chuck.entry:
if entry is not None:
try:
count = count + int(entry.media.duration.seconds)
except:
#per sapere quali video non vengono considerati
#print PrintEntryDetails(entry)
pass
chuck = chuck + 1
start_index = start_index + 20
uri= 'http://gdata.youtube.com/feeds/api/users/%s/favorites?v=2&start-index=%s&max-results=%s' % (username, start_index, max_results)
try:
favorites_feed_chuck = yt_service.GetYouTubeVideoFeed(uri)
except:
break

print 'totale: %s secondi' % count

#converto in termini di secondi, minuti, ore, giorni ed anni

minuts = count / 60
seconds = count - minuts*60
hours = minuts / 60
minuts = minuts - hours*60
days = hours / 24
hours = hours - days * 24
years = days / 365
days = days - years * 356

print 'durata totale: %s anni %s giorni %s ore %s minuti %s secondi' % (years, days, hours, minuts, seconds)


=>Fine codice

Commenti:

ho commentato tante altre belle cose... Forse in seguito troverò il tempo di usarle per qualche figata.

*la scelta di max_results=20 implica un maggior numero di cicli while, ma un minor numero di cicli for entry in ... A voi decidere se cambiarlo o meno.