$ chuck 1. Simple Sine Wave.ck
Chuck tem uma coleção de unidades que fazem barulho. O primeiro gerador de unidades que exploraremos é chamado Sinosc. Esta é uma onda senoidal simples que emite uma única frequência fundamental a 440 Hertz em meio volume. O SINOSC é "jogado" no objeto DAC usando o operador =>. O objeto DAC ou o conversor de áudio digital é a conexão do computador com seus alto -falantes externos ou cartão de som. Pense no operador => como um cabo ou plugue de patch que conecta a saída de áudio da onda senoidal ao alto -falante.
SinOsc s => dac;
s.gain(0.5);
s.freq(440);
Somente esse código não produzirá som. Para produzir som, temos que dizer ao programa quanto tempo o som vai durar. Chuck aplica unidades de tempo ao objeto agora. Agora representa a hora atual, mais o tempo adicional 'jogado' até agora. Neste exemplo, queremos apenas processar o som por um segundo. Portanto, 'jogamos' 1 segundo até agora.
1::second => now;
A execução do programa completo gera um tom suave a 440Hz, meio volume, por 1 segundo. Tente brincar com as configurações. Altere o tom, o volume ou o tempo para criar novas variações do som. Consulte a documentação do Chuck e altere a onda senoidal para um dente de serra ou onda quadrada. Como isso soa diferente?
Vamos fazer algumas músicas agora! Para esta lição, aceitaremos os fundamentos básicos do Capítulo 1 e simplesmente organizaremos uma sequência de notas para fazer uma melodia simples.
A música, em sua forma mais básica, é uma sequência de eventos sonoros tocados em diferentes tons, durações e intervalos. Neste exemplo, simplesmente jogaremos a mesma duração em intervalos de 1/4 de segundo. Para cada evento, jogaremos um tom simples.
Conseguir isso não é difícil. Tudo o que precisamos fazer é copiar e colar nosso código do capítulo 1 e estruturar uma sequência de 4 notas de eventos de nota. Nesse ponto, podemos alterar a frequência para cada evento de nota e criar um padrão de eventos que quase parecem musicais. Aqui, simplesmente dividimos a segunda nota ao meio, multiplicamos a terceira nota por 2 e depois multiplicamos a nota final por 2.5.
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(440);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(220);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(880);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(1100);
// Process program for a duration of 1/4 second
0.25::second => now;
Execute o programa algumas vezes e veja se você pode alterar a sequência para uma sequência que preferir. Você pode replicar uma de suas músicas favoritas? Como você converteria Hertz em notas musicais? O sequenciamento de músicas como essa parece estranho? O que facilitaria isso?
No capítulo 2, criamos com sucesso nossa primeira melodia. Isso não foi pequeno! Os computadores são muito bons em agir com base em uma sequência de instruções. Dado o que já sabemos, qualquer melodia ou música pode ser reproduzida nota por nota por cópia e colar. Depois de um tempo, criar música dessa maneira se torna tedioso e pouco inspirador. Tem que haver uma maneira mais fácil.
As melodias musicais geralmente são repetidas muitas vezes por uma música no que é conhecido como frase. Frases são essencialmente loops. Loops de camada de música eletrônica e hip hop para criar texturas polirríticas, onde os loops interagem e jogam um do outro. Felizmente para nós, há uma estrutura de controle perfeita na programação para replicar esse comportamento - o loop while.
Em vez de copiar e colar cada nota, as instruções podem ser repetidas para criar frases musicais. Em Chuck, o loop while é construído com a palavra -chave e os suportes encaracolados para conter a sequência de instruções que serão repetidas. Neste exemplo, repetiremos as instruções infinitamente ou até que o programa seja encerrado.
// Loop Repeats while true is true (aka forever!)
while(true) {
//instructions go here
}
Normalmente, não escrevíamos programas de computador com loops infinitos! Isso é algo que geralmente é evitado na programação, pois pendurará o programa e impedirá que o programa execute outras peças ou o código e será executado para sempre. Em Chuck, como descobriremos em breve, existem maneiras de encerrar e iniciar programas algoritmicamente encerrados. Na música, podemos querer improvisar e deixar um loop infinito construir um ritmo durante um período de tempo.
Para tornar o loop mais interessante, apresentaremos duas novas bibliotecas - DST e matemática. A STD significa Biblioteca Padrão e é uma coleção de métodos de utilidade úteis que podem ser usados em nossos programas. O STD apresenta um método chamado 'MTOF' ou 'MIDI para frequência'. Na música de computador, a escala de 12 notas no piano é representada como arremessos ascendentes entre 0 e 127. Uma oitava são 12 notas e existem 10 oitavas disponíveis. O meio do piano está representado aos 60 anos. Não se preocupe se você não tiver conhecimento musical! O uso de qualquer um dos valores entre 0 e 127 nos dará automaticamente ajuste ocidental padrão. As notas MIDI são certamente muito mais fáceis de trabalhar e raciocinar.
O MTOF é um método que pega uma entrada e retorna um valor. Entraremos um valor de nota MIDI, 60, por exemplo, e o MTOF retornará o valor correspondente em Hertz. Podemos observar isso escrevendo um pequeno programa que imprime a saída do std.mtof (60). Chuck usa os símbolos <<< >>> para imprimir valores de retorno para fins de depuração.
<<< Std.mtof(60) >>>;
261.625565 :(float)
Como você pode ver, compor músicas em Hertz começa a ficar mais complicado quando tentamos incorporar notas musicais ocidentais em nossas melodias. Para facilitar ainda mais as coisas, vamos gerar algumas notas aleatórias usando a Biblioteca de Matemática. A matemática possui uma função chamada Random2 que recebe a entrada de 2 números. Os 2 números representam um intervalo entre o primeiro e o segundo número.
Podemos randomizar oitavas, anotações que ocorrem de sempre 12 notas, aleatoriamente entre um conjunto de números e multiplicando por 12. Quando convertemos as notas em frequência, o Sinosc pode tomar a frequência como entrada e emitir um som!
Std.mtof(60 + (Math.random2(0,3) * 12)) => s.freq;
Juntando tudo, podemos embrulhar nosso algoritmo dentro do loop while. Esta é uma das vantagens de trabalhar com música com código. À medida que progredimos em direção a programas mais complexos, podemos começar a criar músicas que só podem ser alcançadas com a programação de computador. Isso é conhecido como composição algorítmica.
// Sine Wave connected to audio out
SinOsc s => dac;
while(true) {
// Set midi musical note
// with randomly selected octaves
Std.mtof(60 + (Math.random2(0,3) * 12)) => s.freq;
// Play for 1/4 of a second
0.25::second => now;
}
Tente alterar a velocidade da sequência. O que acontece quando você muda a nota C do meio para outra nota? Como parece 12 ou 24 notas? A música se torna mais ou menos musical se você mudar o valor múltiplo? Expiração e bata no Ctrl-C no teclado quando tiver ouvido o suficiente!
Em breve!
Em breve!
Em breve!
Em breve!