Está en la página 1de 49

Programacin MIDI en C con una API de bajo nivel PortMusic

Taller de Msica Electrnica Sergi Jord, 2005 E.S.U.P., Universitat Pompeu Fabra Barcelona

ndice

Programa MIDI: introduccin Polling, interrupciones, sincrona Relojes, eventos, callbacks y multithreads Introduccin: MIDI en Windows Introduccin a PortMusic (instalacin, funciones) Relojes, callbacks y procesos Sincrona en multithreading Eventos MIDI Control de tiempo: tempo, ticks Standard MIDI Files Artculos y bibliografa Apndice A: Ejemplos de bucles de control Apndice B: Callbacks & punteros a funciones Apndice C: Ciclos interactivos Escalas temporales Apndice D: Standard MIDI Files

Un programa MIDI

Es un buen ejemplo de programa que funciona a t.real Recibe inputs Los procesa Ejecuta outputs

Adems es mucho ms estricto que otros tipos de programas en cuanto al control del tiempo. En qu? & porqu? Frecuencia del ciclo Estabilidad del ciclo

Un programa MIDI

Es un buen ejemplo de programa que funciona a t.real Recibe inputs Los procesa Ejecuta outputs

Adems es mucho ms estricto que otros tipos de programas en cuanto al control del tiempo. En qu? & porqu? Frecuencia del ciclo Estabilidad del ciclo

Polling, interrupciones, sincrona Relojes, eventos, callbacks y multithreads

Sncronos asncronos

A veces se toma sncrono como sinnimo de en tiempo real, con lo que se implica que los sistemas en tiempo real NO pueden ser asncronos. Esto no tiene porque ser as, ya que todos ellos (sncrono, asncrono, t.real) son conceptos un tanto relativos En un sistema de t.real sncrono, el sistema responde instantneamente a los eventos externos Instantaneamente : en un tiempo notablemente inferior al del lapso entre eventos En un sistema de t.real asncrono, se presupone que la densidad de los eventos puede llegar a ser muy alta (o su granularidad temporal muy pequea) por lo que el sistema tan slo debe dar un compromiso tipo tiempo mximo de espera En la mayora de APIs MIDI (y de audio), lo que se realiza es una combinacin de ambos mecanismos

Polling vs. Interrupciones


Existen 2 formas de implementar un sistema con entradas en t.real

Polling Es el caso ms sencillo el sistema mira entradas externas peridicamente Adecuado para un input de tipo continuo (analgico), pero no para uno con eventos (ya que podran perderse) Interrupciones Los eventos externos provocan un servicio de interrupcin, que ejecuta un programa breve (que debera terminar antes de que deban comenzar otras tareas) En el ms breve de los casos, este programa o proceso simplemente pone el evento en una cola de entrada Una vez terminado este proceso el programa principal retoma el punto en el que estaba

Entrada contnua vs. eventos



Si el input fuera mirar la posicin del ratn, el valor de un sensor que nos manda valores continuos, etclos miramos a cada ciclo y ya est Pero si el input genera eventos? (e.g. click ratn, teclado MIDI) Estos eventos probablemente puedan producirse en cualquier instante En muchos sistemas y APIs (incluidas APIs MIDI) se utiliza una combinacin de ambos (polling & interrupciones) 1. Las entradas MIDI ejecutan una interrupcin que se limita a poner los datos en un buffer de entrada Que estructura debe tener este buffer? pila, cola, .? ms bien cola. aunque algunos tipos de datos (e.g. varios controles de volumen) se puedan saltar y coger slo el ltimo (si nuestro sistema es slo capaz de procesar un control/ciclo, manejar todos los volmenes que se han almacenado podra suponer un retardo considerable). Otros tipos de datos (e.g. notas) no deberan saltarse De forma peridica (polling) se consulta esta estructura En este punto, se procesa la cola hasta que est vaca

Entrada contnua vs. eventos



