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.