Pular para conteúdo

2.4 Tocando Samples🔗

Atualmente, existem dois Synths especiais no FoxDot para reproduzir áudio armazenado em um arquivo: play e loop. Aqui, vamos analisá-los mais detalhadamente:

O sintetizador play🔗

Básico🔗

Os conceitos básicos do sintetizador foram cobertos brevemente na seção introdução ao objeto player, mas serão revisitados aqui. Ao contrário de outros sintetizadores no FoxDot, o primeiro argumento deve ser uma sequência de caracteres, em vez de números. Isso permite que mais informações sejam codificadas na sequência. Cada caractere se refere a um conjunto de samples, como bumbo, chimbau, caixa e outros sons. A sequência mais básica que você pode criar é uma batida de bateria disco:

p1 >> play("x-o-")

Você pode usar diferentes tipos de parênteses para adicionar mais informações à sequência. Colocar dois ou mais caracteres entre parênteses alternará o som a ser reproduzido em cada loop da sequência:

# Padrão simples
p1 >> play("(x-)(-x)o-")

# Parênteses aninhados para maior variedade
p1 >> play("(x-)(-(xo))o-")

Colocar vários caracteres entre colchetes irá reproduzi-los sucessivamente no espaço de um passo:

# Toca uma colcheia na quarta batida
p1 >> play("x-o[---]", dur=1)

# Pode ser usado entre parênteses
p1 >> play("(x-)(-[-x])o-")

# Pode conter parênteses
p1 >> play("x-o[-(xo)]")

Você também pode usar chaves para selecionar uma amostra aleatoriamente e adicionar alguma variedade à sua sequência:

# Escolha aleatoriamente um sample na quarta etapa
p1 >> play("x-o{-ox}")

# Pode conter [colchetes]
p1 >> play("x-o{[--]ox}")

# Pode ser colocado entre colchetes
p1 >> play("x-o[-{ox}]")

O parâmetro sample🔗

Cada caractere corresponde a uma pasta de arquivos organizados em ordem alfabética. Para selecionar um arquivo diferente, use o parâmetro sample.

p1 >> play("x-o-", sample=1)

Como qualquer outro parâmetro nomeado, este pode ser uma lista ou até mesmo uma tupla de valores.

p1 >> play("x-o-", sample=[0, 1, 2])

p1 >> play("x-o-", sample=(0, 3))

O sample para um caractere individual pode ser especificado a partir da própria string, envolvendo o caractere com um "|" e o número específico, desta forma:

# Reproduz o sample=2 para o caractere 'o'
p1 >> play("x-|o2|-")

# Substituirá o parâmetro sample
p1 >> play("x-|o2|-", sample=3)

Esta sintaxe pode conter qualquer um dos parênteses usados anteriormente no caractere e nos números:

# Alterne o número do sample
p1 >> play("x-|o(12)|-")

# Alternar o caractere do sample
p1 >> play("x-|(o*)2|-")

# Toque vários samples diferentes em uma única etapa
p1 >> play("x-|o[23]|-")

# Toque samples aleatóriamente
p1 >> play("x-|o{1[23]}|-")

Sequências de camadas🔗

Você também pode usar os sinais menor que e maior que para sobrepor várias sequências simultaneamente. Vamos começar com duas sequências separadas e, em seguida, juntá-las em uma única linha de código.

p1 >> play("x-o-")
p2 >> play("  + + [ +]")

Podemos colocar cada sequência entre os caracteres "<>" em uma única sequência e toca-las ao mesmo tempo:

# "Sobreponha" as duas sequências
p1 >> play("<x-o-><  + + [ +]>")

# Equivalente a:
p1 >> play(P["x-o-"].zip(P["  + + [ +]"]))

Cada "camada" está relacionada ao índice de um grupo, de modo que, para um grupo de valores atribuídos a um objeto player, cada "camada" é afetada apenas por um desses valores atribuídos. Isso pode ser melhor demonstrado por meio de um exemplo:

# Divida cada sequência entre os canais esquerdo e direito
p1 >> play("<x-o-><  + + [ +]>", pan=(-1, 1))

# Alterar o sample utilizada na primeira camada
p1 >> play("<x-o-><  + + [ +]>", sample=(2, 0))

