Skip to content

Instantly share code, notes, and snippets.

@edmorais
Last active April 22, 2016 15:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save edmorais/f0aa22b2277ccba7e1ad to your computer and use it in GitHub Desktop.
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.
/* __ ________ ___ ___ _______
/ / / __/ _/ |_ |/ _ < / __/
/ /___\ \_/ / / __// // / /__ \
/____/___/___/ /____/\___/_/____/
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