We are trying to develop an application that has in its layout:
-icons associated to musical notes (C D E F G A B) that when when are pressed they play the corresponding note (example: if you press Icon "C" it plays the C note. we are usig soundcypher library.
-icons associated to musical intervals that when are pressed they play a musical example of it (for exemple, if you press the icon, it plays the sample)
- we have menu icons that perform actions like (play, to play the notes, exit, clear, plus tempo, minus tempo and go up and down on the intervals)
We want to select the first note (choose one of the musical notes icon) and then DRAG it to somewhere over the layout.
Secondly, we select the up or down button to choose if the interval is above or under the note we have chosen before.
Then, we select the interval icon and we drag it near the note icon (and they should snap to each other) and it is suposed to create a note icon corresponding to the note created by the junction of the first note icon with the interval (we initially chose) Example = We chose the C note, then we chose UP, next we chose the icon corresponding to 2nd M. We drag it near the C note icon and we get a new icon corresponding to the D note.
We choose PLAY and it will play C and D notes.
We had the work done but it was asked us to restructure it into classes.
The previous code is working but now we are having troubles to display the icons, making them draggable and associate actions and notes to them.
Basically, we don't know how to do the restructure correctly.
This is the previous code
import TUIO.*;
TuioProcessing tuioClient;
import arb.soundcipher.*;
SoundCipher sc = new SoundCipher(this);
//irá dar a nota (A PARTIR DISTO IRãO ADICIONAR-SE AS NOTAS)
int nota_inicial = 0;
int[] musica=new int[nota_inicial];
boolean visivel=false;
int N=10;//número de icones por linha
PImage[][] imagens = new PImage[N][24]; //imagens num array
PImage[] botoes = new PImage[12]; //icone dos botões
int[] notas = {
60,61,62,63,64,65,66,67,68,69,70,71};
Point[][] posicoes=new Point[N][24]; //posiçoes para os icones
Point[][] originais=new Point[N][24]; //posiçoes para os ícones no background
Point[][] tamanho = new Point[N][24];
//variáveis para o TUIO
float cursor_size = 5;
float table_size = 760;
float scale_factor = 1;
int sobedesce;
int temp=100;//determina a velocidade de reprodução
//determina a altura e largura dos icones
int largura = 100;
int altura = 100;
//determina a altura e largura dos icones de controlo
int largura2 = 60;
int altura2 = 60;
//Tamanho dos icones das NOTAS
int largura3 = 100;
int altura3 = 100;
int num = 24;
int x = 100;
int y = 630;
int posicaoTOCAR = 690;
float distancia;
//determina o racio para os snaps
int RACIOBOLINHA=10;
int distbola = 8;
//variáveis de posição dos icones de controlo
int botcima=1810;
int botbaixo=1900;
int botplay=1810;
int botclear=1900;
int botmais=1810;
int botmenos=1900;
int botexit=1900;
int botajuda = 1810;
//Tamanho do botão TOCAR
int largura4=40;
int altura4 =100;
int botTOCA1 = 10;
int botTOCA2 = 130;
int botTOCA3 = 250;
int botTOCA4 = 370;
int botTOCA5 = 490;
int botTOCA6 = 610;
int botTOCA7 = 730;
int botTOCA8 = 850;
int botTOCA9 = 970;
int botTOCA10 = 1090;
int botTOCA11 = 1210;
int botTOCA12 = 1330;
//esta função inicializa as posiçoes originais dos icones
void inicializa()
{
for(int i = 0; i < N; i ++)
{
//ICONES INTERVALOS
posicoes[i][0] = new Point(10, 590);
originais[i][0] = new Point(10, 590);
posicoes[i][1] = new Point(130, 590);
originais[i][1] = new Point(130, 590);
posicoes[i][2] = new Point(250, 590);
originais[i][2] = new Point(250, 590);
posicoes[i][3] = new Point(370, 590);
originais[i][3] = new Point(370, 590);
posicoes[i][4] = new Point(490, 590);
originais[i][4] = new Point(490, 590);
posicoes[i][5] = new Point(610, 590);
originais[i][5] = new Point(610, 590);
posicoes[i][6] = new Point(730, 590);
originais[i][6] = new Point(730, 590);
posicoes[i][7] = new Point(850, 590);
originais[i][7] = new Point(850, 590);
posicoes[i][8] = new Point(970, 590);
originais[i][8] = new Point(970, 590);
posicoes[i][9] = new Point(1090, 590);
originais[i][9] = new Point(1090, 590);
posicoes[i][10] = new Point(1210, 590);
originais[i][10] = new Point(1210, 590);
posicoes[i][11] = new Point(1330, 590);
originais[i][11] = new Point(1330, 590);
//ICONES NOTAS MUSICAIS
posicoes[i][12] = new Point(10, 10);
originais[i][12] = new Point(10, 10);
posicoes[i][13] = new Point(130, 10);
originais[i][13] = new Point(130, 10);
posicoes[i][14] = new Point(250, 10);
originais[i][14] = new Point(250, 10);
posicoes[i][15] = new Point(370, 10);
originais[i][15] = new Point(370, 10);
posicoes[i][16] = new Point(490, 10);
originais[i][16] = new Point(490, 10);
posicoes[i][17] = new Point(610, 10);
originais[i][17] = new Point(610, 10);
posicoes[i][18] = new Point(730, 10);
originais[i][18] = new Point(730, 10);
posicoes[i][19] = new Point(850, 10);
originais[i][19] = new Point(850, 10);
posicoes[i][20] = new Point(970, 10);
originais[i][20] = new Point(970, 10);
posicoes[i][21] = new Point(1090, 10);
originais[i][21] = new Point(1090, 10);
posicoes[i][22] = new Point(1210, 10);
originais[i][22] = new Point(1210, 10);
posicoes[i][23] = new Point(1330, 10);
originais[i][23] = new Point(1330, 10);
}
}
void setup(){
background(255);
size(2048, 768);
// minim = new Minim(this);
// musicas = minim.loadFile("oitperf.mid");
tuioClient = new TuioProcessing(this);
for(int i = 0; i < num; i++){//Percorre a linha do icone
for(int j = 0; j < N; j++){//Percorre os icones dessa linha
if(i>=12 && i<=23)
{
image(imagens[j][i],posicoes[j][i].x, posicoes[j][i].y, largura3, altura3);
}
if(i>=0 && i<12)
{
image(imagens[j][i],posicoes[j][i].x, posicoes[j][i].y, largura, altura);
}
if(posicoes[j][i].x!=originais[j][i].x || posicoes[j][i].y!=originais[j][i].y) //Para não alterar os ícones originais
{
//Ao ser criado um ícone, surgem as bolinhas de ligação
ellipse(posicoes[j][i].x, posicoes[j][i].y, largura3/RACIOBOLINHA, altura3/RACIOBOLINHA);//cima esq
ellipse(posicoes[j][i].x+largura3, posicoes[j][i].y, largura3/RACIOBOLINHA, altura3/RACIOBOLINHA);//cima dto
ellipse(posicoes[j][i].x, posicoes[j][i].y+altura3, largura3/RACIOBOLINHA, altura3/RACIOBOLINHA);//baixo esq
ellipse(posicoes[j][i].x+largura3, posicoes[j][i].y+altura3, largura3/RACIOBOLINHA, altura3/RACIOBOLINHA);//baixo dto
}
}
}
}
//esta função cria o snap para que os icones se agarrem usn aos outros
void faz_ligacoes(int j1, int i1)
{
for(int i= 0; i < num; i++){
for(int j= 0; j < N; j++){
if (i1==i && j1==j || (posicoes[j][i].x==originais[j][i].x && posicoes[j][i].y==originais[j][i].y))
continue;
int valorx= abs(posicoes[j][i].x - posicoes[j1][i1].x);
int valory = abs(posicoes[j][i].y - posicoes[j1][i1].y);
distancia= sqrt((pow(valorx, 2))+(pow(valory, 2)));//Calcular a distância entre dois icones
if(distancia<largura+3*RACIOBOLINHA)
{
println(j1+", "+ i1+ " e "+ j+", "+ i+ " estao proximos!");
if(valorx<valory)//Snap icone nas bolinhas de cima e baixo
{
posicoes[j1][i1].x=posicoes[j][i].x;
}
else if(valory<valorx)//Snap icone nas bolinhas dos lados
{
posicoes[j1][i1].y=posicoes[j][i].y;
}
}
}
}
}
int nova_nota=temp[temp.length-1]+12;
int a_mover=-1;
for(int k=0; k<N; k++)
{
if(originais[k][nova_nota]!=posicoes[k][nova_nota])
a_mover=k-1;
}
//Gera as imagens das notas criadas pelo ícone do intervalo
posicoes[a_mover][nova_nota].x=mouseX+altura/2;
posicoes[a_mover][nova_nota].y=posicoes[j][i].y;
sc.playNote(temp[temp.length-1],100,2.0);
}
}
}
}
void mousePressed(){
for(int i = 0; i < num; i++){//Percorre a linha do icone
for(int j = 0; j < N; j++){//Percorre os icones dessa linha
if (mouseX > posicoes[j][i].x && mouseX < posicoes[j][i].x + largura && mouseY > posicoes[j][i].y && mouseY < posicoes[j][i].y + altura){
bdifx[j][i] = (int) (mouseX-(posicoes[j][i].x));
bdify[j][i] = (int) (mouseY-(posicoes[j][i].y));
break;
}
else
{
bdifx[j][i]=0;
bdify[j][i]=0;
}
}
}
// botões para os controlos
if(mouseX >botcima && mouseX <botcima+largura2 && mouseY > y-240 && mouseY < y-180){//botão para subir nos intervalos
fill(255,255, 255, 190);
noStroke();
ellipse(botcima+largura2/2,y-210, 60,60);
for(int i = 0; i< Intervalos.length; i++)
{
Intervalos[i].display();
}
}
----
Class
Class desenho
{
// a ArrayList serve para desenhar várias bolas e manter a sua posição no programa enquanto a mira se mexe
ArrayList arrayDesenho;
desenho(){
//atribui-se um ArrayList ao arrayDesenho
arrayDesenho = new ArrayList();
}
//vai se buscar a class Bola e os seus atributos(posX, posY)
void adicionarIcone(int soundfile_a, String nome_ficheiro_a, int ix_a, int iy_a, int ilargura_a, int ialtura_a){
//atrbui-se o b à bola
Intervalos_Icones b = new Intervalos_Icones(soundfile_a, nome_ficheiro_a, ix_a, iy_a, ilargura_a, ialtura_a);
//o add seve para adicionar a class bola ao ArrayList
arrayDesenho.add(b);
}
void desenhaTudo(){
// cria-se um ciclo for para conservar o numero de bolas no programa
// o size retira o tamanho da ArrayList
for(int i=0; i < arrayDesenho.size(); i++){
Intervalos_Icones b = (Intervalos_Icones)arrayDesenho.get(i);
b.display();
}
}
}
class Intervalos_Icones
{
//Propriedades dos ícones
int x, y;
int largura;
int altura;
PImage imagem;
String soundfile;
//Propiedades genéricas do objecto da classe
Intervalos_Icones(String soundfile, String nome_ficheiro, int ix, int iy, int ilargura, int ialtura)
{
x = ix;
y = iy;
largura = ilargura;
altura = ialtura;
imagem = loadImage(nome_ficheiro);
this.soundfile=soundfile;
}
//Para apresentar o objecto no ecrã
void display()
{
image(imagem, x, y, largura, altura);
}
void toca()
{
sc.playMidiFile(soundfile, 150);
}
void arrasta(){ //CRIAR O ARRASTAMENTO DOS ICONES
if(mousePressed == true)
{
if(pos_x_anterior == -1)
{
pos_x_anterior = mouseX;
pos_y_anterior = mouseY;
return; //Para não fazer o resto do ciclo
}
int diffx=mouseX-pos_x_anterior;
int diffy=mouseY-pos_y_anterior;
for(int i = 0; i < Intervalos.length; i ++)
{
if(pos_x_anterior > Intervalos[i].x && pos_x_anterior < Intervalos[i].x + tamanho_intervalos_icone && pos_y_anterior > Intervalos[i].y && pos_y_anterior < Intervalos[i].y + tamanho_intervalos_icone)
{