Projecte Proj12
Contingut
Introducció
A partir del tros d'escorça que vaig trobar a Sant Quirze de Pedret, al costat del Pont de Pedret, vull fer un instrument de percussió, que tingui d'entrada tres veus.
L'escorça l'he vernissat amb vernís de iot, i li he donat un aspecte brillant com es pot apreciar a la fotografia. Li enganxo tres piezoelèctrics a la part de darrera. Aquí s'ha de tenir diferents consideracions. Evidentment, la vibració es transmet per tota la fusta i es pot disparar més d'un parxe. Per evitar això al màxim, he d'escollir molt bé les posicions. La manera d'enganxar els parxes ha estat problemàtica. Ho he enganxat amb una silicona que tenia, però no és lo ideal, perquè no queda rígid i segur que amortigua molt el cop. Per tant, és més aviat una solució molt dolenta i s'haurà de buscar una goma que sigui ben rígida, alguna mena de pegamento epoxi. Però de moment el resultat és més que correcte. Per tal d'evitar que es disparin els parxes no desitjats faré passar els missatges midi a través de l'ordinador i filtrar aquells que no siguin prou forts.
Solució hardware amb Alesis DM5
A la meva bateria orgàgina li vull donar un so de fustes. Anem a veure com configuro el Alesis DM-5.
- Els parxes estan enganxats en les posicions 1, 2 i 3 dels External Triggers. L'escorça la toco sobre una estora, jo assegut amb les cames creuades, i la Badia de Hudson mirant cap endavant. En aquesta posició, el parxe A és el que queda a l'esquerra, i es connecta al Ext Trig 1; el parxe B és el del mig (Ext Trig 2); el parxe C és el de la dreta (Ext Trig 3).
- Escullo el Drum Set 18
- Apreto el botó External Trigger, i quan toco sobre els parxes puc veure a quines notes es correspon: 46, 38 i 36
- Ara he d'associar aquestes notes als instruments. Vull buscar tres sons de fusta que siguin prou diferents. Per fer-ho apreto Voice
- Quan acabo Store per guardar els canvis. El resultat és:
parxe A (Ext Trig 1) Nota 46 (Bb) Prc/98 Wood Hi parxe B (Ext Trig 2) Nota 38 (D) Prc/100 Block Hi parxe C (Ext Trig 3) Nota 36 (C) Prc/103 Temple Lo
Ara ja puc tocar una mica, però recordem que podem tenir cops que facin sonar dues notes, i cops (fluixos) que no facin sonar cap nota. El volum és proporcional a la força del cop de mà.
Fent passar els missatges MIDI per dins l'ordinador vull aconseguir vàries coses.
- Unificar els volums. Que els cops que han quedat fluixos sonin amb força. Això és important tenint en compte que així puc aprofitar nivells dèbils de senyal.
- Filtrar els missatges no desitjats provinents de parxes que no els correspon.
- Puc utilitzar fluidsynth com a síntesi dels sorolls. He de buscar un soundfont amb sorolls de fusta. Això és important perquè la idea és que en el futur no hagi de dependre d'un hardware com el ALESIS DM-5. La idea és muntar la mínima electrònica possible (mínima en preu i espai) per poder introduir senyals provinents dels piezos a dins l'ordinador en forma de missatges MIDI. Això s'aconsegueix amb PICs. Quan aquest sigui el cas, fluidsynth serà l'eina natural per produir els sons.
Per treballar amb sons de fusta escullo el soundfont HS_Acoustic_Percussion.sf2
$ fluidsynth -a jack -m alsa_seq /home/joan/soundfonts/percussion_drumkit/HS_Acoustic_Percussion.sf2
Escullo el canal 0, back 0 i preset 0 Per representar els sons de fusta escullo les següents notes: 38, 41, 46
manualment faig (recordem que això ho puc automatitzar amb un script)
/usr/src/midishare/src/linux/applications/msconnect/msconnect & /usr/src/midishare/src/linux/applications/msdisplay/msdisplay & /usr/src/midishare/src/linux/applications/mscontrol/mscontrol & fluidsynth -a alsa -m midishare -l /home/joan/soundfonts/percussion_drumkit/HS_Acoustic_Percussion.sf2 /usr/local/bin/msAlsaSeq "ALSA_MS_bridge" -i "UA-25EX":0
i en el codi Java connecto el proj12 amb el fluidsynth per una banda i amb el ALSA_MS_bridge per l'altra (que està connectat amb l'Edirol, que alhora està connectat amb el Alesis DM-5). També connecto el mscontrol, que em serveix de comprovació.
//em connecto a fluidsynth
int ref_fluidsynth;
if ((ref_fluidsynth = Midi.GetNamedAppl("fluidsynth")) > 0) Midi.Connect (this.refnum,ref_fluidsynth, 1);
//em connecto al ALSA_MS_bridge
int ref_alsa_ms_bridge;
if ((ref_alsa_ms_bridge = Midi.GetNamedAppl("ALSA_MS_bridge")) > //em connecto al ALSA_MS_bridge
int ref_alsa_ms_bridge;
if ((ref_alsa_ms_bridge = Midi.GetNamedAppl("ALSA_MS_bridge")) > 0) Midi.Connect (ref_alsa_ms_bridge,this.refnum, 1);
//em connecto al mscontrol
int ref_mscontrol;
if ((ref_mscontrol = Midi.GetNamedAppl("mscontrol")) > 0) Midi.Connect (ref_mscontrol,this.refnum, 1);
Quan començo a tocar al tió, tinc missatges del següent tipus.
Tipus event: 1 (0=typeNote; 1=typeKeyOn; 2=typeKeyOff) Canal: 0 Data0: 38 (altura en el cas de Note On/Off) Data1: 13 (velocitat en el cas de Note On/Off) MidiShareInput, received typeKeyOn Tipus event: 1 (0=typeNote; 1=typeKeyOn; 2=typeKeyOff) Canal: 0 Data0: 38 (altura en el cas de Note On/Off) Data1: 0 (velocitat en el cas de Note On/Off) MidiShareInput, received typeKeyOn
No sento res, i això és degut a dues causes.
- Les altures (volum) que obtinc no són grans. Per varios motius: tió gruixut, silicona per enganxar els piezos no rígida.
- el Alesis DM-5 em dóna un typeKeyOn i un typeKeyOff en comptes d'un typeNote que és el que em dóna el mscontrol, que aquest sí que funciona.
Per tant, retocaré el codi subsanant aquests fets.
public void ReceiveAlarm(int ev) {
System.out.println("\n");
System.out.println("Tipus event: " + Midi.GetType(ev) + " (0=typeNote; 1=typeKeyOn; 2=typeKeyOff)");
System.out.println("Canal: " + Midi.GetChan(ev));
System.out.println("Data0: " + Midi.GetData0(ev) + " (altura en el cas de Note On/Off)");
System.out.println("Data1: " + Midi.GetData1(ev) + " (velocitat en el cas de Note On/Off)");
if (!(Midi.GetType(ev)==1 & Midi.GetData1(ev)==0)){ //no faig cas al typeKeyOff
Midi.SetType(ev, 0); //converteixo el typeKeyOn a typeNote
Midi.SetData1(ev, 127); //normalitzo tots els sons al mateix volum, o no
Midi.SetData2(ev, 250); //durada
Midi.SendIm(this.refnum, ev);
}
}
Hi ha un problema evident de latència, però això ara no és el que toca. (ara mateix no estic utilitzant kernel RT). En aquesta versió 1 no tinc en compte el problema de què un cop dispara dos piezos. De totes maneres, si el tió està ben dissenyat i els piezos col.locats en el lloc correcte, això no hauria de ser un problema.
Faig les proves amb el array de pads de 3x3, i ara no tinc els problemes amb els piezos que tinc amb la tió orgànic. Aquest array de 3x3 forats em dóna uns senyals de volume de 50-100 que està bé, i en aquest cas puc eliminar la normalització de volum a 127 per software.
Vull fer-ho sonar pel Alesis DM-5
apago el fluidsynth i connecto el ALSA_MS_bridge i la Edirol en l'altra direcció:
/usr/local/bin/msAlsaSeq "ALSA_MS_bridge" -i "UA-25EX":0 -o "UA-25EX":0
en el codi Java comento les línies del fluidsynth i em connecto al ALSA_MS_bridge en les dues direccions:
//em connecto al ALSA_MS_bridge
int ref_alsa_ms_bridge;
if ((ref_alsa_ms_bridge = Midi.GetNamedAppl("ALSA_MS_bridge")) > 0) Midi.Connect (ref_alsa_ms_bridge,this.refnum, 1);
if ((ref_alsa_ms_bridge = Midi.GetNamedAppl("ALSA_MS_bridge")) > 0) Midi.Connect (this.refnum, ref_alsa_ms_bridge, 1);
No oblidar-se de posar l'altre cable MIDI. En la configuració MIDI del Alesis DM-5, ficar Local=Off per tal que els pads no sonin directament, sinó que només soni allò que ve de l'ordinador. Efectivament, amb aquesta configuració no tinc latència, la qual cosa confirma el que ja sabia: en el cas de què no tingui una bona configuració RT del kernel, una solució hardware dóna bons resultats. Fluidsynth és el coll de botella que em dóna una latència dolenta.
creat per Joan Quintana Compte, juliol 2009