Last active
April 22, 2016 15:04
-
-
Save edmorais/f0aa22b2277ccba7e1ad to your computer and use it in GitHub Desktop.
Grava as teclas premidas e o tempo respectivo, reproduz quando se carrega no espaço.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* __ ________ ___ ___ _______ | |
/ / / __/ _/ |_ |/ _ < / __/ | |
/ /___\ \_/ / / __// // / /__ \ | |
/____/___/___/ /____/\___/_/____/ | |
Aula de 22/05/2015: | |
Grava as teclas premidas e o tempos respectivo, reproduz quando se carrega no espaço. | |
Por Eduardo Morais / FBAUP - www.eduardomorais.pt/fbaup/ | |
*/ | |
/* | |
Importar bibliotecas! | |
*/ | |
import ddf.minim.spi.*; | |
import ddf.minim.signals.*; | |
import ddf.minim.*; | |
import ddf.minim.analysis.*; | |
import ddf.minim.ugens.*; | |
import ddf.minim.effects.*; // via menu Sketch->Import Library->Minim | |
/* | |
Declarações de variáveis: | |
*/ | |
Minim minim; // objecto que corresponde à 'mesa de mistura' | |
AudioOutput out; // saída de audio (imaginem que é o cabo de saida) | |
boolean playing = false; // determina se estamos em modo de 'REC' ou de 'PLAY' | |
int frame; // conta o frame (nº de ciclo draw()) em que estamos | |
int toque; // conta o número de toques nas teclas | |
int[] tempos; // lista de tempos (= números de frames) em que carregámos numa tecla | |
char[] notas; // lista de teclas em que carregámos | |
/* | |
Função setup(): | |
Executada automaticamente no início do programa: | |
*/ | |
void setup() { | |
size(800,400); | |
background(255); | |
strokeWeight(2); | |
frame = 0; | |
toque = 0; | |
tempos = new int[1000]; // reservámos memória para 1000 tempos e 1000 teclas | |
notas = new char[1000]; | |
// 'ligamos' a 'mesa de mistura' ao nosso sketch: | |
minim = new Minim(this); | |
// iniciamos a saída de audio: | |
out = minim.getLineOut(); | |
} | |
/* | |
Função draw(): | |
Executada repetidamente a cada 'frame'/fotograma de animação. | |
*/ | |
void draw() { | |
// se estivermos em modo de PLAY: | |
if (playing) { | |
// vamos percorrer o array de tempos, | |
// e enquanto encontrarmos toques num tempo igual ao frame actual... | |
while (tempos[toque] == frame) { | |
// tocamos a nota correspondente: | |
out.playNote(0, notas[toque]); | |
// avançamos para o toque seguinte: | |
toque++; | |
} | |
background(255); | |
stroke(#009933); | |
} | |
// vamos usar cores diferentes se estivermos em modo de gravação: | |
if (!playing) { | |
background(0); | |
stroke(#FF0000); | |
} | |
// vamos percorrer o 'buffer' da saída de áudio! | |
// afinal trata-se de um conjunto de amplitudes que podemos visualizar: | |
// (mas com o cuidado de não irmos até ao final (atenção ao - 1)! | |
for (int i = 0; i < out.bufferSize() - 1 ; i++) { | |
// vamos mapear ('regra de três simples') o ponto em que estamos (i) | |
// à coordenada x da nossa janela: | |
float x = map(i, 0, out.bufferSize(), 0, width); | |
// vamos desenhar uma linha vertical a unir as amplitudes actual e seguinte: | |
// (daí o cuidado para não irmos ao final do buffer) | |
line(x, height/2 - out.mix.get(i)*300, | |
x, height/2 - out.mix.get(i+1)*300); | |
} | |
// incrementamos o contador de frames: | |
frame++; | |
} | |
/* | |
Função keyPressed(): | |
Executada sempre que carregamos numa tecla: | |
*/ | |
void keyPressed() { | |
// se estivermos em modo de gravação (= not playing) | |
if (!playing) { | |
if (key == ' ') { | |
// se carregarmos no espaço, entramos em modo de play | |
// e colocamos os contadores de frames e toques a zero: | |
playing = true; | |
frame = 0; | |
toque = 0; | |
} else { | |
// senão, tocamos imediatamente (0) | |
// a nota correspondente à tecla que carregámos: | |
out.playNote(0, key); | |
// gravamos o frame actual na lista de tempos: | |
tempos[toque] = frame; | |
// gravamos a tecla actual na lista de teclas/notas: | |
notas[toque] = key; | |
// incrementamos o numero de toque: | |
toque ++; | |
// se atingirmos o número máximo de toques memorizáveis, | |
// entramos em modo de play e colocamos os contadores a zero: | |
if (toque >= tempos.length) { | |
playing = true; | |
frame = 0; | |
toque = 0; | |
} | |
} | |
// senão (se estivermos em modo de play) | |
} else { | |
if (key == ' ') { | |
// se carregarmos no espaço, entramos em modo de gravação: | |
playing = false; | |
// reinvocamos o setup(), de modo a recriar os arrays | |
// apagando todas as notas registadas anteriormente | |
setup(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment