diff --git a/clap.wav b/clap.wav new file mode 100644 index 00000000..7789be50 Binary files /dev/null and b/clap.wav differ diff --git a/src/headfirst/designpatterns/combined/djview/BeatModel.java b/src/headfirst/designpatterns/combined/djview/BeatModel.java index a1e7b8ce..f2032d6e 100755 --- a/src/headfirst/designpatterns/combined/djview/BeatModel.java +++ b/src/headfirst/designpatterns/combined/djview/BeatModel.java @@ -1,35 +1,56 @@ package headfirst.designpatterns.combined.djview; -import javax.sound.midi.*; -import java.io.File; import java.util.*; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import java.io.*; +import javax.sound.sampled.Line; -public class BeatModel implements BeatModelInterface, MetaEventListener { - Sequencer sequencer; +public class BeatModel implements BeatModelInterface, Runnable { List beatObservers = new ArrayList(); List bpmObservers = new ArrayList(); int bpm = 90; - Sequence sequence; - Track track; + Thread thread; + boolean stop = false; + Clip clip; public void initialize() { - setUpMidi(); + try { + File resource = new File("clap.wav"); + clip = (Clip) AudioSystem.getLine(new Line.Info(Clip.class)); + clip.open(AudioSystem.getAudioInputStream(resource)); + } + catch(Exception ex) { + System.out.println("Error: Can't load clip"); + System.out.println(ex); + } } public void on() { - System.out.println("Starting the sequencer"); - setBPM(90); - sequencer.start(); + bpm = 90; + //notifyBPMObservers(); + thread = new Thread(this); + stop = false; + thread.start(); } public void off() { - sequencer.stop(); - setBPM(0); + stopBeat(); + stop = true; + } + + public void run() { + while (!stop) { + playBeat(); + notifyBeatObservers(); + try { + Thread.sleep(60000/getBPM()); + } catch (Exception e) {} + } } public void setBPM(int bpm) { this.bpm = bpm; - sequencer.setTempoInBPM(bpm); notifyBPMObservers(); } @@ -37,11 +58,6 @@ public int getBPM() { return bpm; } - void beatEvent() { - notifyBeatObservers(); - } - - public void registerObserver(BeatObserver o) { beatObservers.add(o); } @@ -64,7 +80,6 @@ public void notifyBPMObservers() { } } - public void removeObserver(BeatObserver o) { int i = beatObservers.indexOf(o); if (i >= 0) { @@ -72,8 +87,6 @@ public void removeObserver(BeatObserver o) { } } - - public void removeObserver(BPMObserver o) { int i = bpmObservers.indexOf(o); if (i >= 0) { @@ -81,35 +94,14 @@ public void removeObserver(BPMObserver o) { } } - - public void meta(MetaMessage message) { - System.out.println(message.getType()); - if (message.getType() == 47) { - beatEvent(); - sequencer.start(); - setBPM(getBPM()); - } + public void playBeat() { + clip.setFramePosition(0); + clip.start(); + } + public void stopBeat() { + clip.setFramePosition(0); + clip.stop(); } - public void setUpMidi() { - try { - Synthesizer synth = MidiSystem.getSynthesizer(); - synth.loadAllInstruments(synth.getDefaultSoundbank()); - - sequencer = MidiSystem.getSequencer(); - this.sequence = MidiSystem.getSequence(new File("test.mid")); - sequencer.open(); - sequencer.setSequence(sequence); - sequencer.setTempoFactor(1f); - sequencer.addMetaEventListener(meta -> { - if (meta.getType() == 47) { - sequencer.setTickPosition(0); - sequencer.start(); - } - }); - sequencer.setTempoInBPM(getBPM()); - } catch(Exception e) { - e.printStackTrace(); - } - } } + diff --git a/test.mid b/test.mid deleted file mode 100644 index ebee53e6..00000000 Binary files a/test.mid and /dev/null differ