Si el input fuera mirar la posicin del ratn, el valor de un sensor que nos manda valores continuos, etclos miramos a cada ciclo y ya est Pero si el input genera eventos? (e.g. click ratn, teclado MIDI) Estos eventos probablemente puedan producirse en cualquier instante En muchos sistemas y APIs (incluidas APIs MIDI) se utiliza una combinacin de ambos (polling & interrupciones) 1. Las entradas MIDI ejecutan una interrupcin que se limita a poner los datos en un buffer de entrada Que estructura debe tener este buffer? pila, cola, .? ms bien cola. aunque algunos tipos de datos (e.g. varios controles de volumen) se puedan saltar y coger slo el ltimo (si nuestro sistema es slo capaz de procesar un control/ciclo, manejar todos los volmenes que se han almacenado podra suponer un retardo considerable). Otros tipos de datos (e.g. notas) no deberan saltarse De forma peridica (polling) se consulta esta estructura En este punto, se procesa la cola hasta que est vaca

Relojes (timers) y funciones callback

Un sistema de tipo polling puede ejecutarse


en un nico proceso, con un bucle principal (cfg. Apndice A) mediante la programacin de un reloj, que llamar peridicamente a otro proceso

Un sistema basado en interrupciones, suele asociar un proceso a un evento: evento: la entrada de un dato proceso: llamada a funcin El caso del reloj es similar ya que el reloj produce peridicamente un evento de reloj

Sistema con 1 solo ciclo



En el caso ms sencillo, el sistema tiene un nico ciclo En este ciclo se deben Mirar las entradas Mapearlas y procesarlas Generar y mostrar las salidas A nivel de programacin esto conlleva un nico bucle principal que realiza estas tareas siempre en el mismo orden Se debera garantizar que los procesos de un ciclo se pueden completar en menos de lo que dura un ciclo (antes del inicio del nuevo ciclo) ( < h) El programa debe tambin garantizar que no se adelantar. Es decir, una vez terminado el bucle, no deber comenzar uno nuevo hasta que toque (ms adelante veremos varios algoritmos para controlar estos tiempos) (h = cte) Muchos sintetizadores de audio por software funcionan as. A continuacin se describen varios aspectos tomando un programa de este tipo como ejemplo

Relojes (timers) y funciones callback

Un sistema de tipo polling puede ejecutarse


en un nico proceso, con un bucle principal (cfg. Apndice A) mediante la programacin de un reloj, que llamar peridicamente a otro proceso

Un sistema basado en interrupciones, suele asociar un proceso a un evento: evento: la entrada de un dato proceso: llamada a funcin El caso del reloj es similar ya que el reloj produce peridicamente un evento de reloj La asociacin de estos eventos (e.g. entradas, relos, etc.) a una funcin se suele realizar mediante funciones callback

Funciones Callback

Una funcin callback es una funcin que se llama desde un proceso que nosotros no controlamos (normalmente desde una API) Esta llamada puede ser peridica (eg. llenar un frame de audio) o motivada por determinados eventos (e.g. recibir mensaje MIDI, procesar frame video) En realidad estn siempre generadas por eventos (en el primer caso, un evento de RELOJ) Se suelen implementar mediante punteros a funciones (cfg. Apndice B) En una funcin callback, no es conveniente realizar gestin de memoria, acceso a ficheros, refresco de pantalla y ningn tipo de acceso a los recursos del sistema que pueda suponer un retardo para el resto de los procesos

Relojes

Los timers son fundamentales para que las aplicaciones realicen operaciones peridicas en varios procesos y con mxima precisin temporal En windows (por ej.) existe un Timer multimedia con una resolucin de hasta 1 ms, y el standard, que tiene una resolucin de ~ 40-50 ms Un Timer se suele poner en marcha mediante una llamada a una funcin a la que se suele pasar los siguientes parmetros: Periodicidad Callback function Tolerancia [opc] (Periodicidad +- Tolerancia) Puntero [opc] (para intercambio de informacin entre procesos)

// ejemplo de PortMIDI Pt_Start(1, &process_midi, (void*)&iData); // start a timer with millisecond accuracy

Multithreading

