Seqüenciador: jsequencer2lily

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Introducció

Es tracta de crear un seqüenciador que produeixi un fitxer lilypond. Requisits:

La seqüenciació és un tema difícil. Per seqüenciar bé s'ha de seqüenciar a un tempo baix, intentar fer les notes completes. A part d'això, s'introduirà el paràmetre --beauty que intentarà millorar la presentació.

Desenvolupament

El sequenciador consta de dues parts lògiques:

Durant el desenvolupament es realitzen les dues parts per separat. La primera part genera un fitxer de text amb la seqüència. La segona part llegeix el fitxer de la seqüència i processa les dades.

Al final de tot les dues parts s'ajunten (mantenint o no el fitxer de la seqüència).

Processament dels missatges

El seqüenciador grava els missatges MIDI corresponents a NOTE ON (144) i NOTE OFF (128). Sembla ser que hi ha algun controlador que no envia el missatge NOTE OFF, sinó senzillament NOTE ON amb volum 0. No es contempla de moment aquest cas.

Els missatges es guarden en un array de missatges on tenim gravat el timestamp del missatge, el tipus (noteon/noteoff), i la nota musical.

Un cop tenim els missatges en brut, aquests entren en una cadena, on cada pas té una determinada funció. L'objectiu és obtenir una seqüència íntegra (després d'un note on sempre va el seu note off, el nostre és un seqüenciador monofònic). Fins que no hagi acabat aquesta cadena no es podrà processar els missatges per obtenir la partitura. Els passos de la cadena serien:

