Disponible la version 0.3 de Tapita

#1 por monon el 22/06/2014
Hace ya bastante que prometí incluir detección de "beats" a través del audio de jack y finalmente lo de hecho.
Ahora , ademas de poder "tapear" con el teclado alfanumerico y el teclado MIDI, tambien se le puede enviar una señal de audio a traves de jack y ajustar el "threshold" de detección.

He reescrito bastante parte del codigo. De hecho solo he aprovechado algunas funciones.
Está disponible en sourceforge:
http://sourceforge.net/projects/tapita

¿Porque la version 0.3 si la anterior era 2.x? por que las anteriores numeraciones estaban equivocadas y les faltaba un 0 delante.

Si alguien lo prueba me gustaria un poco de "feedback". Por ejemplo "consumo de recursos", "errores de compilacion o instalacion", etc.

Gracias a todos por esta larga espera! :-D
Subir
2
#2 por catorze el 22/06/2014
Genial monon!! lo habro i me aparecen un montón de milisegundos al probar con la barra espaciadora, cierro y vuelvo a abrir y ya funciona perfectamente, no puedo reproducir el fallo, a aparte de eso el detector via jack funciona de maravilla y me sirve muchisimo.

Me consume un 2% de la cpu.

Y aprovechando, ¿seria posible que aprovechando el threshold se enviara una nota midi que se pudiera elegir para sustituir algun elemento de percusión? de momento no he encontrado nada parecido, si alguien lo conoce que lo diga porfa!

Saludos!
Subir
#3 por monon el 22/06/2014
Gracies Cato.
Me pongo en contacto contigo por privado a ver que sucede con ese "tap" del espacio.

Con respecto a lo del "trigger", se puede hacer pero no creo que tapita sea lo mas indicado.
Pero si que se puede hacer un programa dedicado a esa funcion.

Por si te interesa existe el plugin ladspa-trigger que hace eso exactamente.
La limitacion es la cantidad "sample" lanzar y poderlos reemplazar.
Por defecto tiene 4 0 5 "files" pero tocando el codigo puedes poner los que quieras.
El mio está customizado y usa 10 "samples".

Tenía en mente desde hace tiempo escribir un fork de este plugin por que creo
que se puede mejorar en algunos aspectos.

Si me dices que te interesa mas , plugin o stand alone, me pongo a ello.
Subir
#4 por monon el 22/06/2014
Gracias sobre todo a Luis Garrido por su peculiar modo de mostrar el camino.
Subir
#5 por vagar el 22/06/2014
¡Gracias por el esfuerzo!

No me funciona muy bien, ahí va un primer informe:

1) Para que compile en la máquina que estoy usando hay que añadir:

if (! g_thread_supported ()) {
g_thread_init (NULL);
}

Antes de gdk_threads_init

2) La etiqueta BMP debería ser BPM.

3) Sólo he probado con la barra espaciadora y no funciona bien, salen periodos muy altos. He echado un vistazo rápido al código, si quieres manejar el tiempo en milisegundos tienes que multiplicar tv_sec por 1000, no por 1000000, ¿no?

4) Potencialmente puedes tener problemas de concurrencia (dos hilos distintos llamando a la vez a funciones como get_time() u on_event(), pero son poco probables por el patrón de uso de la aplicación.

#4 ¿Peculiar? :silbar: :birras:

Ars longa, vita brevis.
Mi colección de enlaces web en diigo.

Subir
#6 por monon el 23/06/2014
Hola Luis

Gracias por el test
Te comento
1) Esa linea la tenia anteriormente pero me lanzaba un "warning" de "deprecated" asi que la eliminé.
No se exactamente esa advertencia a que es debida. Añadida de nuevo!

2) Jejeje Las prisas y la dislexia. Solucionado!

3) Es extraño lo que comentas por que he estado haciendo pruebas incluso con gtklick tanto por jack como tapeando con "espacio" o por midi para ver que tal funcionaba y tenia deviaciones del 1 y 2 % a 240. Lo cual me parece bastante ajustado.
Voy a volver revisar la entrada a través de teclado ... pero no se... en mi caso tiempos correctos.
Respecto a la formula de adquirir el tiempo he probado a insertar esto y me da exactamente 2000.

// DEBUG TIME
gettimeofday(&timeOfDay,NULL);
int a = ((timeOfDay.tv_sec * 1000000) + timeOfDay.tv_usec)/1000;
sleep(2);
gettimeofday(&timeOfDay,NULL);
int b = ((timeOfDay.tv_sec * 1000000) + timeOfDay.tv_usec)/1000;
printf( " wait: %d ms\n" , b-a);


No sé .. pero una idea me flota por la cabeza.... algo del reseteo de las variables.
Prueba una cosa. Una vez iniciado el programa resetea con el boton de "reset" y entonces empieza a tapear, a ver si despues de eso funciona correctamente.

4) Es verdad que hay 2 threads uno dentro del otro
Imagino que si debo mantener alguno es el que hay en la funcion event_jack (), ya que es llamada continuamente desde gtk para poder actualizar el "meter" cada cierto tiempo.
O ¿Te refieres a que puedo tranquilamente no usar ningun thread?
Eso eliminaria tambien el problema comentado en el puto uno

