<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Ajuda_per_als_baixos_del_diat%C3%B2nic%3A_diatonicbaixos</id>
	<title>Ajuda per als baixos del diatònic: diatonicbaixos - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Ajuda_per_als_baixos_del_diat%C3%B2nic%3A_diatonicbaixos"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Ajuda_per_als_baixos_del_diat%C3%B2nic:_diatonicbaixos&amp;action=history"/>
	<updated>2026-08-30T15:28:25Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Ajuda_per_als_baixos_del_diat%C3%B2nic:_diatonicbaixos&amp;diff=251128&amp;oldid=prev</id>
		<title>Joan: /* script diatonicbaixos.sh */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Ajuda_per_als_baixos_del_diat%C3%B2nic:_diatonicbaixos&amp;diff=251128&amp;oldid=prev"/>
		<updated>2014-01-23T11:08:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;script diatonicbaixos.sh&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Introducció=&lt;br /&gt;
La Maria està aprenent el diatònic. Es tracta d'un programa per ajudar a posar els baixos de l'acordió diatònic G/C, sistema Marimon. El programa consta del binari pròpiament dit ('''diatonibaixos'''), i del script que arrenca el binari ('''diatonicbaixos.sh''') i que s'encarrega de què funcioni tota la sessió (jack2, fluidsynth, change_tempo_smf, jack-smf-player, klick, i el que calgui).&lt;br /&gt;
&lt;br /&gt;
Tot i que el programa està pensat per a diatònic amb 4 baixos, es podria reprogramar per a d'altres sistemes, i fins i tot es podria fer un programa similar per a la mà dreta.&lt;br /&gt;
&lt;br /&gt;
El programa és un client de JACK (sistemes GNU/Linux), i és un ''Time Master'', de manera que el programa s'encarrega de controlar el transport, i que els altres clients connectats, com el ''jack-smf-player'' i el ''klick'' segueixen el ''Time Master''.&lt;br /&gt;
&lt;br /&gt;
Així doncs, per tal de què el programa sigui un ''play-along'', necessitaré tenir el fitxer midi de la cançó, i tocar-la mentre es van mostrant les posicions dels botons (en verd significa tancar; en vermell significa obrir). També hi ha botons en cian, que mostren les posicions anticipades dels futurs botons que s'hauran de tocar.&lt;br /&gt;
&lt;br /&gt;
No cal dir que per fer sonar la cançó es necessita un software de síntesi, en aquest cas ''fluidsynth'', però es podria haver utilitzat qualsevol altre software de síntesi.&lt;br /&gt;
&lt;br /&gt;
Els fitxers midi que es faran sonar s'hauran de sequenciar. En aquest cas s'utilitza ''jsequencer2lily'': [[Seqüenciador: jsequencer2lily]]&lt;br /&gt;
&lt;br /&gt;
=Desenvolupament=&lt;br /&gt;
carpeta ''~/projectes/diatonicbaixos''&lt;br /&gt;
&lt;br /&gt;
Es tracta d'un software ''play-along'': mentre sona la cançó es mostra la posició dels botons que s'han d'apretar per a la mà esquerra. Un dels requisits importants és que es pugui definir el tempo (més ràpid o més lent).&lt;br /&gt;
&lt;br /&gt;
La manera d'invocar el programa és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diatonicbaixos [-d] [-t tempo] midifile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De totes maneres si vull escoltar la cançó per sobre només té sentit invocar el script '''diatonicbaixos.sh'''.&lt;br /&gt;
&lt;br /&gt;
El programa també detecta quan s'han de tocar dos baixos alhora, veure el fitxer de configuració. El límit de moment està en dos baixos a l'hora.&lt;br /&gt;
&lt;br /&gt;
L'opció '''-d''' (display) significa que visualitzo amb antelació el següent baix que s'haurà de tocar, de color blau cel.&lt;br /&gt;
&lt;br /&gt;
El programa mostra el compàs i el temps de compàs. Es pot integrar fàcilment amb el metrònom '''klick'''.&lt;br /&gt;
==fitxer de configuració==&lt;br /&gt;
El fitxer de configuració té el mateix nom que el fitxer midi, només que amb extensió .txt. Per exemple, si vull fer sonar la cançó ''midi/modista_balaguer.midi'', el fitxer de configuració serà ''midi/modista_balaguer.txt''. És a dir, han d'estar en la mateixa carpeta.&lt;br /&gt;
&lt;br /&gt;
fitxer ''modista_balaguer.txt'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Time Signature: 3/4&lt;br /&gt;
Tempo: 80&lt;br /&gt;
Number of bars: 16&lt;br /&gt;
#1&lt;br /&gt;
1 g1 t&lt;br /&gt;
2 g2 t&lt;br /&gt;
2.5 r&lt;br /&gt;
3 g2 t&lt;br /&gt;
3.5 r&lt;br /&gt;
#2&lt;br /&gt;
4 d1 o&lt;br /&gt;
5 d2 o&lt;br /&gt;
5.5 r&lt;br /&gt;
6 d2 o&lt;br /&gt;
6.5 r&lt;br /&gt;
#3&lt;br /&gt;
7 a1 o&lt;br /&gt;
8 d2 o&lt;br /&gt;
8.5 r&lt;br /&gt;
9 d2 o&lt;br /&gt;
9.5 r&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les tres primeres línies estan definides per a la capçalera (ritme, tempo i número de compassos). L'opció -t no és obligatòria. Si no poso l'opció -t, s'agafa el valor del fitxer de configuració (i jack-smf-player també agafarà el valor intern del SMF). Per tant, si vull que soni bé, aquests dos valors hauran d'estar en concordància. Per evitar problemes, es recomana utilitzar l'opció '''-t''', i així no tindré problemes de sincronització.&lt;br /&gt;
&lt;br /&gt;
Després de la capçalera ja bé la seqüència dels baixos, que s'explica ella sola. Com es veu, es pot definir amb decimals el número del temps, per definir les corxees o semicorxees. '''g1''' significa el ''baix'', i ''g2'' significa l'acord. ''t'' significa ''tancar'', i ''o'' significa ''obrir''. per tant, ''g1 t'' i ''g1 o'' es correspondran a dues tecles diferents, que està codificat en el codi. També es defineixen els silencis, i d'aquesta manera podem fer èmfasi en els baixos que són més llargs i d'altres que són més curts.&lt;br /&gt;
&lt;br /&gt;
Si es vol tocar dos baixos alhora n'hi ha prou en definir-los amb el mateix temps. Per ex:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
7 a1 o&lt;br /&gt;
7 d2 o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
que sonaran al mateix temps en el temps 7.&lt;br /&gt;
&lt;br /&gt;
==ncurses==&lt;br /&gt;
Per programar el component gràfic s'havia pensat en la llibreria SDL. Finalment s'ha utiltizat la llibreria ncurses, que també permet colors i compleix perfectament els objectius.&lt;br /&gt;
&lt;br /&gt;
Com que és la primera vegada que programava amb ''ncurses'', he seguit el tutorial:&lt;br /&gt;
*http://hughm.cs.ukzn.ac.za/~murrellh/os/notes/ncurses.html&lt;br /&gt;
&lt;br /&gt;
==jack-smf-player. projecte change_tempo_smf==&lt;br /&gt;
'''jack-smf-player''' forma part de '''jack-smf-utils''':&lt;br /&gt;
*http://sourceforge.net/projects/jack-smf-utils/&lt;br /&gt;
És el programa que s'utilitza per fer playback del fitxer midi. Amb l'opció -n faig que sigui un esclau del transport del JACK&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/local/bin/jack-smf-player -q -n -a fluidsynth:midi $ARGFILE &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El tempo amb què es toca un SMF està definit dins del fitxer. Si vull canviar el tempo, hauré de modificar els bytes necessaris dins el fitxer binari que és el SMF. Està explicat a:&lt;br /&gt;
*[[Canviar_el_tempo_d'un_fitxer_midi:_change_tempo_smf]]&lt;br /&gt;
'''change_tempo_smf''' és una petita utiltiat que només té aquest objectiu, i que s'integra en el script ''diatonicbaixos.sh''.&lt;br /&gt;
&lt;br /&gt;
==script diatonicbaixos.sh==&lt;br /&gt;
invocació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./diatonicbaixos.sh midi/modista_balaguer.midi&lt;br /&gt;
$ ./diatonicbaixos.sh -t 60 midi/modista_balaguer.midi&lt;br /&gt;
$ ./diatonicbaixos.sh -m -t 60 -d midi/modista_balaguer.midi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script que ho fa corre tot queda de la següent manera:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# ./diatonicbaixos.sh midi/modista_balaguer.midi&lt;br /&gt;
# ./diatonicbaixos.sh -t 60 midi/modista_balaguer.midi&lt;br /&gt;
# ./diatonicbaixos.sh -m -t 60 -d midi/modista_balaguer.midi&lt;br /&gt;
# ./diatonicbaixos.sh -h&lt;br /&gt;
&lt;br /&gt;
TEMP=`getopt -o hdmt: -n 'diatonicbaixos' -- &amp;quot;$@&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
if [ $? != 0 ] ; then echo &amp;quot;Terminating...&amp;quot; &amp;gt;&amp;amp;2 ; exit 1 ; fi&lt;br /&gt;
&lt;br /&gt;
# Note the quotes around `$TEMP': they are essential!&lt;br /&gt;
eval set -- &amp;quot;$TEMP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
clear&lt;br /&gt;
echo &amp;quot;Diatonic Baixos&amp;quot;&lt;br /&gt;
echo &amp;quot;(c) Joan Quintana Compte (joanillo)&amp;quot;&lt;br /&gt;
echo &amp;quot;Gener 2014&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ARG=&lt;br /&gt;
ARGTEMPO=&lt;br /&gt;
ARGFILE=&lt;br /&gt;
HELP=&lt;br /&gt;
KLICK=&lt;br /&gt;
&lt;br /&gt;
while true; do&lt;br /&gt;
	case &amp;quot;$1&amp;quot; in&lt;br /&gt;
	-h ) &lt;br /&gt;
		HELP=&amp;quot;yes&amp;quot;;&lt;br /&gt;
		ARG=&amp;quot;$ARG -h &amp;quot;; shift;;&lt;br /&gt;
	-d )&lt;br /&gt;
		ARG=&amp;quot;$ARG -d &amp;quot;; shift;;&lt;br /&gt;
	-m )&lt;br /&gt;
		KLICK=&amp;quot;yes&amp;quot;; shift;;&lt;br /&gt;
	-t )&lt;br /&gt;
		ARG=&amp;quot;$ARG -t $2&amp;quot;; ARGTEMPO=&amp;quot;$2&amp;quot;; shift 2 ;;&lt;br /&gt;
	* ) break ;;&lt;br /&gt;
	esac&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
ARGFILE=&amp;quot;$2&amp;quot;&lt;br /&gt;
ARG=&amp;quot;$ARG $ARGFILE&amp;quot;&lt;br /&gt;
#echo $ARG&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$HELP&amp;quot; == 'yes' ]; then&lt;br /&gt;
	echo &amp;quot;diatonicbaixos.sh. Bash script option:&amp;quot;&lt;br /&gt;
	echo &amp;quot;-h help&amp;quot;&lt;br /&gt;
	echo &amp;quot;-m: use klick metronome&amp;quot;&lt;br /&gt;
	echo &amp;quot;-t tempo&amp;quot;&lt;br /&gt;
	echo&lt;br /&gt;
	echo &amp;quot;Examples&amp;quot;&lt;br /&gt;
	echo &amp;quot;diatonicbaixos.sh midi/modista_balaguer.midi&amp;quot;&lt;br /&gt;
	echo &amp;quot;diatonicbaixos.sh -t 60 midi/modista_balaguer.midi&amp;quot;&lt;br /&gt;
	echo &amp;quot;diatonicbaixos.sh -m -t 60 -d midi/modista_balaguer.midi&amp;quot;&lt;br /&gt;
	echo &amp;quot;---------------&amp;quot;&lt;br /&gt;
	echo&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$ARGTEMPO&amp;quot; != '' ]; then&lt;br /&gt;
	./change_tempo_smf -q -t $ARGTEMPO $ARGFILE #change_tempo_smf retorna 1 si hi ha hagut un canvi de tempo&lt;br /&gt;
	#this way you can see that environment variable $? which receive the last 1 byte of return value of main()&lt;br /&gt;
	if [ $? -eq &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
		#echo &amp;quot;Canvi tempo&amp;quot;&lt;br /&gt;
		NOU_TEMPO=&amp;quot;1&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
	sleep 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
#echo $NOU_TEMPO&lt;br /&gt;
&lt;br /&gt;
if [ -z `pidof -s jackd` ]; then&lt;br /&gt;
  /usr/bin/jackd -dalsa -dhw:0,0 -r44100 -p256 -n2 -Xseq &amp;amp; #targeta interna&lt;br /&gt;
  #/usr/bin/jackd -t 2000 -dalsa -dhw:3,0 -r44100 -p256 -n2 -Xseq &amp;amp; #targeta externa&lt;br /&gt;
  sleep 6&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -z `pidof -s fluidsynth` ]; then&lt;br /&gt;
  #/usr/bin/fluidsynth -i -s -l -j -a jack -m jack -l -f fluidsynth.cfg /usr/share/sounds/sf2/Unison.sf2 &amp;amp;&lt;br /&gt;
  /usr/bin/fluidsynth -i -s -l -j -a jack -m jack -l /home/joan/projectes/soundfont_castagnari/castagnari.sf2 &amp;amp;&lt;br /&gt;
  sleep 4&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
#arrenco el jack-smf-player, si no està arrencat&lt;br /&gt;
#si hi ha canvi de tempo, primer l'he de matar i tornar-lo a arrencar&lt;br /&gt;
if [ -z `pidof -s jack-smf-player` ]; then&lt;br /&gt;
	/usr/local/bin/jack-smf-player -q -n -a fluidsynth:midi $ARGFILE &amp;amp;&lt;br /&gt;
	sleep 2&lt;br /&gt;
elif [ ! -z $NOU_TEMPO ]; then&lt;br /&gt;
	killall jack-smf-player&lt;br /&gt;
	sleep 1&lt;br /&gt;
	/usr/local/bin/jack-smf-player -q -n -a fluidsynth:midi $ARGFILE &amp;amp;&lt;br /&gt;
	sleep 2	&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$KLICK&amp;quot; == 'yes' ]; then&lt;br /&gt;
	#arrenco el klick, si no està arrencat&lt;br /&gt;
	#si hi ha canvi de tempo, primer l'he de matar i tornar-lo a arrencar&lt;br /&gt;
	if [ -z `pidof -s klick` ]; then&lt;br /&gt;
		/usr/bin/klick -t -P -s 1 -e $ARGTEMPO &amp;amp;&lt;br /&gt;
		sleep 1&lt;br /&gt;
	elif [ ! -z $NOU_TEMPO ]; then&lt;br /&gt;
		killall -q klick&lt;br /&gt;
		sleep 1&lt;br /&gt;
		/usr/bin/klick -t -P -s 1 -e $ARGTEMPO &amp;amp;&lt;br /&gt;
		sleep 1	&lt;br /&gt;
	fi&lt;br /&gt;
else&lt;br /&gt;
	killall -q klick&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
#echo $ARG&lt;br /&gt;
./diatonicbaixos $ARG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Veiem que '''jack-smf-player''' haurà d'arrencar si no estava arrencat, o si s'ha detectat un canvi de tempo.&lt;br /&gt;
&lt;br /&gt;
=Descàrrega / Download=&lt;br /&gt;
*download: [[Fitxer:Diatonicbaixos-1.0.0.tar.gz]], http://wiki.joanillo.org/images/5/54/Diatonicbaixos-1.0.0.tar.gz&lt;br /&gt;
*blog: http://www.joanillo.org/?p=811&lt;br /&gt;
*youtube: http://youtu.be/IHHTBFJKLnA&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, gener 2014&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>