CodeSounding library: creare computer generated music sounds con la libreria CodeSounding

SourceForge.net Logo

Demo

Guestbook

News

Wiki Home   Computer generated music sounds from a source code structure Download   Sonification examples Documentazione   How to make computer generated music sounds with CodeSounding java library

Uso della libreria - File di configurazione

Requisiti generali:
  • codesounding-embedded.jar nel classpath dell'applicazione
  • JDK 6 (codesounding-embedded.jar è stato compilato con una JVM 1.6.0_03)
Per permettere alle classi di "suonare", i sorgenti java devono essere ulteriormente processati dalla classe codesounding.cl.ApplyTemplate, che applica un template ANTLR ai token. E' disponibile un tutorial basato su ANT, nonchè una interfacca a riga di comando, che spiegano come effettuare questa operazione.

Dopo aver processato e compilato i sorgenti (avendo codesounding-embedded.jar nel classpath), è il momento di lanciare le vostre classi e "farle suonare" :)

L'algoritmo di generazione audio è impostato dalla proprietà PROCESSOR.TYPE; può essere valorizzata attraverso il flag -D della JVM oppure inserita all'interno di un file di configurazione chiamato codesounding.properties, che se presente nella directory corrente o nel classpath verrà caricato automaticamente, oppure in un file specificato dalla proprietà CONFIG_FILE (la sintassi di tale file è dettagliata nella sezione seguente).
In caso di multiple definizioni, il file di configurazione ha la precedenza su eventuali parametri da linea di comando, il file nella directory corrente ha la precedenza sulla risorsa contenuta nel classpath.
I valori che PROCESSOR.TYPE può assumere sono:
  • codesounding.jjack.SamplerSumProcessor: su piattaforme Linux, permette di generare un'onda sonora compatibile con il server audio JACK. E' necessaria la libreria jjack, nonchè un server JACK avviato. Le proprietà di contorno da configurare sono jjack.ports, jjack.input.ports (da impostare a 0), java.library.path per specificare il percorso della libreria nativa (consultare la documentazione di jjack) ed eventualmente ns, che specifica i nanosecondi dopo cui iniziare una nuova campionatura.
    Occorre inoltre avere nel classpath jjack.jar.
    Un esempio di esecuzione potrebbe essere il seguente:
    java -Djjack.ports=2 -Dns=500 -Djjack.input.ports=0 -DPROCESSOR.TYPE=codesounding.jjack.SamplerSumProcessor -Djava.library.path="/usr/lib" -cp "/usr/share/java/jjack.jar:./java2demo.jar:../../dist/codesounding-embedded.jar" java2d.Java2Demo
  • codesounding.jmusic.LogaRythm: produce musica in base al numero di istruzioni e alla loro variabilità nel tempo, applicando una funzione logaritmica
  • codesounding.abc.MidiBasicPlayer: genera ed esegue dei MIDI temporanei; richiede la presenza dell'eseguibile abc2midi
  • codesounding.abc.MidiGenerator: genera i MIDI ma non li suona; richiede la presenza dell'eseguibile abc2midi
  • codesounding.abc.BufferedProcessor: crea file con notazione ABC; occorre fornirne il percorso e nome attraverso la proprietà OUTPUT_FILE. Da tale file è possibile creare un file MIDI manualmente:
    abc2midi music.abc -o my_midi.mid
    Oppure generare un file PS contenente lo spartito musicale, mediante abcm2ps, ed esportarlo come PDF.
  • codesounding.jmusic.CrazyPianist
  • codesounding.jmusic.DamnBirds
  • codesounding.jmusic.DiehardPeople
  • codesounding.jmusic.IrritatingPianists

File di configurazione

I 'processor' codesounding.abc.* e codesounding.jmusic.LogaRythm possono essere configurati. Il formato è quello classico dei file properties java; ogni riga contiene una coppia chiave-valore:
NOME_PROPRIETA=VALORE
E' possibile utilizzare quattro gruppi di proprietà, aventi i seguenti prefissi:
  1. basic (per i 'processor' codesounding.abc.*)
  2. filter (per i 'processor' codesounding.abc.*)
  3. midi (per i 'processor' codesounding.abc.Midi*)
  4. basic.instr (per il 'processor' codesounding.jmusic.LogaRythm)
Nessuna proprietà è obbligatoria: verranno utilizzati i valori / comportamenti predefiniti.

