Pular para conteúdo

5.1 Usando o TempoClock🔗

O TempoClock, chamado de Clock no FoxDot, lida com todo o agendamento de eventos musicais (e não musicais). Aqui estão alguns métodos úteis para aproveitar ao máximo o TempoClock no seu live coding.

Medidas de Retorno🔗

Clock.now()🔗

Retorna a medida de batida atual mantida pelo relógio.

Clock.bar_length()🔗

Retorna a duração da barra em batidas.

Clock.bars(n=1)🔗

Retorna o número de batidas em n barras. Equivalente a Clock.bar_lenth() * n.

Clock.beat_dur(n=1)🔗

Retorna a duração de n batidas em segundos.

Clock.beats_to_seconds(beats)🔗

Equivalente a Clock.beat_dur(beats).

Clock.seconds_to_beats(seconds)🔗

Retorna o número de batidas em segundos.

Clock.get_time_at_beat(beat)🔗

Retorna o tempo local da máquina no intervalo especificado.

Clock.next_bar()🔗

Retorna o número da batida para o início da próxima barra.

Clock.mod(beat, t=0)🔗

Retorna a próxima vez em que Clock.now() % beat será igual a t. Útil para obter o beat inicial de um ciclo.

# Retorna a batida no início do próximo ciclo de 16 batidas
Clock.mod(16)

# Retorna a batida no início do próximo ciclo de 4 compassos
Clock.mod(Clock.bars(4))

Atualizando o Clock🔗

Clock.set_time(beat)🔗

Define o ritmo atual do relógio como beat e atualiza todos os objetos Player no relógio.

Clock.set_cpu_usage(value)🔗

Deve ser um valor entre 0 e 2. Um valor de 0 utilizará menos recursos da CPU, mas poderá ocorrer instabilidade ao usar durações menores. Um valor de 2 utilizará mais recursos da CPU, mas terá melhor desempenho.

Clock.set_latency(value)🔗

Deve ser um valor entre 0 e 2. Um valor de 0 utilizará um valor de latência menor, o que significa que as atualizações do código serão ouvidas mais imediatamente, e um valor de 2 utilizará um valor de latência maior, o que ajudará a evitar mensagens "atrasadas" no SuperCollider.

Clock.update_tempo(bpm)🔗

Define o tempo no início da próxima barra. Pode (e deve) ser definido usando Clock.bpm = bpm.

Clock.update_tempo_now(bpm)🔗

Atualizará o tempo do relógio imediatamente (ou seja, não no início da próxima barra).

Clock.bpm = new_tempo🔗

Define o tempo no início da próxima barra. Deve ser um número inteiro, um número de ponto flutuante ou TimeVar.

Clock.nudge = new_nudge🔗

Compense o tempo forte do relógio em new_nudge segundos. Útil para sincronizar manualmente com uma fonte de som externa.

Por exemplo, tanto o FoxDot quanto a outra fonte de som estão tocando a 120 bpm, mas o FoxDot está ligeiramente atrasado na batida forte. Você poderia usar Clock.nudge = 0.2 para atrasar a batida forte em 0.2 segundos.

Clock.meter = (num_beats, beat_length)🔗

Essencialmente atualiza o valor retornado por Clock.bar_length(). Por exemplo, para definir o relógio para 3/4 do tempo, use Clock.meter = (3, 4).

Agendando Eventos🔗

Clock.schedule(callable, beat=None, args=(), kwargs={})🔗

Agende um objeto chamável, como uma função ou um objeto com um método __call__() válido, na batida especificada. Se nenhuma batida for especificado, o callable será agendado para o início da próxima barra. Os parâmetros e parâmetros nomeados para o objeto chamável podem ser fornecidos em uma lista e um dicionário, respectivamente:

def update(key, bpm=None):
    Root.default = int(key)
    if bpm is not None:
        Clock.bpm = bpm
    return

# Agenda para 2 batidas no futuro
Clock.schedule(update, Clock.now() + 2, args=[4], kwargs={"bpm": 120})

Clock.future(dur, callable, args=(), kwargs={})🔗

Semelhante a Clock.schedule, mas o primeiro argumento especifica quanto tempo no futuro o objeto chamável deve ser agendado, e não uma batida específico.

Clock.clear()🔗

Limpa todos os eventos programados no relógio, interrompendo qualquer som. No editor FoxDot, Ctrl+. é um atalho para executar este comando.

nextBar(func)🔗

Agenda uma função para ser chamada no início da próxima barra. Também pode ser usado como um decorador para definir uma nova função que é chamada no início da próxima barra, ou seja, não precisa ser invocada diretamente:

# Interrompa todos os eventos no início da próxima barra
nextBar(Clock.clear)

# O decorador chama `key_change()` no início da próxima barra
@nextBar
def key_change():
    Scale.default = "minor"
    Root.default = 4

Sincronização🔗

Clock.sync_to_espgrid(host="localhost", port=5510)🔗

Usa o software EspGrid para sincronizar o FoxDot com outros ambientes de live coding, como o TidalCycles ou o SuperCollider. Certifique-se de que o EspGrid está em rodando no seu computador antes de executar este comando.

Clock.sync_to_midi(sync=True)🔗

EXPERIMENTAL: Sincroniza com o relógio de um dispositivo MIDI externo.

Clock.connect(address)🔗

Usado para sincronizar instâncias do FoxDot em uma rede. Um usuário (o relógio principal) precisa ir ao menu "Language" e selecionar "Listen for connections". Isso imprimirá o endereço IP do relógio principal. Todos os outros usuários que desejarem sincronizar devem usar Clock.connect e o endereço IP fornecido.