2.1 Atributos do Player🔗
Os objetos Player do FoxDot recebem SynthDefs que aceitam vários parâmetros nomeados entre colchetes para manipular as sequências que estão a ser reproduzidas. Provavelmente já viu dur e pan, mas o que mais podemos usar? Existem muitas opções, que são amplamente divididas em dois grupos: atributos e efeitos. Atributos são coisas que afetam qual nota é reproduzida e quando, e efeitos são coisas que alteram como o som, bem, soa! Pode ver uma lista de todos os termos de palavras-chave possíveis avaliando o código
>>> print(Player.get_attributes()
('degree', 'oct', 'dur', 'delay', 'blur', 'amplify', 'scale', 'bpm', 'sample',
'sus', 'fmod', 'pan', 'rate', 'amp', 'vib', 'vibdepth', 'slide', 'sus',
'slidedelay', 'slidefrom', 'bend', 'benddelay', 'coarse', 'striate', 'pshift',
'hpf', 'hpr', 'lpf', 'lpr', 'swell', 'bpf', 'bpr', 'bits', 'amp', 'crush', 'dist',
'chop', 'tremolo', 'echo', 'decay', 'spin', 'cut', 'room', 'mix', 'formant',
'shape')
Tenha em mente que um SynthDef do SuperCollider pode aceitar parâmetros nomeados específicos que não estão listados acima. Pode definir os valores para um atributo ou efeito do player especificando-os como um parâmetro nomeado dentro de uma chamada SynthDef, desta forma:
Ou pode definir o valor diretamente nos atributos do objeto Player:
Esta seção irá guiá-lo pelas diferentes palavras-chave de atributos com alguns exemplos de código. Se quiser saber mais sobre efeitos, poderá encontrar mais informações na próxima seção.
Atributos🔗
Estes são os valores das palavras-chave que são usados pelo FoxDot para decidir qual nota ou sample é reproduzido e quando. Sem nenhuma ordem específica, eles são: degree, oct, dur, scale, amp, amplify, bpm, sample e delay. Vamos analisar cada um deles em profundidade com alguns exemplos de código agora.
Nota🔗
Parâmetro: degree
A nota é por vezes conhecido como o "grau de uma escala" e refere-se ao índice da escala que nós devemos usar para criar uma nota – portanto, para tocar a primeira nota de uma escala, usa-se o valor de grau 0. Não é necessário especificar este por nome, pois é sempre o primeiro parâmetro usado. Aqui está um exemplo de código que toca as quatro primeiras notas da escala padrão (C maior).
Oitava🔗
Parâmetro: oct
Esta é a oitava em que você quer tocar uma nota. Por padrão, é 5, para que a nota que toca ao iniciar um objeto player "em branco" seja o C central. Uma oitava tem (normalmente) 12 semitons, pelo que a 5ª oitava começa no 60º semitom. Adicionamos este valor ao nosso tom (que obtemos usando o grau para obter o valor final da nota. Um número menor toca uma nota mais grave e um número maior toca uma nota mais aguda:
Duração🔗
Parâmetro: dur
Esse é a duração da nota. Durações não podem ser negativas e devem conter pelo menos um número diferente de zero. Uma duração pode ser qualquer tipo, desde que possa ser representada por um valor de ponto flutuante.
# Um único valor para todas as notas
p1 >> pluck([0, 1, 2, 3], dur=1/2)
# Uma lista de durações de inteiros, frações ou ponto flutuantes
p1 >> pluck([0, 1, 2, 3], dur=[1, 1/2, 0.5])
p1 >> pluck([0, 1, 2, 3], dur=[0.1, 0.3, 0.43, 0.17])
Você pode "pular" uma nota definindo a duração como zero ou "muta-la" usando um objeto rest com a duração entre parênteses:
# Pule cada 3ª nota
p1 >> pluck([0, 1, 2, 3], dur=[1, 1, 0])
# Descanse a cada 3 nota por 2 batidas
p1 >> pluck([0, 1, 2, 3], dur=[1, 1, rest(2)])
Escala🔗
Parâmetro: scale
Como o nome do parâmetro sugere, isto define a escala que do objeto player. Deve ser uma lista, um Padrão, ou um objeto Scale (que é uma subclasse de Pattern). Para ver a lista de escala, você pode executa o seguinte código:
>>> print(Scale.names())
['aeolian', 'chinese', 'chromatic', 'custom', 'default', 'diminished',
'dorian', 'dorian2', 'egyptian', 'freq', 'harmonicMajor', 'harmonicMinor',
'indian', 'justMajor', 'justMinor', 'locrian', 'locrianMajor', 'lydian',
'lydianMinor', 'major', 'majorPentatonic', 'melodicMajor', 'melodicMinor',
'minor', 'minorPentatonic', 'mixolydian', 'phrygian', 'prometheus',
'romanianMinor', 'yu', 'zhi']
Por padrão, o FoxDot usa a escala "maior". Para trocar isso para a escala menor, por exemplo, você pode usar o parâmetro nomeado scale e a escala Scale.minor, da seguinte forma:
# Toque a escala maior por padrão
p1 >> pluck([0, 2, 4, 6, 7])
# Troque para menor
p1 >> pluck([0, 2, 4, 6, 7], scale=Scale.minor)
Se você quer trocar a escala para todos os players, você pode definir o valor Scale.default:
# Começe o player com a escala padrão (Maior)
p1 >> pluck([0, 2, 4, 6, 7])
# Troque a escala padrão para Dorian
Scale.default = Scale.dorian
# Você pode especificar a escala padrão como uma string
Scale.default = "dorian"
Volume🔗
Parâmetro: amp, amplify
Esse é a amplitude da nota, or seu volume/intensidade. O valor normalmente variam entre 0 e 1 mas você pode definir valores maiores para tornar a nota ainda mais alta, no entanto, tenha cuidado para não aumentar demais o volume, pois poderá prejudicar os seus ouvidos/alto-falantes!
Nós podemos criar pequenos padrões ritmos usando o amp com valores com 0 também:
Mas, o que aconteceria se nós quisésemos tocar esse ritmo a cada dois compassos? Um jeito seria adicionar manualmente um monte de 0s à sequência ou usar um objeto Pattern com o método stutter, mas, nós podemos usar um outro parâmetro nomeado designado justamente para esse propósito; amplify.
Antes do som ser tocado por um player, o valor de amp é multiplicado pelo de amplify, então, com isso você pode usar coisas como o TimeVar para definir a amplitude como 1 ou 0 (ou seja, ligado e desligado) por certa quantidade de tempo:
p1 >> pluck(
dur=1/4,
amp=[1, 1/2, 1/2, 1, 0, 1, 0, 1, 1/2, 1/2, 1, 0, 1, 1/2, 1/4, 1],
amplify=var([1,0],[6,2])
)
Isso é muito útil se você quiser definir múltiplos players para serem "ligados" e "desligados" ao mesmo tempo
p1 >> pluck(dur=1/4, amp=[1, 1/2, 1/2, 1, 0, 1, 0, 1, 1/2, 1/2, 1, 0, 1, 1/2, 1/4, 1])
p2 >> bass(var([0, 3], 8), dur=1/2)
p1.amplify = p2.amplify = var([1,0],4)
A última linha é bastante complicada, e para isso você poderia usar um objeto Group em seu lugar (veja aqui para mais informações):
p1 >> pluck(dur=1/4, amp=[1, 1/2, 1/2, 1, 0, 1, 0, 1, 1/2, 1/2, 1, 0, 1, 1/2, 1/4, 1])
p2 >> bass(var([0, 3], 8), dur=1/2)
Group(p1, p2).amplify = var([1,0],4)
Tempo🔗
Parâmetro: bpm
Se você quer que um objeto player toque em um tempo diferente você pode usar o atributo bpm. Isso é, batidas por minuto. O tempo global do relógio de agendamento pode ser trocado usando Clock.bpm = 140 por exemplo (veja aqui para mais informações).
# Toca no tempo do Clock.bpm (120 por padrão)
p1 >> pluck([0, 1, 2, 3])
# Força o player a usar 100 bpm
p2 >> bell([4, 5, 7], bpm=100)
# Isso irá tocar sempre a 100 bpm, mesmo que o Clock.bpm seja trocado
Clock.bpm = 200
Samples🔗
Parâmetro: sample
Isso só é usado para o player de samples, chamado play. Esse SynthDef recebe uma string como o primeiro parâmetro (conhecido como "play string") em vez de uma lista de valores de notas e toca o audio do sample armazenado no seu computador baseado no caractere na string.
# Samples padrão
p1 >> play("x-o-")
# Um conjunto diferente de samples
p1 >> play("x-o-", sample=1)
# Pode ser uma lista de valores
p1 >> play("x-o-", sample=[0, 1, 2])
Os valores devem ser um inteiro. Se a pasta contem 3 samples e você usar o valor 4, o objeto player vai voltar para o primeiro arquivo da pasta e reproduzirá este, então, você não precisa saber exatamente quantos samples tem em uma pasta.
Delay do som🔗
Parâmetro: delay
Na música (e especialmente na música eletrónica) o delay refere-se fequentemente a uma espécie de efeito de "echo", em que um som é tocado novamente pouco tempo depois de ter começado, mas um pouco mais baixo. No FoxDot, no entanto, refere-se literalmente a um período de tempo, em batidas, para atrasar a reprodução de um som. Aqui, vamos atrasar cada terceira nota em meia batida:
Se você quiser toca a nota e toca-la com um delay, você pode usar uma tupla ou PGroup com o primeiro valor com 0, que quer dizer, sem delay. O segundo valor irá indicar o tempo de delay da segunda nota:
# "Repita" toda terceira nota
p1 >> pluck([0, 1, 2, 3], delay=[0, 0, (0, 0.5)])
# Atrase uma nota para tocar *depois* da seguinte
p1 >> pluck([0, 1, 2, 3], delay=[0, 0, (0, 1.5)])
Tom🔗
Parâmetro: root
Assim como você pode usar uma escala diferente da Scale.default dentro de um player, você também pode usar uma nota fundamental diferente (mais informações aqui). Ela deve ser um número ou uma sequência de números, e não o nome de nota, como "C#".