GRAMophone II

foto: doggie di Blu Iguana
GRAMophone è un software per la composizione musicale algoritmica basata sull’uso delle grammatiche formali, che sviluppai per la mia tesi di laurea. A causa del limitato tempo a disposizione, questa prima versione di GRAMophone soffriva di alcune limitazioni, come l’impossibilità di usare gli operatori melodici e di generare direttamente un file MIDI binario.
GRAMophone, infatti, generava una sorta di “codice assembler” da dare in input al programma txt2midi che si occupava di generare il file MIDI vero e proprio. Ho deciso, quindi, di riprendere lo sviluppo di questo software, riprogettandolo completamente al fine di superare le vecchie limitazioni, introdurre nuove funzionalità e migliorarne l’efficienza e l’usabilità.
Gli obiettivi del progetto GRAMophone sono:
- Il linguaggio dev’essere quanto più semplice possibile e vicino al musicista, in modo da consentirgli di esprimere le proprie idee.
- GRAMophone II deve supportare un approccio alla composizione musicale sia Top Down sia Bottom Up.
- GRAMophone II deve consentire un approccio parametrico alla composizione musicale, cioè gli attributi di ciascuna nota come il volume, la durata, l’ottava, ecc. devono poter essere controllati separatamente, cambiati ed aggiornati durante la generazione del brano.
- GRAMophone II deve permettere l’uso di operatori melodici, quali la trasposizione, l’inversa, la retrograda e la retrograda inversa.
- GRAMophone II deve offrire la possibilità, se l’autore vuole, di generare musica in maniera non deterministica.
Le novità introdotte da GRAMophone II sono:
- Uso di una Virtual Machine, denominata GrammyVM, per la generazione del brano.
- Generazione diretta del file MIDI.
- Ciascun player dell’orchestra può generare indipendentemente secondo la grammatica di Chomsky (approccio top down) o Lindenmayer (approccio bottom up).
- Gestione di grammatiche di Lindenmayer non free-context.
- Supporto per gli operatori melodici: trasposizione, inversa, retrograda e retrograda inversa. Tali operatori melodici possono essere ricorsivi.
- Uso di librerie esterne.
- Definizione di macros.
GRAMophone II, come il suo predecessore, è sviluppato in linguaggio C.
Al momento il parser, sviluppato mediante l’uso dell’analizzatore lessicale Lex/Flex e del generatore di parser per grammatiche libere dal contesto Yacc/Bison, è quasi completo e già funzionante. Di seguito riporto un esempio di codice sorgente che il parser di GRAMophone II è già in grado di accettare:
//I commenti sono C-like
//GRAMophone II supporta la definizione di macros.
define domaj3 "^C[,,,]E[,,,]G[,,,]^"
composition "First Example" of "Giovanni Ferranti" {
/* 1a Parte Dichiarativa: si possono definire i valori di default
per tutti i player dell'orchestra. */
grammar chomsky //Tipo di generazione delle produzioni.
instrument 0 //Strumento musicale di default.
tempo 120 //Metronomo della composizione musicale.
resolution 480 //Unità di tempo che formano una nota da un quarto.
iterations 10 //Numero di iterazioni per la generazione della musica.
time_signature 4/4
octave 3 //Ottava di default delle note.
velocity 64 //Intensita' di default delle note.
duration 360 //Durata di default delle note.
release 64 //Intensita' di default per il rilascio delle note.
msb 0 //Valore di default per le variabili di tipo msb.
%
//2a Parte dichiarativa: variabili globali.
velocity v0, v1; //Dichiarazione semplice.
duration d0, d1=2*d0; //Dichiarazione con inizializzazione.
player giovanni {
/* 1a Parte dichiarativa del player: valori di default per il player
specifico. */
grammar lindenmayer
channel 0 //canale MIDI associato al player giovanni.
%
//2a Parte dichiarativa del player: variabili locali.
octave o0;
velocity v0, v1=v0;
duration d1=rand(960); /* rand(x) restituisce un valore casuale
minore di x. */
axiom->A[,,,]; /* Assioma per la grammatica di Lindenmayer.
A[,,,] e' la nota LA con tutti i suoi parametri
impostati al default. I parametri delle note sono
quattro: 'octave', 'velocity', 'duration' e 'release'
inseriti in questo preciso ordine. */
A[,,,]->C[2,64,192,64]|B[2,,,]; /* Produzione non deterministica.
La nota B[2,,,] ha il parametro
'octave' impostato a 2 e i restanti
parametri impostati al default. */
B[2,,,]->^G[,,,]B[,,,]D[4,,,]^; /* La nota B[2,,,] viene sostituita con
l'accordo di SOL maggiore.
Le note che compongono un accordo
sono racchiuse tra i simboli ^. */
G[,,,]?v0<64->G[,v0++,,]; /* Produzione con condizione. Viene
processata finche' il valore della
velocity e' minore di 64. */
/* GRAMophone II gestisce librerie esterne.
Possono essere incluse in qualsiasi punto ed il loro contenuto
dev'essere in sintonia con la posizione del sorgente dove sono
incluse. */
library libreria.grl
/* GRAMophone II gestisce anche grammatiche di Lindenmayer non
free-context. */
^C[,,,]E[,,,]G[,,,]^->A[,,,]; //Contesto polifonico.
//A[,,,]B[,,,]<

Questo materiale è protetto dalla Creative Commons License
Posted on February 25th, 2007 by gyofer
Filed under: algorithmic music, projects
Leave a Reply