1. Arreglar incongruències en la seqüència. Depenent del controlador utilitzat i de l'habilitat del músic, així com d'altres factors, s'obtindran més o menys incongruències. Es consideren fins a 4 casos d'incongruència ( #1: noteon solitari, s'elimina el missatge; #2: noteoff solitari, s'elimina el missatge; #3: noteon previ a un noteoff, s'intercalen els missatges; #4: noteon abans que noteoff II, per ex 1-1-0-0, s'elimina la nota del mig. Un cop arreglades totes les incongruències, es comprova la integritat de la seqüència.

2. Paràmetre beauty. És en aquest punt on hem d'introduir aquest paràmetre (abans de la quantització, i després de què tinguem assegurada la integritat). La idea és que el músic tendeix a fer notes més curtes del que està escrit a la partitura, i per tant el resultat final seria que apareixen silencis de corxea i de semicorxea. La idea és simple, es tracta de reduir els espais entre nota i nota (que seran els silencis) en un factor, i per tant ampliar la nota posterior. Per exemple, --beauty 10 significaria reduir en un 10% els silencis. S'haurà de jugar amb diferents paràmetres per veure quin és el valor per defecte i el valor més convenient.

3. Ara que ja tinc integritat i queden definides totes les notes on comencen i on acaben, passo de tenir un array on es guarden els timestamps dels events midi, a tenir un altre array on es guarden les posicions on comencen les notes i la seva longitud.

4. Quantització. En funció del paràmetre --quant, quantitzo a corxees o semicorxees. És el músic el que ha de saber quina és la resolució que ha de tenir la seva partitura. En el procés de quantització s'ha d'anar en compte. D'una banda s'ha de quantitzar la posició de les notes; d'altra banda la seva longitud. Però amb compte, perquè pot donar-se el cas de què després d'aquesta doble quantització la nota següent podria estar abans que la nota anterior.

5. Eliminació dels glitches. Com a conseqüència d'aquesta quantització hi ha hagut notes que han passat a tenir una longitud = 0 (son els glitches). S'ha d'eliminar de l'array.

6. Generalitzo el concepte de nota, i els silencis també passen a ser notes (notemidi=0). La idea és omplir els espais buits amb notes de valor=0. He de considerar el cas especial del silenci que hi pot haver al principi de tot, i del silenci que hi pot haver al final de tot per tal de completar el compàs perfectament.

Ara que ja tinc clar totes les notes on comencen i on acaben, ara les he de convertir a format lilypond. I aquesta no és una tasca fàcil, i pot tenir diverses causístiques. Tinc clar on comença una nota i on acaba, però he de tenir present que aquesta nota pot quedar entre dos compassos, i això ho he de tenir present per tal que la sortida lilypond sigui correcta. Bàsicament és la funció escriure_notes2().

Ús

Els paràmetres disponibles són: (completar)

-h | --help: usage information    
--title title
  ex: --title 'New York, New York'
--composer composer
  ex: --composer 'Frank Sinatra'
--opus opus
  ex: --opus 'Alto Sax'
--tagline tagline 
  ex: --tagline 'Music engraving by LilyPond'
--clef clef
  ex: --clef treble (default: treble)
--time time
  ex: --time 4/4 (default: 4/4)
--tempo tempo
  ex: --tempo 110 (default: 110)
--key key
  ex: --key CM, --key Dm, --key FM (default: CM)
-t | --trans transposition
  ex: --trans -3 (+2: saxo tenor, clarinet; -3: saxo alto)(default: 0)
-q | --quant quantization: quantization value
  ex: --quant 8 (1 (whole note), 2, 4, 8 (quaver), 16 (semiquaver))  (default: 16)
--delaybars delaybars: number of metronome bar/measures previous to sequencing
  ex: --delaybars 2 (default=1)
--pdf yes/no: generate pdf score (default: yes)
--viewscore yes/no: visualize pdf score (default: yes). Implies --pdf yes
--midi yes/no: generate midi file (default: yes)
-f | --file file: output lilypond file (.ly extension)\n");
  ex: --file new_york.ly

Instal.lació i configuració

El millor és llegir el fitxer LLEGEIX.TXT del projecte. Es compila amb gcc.

La mare dels ous està en el script de configuració jsequencer2lily.sh, que llegeix tots els paràmetres; obre (si és que no està obert) el jackd, sinte i controlador; estableix totes les connexions; arrenca el metrònom amb els paràmetres correctes; arrenca el sequenciador amb els paràmetres correctes.

Es pot tenir varis fitxers de configuració per cadascun dels setups (diferents sintes, diferents controladors, etc)

Ja havia treballat jo amb scripts similars. De tota manera, un exemple complet de script bash que treballa amb clients JACK és:

ALSA to MIDI bridge

Sempre havia utilitzat a2jmidid -e. És una solució fiable, però té l'inconvenient que el nom dels ports és bastant enrabassats. També hi ha altres solucions, que poden ser millors:

Per tant, tinc diferents opcions de connectar el EWI-USB o el Axiom 25 a fluidsynth d'una banda i jsequencer2lily d'altra banda.

Més informació:

jsequencer2lily com a sequenciador multipista

jsequencer2lily només grava una pista, és monofònic. Ara bé, es pot gravar una sessió multipistes amb jsequencer2lily? Sí. Puc gravar una pista mentre es reprodueix el fitxer midi del que he gravat prèviament. A grans trets el procediment seria el següent:

$ ./jsequencer2lily -f song_tr1.ly --title 'song_tr1' --time 4/4 --tempo 60 --key CM -q 16

Es produeix el fitxer midi song_tr1.midi

Aquest fitxer midi el puc reproduir amb jack-smf-player, amb la comanda -n i sense la comanda -t, de manera que segueix el transport de JACK (de fet segueix jsequencer2lily, que és el transport master):

$ jack-smf-player -n -a fluidsynth:midi /home/joan/projectes/jsequencer2lily/src/scores/song_tr1.midi

I ara mentre sona el fitxer puc seqüenciar la segona pista:

$ ./jsequencer2lily -f song_tr2.ly --title 'song_tr2' --time 4/4 --tempo 60 --key CM -q 16

Un cop tingui tots els fitxers .ly de les diferents pistes, els puc posar en un sol fitxer lilypond, i aleshores puc associar cada pista a un canal i a un instrument.

Per exemple, si la sortida de les dos primeres pistes és:

melodia =
	\relative c''
	{
%1
r1 r1 r4 f,,8 r a r g r f r e r d r b4 
%5
r8 c4 r2 r8
	}


melodia =
	\relative c''
	{	 
%1
r1 r2 e,8 r d r c' r c r b r a r f4 g,8 f r2
	}

per ajuntar-ho faria una cosa com ara: (fixar-se amb els petits canvis que hi ha respecte els fitxers originals monotrack:

% ****************************************************************************************************
% ********************************************** Song () **********************************************
% ****************************************************************************************************
% ******************** Lilypond score generated automatically by jsequercer2lily *********************
% ****************************************************************************************************

\version "2.12.3"
\header {
	title = \markup { \override #'(font-name . "arial") "song" } 
	composer = \markup { \override #'(font-name . "arial") "" } 
	opus = \markup { \override #'(font-name . "arial") "" } 
	tagline = \markup { \override #'(font-name . "arial") "Music engraving by LilyPond. File generated by jsequencer2lily (open source sequencer)" } 
}

#(set-default-paper-size "a4")

global= {
	\clef treble
	\time 4/4
	\tempo 4=60
}

trackI =
	\relative c''
	{
	\key c \major
	\set Staff.midiInstrument = #"flute"
%1
r1 r1 r4 f,,8 r a r g r f r e r d r b4 
%5
r8 c4 r2 r8 
	}

trackII =
	\relative c''
	{ 
	\key c \major
	\set Staff.midiInstrument = #"alto sax"
%1
r1 r2 e,8 r d r c' r c r b r a r f4 g,8 f r2 r1
	}

% Paper output:
\score{
	<<
	\new Staff { \global \trackI }
	\new Staff { \global \trackII }
	>>
}

% MIDI output:
\score{
    <<
    \new Staff { \global \trackI }
    \new Staff { \global \trackII }
    >>
\midi{}
}

NOTA: com a cosa curiosa en el nom de les pistes no puc ficar track1 o track_1 perquè lilypond no accepta números o guions baixos en el nom del track (?).

També he ficat els instruments adequats a cada pista, i ara ja puc fer sonar les dues pistes (o les que siguin) totes juntes:

$ jack-smf-player -n -a fluidsynth:midi /home/joan/projectes/jsequencer2lily/src/scores/song.midi

Jsequencer2lily multipista.jpg

Enllaços


creat per Joan Quintana Compte, octubre 2013

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
Institut Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines