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:
- basic (per i 'processor' codesounding.abc.*)
- filter (per i 'processor' codesounding.abc.*)
- midi (per i 'processor' codesounding.abc.Midi*)
- 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) ~