Texto publicado inicialmente no Portal Imasters

Este texto continua a abordagem sobre sincronismo de mídias, apresentando os princípios da construção de conectores e introduzindo os links.

Neste texto iremos discutir as relações de sincronismo a partir da criação de conectores e links. Na linguagem NCL tudo é determinado a partir de uma causa. Ou seja, cada ação é precedida por outra; uma condição deve obrigatoriamente ser satisfeita para disparar uma ação.
Assim, todo sincronismo no espaço e no tempo segue uma lógica causal. Para determinar as relações de causa e efeito, precisamos definir conectores. Conectores são expressões que ligam uma condição a uma determinada ação. Assim, todo conector possui ao menos uma condição e uma ação. Por exemplo: quando o vídeo chegar em determinado ponto (condição) coloca uma imagem na tela (ação); quando a imagem iniciar (condição) redimensiona o vídeo (ação); quando o telespectador apertar um botão no controle remoto (condição), inicia a interatividade (ação). Resumindo: conectores são utilizados para especificar relações de sincronização espaço-temporais, tratando relações de referência (de interação com usuário) como um caso particular de relações de sincronização temporal.

A única exceção para essa relação causal é no início da aplicação. Portanto, a primeira ação é definida arbitrariamente pelo desenvolvedor, através do elemento <port> do <body>. Para exemplificar, vamos criar um conector que defina uma ação para quando algo iniciar. Por exemplo, quando um nó de mídia aparecer na tela, deve aparecer outro no mesmo instante. Lembrando que os conectores devem ser criados na base de conectores, dentro do cabeçalho.

Assim:
<connectorBase>
<causalConnector id=”onBeginStart”>
<simpleCondition role=”onBegin”/>
<simpleAction role=”start”/>
</causalConnector>
</connectorBase>

Neste conector temos a condição definida como <simpleCondition> “onBegin” (ou seja, quando começar) e a ação definida como <simpleAction> “start”. Este conector possui apenas uma condição e uma ação. No entanto, tanto as condições quanto as ações podem ser compostas. Nesse caso, temos uma <compoundCondition> e uma <compoundAction> como elementos pai de <simpleCondition> e <simpleAction>, respectivamente . A primeira pode ser qualificada como “or” ou “and”. Isso significa que, no caso “or” uma das condições precisa ser satisfeita para ocorrer a ação; já em “and” ambas precisam ser atendidas. Por exemplo: se o telespectador apertar o botão vermelho do controle remoto e o vídeo estiver redimensionado, começa um joguinho. Só o fato de apertar o botão não dispara a ação. O vídeo precisa estar redimensionado.

Além disso, podemos definir um retardo (delay) para a condição, especificando que a condição é verdadeira após um período de retardo a partir do momento em o evento ocorre.

Já as ações compostas são mais simples, podendo ocorrer em paralelo “par” ou em sequência “seq”. Da mesma forma como nas condições, um atributo delay pode também ser definido para a <simpleAction>, especificando que a ação só pode ocorrer após esperar pelo tempo pré-definido. Além disso, também pode ser definido um atributo repeat para ser aplicado ao atributo repetitions do evento, e um atributo repeatDelay, para ser aguardado antes da repetição da ação. Além de todos os atributos acima citados, o elemento <simpleAction> também pode ter atributos definidos na área funcional Animation (atributos duration e by). Assim é possível fazer animações simples em NCL.

Os conectores definem relações de causa e efeito. A atribuição das relações com as mídias é feita nos <links>, dentro do <body> do documento. Para testar nosso conector, vamos pegar o exemplo do texto anterior (Interatividade, sincronismo e documentos NCL), cujo objetivo era colocar um botão na tela. Esse botão foi definido arbitrariamente através do uso da porta (<port>) do contexto principal (<body>). Agora, outro botão deve aparecer simultaneamente.
Vamos declarar mais uma mídia, com ID Botao2, lembrando que deve ter um descritor e uma região associados, e fazer esse botão aparecer junto com o botão vermelho.

<link xconnector=”onBeginStart”>
<bind component=”botao” role=”onBegin”/>
<bind component=”botao2″ role=”start”/>
</link>

Neste link estamos afirmando que quando o nó de mídia “botao” começar, deve inciar também o nó “botao2”. Isso é feito através do uso do conector declarado na base de conectores “onBeginStart”, onde definimos as condições e as ações. No link ligamos as mídias a estas condições e ações, usando “binds”. O “bind” tem um componente, que é a mídia, e um papel, que é definido no conector.
O código completo da aplicação deve estar assim:

    <ncl id=”new_ncl_file” xmlns=”http://www.ncl.org.br/NCL3.0/EDTVProfile”>
    <head>
    <regionBase>
    <region height=”50″ id=”rgBotao” left=”25″ top=”25″ width=”50″/>
    <region height=”50″ id=”rgBotao2″ left=”100″ top=”100″ width=”50″/>
    </regionBase>
    <descriptorBase>
    <descriptor id=”dBotao” region=”rgBotao”/>
    <descriptor id=”dBotao2″ region=”rgBotao2″/>
    </descriptorBase>
    <connectorBase>
    <causalConnector id=”onBeginStart”>
    <simpleCondition role=”onBegin”/>
    <simpleAction role=”start”/>
    </causalConnector>
    </connectorBase>
    </head>
    <body>
    <port component=”botao” id=”pBotao”/>
    <media descriptor=”dBotao” id=”botao” src=”media/botao_vermelho.png”/>
    <media descriptor=”dBotao2″ id=”botao2″
    src=”media/botao_verde.png”/>
    <link xconnector=”onBeginStart”>
    <bind component=”botao” role=”onBegin”/>
    <bind component=”botao2″ role=”start”/>
    </link>
    </body>
    </ncl>

As causas possíveis de serem descritas nos conectores são:
onBegin – quando começar
onEnd – quando terminar
onAbort – quando abortar
onPause – quando pausar
onResume – quando sair da pausa e começar a tocar
onSelection – quando for selecionado
onBeginAttribution – quando uma atribuição começar
onEndAttribution – quando uma atribuição terminar

Já as ações são:
start - comece
stop - pare
abort - aborte
pause - pause
resume - reinicie
set - configure

Dessa forma é possível concatenar causa e consequência, construindo relações de sincronismo e de interatividade. Podemos ter uma causa e várias consequências, assim como várias causas para apenas uma única consequência. Lembrando apenas que um conector pode ser utilizado quantos vezes for necessário e podemos ter quantos conectores precisarmos em um documento NCL. Nos próximos textos iremos aprofundar o tema sincronismo e começar a definir a participação do telespectador.