|
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
/**
* Classe che rappresenta l'interfaccia grafica.
* <br>Implementa ActionListener per gestire gli eventi del click, KeyListener per la tastiera e<br>
* suonare tramite essa le note, e Noteable per permettere l'uso di Tastiera e le altre ciassi.
* @author netarrow
* @version 1.2.04
* @since 1.0.00
* @see Noteable
*/
static {
try {
createDefaultConf(p);
}
try {
p.load(fis);
fis.close();
}
}
private JPanel jContentPane = null;
private JPanel composer = null;
private JPanel optionPane = null;
private JButton aggiungiNota = null;
private JButton suonaSequenza = null;
private String note [] = {"Do", "Do#", "Re", "Re#", "Mi", "Fa", "Fa#", "Sol", "Sol#", "La", "La#", "Si", "Do2", "Do2#", "Re2", "Re2#", "Mi2", "Fa2", "Fa2#", "Sol2", "Sol2#", "La2", "La2#", "Si2"};
private Tastiera t;
private Sequenza seq;
/**
* Questo metodo crea la configurazione standard in key.conf
* @param p Properties usata per salvare la configurazione
*/
private static void createDefaultConf (Properties p ) {
p.put("q", "DO");
p.put("w", "DOd");
p.put("e", "RE");
p.put("r", "REd");
p.put("t", "MI");
p.put("y", "FA");
p.put("u", "FAd");
p.put("i", "SOL");
p.put("o", "SOLd");
p.put("p", "LA");
p.put("è", "LAd");
p.put("+", "SI");
p.put("a", "DO2");
p.put("s", "DO2d");
p.put("d", "RE2");
p.put("f", "RE2d");
p.put("g", "MI2");
p.put("h", "FA2");
p.put("j", "FA2d");
p.put("k", "SOL2");
p.put("l", "SOL2d");
p.put("ò", "LA2");
p.put("à", "LA2d");
p.put("ù", "SI2");
try {
p.store(fos, "Configurazione tastiera");
fos.close();
//
}
}
/**
* ritorna un pannello che rappresenta la GUI della tastiera
* @return JPanel
*/
if (jPanel == null) {
for(int i = 0; i < noteButton.length; i++) {
jPanel.add(noteButton[i]);
}
}
return jPanel;
}
/**
* Questo metodo inizializza i 24 bottoni
* Prima di questo metodo c'era un metodo per ogni bottone(24).<br>
* Decisamente scomodo prima.
* @since 1.2.03
*/
private void initNoteButton() {
for(int i = 0; i < noteButton.length; i++) {
noteButton[i].setText(note[i]);
noteButton[i].addActionListener(this);
noteButton[i].addKeyListener(this);
}
}
/**
* Naturalmente il metodo main per far partire l'applicazione
* @param args Non utilizzato, al momento il programma non prende argomenti da riga di comando
*/
public static void main (String[] args ) {
new MidiSounderGUI();
}
/**
* Costruttore per creare la finestra, inizializza la Testiara e la Sequenza
* @see Tastiera
* @see Sequenza
*/
public MidiSounderGUI() {
super();
t = new Tastiera(this);
try {
seq = new Sequenza(t);
}
initialize();//inizializza la GUI
}
/**
* Metodo di inizializzazione, setta il titolo, mette i pannelli, crea i bottoni ecc...
*
*/
private void initialize() {
this.setTitle("MidiSounder - (C) Netarrow");
initNoteButton();
this.setContentPane(getJContentPane());
addComposer();
this. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE);
pack();
this.center();
this.setResizable(false);
this.setVisible(true);
}
/**
* Crea e restituisce il pannello principale
* @return JPanel
*/
private JPanel getJContentPane () {
if(jContentPane == null) {
}
return jContentPane;
}
private JPanel getOptionPane () {
if(optionPane == null) {
}
return optionPane;
}
/**
* Serve per mettere al centro la finestra
*
*/
private void center() {
setLocation(d.width/2-(win.width/2)-1,d.height/2-(win.height/2)-1);
}
/**
* Questo pannello crea il pannello e i suoi componenti per poter utilizzare le sequenze
* @since 1.2.03
* @return JPanel
* @see Sequenza
*/
private JPanel getComposer () {
if(composer == null) {
list.setEditable(false);
aggiungiNota = new JButton("Aggiungi Nota");
suonaSequenza = new JButton("Play");
aggiungiNota.addActionListener(this);
suonaSequenza.addActionListener(this);
}
return composer;
}
/**
* Aggiunge il pannello composer per le sequenze
* @see Sequenze
*/
private void addComposer() {
clear.addActionListener(this);
center();
}
/**
* Gestisce gli eventi<br>
* Controlla se è stato premuto aggiungiNota, se si aggiunge la nota alla sequenza
* <bt> Se viene premuto suonaSequenze viene riprodotta
* <br> sennò è stato premuto un tasto-nota, viene convertito da formato nota standard(Do, Do#, Mi2, La2#) in <br>
* formato nota-variabile(DO, DOd, MI2, LA2d)<br>
* @param e l'ActionEvent per gestire l'oggetto sorgente che ha scatenato l'evento
*/
if(e.getSource().equals(clear)) {
seq.clear();
list.setText("");
} else
if(e.getSource().equals(aggiungiNota)) {
String nota = addingList. getSelectedItem(). toString();
int idurata = 500;
try {
idurata = Integer. parseInt(during. getText());
}
seq.addNota(new Nota(nota, idurata));
list.append(nota + " - " + idurata + "\n");
} else if(e.getSource().equals(suonaSequenza)) {
try {
seq.suonaSeq(canonic.isSelected());
}
}else {
t.suonaNota(e.getActionCommand().toUpperCase().replace('#', 'd'), false);
}
}
/**
* Not used
*/
//NON FA NIENTE
}
/**
* Metodo per intercettare i tasti premuti e suonare i midi da testiera, viene chiamato getName<br>
* e se il ritorno non è null è stata trovata una nota associata a quel tasto
*
*/
if(getName(e.getKeyChar()) == null) {
e.consume();
}
else {
t.suonaNota(getName(e.getKeyChar()), false);
}
}
/**
* Not used
*/
//NON FA NIENTE
}
/**
* Cerca nel file key.conf una nota associata a quel tasto, se viene trovata ritorna la nota, sennà null
* @param code Codice del tasto premuto
* @return String il nome della nota in stringa, Null se non si trova un'associazione
*/
private String getName (char code ) {
tmp.toLowerCase();
return p.getProperty(tmp);
}
}
|
|