From 0851398da4f7efa7ca88aa9e92f92c7e4cc7039f Mon Sep 17 00:00:00 2001 From: bethrobson Date: Wed, 16 Sep 2020 17:23:50 -0700 Subject: [PATCH] Updating code to use an audio clip instead of midi for the DJ beat --- clap.wav | Bin 0 -> 37462 bytes .../combined/djview/BeatModel.java | 92 ++++++++---------- test.mid | Bin 9356 -> 0 bytes 3 files changed, 42 insertions(+), 50 deletions(-) create mode 100644 clap.wav delete mode 100644 test.mid diff --git a/clap.wav b/clap.wav new file mode 100644 index 0000000000000000000000000000000000000000..7789be5005fd4eac11c7a7985288320c18334c93 GIT binary patch literal 37462 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

_pEH&^pMxorq%<=?Pt1ce8zNF z0KfVLNbb^LSuG&BP3WzKgX9hY;~EH(oBPOhtG$vxxo$bQZql0zW;Wa70YzJgK3_ii zrMV!vv(O7n2g#lKA8fY+B)1hLw*Vsdo#&zF4SJ6+(SLl7eqvmCwI zrJ#ZRocF@N;k>6~uc_E;GWME?{_=S2ITn59X!Mc)n)ROck@cQj!g}`y9sV8Y@IHU? z-lPA5_a0Hgdw2Sb_x>73`4{s&@Nb##W*?dFruc+U+_#_kZUln*Ke_LQpK;%Q2K>M0 zzWogN-?87H_-{Y^{fYnfv)_Nke-8tn?q|S9f&m}pX#;Be0|P$B^EK+l&wzLQi~;`^ z40u;?^W8yl_XKg@8}-~5_1zD3Kj0$=J{aQ>L;r#UABW#_B7WN`_>HII_nwKfVh%

)oVQ-oDnMdJ$g^`!{&4hiEAUuIa zA$n*6o?x>OeY6lG2P+ZLv;j}top@p&E@8wA@jR3f_kB9zg)fW{ePsx@uNsl-t4~OX z7ErJ505y)D(6Sx`P3tHqc1(fB^*o||2`3&)d{68oek6`!?Rl)dNvt5Af*y|tJ)T4y z$EeyL1Sz>gXrWOQj!6D;&?)k>;_$J73=aSqZjlU2(mT^ z@n%pk>O`(4zazJiBgrGsZ}&6f_b?v#n%qIU$YW$4d6|?$*Cjw~&8L*J-~Y$8=k zJ3_goFESR4l-9$DVk@Y;bS>e=cSG^zq;w8Q@fFfI=@zLC8s(YLg&}1RpdRy1%F9xu zH83*SM5dN?f~HJAD9uF4B1+itrBI^TC>sgQnyJvQSqwd+4Nywo4=tl}vSKL0tL1NG zM!8#773w#QM^CF zt(1|@rmE61x-lI@ccRPF1L*p6G#v?!yf^6ak@R+YI{iDnjJ{59p`X)7X(xS!&Zpx* z3EJs!CYP?vFiZp!%5-2VG5wjZn9)po<{fjUge6}Io_ro_=4WOEvxFJWEG{X-m_^J`W+5|#`H30K%x8XJ<}u%cP#?(5Wd<;_@rizJeFiA@ z=}d2CD$|RZ!t`J!G2NI6Ojl+c^DQ%$`3B#jBR;J?KBXOw-j*50w8qg|GJ}}rI8sv_ zr4f!0fg?1)yX)cIb@0xbcxQF|Usdp~icA}(JkyFPi+7Y_nlNVkrv~gDioJuFT8tih z>aeF8dos)yjGQUWkc@@#(gvo84q@`>Kqi}JnRHsiq|gc`k(M(KTEd95hkj2N(68wn z)NTg-gifI!(1~F69rO)aq%VWrzd*mF&!EOn&=2V&^j-P@w(P;LupL`AV@oW4pEdMh zdL_M|{u$i=0(vVQL;pt4q}S0?@EeZDX!~e-Aw2?X2V?C3tnEXOqr1~lbZ2@v{WU#^ zZjJbXW^^w)g6@Jif{t`eL=se{o73g!Ml?@+0_l88OJ{-x zO`%BINflEfl}o*$(y3=S#~xC4>NfSBxI!$fFsQ)@@ zKeYmp4U2JR&cmx2)Jkd+UPV(e)Cjy9L`|gnQlqKv)Nra3^*!Pu`cTbrjz=IjNgb*+ zRSj_y<*5b~Pt~HrsLGU{Dod%5vqVM(Qy#gN%9YcIuOKKFG_*wMWxYlQlc&(dx>usv z^$b_k1NkXvU>%13)gGu`ZH3}hEOf6{L+xq_mgZq;29_pZDGCZ#L$TB!*Je*Bhkb)9 zGZH#i%@O6%P~KKvTiz6LAN8SURa0(+##InBt~7`Sq2zjKlc^9NB9*7filAqe4LvJ2 z^sMagX}p!)hQ`$u+!xLwi^?(FBlgQqLfz^R?i0J9X|)N;XzOJ25Op#`wg9?lvk-?e zSvEu#jl0Y+S$Ek0+;Mu!+CV+6i7XOXSenUd$QsBh$ZA6AsuGm0N<(WcT&9%iWhADB z&}7S!7De~Y86zMGK7{t|#kVZodZkV)>bRgnudP&_vVjt8gF2T-7&Pt9WQ_VriA<1soR@esE8rX8!B3KM;25b^+ zER^_0!G^#F!1_RWs~fBntR1W+tcj#CG`Jc-jjImgr>a4btD>YV%px&Ek1GtyT!GN! z(n*vsIgCID2}$ONJUnMJ5to%hxS`SI1kY^66Zkz8yIw)7D-Nn%j}XCi7s_2XiEG3a z;v$~P=ZG`JDdGfi4A1UEi0ax01+QJi4rJNc0=2>4kYi^(u@+HZtMEi$Ml2;36N`ui z#C$}E%^_w%*=ss6m6!~5uL;CBVhjuSrt|Zz=cIg_9mysP?cZ%%N Xx~m4ut=scm#!vWR_-MXnErR$zF<~bT literal 0 HcmV?d00001 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 ebee53e63699208f66b9492d6ed8f587866d8c97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9356 zcmeHK&2tpT6@P#PDjQ;Ogjqm{MJ*c9t3|tN0b0C5@=6=YXkes8o{(h1E{hnXFffE6 zV@Tw0frFt^? z7)qCu@e3$fW~`hqA;d$>)rXi?@P2k7xE_C;UCq^pa7@a*zpVqoi^6RUZrl!qgEcO(xjD}S*!5Akm*`6iBid2fF{?cj&)^IbE`SC`1c zUo=(=_5B5?7Q$iy{t=`We@-uc`$oaZ6d+S@dI~UAxV*Ojzd!lkgg>zh?qC5vy`2(x zQ7_RZj-b)Or?fXxFs+P+8SOGYQ<7w>*e{#U617PqBQUM8JmO^ZEZNVx zNv~hjFr;m=#3#%t!Vf6~#u?hRIOxRZ+GlIi+FcF}A(%Ox<(ti^<+C-?#dMl5=jg0^ zOvA7)lWpuvllbGrVZS(f7V(`HD#M@KpbkQm{d37P*5W2fYY?fMPirAL-aS-PX~0{>G(SSAI3IDp#@+CS=qtp-0Z{ln^(h z9fO1x$ofqjc1m{vhe7Ery;`aTZb(&bhC`?z{TdhzQB@B1zpj8D%77WYmj?YcB@GH!egWs@c&tA!4ILHpst>dk3V? zwuhH+bx;OIg!e)oA{Y1iWyleTF5;?BM(Dv$(1Vw+Dg3d7ii}1i49ZAKI3-v1OV~}c zb$mT6FuuN!{H{a5)+seV>s!azf5oubkJU?=!aXClAX|U>EtWj1Eb-cW~q82fO80?l}MBKG2k5yi2B@ zldiwFpOcQ+<;&MTf>q(g?+S=dim+EeMJy+)Z;F*xRzO39Lco}~8kYquim=roU_}H+ z1)LN?+=Hh&L=<1cakq%(1nd-xdj-BCq8Xn?W<~fX1SsKr2NzZ0-NC&s;g2BO3eStD5VtIrj|mtS_61zb2!9b3_XvMPz@X@x zN1lygLy5R1eD)aQ8e?GNT{s3}8J+DDa~!T9-ipj0iW_viI*W_=XgnZJk3N zLd9J;-Z79a>j`5(Nf16lwknw84Q3yv#BMv zdv@BqCwew@M3=4mvY!2X4Ur1y{-7AfhhmTLGT0WEHg3D#VCFs9tv8%`*c=}HW!|y9 z{f)DI(htHbi`kjwnM=1}RrQAo&Z?nE!5KBaqF_pm-&FX2S%o`sxT(TjI0Pzq3y1Hi z=<7IKS5XFsB^B{rv|qvf!^#;|FrX@v3Jxfzte{_6Cln~b>cWV1;;|Wa=M>#KN1ZtCQ*%DW8C#^-lqud3$@_a1OsjySPOt#+zXW18%s+2s(C*(M!V#Rvd zPTu80Y*O-kN>7s1`}@?ZieATx2IbEv$h_)+W9n50f z@