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!
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.
Gracias sobre todo a Luis Garrido por su peculiar modo de mostrar el camino.
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
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.
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.
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.
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.
Hola monon, ahora tengo 0 tiempo para nada, a la semana que viene te contesto a todo, gracias!
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.
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 .
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.
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!