Si usamos este tipo de arquitecturas (relojes con callbacks o interrupciones en lugar de polling) tendremos al menos dos procesos (el principal y el llamado de vez en cuando por las interrupciones) multithreading NOTA: la diferencia entre threads y procesos es que los primeros comparten el mismo espacio de memoria, variables, etc Sin embargo, en bastantes casos, el programador no gestiona directamente estos threads, cuyo uso puede venir facilitado por las libreras que se utilicen Ejemplos: Salida de audio a la tarjeta: una librera (e.g. DirectX) se encarga de esto a partir de unos frames de tamao predefinido (y rellenados por nuestro programa) Entrada de datos MIDI o serie: las libreras suele invocar un thread que coloca los datos en una cola Procesado de imagen a t.real: las libreras suele llamar a una funcin a la que le pasan el frame (imagen) recin capturado. En estos casos, nuestro programa NO controla el bucle principal Si utilizamos alguna librera de audio de ms alto nivel que DirectX (e.g. CLAM, PortAudio) la librera puede comportarse de forma similar al caso de vdeo. En lugar de responsabilizarnos del bucle principal, debemos escribir la funcin que se ejecuta peridicamente y que se encarga de rellenar un frame de audio (calcular todas sus muestras). La llamada a esta funcin (callback) queda como responsabilidad del scheduler de la librera

La librera PortMusic

Cada dispositivo-puerto MIDI (hardware o virtual) tiene un driver asociado

MIDI en Windows

(drivers virtuales: e.g. MidiYoke) Entre la aplicacin y el driver existe una capa intermedia (winmm.dll) con centenares de funciones para Audio (Wave), MIDI, Timers, Video, Joystick En cualquiera de estos casos, deberemos incluir mmsystem.h y linkar con winmm.lib

Winmm

En el caso de MIDI, las funciones bsicas nos permiten Preguntar por puertos disponibles (I & O) y sus propiedades Abrirlos / cerrarlos Recibir mensajes de los puertos de entrada Mandar mensajes a los puertos de salida Adems tambin habr que utilizar las de relojes Winmm es suficiente para aplicaciones sencillas (slo MIDI OUT) (cfg. Anaya cap. 17), pero demasiado laborioso para aplicaciones ms complejas... Por ello es recomendable utilizar alguna API adicional

Uso de la API PortMusic (en C)



MIDI + Audio (con PortAudio) Multiplataforma (Win MME, Win DX, Win Asio, Linux ALSA, Mac OS) Encapsula timers y colas de entrada Facilita gestin de colas adicionales Todo el cdigo es abierto Bajo nivel, no aade latencia En el caso de Windows, se puede crear aplicaciones MFC, de consola, o con cualquier otro GUI Toolkit. La API sigue llamando a winmm.dll por lo que habr que seguir linkando con winmm.lib (adems de las propias de PortMusic)

Instalacin

Download (slo 85Kb) y la documentacin (slo un .h, que contiene una descripcin de cada una de las funciones) Hay que compilar los proyectos para obtener las libreras (portmidi.lib, porttime.lib y pm_dll.dll) Se incluyen los proyectos que generan estas libreras, junto con ejemplos sencillos Entrada y salida Envo sistema exclusivo Aplicin multithreaded

Funciones PortMusic

Listar y abrir puertos MIDI (IN & OUT) Recibir mensajes del IN y enviar mensajes al OUT Crear timers con callbacks para procesar las entradas Gestionar colas de mensajes para comunicar callbacks y otros procesos

Estructuras de datos PortMusic



Mensaje MIDI 3 bytes Win usa un ULONG con el status en el LSB: MSB 00 data2 data1 status LSB #define Pm_Message(status, ch, data1, data2) ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status | ch) & 0xFF))

Evento MIDI: mensaje + timestamp El timestamp no se mide en ms sino en ticks (ULONG) typedef long PmMessage; typedef struct { PmMessage message; PmTimestamp timestamp; } PmEvent;

Entradas y salidas
Entrada y salida (varias opciones)

1. 2.

El puerto de entrada ejecuta un thread independiente que se activa (otra callback) cuando recibe mensajes El puerto de entrada deja mensajes en una cola. La callback de salida mira si hay mensajes en la cola (poll) y los procesa (an as tenemos como mnimo 2 threads de que preocuparnos: principal + timer-callback)

Esta funcin podra estar mirando en un array (o lista o array, etc.) de eventos (con timestamp) para ver si debe mandar algo a la salida (los ticks los debe controlar la funcin) Esta funcin no debera ejecutar ninguna llamada tipo leer/escribir en fichero, consola se podra retrasar

Comunicacin entre threads


