Code: Select all
;*****************************************************************************
;*
;* Season's Greetings PurePunch Demo contest
;* PureBasic 5.00 +
;* 80 lines of 80 chars, 1 month delay
;*
;* Name : "Eine Kleine PBmusik - Experiment in recombinatorial music
;* Author : einander
;* Date : 31.12.2012
;* Notes : A indigest macro soup for windows only :)
;*
;*****************************************************************************
Macro M(P,T):Macro P:T:EndMacr:EndMacro:M(E:EndIf)o:M(Mu:Midiout)o:M(Nx:Next)o;;
M(Mo:Mu#ShortMsg_)o:M(Dr:Drawing)o:M(PY:Play)o:M(TR:Thread)o:M(CP:Caps)o:T.S;;;;
M(G:Gadget)o:M(Sga:Set#G#Attribute)o:M(Im:Image)o:M(Wn:Window)o:M(Dk:Desktop)o;;
M(D:Delay)o:M(GS:Get#G#State)o:M(P:Procedure)o:M(EP:End#P)o:M(C:Case)o:
M(Ca:Canvas)o:M(SG:Set#G#State)o:M(AR:Array)o:M(SD:StopDrawing())o:M(RN:Random)o
M(R:ProcedureReturn)o:M(ES:Else)o:M(B:Beat)o:M(SL:Select)o:M(GL:Global)o
M(ST:Structure)o:M(PN:Py#Nt)o:M(O:Output)o:M(H:Height)o:M(Wi:Width)o:M(An:AND)o;
M(F:For I=0 To)o:M(MX:Mutex)o:M(LX:LOCK#Mx(_M))o:M(UX:Un#Lx)o:M(TX:Try#Lx)o
M(SAG:Set#G#Attribute)o:m(SGC:set#g#color)o
M(MC:Macro)o:St Th:Mo.I:Ro.I:Tpo.I:V.I:I.I:Pl.I:C.I[6]:K.I[6]:End#St
GL _M=Create#Mx(),TP,Mo,CG,TQ,Th1,CK,_Q:Dim TB.I(5)
Gl Dim _N.A(0),Dim SF(5),Dim HR(5),_L,QS,Th.Th,XS,YS
MC C3:_L=Len(T)-1:Dim _N(_L):F(_L):_N(I)=PeekA(@T+I)-32:Nx:Mo(Mo,$78B0):EndMacro
Mc C0:T="FYa M RY U^ Y T\ Y R[ K U [ ^ Uc ^ Ua K DW` K PW T\ W R[ W DPY I` PY U"
T+"^ Y Y\ UY Y IU OY[ R U IRY U[ IPY U OX H R T X R[ T X HT[` M^ T]a T MY\` HT "
T+"RX[^ TY\ H MQY[ T HTX\ MW] T HW MTY ":C3:EndMacro:MC C1:T="BNZ^a Z^a B N U"
T+" Z \ BZa U Z N U Za B U J^b Y > ^e Y > ^b J >^e Y > J^e b J^ W KZ^ K ? W "
T+"Zc Z^c ? W Z ? Zc ^ Z KW =IUZ^ UZ^ = U Z^ I^ = a ^ = Za ^ IZ UU BNX^a B "
T+"N U X^ UX^ B U X a B ^ X B GWZ_ WZ_ G GWZ_ a _ a GWZc a _ Z^a FR ^ Z K DPW\"
T+"_ K D 8 D W _ P\ SW \ DW IZ_ = W Z =_ IUZ_ UZ_ = IZa _ Z = "
_L=Len(T)-1:C3:EndMacro:Mc C2:T="Kgjv R Wg e ^g K W c o l ^j ^bgj F R be "
T+"Y R ^ JY^e R Y ^ V Y e Mg AW\ch W COW^cj W DPW^cj `l W Wc P RW\`co Fn Wl "
T+"Rj KW[^c W K W[^c W S GX]ad X G S \_dht iu Gkw L S hkpt P X \f _h L X d"
T+" p m _k _ck G S i Z S _ KZ_ S Z _ W Z f h BX]di X DPX_dk X EQX_dk am X "
T+"Xd Q SX]adp Gr m S_dp LX\ X L X^ad X L FW\^c W F R [^co{ `lx Rjv "
_L=Len(T)-1:C3:EndMacro:C0:CopyMemory(?Rs,@SF(),24):CopyMemory(?Rh,@HR(),24)
P PN(Nt,Ch=0,V=100,Z=-1):If Ch=0:Mo(Mo,$B0|Ch|$A00|Nt<<16):E
Mo(Mo,$90|Ch|Nt<<8|V<<16):If Ch=0 And Z>-1:Tx:Start#Dr(Ca#O(CG))
Box((Nt-20)*Xs,O#H()-Ys-Z*Ys,Xs,Xs,Th\K[Z]):Stop#Dr():Ux:E:EP
P RS(Ar A(1),Ar Tb(1)):F(5):A=A(I):SG(Tb(I),A):If I:Th\C[I]=A:Es
Th\C[0]=200-A+100:E:NX:EP:P TA(Nt,Tr):Ov=Nt/12:R(Nt+Tr)%12+Ov*12:EP:P Th(Void);;
With Th.Th
Repeat:If \Mo:\Ro+(Rn(4)+1):\Ro%12:E:B=0:If TX:SAG(CG,1,Im#ID(\I)):UX:E:F(_L);
Nt=_N(I):If Nt:Lx:If \Ro:Nt=Ta(Nt,\Ro):E:If Tp:Nt=Ta(Nt,Tp):E:N1=Nt:Nt+12*RN(2);
\V=60+RN(30):If \C[5]=0 Or RN(\C[5]):If \C[3]>35 And N1<\C[3] And Nt>30
PN(Nt-12,0,\V,3):E:If \C[4]>35 And N1<\C[4] And Nt<90:PN(Nt+12,0,\V,4):E
PN(Nt,0,\V+10,0):If \C[1]>36 And N1<\C[1]:PN(Nt+12,0,\V,1):E
If \C[2]>36 And N1<\C[2]:PN(Nt-12,0,\V,2):E:Es:If RN(1):PN(Nt-1,0,\V-10,5)
PN(Nt+11,0,\V-10,5):OA=Nt:Es:PN(Nt,0,\V+20,5):N2=Nt:E:E:Ux:Es:If Gs(CK) And B=0
PN(76,9,100):E:B+1:If OA:D(\C[0]/2):Lx:PN(OA,0,\V+20,5):PN(OA+12,0,\V+20,5)
OA=0:Ux:D(\C[0]/2):Es#If N2:D(\C[0]/2):Lx:PN(N2-1,0,\V-10,5):D(\C[0]/2)
PN(N2,0,\V+10,5):N2=0:Ux:Es:If QS:QS=0:Break:E:If TQ:Break 2:E:D(\C[0]):If B%4=0
SAG(CG,1,Im#ID(\I)):E:E:E:If B=8:Mo(Mo,$78B0):B=0:E:NX:Until _Q Or TQ:EndWith:Ep
Examine#Dk#s():DWi=Dk#Wi(0):a$="Experiment in recombinatorial music"
Open#Wn(0,100,100,DWi/2.4,Desktop#H(0)/2.2,"Eine Kleine PBmusik - "+a$,$Cf0001)
Wi=Wn#Wi(0):He=Wn#H(0):SP=DWi/16:Set#Wn#Color(0,$22):X=10:Y=10
With Th
Restore TBS:F(5):Read A:Read B:Tb(I)=TrackBar#g(-1,X+16,Y,22,He/2,A,B,2):X+SP:NX
RS(SF(),Tb()):X=10:A=SP*0.8:F(5):Read$ A$:Read$ B$
Tg=Text#G(-1,X,Y+He/1.85,A,16,A$,1):X+SP:SGC(Tg,1,0):Th\K[I]=Val("$"+B$)
SGC(Tg,2,Th\K[I]):NX:X=G#X(Tb(5))+A/2:CM=CheckBox#G(-1,X,10,A,20,"Modulate")
OS=Option#G(-1,X, 35,A,20,"Soft"):OH=Option#G(-1,X,60,A,20,"Hard")
CK=CheckBox#G(-1,X,85,A,20," Click"):SPT=SpinGadget(-1,X,110,30,20,0,11,2)
Op0=Option#g(-1,X,135,70,20,"Seed 1"):Op1=Option#g(-1,X,160,70,20,"Seed 2")
Op2=Option#g(-1,X,185,70,20,"Seed 3"):CH#Py=CheckBox#g(-1,X,230,A,20," Play")
tg=TextGadget(-1,x+32,110,80,20,"Transpose"):sgc(tg,1,#White):sgc(tg,2,$22)
SG(SPT,0):CG=Ca#G(-1,10,He*0.66,Wi-20,He*0.32):\I=Create#Im(-1,Wi-20,He*0.32)
Start#Dr(Im#O(\I)):Box(0,0,O#Wi(),O#H(),22):XS=O#Wi()/90:YS=O#H()/7:Stop#Dr()
SAG(CG,1,Im#ID(\I)):F(Mu#GetNumDevs_()-1)
If Mu#GetDevCaps_(I,@MD.Mu#Caps,SizeOf(Mu#CAPS))=0:If MD\WVoices
Mu#Open_(@Mo,I,0,0,0):Break:E:E:NX:Repeat:Ev=WAIT#Wn#Event(1)
If GetAsyncKeyState_(27)&$8000:_Q=1:Break:E:If Ev=13100:Sl Event#G():C Ch#Py
\PL=GS(Ch#Py):If \PL:If Is#Tr(Th1)=0:TQ=0:Th1=Create#Tr(@Th(),Ev):E:Es
Pause#Tr(Th1):WAIT#Tr(Th1,500):If Is#Tr(Th1):Kill#Tr(Th1):E:Mo(Mo,$78B0)
SAG(CG,1,Im#ID(\I)):E:C CM:\Mo=GS(CM):If \Mo:\Ro+7:E:C OS: RS(SF(),Tb()):C OH
RS(HR(),Tb()):C SPT:TP=GS(SPT):C Tb(0):\C[0]=200-GS(Tb(0))+100:C Tb(1)
\C[1]=GS(Tb(1)):C Tb(2):\C[2]=GS(Tb(2)):C Tb(3):\C[3]=GS(Tb(3)):C Tb(4)
\C[4]=GS(Tb(4)):C Tb(5):\C[5]=GS(Tb(5)):If \C[5]:\C[5]=49-\C[5]:E:C Op0:C0:QS=1
C Op1:C1:QS=1:C Op2:C2:QS=1:End#Sl:E:Until EV=16:_Q=1:EndWith:If Is#Tr(Th1)
Pause#Tr(Th1):WAIT#Tr(Th1,500):If Is#Tr(Th1):Kill#Tr(Th1):E:E:End
DataSection:Tbs:Data.I 0,200,36,67,36,67,35,68,35,68,0,48
Data.S "Tempo","ffffff","High 8","ffff","Low 8","ff00","Bass","336688","Treble","ff00ff","Fill","ff"
RS:Data.I 80,0,35,35,35,0:RH:Data.I 120,67,36,68,40,38
EndDataSection