From 4e8ded22bb3f37510a52e96d0a2bad5238a5c8e6 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 8 Oct 2011 11:42:54 -0700 Subject: [PATCH] initial commit --- Arduino/Moppy.pde | 114 +++++++++++++++++++++++++++ Java/lib/RXTXcomm.jar | Bin 0 -> 60866 bytes Java/lib/themidibus.jar | Bin 0 -> 10034 bytes Java/src/moppydesk/MIDINotes.java | 26 ++++++ Java/src/moppydesk/Main.java | 105 ++++++++++++++++++++++++ Java/src/moppydesk/MoppyBridge.java | 85 ++++++++++++++++++++ Java/src/moppydesk/MoppyPlayer.java | 52 ++++++++++++ Java/src/moppydesk/MoppyPlayer1.java | 67 ++++++++++++++++ 8 files changed, 449 insertions(+) create mode 100644 Arduino/Moppy.pde create mode 100644 Java/lib/RXTXcomm.jar create mode 100644 Java/lib/themidibus.jar create mode 100644 Java/src/moppydesk/MIDINotes.java create mode 100644 Java/src/moppydesk/Main.java create mode 100644 Java/src/moppydesk/MoppyBridge.java create mode 100644 Java/src/moppydesk/MoppyPlayer.java create mode 100644 Java/src/moppydesk/MoppyPlayer1.java diff --git a/Arduino/Moppy.pde b/Arduino/Moppy.pde new file mode 100644 index 0000000..d7661aa --- /dev/null +++ b/Arduino/Moppy.pde @@ -0,0 +1,114 @@ +boolean firstRun = true; // Used for one-run-only stuffs; + +const byte FIRST_PIN = 2; +const byte PIN_MAX = 9; + +byte MAX_POSITION[] = { + 0,0,79,0,79,0,79,0,49,0}; +byte currentPosition[] = { + 0,0,0,0,0,0,0,0,0,0}; +boolean stepDirection[] = { + false,false,false,false,false,false,false,false,false,false}; // false = forward, true=reverse (i.e. true=HIGH) +unsigned int currentPeriod[] = { + 0,0,0,0,0,0,0,0,0,0 +}; + +void setup(){ + pinMode(13, OUTPUT);// Pin 13 has an LED connected on most Arduino boards + pinMode(2, OUTPUT); // Step control 1 + pinMode(3, OUTPUT); // Direction 1 + pinMode(4, OUTPUT); // Step control 2 + pinMode(5, OUTPUT); // Direction 2 + pinMode(6, OUTPUT); // Step control 3 + pinMode(7, OUTPUT); // Direction 3 + pinMode(8, OUTPUT); // Step control 4 + pinMode(9, OUTPUT); // Direction 5 + + Serial.begin(9600); +} + + +void loop(){ + if (firstRun) + { + firstRun = false; + resetAll(); + delay(2000); + //runOnce(); + } + + if (Serial.available() > 2){ + if (Serial.peek() == 100) { + resetAll(); + Serial.flush(); + } + else{ + currentPeriod[Serial.read()] = (Serial.read() << 8) | Serial.read(); + } + } + + voice(); +} + +void voice() +{ + if (currentPeriod[2] > 0 && micros()%currentPeriod[2] < 100){ + stepPin(2,3,4); + } + if (currentPeriod[4] > 0 && micros()%currentPeriod[4] < 100){ + stepPin(4,5,4); + } + if (currentPeriod[6] > 0 && micros()%currentPeriod[6] < 100){ + stepPin(6,7,4); + } + if (currentPeriod[8] > 0 && micros()%currentPeriod[8] < 100){ + stepPin(8,9,4); + } +} + +void stepPin(byte pin, byte control_pin, byte wait) { + if (currentPosition[pin] >= MAX_POSITION[pin]) { + stepDirection[pin] = true; + } + if (currentPosition[pin] <= 0) { + stepDirection[pin] = false; + } + if (stepDirection[pin]){ + digitalWrite(control_pin,HIGH); + currentPosition[pin]--; + } + else { + digitalWrite(control_pin,LOW); + currentPosition[pin]++; + } + digitalWrite(pin,HIGH); + delayMicroseconds(wait); + digitalWrite(pin,LOW); +} + +void blinkLED(){ + digitalWrite(13, HIGH); // set the LED on + delay(250); // wait for a second + digitalWrite(13, LOW); +} + +void reset(byte pin) +{ + digitalWrite(pin+1,HIGH); // Go in reverse + for (byte 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 literal 0 HcmV?d00001 diff --git a/Java/lib/themidibus.jar b/Java/lib/themidibus.jar new file mode 100644 index 0000000000000000000000000000000000000000..d68ec0c45ed5d3854642f005011fcde4070fee00 GIT binary patch literal 10034 zcmaiaWmH|e+BFn+C~Vx_p}13^xci3UzHyi0?(S0Di@OysP~2ULLveTbIM>c??>X<6 zJ(9J4Br`L~98dOG&s30xfP@G8qgch>^8MrGUkw}>B$%wIiV%aOoEX#dAQ+g!zq-PL zS-y5nQG*Ise(kFJS}|Vhf4a&F$w`WdDyuNcie1PK56MU~Fis#zGtiC>kJTzMPqY5m zwjUOGYez33Gb*7976wi+a)s#DoDr^sF0G{O_?cGdr|cEtMx=}*k}N%d4IcsCUJ1Z= z5qHJr*6iB+9}-~yAn`A%|9Bw0wvJ}TRv;sgfs+H%uWad2(63%o0lD9}~z4J;25{leJwL;LOt z|I%8!_dTK>)=e0-UVQ+mby9WE$4?8)6ZAO|YH$bh<2{9N!Ck25SJMH~wS*(sWtj+iBc1#Cc4!8v8!@5Rt_Fi>!2cW9Wr9^l%s z&jqkpBg@AOZ&<0ov8E+HloLR^%SSd{6ZR_FKj(2xKEnvZU&XAqI}rXL-6y!AC|LfC z%oVt9v!N&ReKsRtBN~GHGK&EJy!~fWrNk+9h!_pWNfST9P!+@Uk5sdd^WEAA6k06R zBURj${-ur>UoPj5RZ8DWd~WevZGa-;rF3S{>TyEgR4^@mEDy~&tCW@uPzt(2@IjOo z$%K>OX6S#)I;a@k9ne!ME9wf!UDQZWId=fSb00p&inRnoe;p$I3iRihL21zzqo`I_ zfT9IxgEY5G=4=6obZi#H$%peg4;aG_J{gTyXl_Bu*e7o}rnZO1mjXs(tr|LVZ6ju` zu`pJ9xO)7O(^ymbsj;c<;v=M0$C~Jja2C#)_BQ0l-$ts!mwBf^J$Ks0Eq3SoCpPeOjY`_TAj!LE8bmkPVO(I#81hdlf-BvIR+DKew{H@wmA7oQ!x zp6{;-I{7#@usc;DBxP_@y4fiz4yq7)ZAC&s6xKgeLN_t3Z#JXA@jwtbMu|;dHZ!BR z2`&&lYj#3Yxr1VJ%g#h9H;&i?m2;iSY0iywuRY`|n6;{3wqsU}$7lWFO+yk7e6#E4 zqTY8s!S~c@^Vvo(8;V29c5D=%QaAJl+J51CA^mD$0NX<;##~|8)k~Trv)m66R8lc; zq=`BxR~#BVcoF+HI@SdWZGCX0;()2Y*zEd3^2PgJ$?rrPe}tOe&Ke@9xa z6a$Ide2ptMbdD-0C_vMT_^!}q!C@Ay62@4*VKNC(ZvDyg3;wM*ABN&R0A2n}roS|l zT_y$C57}eHsmNNO-Zso1W*DM7KH_(BVf*zMz6(m^{E>*`2H91ECBFs86`lD=)aa;? zIApaySQt{Oq{j?M)y<)`KbrLgVT*>*^?D&tSV;A%`>6ro5S)-wY=|8> zc*fctaEb+ejyWW6H=Yy)h-3*v`6DLh6EfTL5)^Xe?j4$oUgT6&eY}Ls# z2Qk*`n+W(Dmvg)|9o$AA6o}ABJ9Kr-%wv=|02}#9|H%vD*D$A!6z2-_s@ug^-BSOx zZsl!_?e!f&)~3pC4vxlF|B7%*CpMD`82r(gn%Q^}XNJRf7A!C_#>$N;3G_0;q;Pnl zpOrVTc-5+<_YoPSA1m>tGbYTg7X$}g*Yb!`7-Q$QGBd81-H$!Lc6fO|!0ADJR2%?? zt_!FEwg3qR61l@YX<^OSo*tb56jdWG0j1b&pknN1Q-z+t(Beu7EBPW(x$pjx_1Nv! zom!TVMN0*HF>m3n2BApKws+P2b*v}XC2ecKSg_7|CHd#luhz$k%NFhWu#GpmY&tB| zf&QOozXWwvojbSC#wt(Y*w4)vfCe#|z3h!*lLst2OkLG13DS#9zP($~`F09JJ}a%f zsBSfP-H1~&H*J=LjGY^_;vnnIMJ!!1uvR=%fo^0aOU}Nm-@y}k&`_c8`_kJM)bE=6 zgQn;F<$`Uww=ig_2|a*2pWVoH;5e{){(gK=dMJ4?N*~aT1EuRM=KMBq?Wu@S9z| z%QU#)!y1W;QkWz76~3a7K@G8;P+b)HldB)c^yurIsqiW$#=jAhljGlCnzHgs?@>L|QDou@ zWJRbMaww1(>j}b2razVv!X``9Nr-NAj*v^&P+OW=ia*gk!Z0SntGd6pJ&G0{USxa= z37*8qy6SfEXySacw!Ov*MpTt1g6ZJ4r9h)cSb4c?0Wre|U%XuntDN2lorKMzbcBT1 zmRBr_24O=(5j4`i`_OG#Y<1{Pb`pGmB0OV< zihvTcg2QR~&Wtq)?ji3O6E2}0QgT^1<>q|&k-o$9QnxmR~_dXkWZAAV^#y&G**I|uj6G{gdi8bgNi#59uC{w*4-KSHg zmvA(ntCx(@s<@d-xU+8@)Gi#cPVwjnBI!GOi}L`Gxg`#ego43ni=a^sOzA`9^cPqT zTY|5KXryZr=^DB_gSTEK+jRFF59M{UrO4CSCY!!__wr!;=;NneyM;n~OL8nYtf@0t zH%EPo232`AaqG$VTssN;@Uxv&AJu5*Afh%N&fXe$ZEw87mPNME(mxN0AKNs zD!*Wi#|pn-K$~(`D+V9w<_&Oh#Zo6O>v(-f=la_7@mPRRr@Q*v)2k&b9nIRSa|EI- zLr~>Z2#QGQR2*KQ><1bAGq5Y`^im#Y-SqL2TKIck*KntviGKt8Y(cp^CCda*Sem3* z7VhUw}#6jD?GM~q`1Sq8|){uEiB(L(A<^`zJ{8aFpE-u z=|`RBG`+8T2D(Iin5k1(<4V!l%eP*^?M_RZJ{pnKahTo6#dN-DW zt6oV3*>E|LY00s%6%8mM4>TzYk~W@?}DAf~VeZjg7gCGiDWL3nYaY&&Eu4*?rc$vWC35H{y&P z!^U-2b@-9i}#-_*ayKNE=c#yw} zDI#Yu(ousMCHm3Nsg^6UfNMv|s?w?bJz5sH$UI-_A+g$XYfj{d!VmIskk~7v=r-=M zJlrXJ73+Ex-_e+iSh|_Udd7m4b60|hg^@W_KSwL1Oy0+TWIwAR-_zT@qxZJom)WK8 z5MlE~LNsy!&I9IhX{LlKh+E}n)->7`F7-wD1-cbd@!cS@DwtnN&?(akp)9`%xnyWke1%3w-pIm1_|l!GOL8u&VfQr2eR#vq|pM(fmDh!%x|vmOp1$ zE=kO1#+p*QXp3UVTOHV<4&-_0QuE)D+8)((nelxVZ?zkuxD=h3xfq|MfVIH4pBb!Kpp+bs)5-wo6|~oQpHcoj~B)Rw+?`;PAcQaz%coB zCRGpIEJZu`dsLI%N~29Z`qdG$Fktuy?K8Z0dAI**OvG5}E&j9Ex7{-+&8>iWSW#|N z{>u2XM%wlerjlFU$FJ~$e!;SdPPjulnk@mZp@mM{M??Ux;S=L~%f>y8fa!(e zZuwhneQ)craqAQ_>5@}r0{%5MfEP5%ms4uaXuAt8PQl$B>!yCAs%h0(N0)jX9Ox@c;5 z99JN4Awsk0!na0lRzAAUR}&SIke4#tdRyhby?QU03v5V!}*_mf?jEbqe4- z{$>W@vj74a3t#Lr@_I)DNy==iB2TK#HPuI$Qv70X#j`A6{)WXZ6OOKWb$|ixOQg-f zEs^kWxrhiYU}Yja7iN~RePZqW$Gs+q>Y2KP|{#8cT~ z0g-r#R)T0rR{MsZUg+D)Mmh_jDn*P!B6(R1MKWzOMKmqo2jU=m)R<|2t}1tXvcbNO zA|7O1=q<8poJR4RttFOVsCsxJ9ysz!+Pi#VRiy$NzKl{S(ZeX({#zbSm&538~=kn7OJ8gNBf>mqz%|SE_lL8B*Sm$4y`lE?QJ^g$-&V`;_%=1$ZIfKb0hCYmtNzlfcluTNJ zqTnmLIx>=~XsQ$2ZSK{*MA*>l8P>VzNVA=SV?|ie>|>EhIKX|!v8*ESOS9{bk~C{6 z1T8Lg#RuDsXyfw&IGfx)f4?evDW23yP)Sf!EKn+mXs6sXB3IE^G#Pz|?BJl3IJiKv z%@NiBe0lGoa-6$SLXI(KHw9}$tTO+db>f2y+YEo&I^ygR4JeadwOHwWT6ERaLNuNM z2;N&qf72f`f`SE{kqlik!!r#Iv6n^Lvu{(4A@eZI*jYtm0!Mb7vW2agL8w0)$ig4R z>Ph1zSqc?W)yR}5m5A@i`9f450vW-i(OIVS<&9RIX3wVj+x0=i$;zVLBYX62h8KCH zRb(trGZv_eibfWNFwZg-3mNZ*j}m z6kj;P{3?^+8_W-~GV!;9U?qOGFm6pl?!PQAC&WU|OVZgxe8f$1FWKN594HW-GyoK> zI|fJak+I62vVrhJw%Y4Hs_*-kPXwNn z-P8DX4sjMv8f#a0?!{sVnV?Dqx3tPQ_sh5FIjcFxCyvx7=>(<9eWA#RW^l9$Up^nB z^tHVWq<%L_xCV?J(YQUAqK11))i)Yx8@4t@zDAKi)!J zP8Gr-?d)(CEnyZtgYRjzk`IUr*`f~zw^1da+`!cJPSFO$Q|eK5nLYxHqdOVeG>M!3 z2=_2IL%>o(dZoi)KIg(+VnT7ufUIH8@Oh~1O*2v-w6N zo!9VQYBjd^u{a!B<|hdm|Kb1d|@4t}swcHU<{wN(KTmLI-DK8xy-C6F$}2 zdD_X7=k{E3L^2WFlG>8(G0CiwPf?%AkdVS6ttwkR)?z9%DK>kpUY zT~E_d^L>KZ*WgRH!P5e;DEl6-7sJ&v+QbX+QV{J)Ui5`^LXh^p|HDhuo_EEKg+w3v zDS3TI_5^(#h2jYU0VHA|ieH^>k#SlPq%4JEQ|fFkT%vK;3?c29Un{@(i?mP&s#a&m zQHtUC!wO8-=I~kFj}%#a#-9jCQLyi}LNal5BPB557e!_?Vyv<|(j<_?qjcp>%m|-q z<3S0gI}Y)@l=9s+l#N}KA{$@qyX<&eoz!Oup$j&NUBf+(TeGWr*b#rqq}VSoW7He# zYho5Q26PAKq)3=xj13FJ`6e0ZCvCg+VGNPU!lWMcLgbu+rw|Z=Q{WHA$*t4hhVNo7 zLlqEIEajAy_mnphTGuLgf$bpqw$2bE$h_we6j$R0U+}|U5N?#?fWX924tG$N9xlm# zr<$0aM#t;tf-&q9BZS{T!$)J+TX>z{JHxS!K);=OOHSG_U~Usnzgd~Ty3l<9v7mCGhv zPUfD?r9{Z6n;EETrQT}0w>K2)N!qLHxFv9v(&YQHMcky0&J_GmGfrSDg=v1`*J3jF zljYqaghS6gt5wZ?tNs;1RpF6&Xm%z-x`MZDfaW`R^FSo?K=Ar&WFRLl{GGh&n^MUP z(=XBmD?jXx2!eu=CSf(mlfA$(mysiPMnB58RB+BN{@``P)R$5WzKd= zna1?P+zhcI<3UvjKlk*}C#me6EZEDVD406~W-Qg}L26E;WjT2_@Fd{RBH^g#Om7uC z*S?-IXAHfi#%YGbTuQLwOwj&zpJ{s2l%r}&p+s)32o;v&ZI5xEiJPGnu9%qbY>xS89ki^8-0YOpxgcW}q!kSS zp=iWjhXFwHXe{1IwI=yjJK~yIRyc-vWLANO`Q;;`i!G9*R^@~W$#rT|;nJ~D$Amd< zUi4S8_|lwVz!t^m0=&yi&s+7|^r{QK>OH((Xb>_&JzdWZGziE25Ru?%8?|^OU&1b9 z3#aYr;i?!2Pj#>sefKC%Mq->7qePWqD0!ByG}{0K=Wx7)Lg&->sjTWuelOvX@vQHg ztT5)FbKge3|I+DYclt6#3L?L2OQS;SF&^2Ns*MrgGqBoDRV6*uqt4 zptQ)He^@v^W4m?~DunhJ94$eKc55z^~4m4eyc z-7j^^2rPfRTN4v&sEOqr7$A|*P^k1kE7b6xbMD#bvE^RZnRp8q9Bs7DpFz;>!gdkX zQxz{!LH^cXaR9;nk`X~YQh!k%LFvs^6=s8o;Gxfrf;ay%^g{_}gr_#Pd(FHFAPJQR ze{~luB>Vk4-!!lnOfc4Ors{BsNzFBRAjcS7XfM?wa^HPIPaQ- zXdaDEd$tNFT{G5U3#PJPR_n?>Vcq$cYg*Ns^Jo##I?2)vcEgAmSAf**b*(R3;x>UF zA%+6$#i@Kdeg^yi5y>KUoP78JM?`U;Y+W{!Wk%;wJS!WeBN?>=K(Fx1$a2*6ZffY% zwMEgYMF@L@a_M3Bx*@p@fqXn()IP=ONH=^2EYi=N1X0M?F?6J<)lHpnH2AJr9r}x$ zDr(a1joN9k)AaYJ7`jCnu2}=Q-u3sdw3yGqIaMOSAa_x5eMk!Nhtn>^(#j$uiiy|0 z3c?agwNLS2v4LD{%6q9rxTKX2AqYAsF<}loAd4<}6J28~@_;(bp|&BW35Wb5A9U&y z1t9FgYBmJkx$5!4hZv{&Mm6H@W!2;b2cH_|Ef1*;bC#ue8>o3KG6q+Zk_|{2Z3UG1 zm?B<|%}8Ije<%5pV{R=mr&s~KM1 z!>V?Qb@(XV{Kya}tKzHj9^SghvgA!>Pcu+%`;c}yN?k!PU~J=Jx`U=X7B^eC<$a6H zpu!8>e)^=<^oznLp-*tMT5%RR7NN2Fr&%k#8mdg~KGNT4j6IP}(zExatc{!aI~k<3Xn>v@6*&YpN&rw=8}_+z~wbOOK7IT z1%$Y@x5Qh>L@B}pi^KK}>;!?G>ViYP>Ji=?G&_};7fT}<7bb(OIAIQ>A0skqHHHHt zX&8r_4{vif58>anF4;L3q&&r?uv^$X2WE`#y@{30Bxr}ZKJ;Vlap}p#lzOx-NZ3-7 z`eL&YI38}Ioye5F2|&|sV%Nc$_=aP6qm#Vf0^-t^XwlgMS0@VMC&16Jyb-#Ua`1{h z7y~rx=MD1beLkOmyzI)7Ch8V5&V{Q{>|&zKlrcco-LW=E9Itbde+oCOe$y&2xVIGU#mC+tgYZ@E!8Fry_#$H?w$k$RJ;{?~4#g90^RN5=wGAev_hqxIN~ z&W(7)LGvu^w-;OYD}gw6bX+}uoiLh5^wAgp%hg6|&rFK1>Jl~%G3_3t`xz9ivfoLI zGXm_{Wrd5_$4gX%S~OCvDt0$`_jz@*}=_>|;|ldOcqG_CHwfzE-> zUNETNQpNDz;CN226Gy#P;$I0U>AU=4F8DhRa?a2k&d|=z(8yxY?YX`7Yr_dLYttJW zy_YIt&}xxpR3pq{&?T?@w6Z@afvUYwKSau#*h!k}n4^*TzgIKR$n}yl&}nJ+R#G#! zha>aniu+{r%`yTp0#WAuFk)SLY+$T!pf6y+;CJhW9-mZb{43SQ*Gl#)Wo3|+t)=n* z#oGFnuQT*3cSbSjhPKBzl@~r@k)Ek3W!8vTUjq8Lq`ud^%g9n!O2~?j*WAj8O-ari z93cJ}7n_!z8kee~Sw@tR`Y|T{C&Jd95oU7!P5~x(y%9wc#m`+Zz`+BRaRFsAGfM~= zNJwq?A6pLDJN#b!T`e<96>}8}GZ=`2dIUKa2m7~U2uu5}7W%rD^4Ci7+nOBpt&Q~U zjsCAy{r6cMzv|)7gP=glD(kK3g@4+3oNUAJjLB$c685c6Ho+$I_mC8$m7pxC0}3{g zzhk1PriRKNpsH;mXJ@Jpi4_7f3iAe> 8) & 0xFF), (byte)(periodData & 0xFF)); + } + + public void sendEvent(byte pin, byte b1, byte b2){ + sendArray(new byte[] {pin, b1, b2}); + } + + private void sendArray(byte[] message){ + try { + os.write(message); + os.flush(); + } catch (IOException ex) { + Logger.getLogger(MoppyBridge.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private void silenceDrives(){ + // Stop notes + for (int d=2;d<=6;d+=2){ + sendArray(new byte[] {(byte)d,(byte)0,(byte)0}); + } + } + + public void resetDrives(){ + silenceDrives(); + //Send reset code + sendArray(new byte[] {(byte)100,(byte)0,(byte)0}); + try { + Thread.sleep(1500); // Give the drives time to reset + } catch (InterruptedException ex) { + Logger.getLogger(MoppyBridge.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public void close(){ + silenceDrives(); + if (os != null){ + try { + os.close(); + } catch (IOException ex) { + Logger.getLogger(MoppyBridge.class.getName()).log(Level.SEVERE, null, ex); + } + } + + if (com != null){ + com.close(); + } + } + +} diff --git a/Java/src/moppydesk/MoppyPlayer.java b/Java/src/moppydesk/MoppyPlayer.java new file mode 100644 index 0000000..cbf1e8a --- /dev/null +++ b/Java/src/moppydesk/MoppyPlayer.java @@ -0,0 +1,52 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package moppydesk; + +import gnu.io.SerialPort; +import javax.sound.midi.MidiMessage; +import javax.sound.midi.Receiver; +/** + * + * @author Sam + */ +public class MoppyPlayer implements Receiver { + + public static int[] microPeriods = { + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 30578,28861,27242,25713,24270,20409,21622,20409,19263,18182,17161,16198, //C1 - B1 + 15289,14436,13621,12856,12135,11454,10811,10205,9632,9091,8581,8099, //C2 - B2 + 7645,7218,6811,6428,6068,5727,5406,5103,4816,4546,4291,4050, //C3 - B3 + 3823,3609,3406,3214,3034,2864,2703,2552,2408,2273,2146,2025, //C4 - B4 + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0 + }; + + MoppyBridge mb; + SerialPort com; + + public MoppyPlayer(MoppyBridge newMb) { + mb = newMb; + } + + public void close(){ + mb.close(); + } + + public void send(MidiMessage message, long timeStamp) { + if (message.getStatus() > 127 && message.getStatus() < 144){ // Note OFF + byte pin = (byte)(2*(message.getStatus() - 127)); + //System.out.println("Got note OFF on pin: " + (channel & 0xFF)); + mb.sendEvent(pin, 0); + } + else if (message.getStatus() > 143 && message.getStatus() < 160){ // Note ON + byte pin = (byte)(2*(message.getStatus() - 143)); + int period = microPeriods[(message.getMessage()[1] & 0xff)]; + //System.out.println("Got note ON on pin: " + (pin & 0xFF) + " with period " + period); + mb.sendEvent(pin, period); + } + } +} diff --git a/Java/src/moppydesk/MoppyPlayer1.java b/Java/src/moppydesk/MoppyPlayer1.java new file mode 100644 index 0000000..e69ea45 --- /dev/null +++ b/Java/src/moppydesk/MoppyPlayer1.java @@ -0,0 +1,67 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package moppydesk; + +import gnu.io.CommPortIdentifier; +import gnu.io.NoSuchPortException; +import gnu.io.PortInUseException; +import gnu.io.SerialPort; +import gnu.io.UnsupportedCommOperationException; +import java.io.IOException; +import java.io.OutputStream; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.sound.midi.ControllerEventListener; +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.MidiMessage; +import javax.sound.midi.Receiver; +import javax.sound.midi.ShortMessage; + +/** + * + * @author Sam + */ +public class MoppyPlayer1 implements Receiver { + + OutputStream os; + SerialPort com; + + public MoppyPlayer1(String portName) throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException, IOException { + CommPortIdentifier cpi = CommPortIdentifier.getPortIdentifier(portName); + com = (SerialPort) cpi.open("MoppyDesk", 2000); + com.setSerialPortParams(31250, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); + os = com.getOutputStream(); + } + + public void close(){ + if (os!=null){ + try { + os.close(); + } catch (IOException ex) { + Logger.getLogger(MoppyPlayer1.class.getName()).log(Level.SEVERE, null, ex); + } + } + if (com!=null){ + com.close(); + } + + } + + public void send(MidiMessage message, long timeStamp) { + if (message.getStatus() > 127 && message.getStatus() < 160){ + try { + ShortMessage sm = (ShortMessage) message; + //System.out.println(sm.getChannel()); + //TODO Channels start at 0?? + sm.setMessage(sm.getStatus()+1, sm.getData1(), sm.getData2()); //Try shifting channel + os.write(sm.getMessage()); + } catch (InvalidMidiDataException ex) { + Logger.getLogger(MoppyPlayer1.class.getName()).log(Level.SEVERE, null, ex); + } catch (IOException ex) { + Logger.getLogger(MoppyPlayer1.class.getName()).log(Level.SEVERE, null, ex); + } + } + } +}