{"id":168,"date":"2012-02-22T13:29:01","date_gmt":"2012-02-22T11:29:01","guid":{"rendered":"http:\/\/www.joanillo.org\/?p=168"},"modified":"2020-09-16T12:50:11","modified_gmt":"2020-09-16T10:50:11","slug":"jplay-sndfile-una-aplicacion-educativa-para-procesamiento-digital-del-senal","status":"publish","type":"post","link":"https:\/\/www.joanillo.org\/?p=168&lang=es","title":{"rendered":"jplay-sndfile: una aplicaci\u00f3n educativa para Procesamiento Digital del Se\u00f1al"},"content":{"rendered":"<p><a href=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2012\/02\/pic-digitalsignal.jpg\"><img loading=\"lazy\" src=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2012\/02\/pic-digitalsignal-300x183.jpg\" alt=\"\" title=\"pic-digitalsignal\" width=\"300\" height=\"183\" class=\"alignright size-medium wp-image-594\"><\/a><strong>jplay-sndfile<\/strong> es una aplicaci\u00f3n que he estado programando la \u00faltima semana y que tiene un car\u00e1cter did\u00e1ctico. B\u00e1sicamente es un reproductor de ficheros de audio que adem\u00e1s puede aplicar un cambio de frecuencia, y tambi\u00e9n puede hacer un barrido continuo de frecuencias sobre la muestra de audio. Es un cliente de <strong>JACK<\/strong> (el servidor de audio de Linux), y est\u00e1 basado, como punto de partida, en <em>sndfile-jackplay<\/em> que se encuentra dentro de las utilidades de la librer\u00eda <strong>libsndfile<\/strong> (http:\/\/www.mega-nerd.com\/libsndfile\/tools\/#jackplay).<\/p>\n<p>Todo el mundo saber que cuando se reproduce un fichero de audio al doble de la frecuencia original dura la mitad de tiempo. Ser\u00eda equivalente a coger una muestra de cada dos, y reproducirlas a la misma frecuencia de muestreo original.<\/p>\n<p>Ahora vamos a hacer el caso contrario, queremos dividir la frecuencia por dos, y el tiempo que durar\u00e1 la reproducci\u00f3n tendr\u00eda que ser el doble. Para hacerlo, lo m\u00e1s f\u00e1cil es doblar cada muestra en dos, y reproducirlo a la frecuencia de muestreo original.<\/p>\n<p>Estos dos casos especiales, multiplicar por dos y dividir por dos, son los casos f\u00e1ciles y m\u00e1s evidentes. Un an\u00e1lisis de estos casos y estudiar el c\u00f3digo fuente proporcionado puede aclarar muchos conceptos a losestudiantes de Procesamiento Digital del Se\u00f1al. Ahora bien, m\u00e1s dif\u00edcil es hacer frecuencias intermedias entre 0.5 y 2; y m\u00e1s dif\u00edcil todav\u00eda es hacer un barrido continuo de frecuencias en un rango determinado. Todo esto es lo que se puede ver y se puede estudiar en esta aplicaci\u00f3n que tiene un car\u00e1cter did\u00e1ctico.<\/p>\n<p>La salida de la ayuda del programa proporciona la siguiente informaci\u00f3n:<\/p>\n<blockquote><p>\n$ jplay-sndfile -h<\/p>\n<p>jplay-sndfile 1.00<br \/>\nCreated by Joan Quintana Compte (joanillo)<br \/>\njoanqc arroba gmail.com &#8211; www.joanillo.org<br \/>\nLicensed under GPL v.3<\/p>\n<p>jplay-sndfile is a JACK client intended for playing audio files (wav) and pitch shifting, written basically for learning, testing and educational purposes, and the first stage for future developments. A part of playing an audio file, you can change the pitch (between *0.5 and *2) of your audio file, you can play the audio file combing the pitch between two ranges. For testing is useful a sine wave, but remember that you can use any mono (one channel) audio files.<br \/>\nThis Jack Audio client connects automatically to system:playback_1 and system:playback_2<\/p>\n<p>usage: jplay-sndfile [-h] [[pitch-shift] | [pitch-shift-start pitch-shift-end]]  wav-file<\/p>\n<p>\\t-h &#8211;help: this usage information<br \/>\n\\t[pitch-shift] (0.5,2): shifting pitch<br \/>\n\\t[pitch-shift-start] (0.5,2): shifting pitch start range<br \/>\n\\t[pitch-shift-end] (0.5,2): shifting pitch end range<br \/>\n\\twav file: mono channel audio file<br \/>\n\\t<\/p>\n<p>\\tExamples:<br \/>\n\\t.\/jplay_sndfile samples\/hellosine.wav<br \/>\n\\t.\/jplay_sndfile 0.65 samples\/hellosine.wav<br \/>\n\\t.\/jplay_sndfile 0.5 2 samples\/hellosine.wav<\/p><\/blockquote>\n<p>La muestra de audio que se presenta quiere ser un compendio de qu\u00e9 puede hacer <strong>jplay-sndfile<\/strong>, y contempla los siguientes casos:<\/p>\n<ul>\n<li>.\/jplay_sndfile samples\/test_44100.wav<\/li>\n<li>.\/jplay_sndfile .5 samples\/test_44100.wav<\/li>\n<li>.\/jplay_sndfile .8 samples\/test_44100.wav<\/li>\n<li>.\/jplay_sndfile 1.4 samples\/test_44100.wav<\/li>\n<li>.\/jplay_sndfile 2 samples\/test_44100.wav<\/li>\n<li>.\/jplay_sndfile .5 2 samples\/test_44100x3.wav<\/li>\n<li>.\/jplay_sndfile samples\/sine_440_44100.wav<\/li>\n<li>.\/jplay_sndfile .5 1 samples\/square_440_44100.wav<\/li>\n<li>.\/jplay_sndfile 1 2 samples\/saw_440_44100.wav<\/li>\n<li>.\/jplay_sndfile .5 samples\/waves.wav<\/li>\n<li>.\/jplay_sndfile 2 samples\/waves.wav<\/li>\n<\/ul>\n<p><object height=\"81\" width=\"100%\"><param name=\"movie\" value=\"https:\/\/player.soundcloud.com\/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F37445618\"><param name=\"allowscriptaccess\" value=\"always\"><embed allowscriptaccess=\"always\" height=\"81\" src=\"https:\/\/player.soundcloud.com\/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F37445618\" type=\"application\/x-shockwave-flash\" width=\"100%\"><\/object>  <span><a href=\"http:\/\/soundcloud.com\/joanillo\/jplay-sndfile-examples\">jplay-sndfile-examples<\/a> by <a href=\"http:\/\/soundcloud.com\/joanillo\">joanillo<\/a><\/span><\/p>\n<p>Una de les cosas m\u00e1s interesants es estudiar la funci\u00f3n <strong>callback<\/strong> de la <strong>API<\/strong> de <strong>JACK<\/strong>, que ha quedado bastante escueta, y donde est\u00e1 el meollo del asunto. B\u00e1sicamente la funci\u00f3n callback() es llamada por el servidor de audio cada vez que la interf\u00edcie de audio (la tarjeta de sonido hardware) necesita llenar su buffer con m\u00e1s datos.<\/p>\n<blockquote><p>\nstatic int process (jack_nframes_t nframes, void * arg)<br \/>\n{<\/p>\n<p>\\tjack_default_audio_sample_t buf ;<br \/>\n\\tunsigned int i;<br \/>\n\\touts = (jack_default_audio_sample_t *)jack_port_get_buffer (output_port, nframes) ;<\/p>\n<p>\\tinfo_t *info = (info_t *) arg;<br \/>\n\\t<br \/>\n\\tmemcpy (outs_original, buffer2 + frames_counter_original, sizeof (jack_default_audio_sample_t) * nframes * DOUBLE_SAMPLES * 2);<\/p>\n<p>\\tint k=0;<br \/>\n\\tfloat k2;<br \/>\n\\tk2 = nframes\/info-&gt;shift_pitch;<br \/>\n\\tfloat var, var2 = 0;<br \/>\n\\tint part_entera = 0;<br \/>\n\\tvar = 1\/info-&gt;shift_pitch &#8211; 1;<\/p>\n<p>\\tfor (i = 0 ; i &lt; nframes ; i++)<br \/>\n\\t{\\t<\/p>\n<p>\\t\\tif (info-&gt;shift_pitch &lt; 1) {<br \/>\n\\t\\t\\tif (frames_counter + i &gt;= info-&gt;numFrames \/ shift_pitch_equivalent) { \/\/ shift_pitch_equivalent = info.shift_pitch quan no faig un escombrat<br \/>\n\\t\\t\\tinfo-&gt;play_done=1;<br \/>\n\\t\\t\\treturn 0;<br \/>\n\\t\\t\\t}<br \/>\n\\t\\t} else { \/\/ &gt;= 1<br \/>\n\\t\\t\\tif (frames_counter_original + i &gt;= info-&gt;numFrames * DOUBLE_SAMPLES) {<br \/>\n\\t\\t\\tinfo-&gt;play_done=1;<br \/>\n\\t\\t\\treturn 0;<br \/>\n\\t\\t\\t}<br \/>\n\\t\\t}<br \/>\n\\t\\t<br \/>\n\\t\\tif (info-&gt;shift_pitch &gt; 1) {<br \/>\n\\t\\t\\tk=(int)(i*DOUBLE_SAMPLES*info-&gt;shift_pitch + .5);<br \/>\n\\t\\t\\touts[i] = outs_original[k];\\t<br \/>\n\\t\\t} else if (info-&gt;shift_pitch &lt;= 1) {<br \/>\n\\t\\t\\touts[k] = outs_original[i*DOUBLE_SAMPLES];<br \/>\n\\t\\t\\tif ((int)var2 != part_entera) {<br \/>\n\\t\\t\\t\\touts[k+1] = outs_original[i*DOUBLE_SAMPLES+1];<br \/>\n\\t\\tpart_entera = int(var2);<br \/>\n\\t\\tk++;<br \/>\n\\t\\t\\t}<br \/>\n\\t\\t\\tvar2 = var2 + var;<br \/>\n\\t\\t\\tk++;\\t\\t\\t<br \/>\n\\t\\t}<\/p>\n<p>\\t}<br \/>\n\\tframes_counter += nframes;<br \/>\n\\tframes_counter_original += nframes * DOUBLE_SAMPLES * info-&gt;shift_pitch ;<br \/>\n\\t<br \/>\n\\treturn 0 ;<br \/>\n} \/* process *\/<\/p><\/blockquote>\n<p>\u00bfY para qu\u00e9 sirve todo esto? Como hemos dicho es una aplicaci\u00f3n did\u00e1ctica, sirve sobre todo para aprender:<\/p>\n<ul>\n<li>para aprender: teor\u00eda del Procesamiento Digital del Se\u00f1al<\/li>\n<li>para aprender: API de libsndfile<\/li>\n<li>para aprender API de JACK, ejemplo de c\u00f3mo funciona la funci\u00f3n de callback<\/li>\n<\/ul>\n<p>pero a parte de aprender, se ha desarrollado con una idea en mente, que ha de ser el siguiente proyecto a realizar: utilizar una tableta gr\u00e1fica Wacom, de las que utilizan los dise\u00f1adores gr\u00e1ficos, para producir sonidos real\u00edsticos, sensibles al movimiento y a la presi\u00f3n del l\u00e1piz, pero esto es otro proyecto: <a href=\"http:\/\/wiki.joanillo.org\/index.php\/Reconeixement_real_de_gestos_amb_la_wacom_i_s%C3%ADntesi_d%27%C3%A0udio\">Reconocimiento real de gestos con la wacom y S\u00edntesis de audio<\/a><\/p>\n<ul>\n<li>Descargar <a href=\"http:\/\/wiki.joanillo.org\/index.php\/Fitxer:Jplay-sndfile-1.0.0.tar.gz\"><strong>jplay-sndfile<\/strong><\/a><\/li>\n<li>enlace del proyecto en la <a href=\"http:\/\/wiki.joanillo.org\/index.php\/Jplay-sndfile\"><strong>wiki<\/strong><\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>jplay-sndfile es una aplicaci\u00f3n que he estado programando la \u00faltima semana y que tiene un car\u00e1cter did\u00e1ctico. B\u00e1sicamente es un reproductor de ficheros de audio que adem\u00e1s puede aplicar un cambio de frecuencia, y tambi\u00e9n puede hacer un barrido continuo de frecuencias sobre la muestra de audio. Es un cliente de JACK (el servidor de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[298,310,324,320,182],"tags":[],"_links":{"self":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/168"}],"collection":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=168"}],"version-history":[{"count":2,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/168\/revisions"}],"predecessor-version":[{"id":301,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/168\/revisions\/301"}],"wp:attachment":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}