Caso A) Imaginemos que al definir la callback indicamos una variable de intercambio de 32 bits int iData; Pt_Start(1,&process_midi,(void*)&iData); //1 ms, callback, variable de intercambio Thread principal y callback comparten esta informacin. OK. Caso B) struct Data data[10]; StartTimer(1,&process_midi,(void*)data); //1 ms, callback, zona memoria de intercambio Ahora pueden surgir problemas. Porqu? Cual es la diferencia?

Sincrona en Multithreading

Por definicin, si dos threads son independientes es imposible garantizar la sincrona entre ellos, con una precisin mxima Esto es generalizable al uso de cualquier dato compartido por 2 o ms threads Orden de actualizacin? Problema ms grave: que el thread A que escribe los datos, se interrumpa durante la escritura para dar paso al thread B que los leer (parcialmente actualizados) 2 procesos leyendo y escribiendo simultneamente de las mismas posiciones de memoria Soluciones: Semforos: mecanismos de bloqueo de acceso Ms simple: intercambio de datos entre threads mediante colas de mensajes Slo uno de los threads debe tener acceso de escritura Si 2 threads deben intercambiar datos mutuamente (ambos con posibilidad I/O) 2 colas PortMusic implementa estas colas de comunicacin (ej. midithread.c)

Control de tiempos, tempo, ficheros

Tempo y ticks

Tempo = negras/minuto Resolucin del secuenciador = ticks/negra Duracin de un tick = ms/tick Cmo calcular la duracin de un tick en funcin del tempo y la resolucin? 60.000 [ms] 1 [min] ----------------- x ---------------------------------1 [min] Tempo*Resolucin [tick] Problemas?

Tempo y ticks

Tempo = negras/minuto Resolucin del secuenciador = ticks/negra Duracin de un tick = ms/tick Cmo calcular la duracin de un tick en funcin del tempo y la resolucin? 60.000 [ms] 1 [min] ----------------- x ---------------------------------1 [min] Tempo*Resolucin [tick] Problemas?

En la prctica, no todos los tempos son posibles, ya que la duracin de 1 tick es int Soluciones: Cuantizar los tempos (si el usuario introduce un tempo imposible, se le avisa del redondeo poco prof!) Acumular errores y corregir (e.g. si la duracin terica de 1 tick es 1,5 ms, cada 2 ticks de 1 ms se aade 1 tick fantasma que no se cuenta - ~aos bisiestos) Adems, El timestamp puede ser absoluto o relativo (en SMF es relativo, en PortMusic es abierto) Si es relativo, al insertar un evento hay que corregir el TimeStamp del siguiente

Standard MIDI Files


http://www.sfu.ca/sca/Manuals/247/midi/fileformat.html

http://www.sonicspot.com/guide/midifiles.html
Un SMF se almacena como varias pistas, cada una de ellas con TimeStamps relativos (a los eventos de esta pista) Para reproducir el fichero 1. Se convierte cada pista a t absolutos 2. Se combinan todas las pistas en una sola en memoria 3. Opcionalmente (si nuestro reloj funciona con relativos), se vuelven a relativizar Si no trabajamos con SMF, y lo hacemos con t absolutos, no es necesario todo esto:

Podemos tener un array 2D (un array de secuencias donde cada secuencia es un array de eventos) Y un array de ndices (cada ndice indica el prximo evento de la secuencia) A cada tick, miramos para cada secuencia si el timestamp del prximo evento coincide con el tick actual. Si s, lo mandamos a la salida e incrementamos el ndice. Si adems de un secuenciador, quisiramos un editor, los arrays no son suficientes (hay que insertar/borrar). Habra que trabajar con listas enlazadas.

Varios artculos sobre diseo de lenguajes y sistemas para interactividad en tiempo real (especialmente en audio)
Dannenberg, ``Software Design for Interactive Multimedia Performance,'' Interface - Journal of New Music Research, 22(3) (August 1993), pp. 213-228. Brandt and Dannenberg, ``Low-Latency Music Software Using OffThe-Shelf Operating Systems,'' in Proceedings of the International Computer Music Conference, San Francisco: International Computer Music Association, (1998), pp.137-141. Brandt and Dannenberg, ``Time in Distributed Real-Time Systems,'' in Proceedings of the 1999 International Computer Music Conference, San Francisco: International Computer Music Association, (1999), pp. 523-526. Bencina and Burk, PortAudio an Open Source Cross Platform Audio API, in Proceedings of the 2001 International Computer Music Conference, San Francisco: International Computer Music Association, (2001). What is latency and how to tune it?

