GRAMophone II

la voce del padrone
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[,,,]<G[,,,]; Contesto temporale (da implementare).
  }

  player garm {
    channel 1
    instrument 1
    %

    velocity v2=v0++ step 6; /* a v2 viene assegnato il valore della
    				variabile globale v0 incrementato di 6. */
    octave o0;
    msb m0;

    //Gli operatori melodici sono ricorsivi.

    @composition->transpose(m0++ step 3, transpose(2, A[,,,]))|A[2*o0,,,];
    @seq1->A[,,rand(d0),]|domaj3;
    @seq2->repeat(3, repeat(5, ^A[,,,]B[,,,]C[,,,]^));
    @seq3->; //Produzione nulla
  }
}

Creative Commons License logo
Questo materiale è protetto dalla Creative Commons License

Leave a Reply