package com.ociweb.midp2;
import java.io.IOException;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;
import javax.microedition.media.control.ToneControl;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class PlayToneSequenceMIDlet extends MIDlet implements PlayerListener {
private byte TEMPO = 30;
private byte volume = 100;
private byte d = 8; // eighth note
private byte C = ToneControl.C4;
private byte D = (byte) (C + 2); // a whole step
private byte E = (byte) (C + 4); // a major third
private Player p;
private ToneControl c;
private Form form = new Form("Now Playing");
protected void startApp() throws MIDletStateChangeException {
Display.getDisplay(this).setCurrent(form);
try {
play();
} catch (IOException e) {
e.printStackTrace();
} catch (MediaException e) {
e.printStackTrace();
}
}
private void play() throws IOException, MediaException {
form.append("Quiet!");
p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
p.addPlayerListener(this);
p.realize();
c = (ToneControl) p.getControl("ToneControl");
c.setSequence(createSequence());
p.start();
}
private byte[] createSequence() {
byte[] sequence = {
ToneControl.VERSION, 1, // version 1
ToneControl.TEMPO, TEMPO, // set tempo
ToneControl.SET_VOLUME, volume,
ToneControl.BLOCK_START, 0, // Define block 0
C, d, D, d, E, d, // Define repeatable block of 3 eighth notes
ToneControl.BLOCK_END, 0, // End block 0
ToneControl.PLAY_BLOCK, 0, // play block 0
ToneControl.SILENCE, d, E, d, D, d, C, d, // play some other notes
ToneControl.PLAY_BLOCK, 0, // play block 0 again
};
return sequence;
}
public void playerUpdate(Player player, String event, Object eventData) {
p.close(); // release the resources
if (event == PlayerListener.END_OF_MEDIA && volume > 10) {
try {
volume /= 2;
play();
} catch (IOException e1) {
e1.printStackTrace();
} catch (MediaException e) {
e.printStackTrace();
}
} else if (volume < 10) {
notifyDestroyed();
}
}
protected void pauseApp() {}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException {}
}