quarta-feira, 27 de março de 2013

Modelagem de Domínio





Um modelo de domínio é uma representação visual de classes conceituais ou objetos do mundo real, em um contexto (Fowler, 1996). Ou seja, é uma descrição de coisas/conceitos em uma situação real, mas não de objetos de software, tais como classes em Java, por exemplo. O modelo de domínio, produzido na etapa de análise, ajuda na elaboração da lista de requisitos.

Nesse sentido, um tom determina 8 acordes (sem as variações) a serem tocados. Um tom pode ser maior ou menor; por causa disso, temos que Acordes Maior e Acordes Menor são um tipo de Acorde. Um acorde é composto por 3 notas tocadas simultaneamente. As instâncias C e C#m são apenas um exemplo de nota e acorde, respectivamente.

sexta-feira, 15 de março de 2013

Musical Instrument Shield

Seguindo com o projeto, estamos na fase da integração Hardware-Software.
Estamos trabalhando no momento com o Musical Instrument Shield, que será de extrema utilidade no projeto, com ele poderemos reproduzir sons reais de instrumentos musicais, já que o Musical Instrument Shield comporta uma biblioteca de diversos instrumentos musicais.

Segue foto abaixo dele conectado no Arduino e na Protoboard para a realização de alguns testes com o Software.

Musical Instrument Shield (vermelho)




















Musical Instrument Shield















O manuseio do hardware é simples junto ao Arduino e a Protoboard, como estamos fazendo alguns testes com o Software, decidimos ainda não solda-lo junto ao Arduino, mas para a finalização do projeto será necessário.

A princípio utilizamos este site de dois alunos da Universidade de Stanford, para nos auxiliar com o desenvolvimento do código.
Ao decorrer do desenvolvimento encontramos algumas dificuldades que serão solucionadas junto a nossa Orientadora.

sexta-feira, 8 de março de 2013

Relatórios Parciais

No último mês, deixamos um pouco o blog de lado para correr com a elaboração dos relatórios parciais de cada um. Decidi publicar agora os documentos com os resultados preliminares da pesquisa:


Danilo - Programação Arduino
Rodrigo - Hardware
Thiago - Interface Java

quinta-feira, 24 de janeiro de 2013

Montagem do Projeto

Nos reunimos esta semana para a segunda parte da montagem do protótipo.

Esta segunda parte consiste em soldar os seguintes materiais: laser, LDR, woofer e a bateria.

A terceira parte do projeto, consiste em fazer uma montagem parcial de como ficará nosso protótipo. 
Utilizaremos também o código processing que está sendo desenvolvido por nosso colega, para que possamos ter um protótipo mais completo.


Laser's / Woofer's / LDR's

Posição do Arduino e da Protoboard



terça-feira, 15 de janeiro de 2013

Prévia da Interface Gráfica: Stringless Guitar - Parte 4

Nesta última parte da prévia da interface gráfica, vamos abordar o assunto mais intrínseco, que é a lógica de abrir arquivo de áudio. Para isso, há dois jeitos distintos: especificar o caminho de um arquivo local ou por Uniform Resource Locators (URLs). Como o próprio nome já diz, URLs são utilizados para localizar sites na web. Por exemplo, no outro post, o site http://pscode.org/media/EverLove.mid é o URL utilizado pelo programa pra abrir esse arquivo de áudio midi. 

Ao explorar a outra alternativa, devemos informar no código do programa aonde esse arquivo se encontra no computador. 






Em suma, o método abaixo é encarregado de implementar essa operação:


private void D_GMaiorActionPerformed(java.awt.event.ActionEvent evt) {
       InputStream in;
       try{
           in = new FileInputStream(new File("C:\\Users\\Thiago\\Downloads\\D_G Maior.wav"));
           AudioStream audioStream = new AudioStream(in);
           AudioPlayer.player.start(audioStream);
       }
       catch(Exception e){
           JOptionPane.showMessageDialog(null, e);
       } 
    }



Um caractere separador é utilizado para separar diretórios e arquivos no caminho. No Windows, o caractere separador é uma barra invertida (\). Em um sistema UNIX, é uma barra (/). Um erro comum de programação é utilizar '\' como um separador de diretório em vez de '\\'. Uma '\' simples indica que a '\' seguida pelo próximo caractere representa uma sequência de escape.

A diferença aqui é que essa classe, também do pacote javax.sound.sampled (API Java Sound), permite abrir outros formatos de áudio, como o .wav. Isso ajuda bastante, pois obtemos uma qualidade sonora melhor. O MIDI produz um som digitalizado, o que dificulta a experiência de descobrir o som real das notas, objetivo que norteia nosso propósito.



Fontes de Referência

DEITEL, H.M; DEITEL, P.J, Java, Como Programar -8ªed. – São Paulo: Prentice Hall, 2010.
http://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/AudioInputStream.html

quarta-feira, 2 de janeiro de 2013

Prévia da Interface Gráfica: Stringless Guitar - Parte 3


Nessa parte iremos abordar sobre os tratadores de evento de selecionar um item do JComboBox. Ao consultar a documentação (API), descobrimos como prosseguir diante desta situação. Há dois métodos de duas interfaces distintas, respectivamente, ActionListener e ItemListener, que podem ser associados a um JComboBox. Devemos, portanto, criar uma classe que implemente uma dessas interfaces, e instanciar um objeto que será registrado como o handler de evento.