Apndice A Ejemplos de bucles de control

NB: Se incluyen a ttulo informativo ya que la mayora de APIs (incl. PortMusic) ya se encargan de la gestin de estos bucles

Suposiciones: Queremos hacer algo peridicamente, cada h El sistema es multithreated: que un proceso espere un rato determinado, no significa que el sistema se quede sin hacer nada

Ejemplos de bucles control

Cuales son los problemas de estos ejemplos?


sleep(h) indica que el proceso espera un tiempo relativo h (podra ser wait, delay, etc.) sleepUntil(t) indica que el proceso espera hasta el instante t while (true) do { executeController(); sleep(h); } while (true) { start = getCurrentTime(); executeController(); end = getCurrentTime(); sleep(h - (end - start)); } while (true) { start = getCurrentTime(); executeController(); nexttime = start + h; sleepUntil(nexttime); }

No se tiene en cuenta el tiempo de ejecucin del proceso

Podra ser que la tarea se haya interrumpido entre las lneas 4 y 5

Tampoco se tiene en cuenta el tiempo transcurrido entre las lneas 5 y 2

Ejemplos de bucles control

Cuales son los problemas de estos ejemplos?


sleep(h) indica que el proceso espera un tiempo relativo h (podra ser wait, delay, etc.) sleepUntil(t) indica que el proceso espera hasta el instante t while (true) do { executeController(); sleep(h); } while (true) { start = getCurrentTime(); executeController(); end = getCurrentTime(); sleep(h - (end - start)); } while (true) { start = getCurrentTime(); executeController(); nexttime = start + h; sleepUntil(nexttime); }

No se tiene en cuenta el tiempo de ejecucin del proceso

Podra ser que la tarea se haya interrumpido entre las lneas 4 y 5

Tampoco se tiene en cuenta el tiempo transcurrido entre las lneas 5 y 2

Ejemplos de bucles control

Cuales son los problemas de estos ejemplos?


sleep(h) indica que el proceso espera un tiempo relativo h (podra ser wait, delay, etc.) sleepUntil(t) indica que el proceso espera hasta el instante t while (true) do { executeController(); sleep(h); } while (true) { start = getCurrentTime(); executeController(); end = getCurrentTime(); sleep(h - (end - start)); } while (true) { start = getCurrentTime(); executeController(); nexttime = start + h; sleepUntil(nexttime); }

No se tiene en cuenta el tiempo de ejecucin del proceso

Pudiera ser que la tarea se hubiera interrumpido entre las lneas 4 y 5

Tampoco se tiene en cuenta el tiempo transcurrido entre las lneas 5 y 2

Ejemplos de bucles control

Cuales son los problemas de estos ejemplos?


sleep(h) indica que el proceso espera un tiempo relativo h (podra ser wait, delay, etc.) sleepUntil(t) indica que el proceso espera hasta el instante t while (true) do { executeController(); sleep(h); } while (true) { start = getCurrentTime(); executeController(); end = getCurrentTime(); sleep(h - (end - start)); } while (true) { start = getCurrentTime(); executeController(); nexttime = start + h; sleepUntil(nexttime); }

No se tiene en cuenta el tiempo de ejecucin del proceso

Pudiera ser que la tarea se hubiera interrumpido entre las lneas 4 y 5

Tampoco se tiene en cuenta el tiempo transcurrido entre las lneas 5 y 2

Ejemplos de bucles control (y 2)


nexttime = getCurrentTime(); while (true) { executeController(); nexttime = nexttime + h; sleepUntil(nexttime); } Esto ya es correcto Que sucede cuando un ciclo dura ms de la cuenta? Que el siguiente dura menos

Ejemplos de bucles control (y 2)


nexttime = getCurrentTime(); while (true) { executeController(); nexttime = nexttime + h; sleepUntil(nexttime); } Esto ya es correcto Que sucede cuando un ciclo dura ms de la cuenta? Que el siguiente dura menos (se mantiene el promedio) Esto puede ser lo que busquemos o puede que no Por ello, se deja al estudiante, la modificacin de este fragmento, para el caso en que se deseara que el ciclo siguiente a un ciclo demasiado largo, siguiera teniendo la duracin correcta (para ello, tal vez haya que descomponer executeController() en varias fases [input, output] )

