Skip to content

Commit

Permalink
Updating code to use an audio clip instead of midi for the DJ beat
Browse files Browse the repository at this point in the history
  • Loading branch information
bethrobson committed Sep 17, 2020
1 parent 174f228 commit 0851398
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 50 deletions.
Binary file added clap.wav
Binary file not shown.
92 changes: 42 additions & 50 deletions src/headfirst/designpatterns/combined/djview/BeatModel.java
Original file line number Diff line number Diff line change
@@ -1,47 +1,63 @@
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<BeatObserver> beatObservers = new ArrayList<BeatObserver>();
List<BPMObserver> bpmObservers = new ArrayList<BPMObserver>();
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();
}

public int getBPM() {
return bpm;
}

void beatEvent() {
notifyBeatObservers();
}


public void registerObserver(BeatObserver o) {
beatObservers.add(o);
}
Expand All @@ -64,52 +80,28 @@ public void notifyBPMObservers() {
}
}


public void removeObserver(BeatObserver o) {
int i = beatObservers.indexOf(o);
if (i >= 0) {
beatObservers.remove(i);
}
}



public void removeObserver(BPMObserver o) {
int i = bpmObservers.indexOf(o);
if (i >= 0) {
bpmObservers.remove(i);
}
}


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();
}
}
}

Binary file removed test.mid
Binary file not shown.

0 comments on commit 0851398

Please sign in to comment.