Ambos funcionam, mas é preciso ressaltar a diferença de comportamento entre ambos. Para cada item selecionado, a seleção de outro item é primeiro removida - então ocorrem dois ItemEvents quando um item é selecionado. Ou seja, quando você selecionar um item, este método (itemStateChanged) será disparado duas vezes, ficando propensa a ocorrência de futuros bugs.

Então, optamos por utilizar um action listener. As duas condições dentro do método actionPerformed determinam a origem do evento (se ele é oriundo da primeira ou segunda combo box). 


void addActionListener(ActionListener) : Adiciona um action listener ao combo box. O método actionPerformed do listener é chamado quando o usuário seleciona um item do combo box ou, quando num combo box editável, quando o usuário pressiona Enter.

void addItemListener(ItemListener) : Adiciona um item listener ao combo box. O método itemStateChanged do listener é chamado quando o estado de seleção de qualquer um dos combo box's muda.



import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class TesteEventoJComboBox extends JFrame implements ActionListener {

JComboBox comboBoxTomMenor;
JComboBox comboBoxTomMaior;

public TesteEventoJComboBox(){
super("Teste Evento JComboBox");
Container container = this.getContentPane();
container.setLayout(new FlowLayout());

String[] listaAfinacaoMaior = {"Selecione um tom maior","C", "Db", "D", "Eb", "E", "F", "F#", "G", "Ab", "A", "Bb", "B"};
String[] listaAfinacaoMenor = {"Selecione um tom menor","C", "C#", "D", "Eb", "E", "F", "F#", "G", "G#", "A", "Bb", "B"};

comboBoxTomMaior = new JComboBox(listaAfinacaoMaior);
container.add(comboBoxTomMaior);

comboBoxTomMenor = new JComboBox(listaAfinacaoMenor);
container.add(comboBoxTomMenor);

comboBoxTomMaior.setEditable(false);
comboBoxTomMenor.setEditable(false);

comboBoxTomMaior.addActionListener(this);
comboBoxTomMenor.addActionListener(this);
}


public static void main(String[] args) {
TesteEventoJComboBox t = new TesteEventoJComboBox();
t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
t.setSize(250, 150);
t.setVisible(true);
}


@Override
public void actionPerformed(ActionEvent event) {
if(event.getSource() == comboBoxTomMaior){
JOptionPane.showMessageDialog(null, String.format("Você clicou %s", comboBoxTomMaior.getSelectedItem()));
}

if(event.getSource() == comboBoxTomMenor) {
JOptionPane.showMessageDialog(null, String.format("Você clicou %s", comboBoxTomMenor.getSelectedItem()));
}
}

}








Fontes de Referência

DEITEL, H.M; DEITEL, P.J, Java, Como Programar -8ªed. – São Paulo: Prentice Hall, 2010.
http://geekycoder.wordpress.com/2008/07/28/tipjava-difference-between-actionlistener-and-itemlistener/
http://javafree.uol.com.br/topic-864599-JComboBox-eventos-duplicados.html
http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#listeners

sábado, 29 de dezembro de 2012

Prévia da Interface Gráfica: Stringless Guitar - Parte 2


Um JComboBox, que permite ao usuário escolher dentre vários elementos, pode ter duas formas diferentes. O formato padrão é uma combo box não-editável, que caracteriza um botão e uma lista drop-down de itens. A outra, editável, caracteriza um campo de texto com um pequeno botão ao lado. O usuário pode digitar um valor no campo de texto ou clicar no botão para mostrar a lista de itens. Aqui segue as duas formas de combo boxes, da esquerda para a direita, respectivamente, editável e não-editável em Java:


An uneditable combo box                            An editable combo box
An uneditable combo box                         An editable combo box


Outros componentes que podem mostrar uma de várias possibilidades de escolhas são grupos de radio buttons e lists. Selecionar um botão de opção diferente força a remoção da seleção de todos os outros que estão selecionados. Os botões de opção são utilizados para representar opções mutuamente exclusivas (isto é, não é possível selecionar múltiplas opções no grupo ao mesmo tempo).

A intenção de usar dois combo boxes é de fornecer ao usuário duas listas de tons (maior/menor) contendo cada uma 8 possibilidades de acordes para serem tocados (que vão ser representados pelos botões do último post). Segue o código que implementa essa funcionalidade:


import javax.swing.JComboBox;
import javax.swing.JFrame;
import java.awt.Container;
import java.awt.FlowLayout;


public class JComboBoxTeste extends JFrame {


JComboBox comboBoxTomMenor;
JComboBox comboBoxTomMaior;

public JComboBoxTeste(){
super("Teste");
Container container = this.getContentPane();
container.setLayout(new FlowLayout());
String[] listaAfinacaoMaior = {"Selecione um tom maior","C", "Db", "D", "Eb", "E", "F", "F#", "G", "Ab", "A", "Bb", "B"};
String[] listaAfinacaoMenor = {"Selecione um tom menor","C", "C#", "D", "Eb", "E", "F", "F#", "G", "G#", "A", "Bb", "B"};

comboBoxTomMaior = new JComboBox(listaAfinacaoMaior);
container.add(comboBoxTomMaior);

comboBoxTomMenor = new JComboBox(listaAfinacaoMenor);
container.add(comboBoxTomMenor);


comboBoxTomMaior.setEditable(false);
comboBoxTomMenor.setEditable(false);
}



public static void main(String[] args) {
JComboBoxTeste j = new JComboBoxTeste();
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.setSize(250,150);
j.setVisible(true);
}

}







Fontes de Referência

DEITEL, H.M; DEITEL, P.J, Java, Como Programar -8ªed. – São Paulo: Prentice Hall, 2010.
http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#eg