Apndice B Punteros a funciones

Las llamadas de tipo callback se implementan mediante punteros a funciones

Punteros a funciones (1)



Los punteros a funciones son punteros al inicio de la funcin en memoria, a la direccin inicial dentro del cdigo donde comienza la funcin. Se utilizan para ofrecer algoritmos alternativos dentro de un algoritmo mayor Para personalizar fragmentos de cdigo dentro de procesos predefinidos Permiten crear arrays de funciones de forma que cada elemento del array toma la direccin de una funcin Para pasar una funcin (f2) como parmetro (de una funcin f1) se escribe: f1(f2) Esto es as, porqu al igual que el nombre de un array (sin [ ]) es igual a la direccin de su primer elemento, el nombre de una funcin (sin ( ) ) equivale a la direccin de inicio de esta funcin en memoria En el prototipo de la funcin f1 deberemos indicar tambin el prototipo de la funcin f2. Por ejemplo si f2 es: int f2 (char *), y f1 recibe f2 como argumento, entonces la declaracin de f1 ser: f1(int(*f2)(char *)) Para llamar a f2, desde el cdigo de f1, escribiremos: (*f2)() f1(int(*f2)(char *)) { char *p; int a; .... a=(*f2)(p); ... } En el caso de funciones callback, f1 suele estar escrito. Lo que debemos hacer es rellenar el cdigo de f2

Punteros a funciones (y 2)

Los punteros a funciones se utilizan mucho par ordenaciones. En las ordenaciones se realizan dos acciones bsicas: la de comparacin y la de cambio de lugar. La comparacin no es algo trivial. No es vlido el smbolo < para comparar cadenas, o muchos otros tipos de datos. A una funcin de ordenacin le podremos determinar cmo se compara para que sea genrica. El prototipo de una funcin de este estilo podra ser: int ordenar (void *array_a_ordenar, unsigned int n_elem, unsigned int tam_elem, int (*pfcomparacion)(const void *, const void *)) El const se utiliza para evitar que la funcin de comparacin pueda modificar los elementos a comparar El puntero a elementos a ordenar es de tipo void para poder ordenar cualquier cosa Por esta misma razn, es necesario indicar el tamao de cada elemento

En ANSI C existe la funcin qsort, que utiliza el algoritmo quick sort. Lo nico que deberemos escribir para que funcione es la funcin que compara. Otra aplicacin de los punteros a funciones es la de crear mens u opciones diferentes: int f1(void); int f2(void); int f3(void); inf (*pf[3])( ); // esto es un array de punteros a cada una de estas tres funciones Para llamar a una de estas funciones podramos hacer: while ((i=opcion( ) ) > 0 && i < 3) (*pf[i] )( );

Apndice C Ciclos interactivos Escalas temporales

Antes hemos hablado de ciclos que deben ser estables pero que frecuencia deben tener? cuanto deben valer este tiempo justo?

Ciclos Interactivos Escalas temporales Imagen

A partir de ~10 Hz percibimos un continuo de movimiento Cine ? TV ? Generada por ordenador ? Una cosa es la continuidad de movimiento (evitar saltos) y otra es la continuidad de brillo (evitar flickering), que mejora conforme aumenta la frecuencia Por ello, estos sistemas muestran cada imagen 2 veces (cine=48 Hz, PAL=50 Hz, NTSC=60 Hz) Como se ve entonces una pelcula en TV? En Europa (PAL) + rpido (en un factor 24/25 = 0,96). Una pelcula de 90 minutos dura 86,4 en TV En USA (NTSC) cada par de frames se repite x2 y x3 resp (48+72=60+60)

Ciclos Interactivos Escalas temporales Imagen

A partir de ~10 Hz percibimos un continuo de movimiento Cine : inicios: 12-16 fps actual: 24 fps dibuj.anim.: 12-30 fps TV : PAL: 25 fps NTSC: 30 fps Generada por ordenador : ~12-30 fps (flexible) Una cosa es la continuidad de movimiento (evitar saltos) y otra es la continuidad de brillo (evitar flickering), que mejora conforme aumenta la frecuencia Por ello, estos sistemas muestran cada imagen 2 veces (cine=48 Hz, PAL=50 Hz, NTSC=60 Hz) Como se ve entonces una pelcula en TV? En Europa (PAL) + rpido (en un factor 24/25 = 0,96). Una pelcula de 90 minutos dura 86,4 en TV En USA (NTSC) cada par de frames se repite x2 y x3 resp (48+72=60+60)