Gracia de nuevo Luis
Subir
#7 por vagar el 23/06/2014
1) Sí, es que el sistema en el que la he probado está anticuado. De momento no debería darte problemas mantenerla, a lo mejor en el futuro tienes que compilarla condicionalmente.

3) He puesto un printf en on_event y no se dispara con cada pulsación de tecla, tienes que pulsar de 2 a 4 veces el espacio para que se llame a la función.

4) El problema vendría si recibieras eventos por varios sitios a la vez, porque hay varios hilos que ejecutan parte de tu programa (las callback). Por eso te digo que, aunque el programa no lo hayas hecho thread-safe, no es gran problema porque de todas maneras nadie esperaría que funcionara bien en esa situación.

Ars longa, vita brevis.
Mi colección de enlaces web en diigo.

Subir
#8 por vagar el 23/06/2014
3) Ah, no me había fijado bien en los paréntesis. Pensaba que estabas usando sec*1000 + usec/1000 pero tú haces (sec*1000000 + usec)/1000, está bien, sí, perdona.

Ars longa, vita brevis.
Mi colección de enlaces web en diigo.

Subir
#9 por monon el 23/06/2014
3) ¿Incluso despues de resetear?
Extraño comportamiento ya que on_event() es llamado por la funcion CALLBACK event_keyboard() que lo unico que hace es filtrar la tecla pulsada.
El problema es que no puedo reproducir ese bug en mi sistema ya que a mi me funciona correctamente.
Prueba a poner el prinf() de debug al principio de todo de la funcion event_keyboard(). A ver si tambien imprime solo cada varias pulsaciones.

4) Voy a eliminar los threads a ver si así soluciono parte de los otros problemas y sigue refrescando a tiempo.
Subir
#10 por monon el 24/06/2014
Hola Cato. Queria preguntarte si a ti te sigue dando problemas con la barra espaciadora.

Tambien he hecho algunos cambios que subiré en breve para la version alpha 0.3.1
Mejora el consumo de cpu cuando no se está usando jack y una mas ajustada medida del tiempo tambien con jack.
Subir
#11 por catorze el 24/06/2014
Hola monon, ahora tengo 0 tiempo para nada, a la semana que viene te contesto a todo, gracias!
Subir
#12 por vagar el 25/06/2014
El problema es que la lógica que controla timeInit no es correcta, así que siempre se mantiene a 0.

De todas formas el tratamiento del tiempo es heterodoxo. time_t en un Linux moderno es un long int, pero tú usas int para mantener los milisegundos, al multiplicarlo por 1000000 puede dar la vuelta por desbordamiento. Además la aritmética con time_t no está definida.

En resumen, en vez de operar directamente con el resultado de gettimeofday lo más correcto sería almacenar los tiempos en formato timeval y usar la función timersub de time.h para computar el intervalo y pasar el resultado a double, por ejemplo:

timeval start,stop,result;
double interval;
// query the start/stop with gettimeofday during your program
timersub(&start,&stop,&result);
interval = result.tv_sec + result.tv_usec/1e6L; // 1000000 microseconds per second

1e6L es 1.000.000 en formato double, las reglas de conversión implícitas para operaciones hacen el resto.

Ars longa, vita brevis.
Mi colección de enlaces web en diigo.

Subir
#13 por monon el 26/06/2014
Hola Luis, ante todo gracias por el interés y el tiempo.

Con respecto a la inicializacion de timeInit, al menos en mi sistema, si sucede.
En la primea pulsacion timeNow vale -X (negativo por usar un entero con signo) y timeOld es 0.

Pero desde luego tienes toda razon, la condicion de testear el inicio deberia ser if (timeInit == 0) y los tiempos deberian ser como minimo long.

Así que para los tiempos usaré unsigned long long (por si acaso) que me soluciona dos problemas: el desbordamiento y el signo.

De todos modos habia unos errores a la hora de llamar a refrescar los Widgets (varios llamadas al mismo tiempo) que provocaban a GDK fallos de segmentacion y otras cosas por el estilo ante algunas situaciones.
Esto tambien estará corregido para la siguiente version .
Subir
#14 por monon el 27/06/2014
Con bastantes cambios he subido la version 0.3.1-alpha5

Finalmente los tiempos son tipo "double" para mas precision en las operaciones de division.
Tambien hay cambios para:
-Correcta inicializacion del tiempo inicial con "if (timeInit == 0)"
-Revision del proceso de eventos en jack_process().
-Eliminacion total de gdk_threads.
-Correccion de la relacion de "peaks" entre jack_process y el medidor.
-Añadidos varios atajos de teclado.
Subir
#15 por Pablo_F el 28/06/2014
Me funciona muy bien en modo manual (tapeando con la barra espaciadora). El resto no he probado.

El logo es muy gracioso, me encanta. Te comento dos posibles mejoras:

Que quede más claro que el muñeco está tapeando con el pie (añadir un par de lineas de movimiento o algo así).
Que la corbata rememore un poco mejor el péndulo de un metrónomo mecánico.

Gracias y saludos!
Subir
Respuesta rápida

Regístrate o para poder postear en este hilo