// Ce code est une implémentation partielle d'un petit "piano à une touche" proposée par
// Frederic.Ferre@ac-rennes.fr Professeur de Mathématiques au lycée Jean Macé, Académie de Rennes. http://www.infx.info propose ce code.
// A charge aux élèves:
// - corriger la position de l'affichage desnote spour qu'elles s'affichent en bas de stouches
// - définir les bonnes fréquences des notes
// - puis proposer toute sorte d'amélioration
// ../..

// Pour l'utiliser: choisir l'activité "Programmer directement en Java"
// Charger le code et le modifier à loisir.

import javax.swing.JLayeredPane;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import org.javascool.tools.sound.SoundBit;

// Nombre de notes, nom desnotyyes et fréquences des notes

String notes[] "do""ré""mi""fa""sol""la""si""do2""do#""ré#""_""fa#""sol#""la#" };
double frequences[] 440440440440440440440440440440440440440440440440440440440440 };

// Création des touches de piano
void drawFingerBoard() {
  JLayeredPane pane = getPane();
  pane.removeAll();
  int pospiano = 20;
  // création des bécares
  for(int i = 0; i < 8; i++) {
	JButton touchepiano = new JButton(notes[i]);
	touchepiano.setVerticalTextPosition(SwingConstants.BOTTOM);
	touchepiano.setToolTipText(notes[i]);
	pospiano = 20 + i * 50;
	touchepiano.setBounds(pospiano, 2050150);
	pane.add(touchepiano, new Integer(i));
	touchepiano.addActionListener(player);
  }
  // création des dièses
  for(int j = 0; j < 7; j++)
	if(j != 2) {
	  JButton touchepiano = new JButton(notes[j + 8]);
	  pospiano = 45 + j * 50;
	  touchepiano.setVerticalTextPosition(SwingConstants.BOTTOM);
	  touchepiano.setToolTipText(notes[j + 8]);
	  touchepiano.setBounds(pospiano, 2050100);
	  int k = + j;
	  pane.add(touchepiano, new Integer(k));
	  touchepiano.addActionListener(player);
	}
}
// Définition du gestionnaire d'évènement
ActionListener player = new ActionListener() {
  public void actionPerformed(ActionEvent e) {
	for(int i = 0; i < notes.length; i++)
	  if(notes[i].equals(e.getActionCommand())) {
		System.out.println("Oh oh vous jouez un «" + notes[i"» à la fréquence de " + frequences[i"Hz !");
		sound.play(frequences[i]);
	  }
  }
};

// Définition de la note à jouer
public SoundBit sound = new SoundBit() {
  // Joue une note à une fréquence donnée
  public void play(double frequence) {
	freq = frequence;
	super.play(0);
  }
  // Une note dure une seconde
  public double getLength() {
	return 1;
  }
  // Une note est une sinusoide (un "piccolo") à la frequence choisie
  public double get(char channel, double time) {
	return Math.sin(* Math.PI * time / freq);
  }
  private double freq;
};

// Mise en place du clavier
void main() {
  drawFingerBoard();
}