Ciclos Interactivos Escalas temporales Sonido

Sonido: la freq. de muestreo est relacionada con la mxima freq. audible (T.Nyquist dice que debe ser como mnimo el doble) Comprensin perfecta voz hablada : a partir de ~3 4.000 Hz Calidad CD : 44.100 Hz Sistemas grabacin profesionales : 96.000 Hz Significa esto que un sistema interactivo sonoro debe funcionar varios miles de veces + rpido que un sistema interactivo visual? No se debe confundir el ciclo o la frecuencia de reproduccin de medios, con el ciclo o la frecuencia de interaccin

Ciclos Interactivos Escalas temporales Sonido

Sonido: la freq. de muestreo est relacionada con la mxima freq. audible (T.Nyquist dice que debe ser como mnimo el doble) Comprensin perfecta voz hablada : a partir de ~3 4.000 Hz Calidad CD : 44.100 Hz Sistemas grabacin profesionales : 96.000 Hz Significa esto que un sistema interactivo sonoro debe funcionar varios miles de veces + rpido que un sistema interactivo visual? No se debe confundir el ciclo o la frecuencia de reproduccin de medios, con el ciclo o la frecuencia de interaccin

Duracin de un ciclo?


Necesidades de la interaccin (depende del tipo de aplicacin, de centsimas a centenares de Hz) Limitaciones velocidad hard+soft (todos los procesos de un ciclo deberan completarse antes del inicio del nuevo ciclo) Algunos ejemplos
Windows GUI (timer...) Termostato aire acondicionado vs. Termostato reactor nuclear
Sistemas blandos vs. duros (donde pasar del ciclo puede ser catastrfico) Para asegurar la estabilidad, de acuerdo con el T.Nyquist, en principio la duracin de un ciclo debera ser como mnimo, igual a la mitad del tiempo de cambio de cualquier parmetro externo

Aplicacin interactiva procesado de vdeo t.real Reconocimiento de gestos Teclado + Secuenciador MIDI

La frecuencia del ciclo de entrada no siempre tiene que coincidir con la del de salida (e.g. reconocimiento de gestos) Excepto casos como el teclado MIDI, el ciclo de entrada en HCI suele estar entre 20-100 Hz (10-50 ms)

Duracin de un ciclo?


Necesidades de la interaccin (depende del tipo de aplicacin, de centsimas a centenares de Hz) Limitaciones velocidad hard+soft (todos los procesos de un ciclo deberan completarse antes del inicio del nuevo ciclo) Algunos ejemplos
Windows GUI (timer...) ~20 Hz Termostato aire acondicionado vs. Termostato reactor nuclear
Sistemas blandos vs. duros (donde pasar del ciclo puede ser catastrfico) Para asegurar la estabilidad, de acuerdo con el T.Nyquist, en principio la duracin de un ciclo debera ser como mnimo, igual a la mitad del tiempo de cambio de cualquier parmetro externo Aplicacin interactiva procesado de vdeo t.real: al frame rate, a no ser que

Reconocimiento de gestos: frecuencia min. doble de la del gesto Teclado + Secuenciador MIDI: en algunos programas hasta 1000 Hz!

La frecuencia del ciclo de entrada no siempre tiene que coincidir con la del de salida (e.g. reconocimiento de gestos) Excepto casos como el teclado MIDI, el ciclo de entrada en HCI suele estar entre 20-100 Hz (10-50 ms)

Escalas de tiempos
The Dictionary of Computer Science (Van Nostrand Reinhold, 1993) defines a simple table of average response times, and processing methods and models: Computer Processing Modes and Times Card Oriented Batch Keyboard Oriented Batch Interactive Computing Online Inquiry and Transactions Message Switching Data Acquisition and Control 100-10000s 1-100s 1-10s 1-10s 0.1-10s 0.01-10s

Which of these are real-time? (extrado de Real-Time Computing for Human Computer Interfacing,
Perry Cook)

También podría gustarte