1. Proprietà basic
Sono le proprietà che configurano la notazione ABC. Non sono un esperto di ABC, quindi vi rimando all'ottimo lavoro di Guido Gonzato, in italiano e inglese, oppure al sito inglese di Chris Walshaw.
Per i nostri fini basta sapere che un file ABC è un file testuale, composto da un header e un corpo, e che per i nomi delle note utilizza la notazione anglosassone.
  • basic.header: configura l'header del file ABC; di default viene usato un header vuoto:
    X: 1 % inizio testata
    K: C % scala: do maggiore

  • basic.var_declaration: assegna una nota all'istruzione di dichiarazione variabile. Di default assegna A (= La).
  • basic.break: assegna una nota all'istruzione break. Il valore predefinito è " ", cioè spazio (lo spazio tra una nota e l'altra).
  • basic.continue: assegna una nota all'istruzione continue. Il valore predefinito è ', cioè l'apostrofo (alza la nota precedente di un'ottava).
  • basic.do: assegna una nota all'istruzione do. Il valore predefinito è F (= Fa).
  • basic.for: assegna una nota all'istruzione for. Il valore predefinito è E (= Mi).
  • basic.while: assegna una nota all'istruzione while. Il valore predefinito è G (= Sol).
  • basic.start_block: assegna una nota all'apertura di un blocco, cioè in corrispondenza di una parentesi graffa aperta {. Il valore predefinito è B (= Si).
  • basic.end_block: assegna una nota alla chiusura di un blocco, cioè in corrispondenza di una parentesi graffa chiusa }. Il valore predefinito è C (= Do).
  • basic.if: assegna una nota all'istruzione if. Il valore predefinito è D (= Re).
  • basic.return: assegna una nota all'istruzione return. Il valore predefinito è z (indica una pausa).
  • basic.throw: assegna una nota all'istruzione throw. Il valore predefinito è , (cioè la virgola; abbassa la nota precedente di un'ottava, il contrario dell'apostrofo).
2. Proprietà filter
Durante la produzione di musica ABC, i filtri permettono di associare delle logiche di post-processamento a runtime. Prima di essere salvati su file, le note vengono scritte in un buffer temporaneo. I filtri possono decidere se scrivere una nota sul buffer oppure modificarne il contenuto. Al momento esistono quattro filtri:
  • codesounding.abc.filter.BasicFilter: salva sul buffer tutte le note.
  • codesounding.abc.filter.OneThousandthFilter: salva sul buffer una nota su 1000, le altre vengono scartate.
  • codesounding.abc.filter.DurationFilter: in modo casuale trasforma una sequenza di note uguali (presenti sul buffer) in una nota di maggiora durata: per esempio, la sequenza AAA (3 La) viene trasformata in A3, un La di durata tripla.
  • codesounding.abc.filter.SheetMusicFilter: formatta opportunamente l'output ABC (presente sul buffer), in particolare crea più righi, più voci, assegna gli strumenti.
I primi due lavorano sul buffer, mentre gli ultimi lavorano sul suo contenuto. E' possibile combinare più filtri, in modo sequenziale. Usare la proprietà filter.#, ad esempio:
filter.1=codesounding.abc.filter.OneThousandthFilter
filter.2=codesounding.abc.filter.DurationFilter
filter.3=codesounding.abc.filter.SheetMusicFilter
indica di applicare prima il filtro OneThousandthFilter, poi il DurationFilter, infine lo SheetMusicFilter.
Se non si usa nessuna proprietà, di default viene caricato soltanto il filtro codesounding.abc.filter.BasicFilter. Se si vogliono usare più filtri, è importante utilizzarne almeno uno che scriva sul buffer.
Con un po' di fantasia è possibile scrivere filtri più complessi; è una delle parti più creative.

3. Proprietà midi
Queste proprietà permettono di creare una musica ABC polifonica e di associare a ciascuna voce uno strumento. In poche parole, permettono di avere più strumenti che suonano contemporaneamente.
Per poter usare le prime due (totvox e voxnum) è necessario applicare il filtro codesounding.abc.filter.SheetMusicFilter.
  • midi.totvox: permette di creare una musica polifonica, impostando il numero di voci che si vogliono suonare contemporaneamente. Il default è un'unica voce.
  • midi.instrument.voxnum.#: permette di associare uno specifico strumento alla voce #. Per esempio, midi.instrument.voxnum.2=47 assegna alla seconda voce i timpani. Per un elenco di codici e strumenti, clicca qui (ricordarsi di sottrarre uno ai codici MIDI, in quanto gli indici vanno da 0 a 127).
    Se non si imposta nulla, lo strumento predefinito sarà 1, cioè il pianoforte.
    Note: l'assegnazione degli strumenti è possibile solo se esistono almeno due voci.
  • midi.conversion.abc_min_kbytes: indica quale dev'essere la dimensione minima (in kilobyte) del file ABC temporaneo affinchè possa essere convertito in MIDI. Per default vale 2.
  • midi.conversion.wait_seconds: indica ogni quanti secondi dev'essere verificata la presenza e dimensione del file ABC temporaneo. Per default vale 4 secondi.
4. Proprietà basic.instr
Quando si usa la classe codesounding.jmusic.LogaRythm è possibile associare uno strumento a ciascun tipo di istruzioni. Utilizzare i nomi mnemonici definiti nell'interfaccia jm.constants.ProgramChanges, ad esempio:
basic.instr.continue=EL_GUITAR
Quando non definiti, vengono caricati gli strumenti a partire da jm.constants.ProgramChanges.PIANO.
  • basic.instr.var_declaration
  • basic.instr.break
  • basic.instr.continue
  • basic.instr.do
  • basic.instr.for
  • basic.instr.while
  • basic.instr.start_block
  • basic.instr.end_block
  • basic.instr.if
  • basic.instr.return
  • basic.instr.throw
Infine, se si vuole salvare nella directory corrente l'audio generato da codesounding.jmusic.LogaRythm si può impostare la proprietà jmusic.writemidi a true.

~ Copyright © 2006 2010 - Roberto Mannai (robermann@gmail.com) ~