From a60aa223a50ca70c46e8f51e59dfa42183e8df38 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Sun, 27 Jan 2019 22:20:10 +0100 Subject: [PATCH] Made Some Changes Trying Techno --- bin/technomaker/BeatMaker.class | Bin 2363 -> 2354 bytes bin/technomaker/Main.class | Bin 930 -> 499 bytes bin/technomaker/MelodyMaker.class | Bin 2469 -> 3963 bytes bin/technomaker/TechnoMaker.class | Bin 1358 -> 1424 bytes src/technomaker/BeatMaker.java | 13 +++-- src/technomaker/Main.java | 8 +-- src/technomaker/MelodyMaker.java | 85 +++++++++++++++++++++++++++--- src/technomaker/TechnoMaker.java | 8 +-- test1 | Bin 480 -> 0 bytes test1.mid | Bin 4548 -> 4108 bytes 10 files changed, 94 insertions(+), 20 deletions(-) delete mode 100644 test1 diff --git a/bin/technomaker/BeatMaker.class b/bin/technomaker/BeatMaker.class index a066816dc48272583c0114100c0093e6f1eba7a0..353ed22b4d4493b040ce46ddc72900900fbd9d37 100644 GIT binary patch literal 2354 zcmbVOOKenC82-+@?#y&(Z)>3p^ue2%DKJ<8VOl_jLYdkrV8`N6Uw38>(_7|&Gq(*a zuq;)<S%y z=TEm16vCZbs%U0Z|v& zJf^;1jn}KQl|sC17R>mBd}CHt@^X*}qBc4anVONm%xzDhHd`htCEyz}E2ec!pfBRY zFGoy8Ck2A1uIA+x%dA%F8rlS+jtWwhIiqA2(yV6Ku#9CqGoGv#WDst2gwTSg1l*D6 zWB}|ugaCr-sVf98d_jb$I4@C%K zL=``R=T-4zN|RKIngprxcnD{eyVezDMb>DJVH%xD+s4d_9G@-cWG!RlN>ZR>teQ7U zlSa){@6C@MYuY5bYi!l)ND{pDD^gMdkrQxDu`ySj_o&ZlyonW#;yG8DDZ8DpN3tml zFKzECm`A#)NI9YcwkgI96}7`Y@fi0i)*5B4;BioKm{%OKAsWCY(aWKvemHnsIXcdj z8(_C48J)1GdfK?sq$)U3ovr2NX&QpwSRPsXl;fb*bBK|KWBqrqA=bZujd#$i`#$$)-TLpDtVe${llAKJ znXFF_WU`tkllANOGviCxl3m2MgeUCTtNRwPeF?j>VNYNY(S$d48@*xg0`^>3!T@0h z5y09KcumMRvjbbAvIa*)m z=roC~qZilFhqpQC-oti$fE~C+D=cCczUJ`y4l&$CKYqa;+~ah*kNpB1K`j^%U7Rml zaZv2UA)IH{OAW>F0w(xI?QG2n=TnAzE>>|5FEYQIwfu?;c!_mR;(KIqkysO7U_ zlRKqPnClRkJ4)VgBUhs(k6}SHtz#q1< d9#-*V(+e|<(E`^41cVTO;vXKp%ug$7u$QAUi$#I0s}Q=GQ}J^;5(3dCqKtIRoB=9Oah~U3x@yn50h|1vTv02uZ1?`p_T7QP5F= zl5_^II+7OEV)2PV_3d~VPhgNEEla!POu0r#>lj{9ps8x@o(Lffsp5xlQWgKC(j=Xx zCLyYPDvYO;r`DFFEo(H#aBZf-r0Yj5TaL|CCS@&aPL`!W>u9xLmUCv!QqM~-HD}5q zx_xxTgQrf=q=09FMSJQM3ejx1@%x-ayr;rc(Pr4PQCtj1?cHPe=dpDWJMw#j3)q#^xB;KjJgaMEs1{uOcG8RYMlhmv4P+0f&=%#OIIb^GK=7vHyu2VzQBB zAQEW7N5;$Ed7N-_1e$X^fSg+$$+@IIb_Y1hYmFNXSkD0(99s*2Z8*qXo5Cgxq8%CT z)U)WodEzdj6Arp?4O{U#w&QJXvv;r)A7U47VmH3zy1I>Se2X6Z$j$UC61anX!h`){ z9S(@i=o3*KA}8>CLnMshG@mG!E3aVgU+^@}P}UTFz%v-9{26?WES_bJ=kYmmtjEV% zuH!l4{H$OOd7R@Kzs<-AG6xvV{zMi3Ku!d3R*+M4P&egbb8 rJxwLsgpLaDysY7OS7nV=eCPVY2b&yg;JJ%-A;h2fi=kD%^5D`x0A?Kk diff --git a/bin/technomaker/Main.class b/bin/technomaker/Main.class index 66395bfa1cd6a0fa1d1e8d06db7ea8df1637f9a2..2b3394ca1d853f61083ce26059762ed8459c42d6 100644 GIT binary patch delta 169 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 literal 2469 zcmah~TTEMZ9RB|8X-``^c3|8(E}OfyFkn}7lmP>F=|-88%IxsMp*^(a(z5n|;Eg@F zEZGAwF)=cm+ZK-t1Y!|5W7lKyP1O@~= z$7W*2q?yX3b1F6nYKg&2I}O7KQQ11;a)i4^q?G-Dk=ng>o)C0 z6?_6kv8Y6}z3=8T!Jk;~}`wpIg89=3Y%9JX<+ zoMA4%BOCs~u25h=#ST_1$P*^D$EJ<6>A`mFlJo5r*!B$GByc%r@Kj*Hg8&*-)C*J; z1AfWm~%X1xi!bSaN zHkD4e@Vr2=^vy_W+}LVLXL#ty!*aq_f%1GqdE@0nf^w*XX!GI-=p9$WFuP_=gJx9x zfx#~MuG5R7=pv=#Mmk|8EhB_f^gL6bWG1^Jf(PBQ`EHz$&7YK-ghJHBLzPc?aaww+ zIANrXEX|Q$Ap#qFQ)#1bYGT;PM)cuvL!h)b6Vt~B^lVDrFF#bwWQsldde>QHa=8o( z*aq3REjK|e3O(1q#!ST9CRnVd5VqmtWhRqMsrbnxhfMJw64=mhQtPljY4PKMfrN??@+;kyFC5m* zq!&pr!kN|6@eIpzN%uHAtGI3P=j?Q?T;$J?c`kU71*x`AX5JKV_*wr@ z=Aq1)85!XMSP8iW@NDNB zH@mQ*h<6I_yeKBnPMjMMwe^eGSl@61rS%O9D7%5pn)9|RYS;dZL>2A5NYtUtMWRm4 z9f_(+BtkY>zg&7qPQdslSfRK4k&^b4zFhift@P+oSeF4X< z8m__`Pax;kN0OJ&m!!;wULLdDBms>CmXNkm9?Nk66$qjdUEHF>@ZlUWL#V|l>R@6E zE@CULaC7_+JMam1;&bf6E$qg(sK;G2;2t-+-_VFZuon-oPuQ?u6my5F!XZ(E7Ul$A z&5MLSoZ%hivg8%4{X1U7S#}r1uXqXl6grHb5W&mraR^^yfc-ew%U5`XI43)pLlo!v zWw^`8L1uO_nmfqT)(D^ZP!p-ulcK!i+JsQA*wac)kl9xQtTEfr7Q&;W|>xO z;91fko36-*FE?#N8FUQOc`?4@hy5Qogft{qWeA$=2*WiZELvH2FImXB*3NoDBr*nCZVsC@}}nH@ey3GP@i(_{0i zVmsW`mvm`Zr)5}LQW|zm$OpCB+=_=B<;tc1fnQt;_Ykia29ztB|LUWT$L#fC69?_! zx;)Ai*+rIm_?0@2c7$*OrzqQLB*^mxO8*umyF?j3qST*KOhK&wZLzhq@<*L&UDOa)L?#if#V9dx)%XoG zv(Rtg+C-qSN!P|jSMK~S*7GVcon+p9^X_@~{?2=IXnY77KmU9`0B{A5J{q4^eQ#d5 zZd*V!1pMXBPN%mlpye9*Erzvj+clsfWMUj)0X3K33P51OL=dKqs6gC%BH~#C5ll)^ zT)>yBa<`NvO!(lJxw9rxIOl1in41=e_1ve=cDgTHFWlE9$KCF>-#Kz_AdMMWWmZt! z6v@h{P}W2MhK`&-$(9Tx;FZ&R^+CN3iE9f}{BTLR|u z*4tL8(=Amy+jLjPifp-LU=?dRD&C%wR@ZUI`>ibcYqCt;OQ^1R;JsJNLh}yP_%5V< zo}t2y<2c3fG{1h)t;*=wL!7Y_eOUHBBF&&aM68b~`x~YPNIG0hH{}OkYluuA=eaa@ zVkzH;{RLxAVSvI{77t(@HCj@!!17t_1{gxn5N2uuQ66xL;{sw7PNI%D?jwOqRM}LK z2$y-^@^OyI1@&26#WgypQ*j+PIJ?Pw2+9$ADLMrI2^~d^{THz`viO+{8t6Z{k8*Q< zh-F7Q(F%LG{g}ub#R01SkS!9`M#xc~4A?Wk3$`##&J6ixPY@>m6DHBX-DA@h?$L)r fwIp;{OAebMMAWgN^8y)blJgQ}JY zgWf!PHW6rS(sSd%#ET~rzd*l$7xj55mzj6woq6Ur^DgvV*T4P!dH`S!^+ds_VIpAOvCt#^Bcx#*~2sPJ06?{V0cI3Fne9Vkb`WuV^`hh++YDq zl3`v)8Os`Oct4f2x`I{jkFw;iNQE_TQFX*U@1t54s`pDx>?j<?oY+;oK(#YK1;7e5RgH@(^6bEETf| z(1w|vz&Ikj-X#B`J1mN!gg921DzYTa1_IzBZ2AODT*76_mDqX(SNWP73Mv1nE;Pn8 zmXH1#=4s^`AE@D@Pwiu&Q5aycE{T1!dni37;)7xzHzi^aZzCLE88ODVJ)4*|NjOcY zG?FBjSoveY5tgjFh1)}k2&%ZltHp diff --git a/src/technomaker/BeatMaker.java b/src/technomaker/BeatMaker.java index 41dc540..fe53f38 100644 --- a/src/technomaker/BeatMaker.java +++ b/src/technomaker/BeatMaker.java @@ -11,8 +11,9 @@ import javax.sound.midi.Track; public class BeatMaker { Sequence s; Track t; + private int drum = 13; - public BeatMaker(Sequence s) throws InvalidMidiDataException { + public BeatMaker(Sequence s, int speed) throws InvalidMidiDataException { this.s = s; t = s.createTrack(); @@ -25,7 +26,7 @@ public class BeatMaker { // **** set tempo (meta event) **** MetaMessage mt = new MetaMessage(); - byte[] bt = { 0x10, (byte) 0x00, 0x00 }; + byte[] bt = { (byte) speed, (byte) 0x00, 0x00 }; mt.setMessage(0x51, bt, 3); me = new MidiEvent(mt, (long) 0); t.add(me); @@ -54,13 +55,15 @@ public class BeatMaker { private void generateDrums() throws InvalidMidiDataException { - int b1 = (int) (Math.random() * 3); - int b2 = (int) (Math.random() * 3); + // int b1 = (int) (Math.random() * 3); + // int b2 = (int) (Math.random() * 3); + int b1 = 0; + int b2 = 2; for (int i = 0; i < 100; i++) { // **** set instrument to Piano **** ShortMessage mm = new ShortMessage(); - mm.setMessage(ShortMessage.PROGRAM_CHANGE, 1, 118, 0x00); + mm.setMessage(ShortMessage.PROGRAM_CHANGE, 1, drum , 0x00); MidiEvent me = new MidiEvent(mm, (long) 0); t.add(me); diff --git a/src/technomaker/Main.java b/src/technomaker/Main.java index 044528d..f611a31 100644 --- a/src/technomaker/Main.java +++ b/src/technomaker/Main.java @@ -3,11 +3,11 @@ package technomaker; public class Main { public static void main(String[] args) { - new TechnoMaker().save("test1.mid"); + new TechnoMaker(8).save("test1.mid"); try { - Process p = Runtime.getRuntime().exec("\"C:\\Program Files\\VideoLAN\\VLC\\vlc.exe\" D:\\spigotworkspace\\TenchnoMaker\\test1.mid"); - Thread.sleep(41*1000); - p = Runtime.getRuntime().exec("taskkill /IM \"vlc.exe\" /F"); +// Process p = Runtime.getRuntime().exec("\"C:\\Program Files\\VideoLAN\\VLC\\vlc.exe\" D:\\spigotworkspace\\TenchnoMaker\\test1.mid"); +// Thread.sleep(120*1000); +// p = Runtime.getRuntime().exec("taskkill /IM \"vlc.exe\" /F"); } catch (Exception e) { } diff --git a/src/technomaker/MelodyMaker.java b/src/technomaker/MelodyMaker.java index 2f6e384..f39192b 100644 --- a/src/technomaker/MelodyMaker.java +++ b/src/technomaker/MelodyMaker.java @@ -1,5 +1,7 @@ package technomaker; +import java.util.Random; + import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MetaMessage; import javax.sound.midi.MidiEvent; @@ -12,8 +14,11 @@ public class MelodyMaker { Sequence s; Track t; + int instrument = 80 + (int) (Math.random() * 7); + int instrumentR = 80 + (int) (Math.random() * 7); + private int ton = 60; - public MelodyMaker(Sequence s) throws Exception { + public MelodyMaker(Sequence s, int speed) throws Exception { this.s = s; t = s.createTrack(); @@ -26,7 +31,7 @@ public class MelodyMaker { // **** set tempo (meta event) **** MetaMessage mt = new MetaMessage(); - byte[] bt = { 0x10, (byte) 0x00, 0x00 }; + byte[] bt = { (byte) speed, (byte) 0x00, 0x00 }; mt.setMessage(0x51, bt, 3); me = new MidiEvent(mt, (long) 0); t.add(me); @@ -54,24 +59,36 @@ public class MelodyMaker { } private void generateMelody() throws Exception { - for (int i = 0; i < 10; i++) - addStrophe(40 * i); + generateRefrain(); + addStrophe(40 * 0); + addRefrain(40 * 1); + addStrophe(40 * 2); + addStrophe(40 * 3); + addRefrain(40 * 4); + addStrophe(40 * 5); + addRefrain(40 * 6); + addStrophe(40 * 7); +// for (int i = 0; i < 8; i++) +// addRefrain(40 * i); } private void addStrophe(int offset) throws Exception { - int variation = 1 + (int) (Math.random() * 6); + int variation = 1 + (int) (Math.random() * 3); - int ton = 60; for (int i = 0; i < 40;) { i += 1 + Math.pow(Math.random() * 3, 2) * 0.3; - ton += (int) (Math.random() * (variation * 2 + 1)) - variation; + ton += new Random().nextInt(variation * 2 + 1) - variation; + if (ton <= 0) + ton = 0; + if (ton >= 128) + ton = 127; // **** set instrument to Piano **** ShortMessage mm = new ShortMessage(); - mm.setMessage(ShortMessage.PROGRAM_CHANGE, (int) (Math.random()*100), 0x00); + mm.setMessage(ShortMessage.PROGRAM_CHANGE, instrument, 0x00); MidiEvent me = new MidiEvent(mm, (long) 0 + offset); t.add(me); @@ -89,4 +106,56 @@ public class MelodyMaker { } } + ShortMessage[] refrainOn = new ShortMessage[40]; + ShortMessage[] refrainOff = new ShortMessage[40]; + int[] tonLänge = new int[40]; + + private void generateRefrain() throws InvalidMidiDataException { + int variation = 1 + (int) (Math.random() * 3); + + for (int i = 0; i < 39;) { + i += 1 + Math.random() * 2; + + ton += new Random().nextInt(variation * 2 + 1) - variation; + if (ton <= 0) + ton = 0; + if (ton >= 128) + ton = 127; + ShortMessage mm = new ShortMessage(); + mm.setMessage(ShortMessage.NOTE_ON, ton, 127); + ShortMessage mm2 = new ShortMessage(); + mm2.setMessage(ShortMessage.NOTE_OFF, ton, 127); + if (i >= 40) + i = 39; + refrainOn[i] = mm; + refrainOff[i] = mm2; + tonLänge[i] = i; + } + } + + private void addRefrain(int offset) throws Exception { + + for (int i = 0; i < 40; i++) { + + // **** set instrument to Piano **** + ShortMessage mm = new ShortMessage(); + mm.setMessage(ShortMessage.PROGRAM_CHANGE, instrumentR, 0x00); + MidiEvent me = new MidiEvent(mm, (long) 0 + offset); + t.add(me); + + if (refrainOn[i] == null) { + System.out.println("exit"+i); + continue; + } + + // **** note on - middle C **** + me = new MidiEvent(refrainOn[i], (long) i + offset); + t.add(me); + // **** note off - middle C - 120 ticks later **** + me = new MidiEvent(refrainOff[i], (long) tonLänge[i] + offset); + t.add(me); + + } + } + } diff --git a/src/technomaker/TechnoMaker.java b/src/technomaker/TechnoMaker.java index 2679601..54be674 100644 --- a/src/technomaker/TechnoMaker.java +++ b/src/technomaker/TechnoMaker.java @@ -12,13 +12,15 @@ public class TechnoMaker { Sequence s; BeatMaker bm; MelodyMaker mm; + int speed; - public TechnoMaker() { + public TechnoMaker(int speed) { + this.speed = speed; try { s = new Sequence(Sequence.PPQ, 4); Track t = s.createTrack(); - mm = new MelodyMaker(s); - bm = new BeatMaker(s); + mm = new MelodyMaker(s,this.speed); + bm = new BeatMaker(s,this.speed); } catch (Exception e) { e.printStackTrace(); } diff --git a/test1 b/test1 deleted file mode 100644 index fd70f4c18141e7afc93f3f4a13541a80ffd4a885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmeYb$w*;fU|?flWME=o@eL`;2J%=K{_8V9*o^xaKCsr+b25Hs_#ep31eE;G%$J*) vl9`s7ld4csl$e~&u%VWLp`L-^Kt00*kpvJ$MabA7!T>UMlqMq_fUyVwDQIa@ diff --git a/test1.mid b/test1.mid index 8d509912e5c9f3a323b684271603c6285f0df403..2e8684fd2006b7a67d0fc9ed29d5e1867f2e8060 100644 GIT binary patch literal 4108 zcmeHKIZgyI5bXAH1`zQ8Vqm#e+&4KAEAauuAyzgUji<5;R5&q_%d)A`PQG&#<|$fx;dZY=P`aBb+A=z*LiY77gmSkaJ~U-0Lkm% zb#O=pxg6w`AoF)!((8h;z7CF-xaCQj&ZZ|Payc%J6VE!E zsJDsvwt!o}GFQKY_zvQR&ToTncjc4sVw*pD9i*vk6vcwWjo>vP{+sKN&)1G)7v~?2 zg>mXbZu(`NsOJX8ZFK2oaZP%2ocSQfdpUhmuIIdQjlL3mwG>}3a*h20`~{zcjs0t% zgg?mP%O1|0cbk~w)Qow?UDAyG)STWTrsVfIoZ4qBdn12y${x-h?}?}1 vEQ5=m{>}0{BKKp3+@az14?Hezr$UppI)~~U!u76vQ2C(p!N>O?{Kx+Wi+Vv~ literal 4548 zcmeI0-%=b^5XQe5K!l`_ii;75nuIb{VFL?n0s>)y0O9XyLN+ncN+bp?spw70@=jOZ zV0;rFVSOX-yu{z^nQtb$x$#=5t)ZvS^z`Ze`s+SZ)EnO&OL|L@demEQyn2b&tJ8|Y z{ot|w>ieZR5dE#w`#r-vJnb3!;pF(_+mr9Vx%}g+=PzFBkDsNc)Vj}$TY9KbEvmu& zuqO0Whk8#HUDO!Qq>`4kuN8f+5nYRtEjQ2DDm z(h><*srx+F3rJrl`KP+1&q)7}2IvEphQoJQu3?muIgq_*hCup)>?XaN!RfduI;CZh!E!HAZ(2>s?)=>n|_^D%|y?4RoJOBUw?9MTI6Gy4=!m2RBPR6`zlS@7X%b~sk zo^^P0g_)90mT}-L>mDPv%&cj^xp|uGGAw%nsO1PZN+WEGq5&Md32)t1bc0#9G@Go4 z_u_1Xx^cSM<%TOpeYc-Zf1X($!QK8+)~Yq6em&E3PMS&=wDWJ4vRj7dIJ3+DMNB76n-E25~Nza~N@qx`F3hdS&K$1ZX= zuWX!EI?mQpU9Blbh_G4I0eD4?ZIQuv&{A4xHzcu^k|Mj=#pFipMQd7Ti kS+evW`1LxSOrGhTWj@2>43F2_{)`W2eE2`}A^lIyKLBjkLjV8(