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