Tenha cuidado ao combinar várias camadas com algumas funções como offadd, pois isso cria novas camadas se elas não existirem ou as afeta se elas existirem. O código a seguir afetará apenas a segunda camada e, portanto, a primeira camada não será afetada:

p1 >> play("<x-o-><  + + [ +]>", sample=(2, 0)).every(4, "sample.offadd", 2)

O sintetizador loop🔗

Esta ainda é uma funcionalidade bastante experimental do FoxDot e está sujeita a alterações, mas vamos dar uma olhada no básico. O sintetizador de loop foi projetado para permitir que você reproduza arquivos de áudio mais longos (>1 segundo) e os manipule. Para começar, basta fornecer o nome do arquivo que deseja reproduzir e a duração que deseja reproduzir em batidas:

p1 >> loop("path/to/my/my_file.wav", dur=32)

Você pode colocar arquivos em uma pasta especial localizada em FoxDot/snd/loop/, que pode ser aberta indo em "Help & Settings" e depois em "Open Samples Folder" no menu do FoxDot. Você não precisa fornecer o caminho completo (ou extensão) dos arquivos nesta pasta:

p1 >> loop("my_file", dur=4)

Para ver todos os arquivos nesta pasta, execute print(Samples.loops).

Se você quiser alterar a ordem de reprodução, pode fornecer um argumento de posição após o nome do arquivo, que o FoxDot irá iterar com base na duração.

# Toque as primeiras 4 batidas do áudio em ordem
p1 >> loop("my_file", P[:4], dur=1)

# Toque as primeiras 4 batidas em ordem aleatória
p1 >> loop("my_file", P[:4].shuffle(), dur=1)

Se você souber o bpm do arquivo de áudio e quiser reproduzi-lo no tempo atual, pode fornecer ao playero parâmetro tempo. Por exemplo, my_file pode ser uma batida de bateria a 135 bpm, mas o tempo atual é 120. Posso ajustar o tempo de my_file ao relógio da seguinte maneira:

# Primeiras 4 batidas em passos de 1 batida
p1 >> loop("my_file", P[:4], dur=1, tempo=135)

# Primeiras 4 batidas em passos de 1/2 batida
p1 >> loop("my_file", P[:8]/2, dur=1/2, tempo=135)

Você pode reproduzir o arquivo inteiro no tempo atual fornecendo o parâmetro beat_stretch com um valor diferente de zero (como 1 ou True) e não precisa saber o tempo antecipadamente.

p1 >> loop("my_file", dur=4, beat_stretch=True)

Esticar o áudio dessa maneira alterará o tom, portanto, se o áudio tiver tom, você pode querer esticá-lo sem perder essa informação. Isso é possível usando o parâmetro striate. Ele fatia o arquivo em vários segmentos pequenos e os reproduz ao longo do valor da duração – isso reproduzirá o arquivo de áudio inteiro. Quanto maior for o arquivo de áudio, maior será o número que você provavelmente desejará usar. Usando o exemplo acima, você pode querer usar um valor striate de 100-200 para uma reprodução mais suave:

# Estique o arquivo usando 100 segmentos
p1 >> loop("my_file", dur=4, striate=100)

# Estique usando 10 segmentos - ouça a diferença
p1 >> loop("my_file", dur=4, striate=10)

Observação: você pode perceber alterações no tom em tempos mais rápidos.

Todos os Efeitos do player do FoxDot podem ser usados com o sintetizador de loop, então experimente e descubra o que funciona melhor para o seu áudio. Por exemplo, usar slide com valores negativos pode recriar o efeito de "scratch de DJ" do hip-hop da velha escola, pois diminui a velocidade de reprodução para 0 e depois volta ao normal:

p1 >> loop("my_file", P[:8]/2, dur=1/2, slide=[0,0,-2])

O sintetizador stretch🔗

Esta recente adição ao FoxDot lhe permite esticar um arquivo de áudio inteiro sem perder qualquer informação de tom – independentemente do tempo ser mais rápido ou mais lento. Basta fornecer o nome do arquivo da mesma forma que o sintetizador de loop e definir a duração que deseja reproduzir o arquivo e pronto:

# Reproduza o arquivo inteiro em 4 batidas
p1 >> stretch("my_file", dur=4)