'TITLE: SOUND COMPOSER 'AUTHORS: TIMO KLOSS, GREENPILLOZ 'ENERGY SAVING MODE SYSTEM 0,1 'TRACK 0, 0 'OUT=0 'GAMEPAD 1 'WHILE OUT<>1 'PLAY 0, RND(96), 20 SOUND 0 'WAIT 20 'IF BUTTON(0,0) THEN OUT=1 ''WAIT VBL 'WEND 'GAMEPAD 0 GLOBAL NUMINST,INSTSIZE NUMINST=16 INSTSIZE=8 GLOBAL NUMPATT,PATTSIZE NUMPATT=64 PATTSIZE=4 GLOBAL NUMTRAC,NUMROWS,ROWSIZE,TRACSIZE NUMTRAC=64 NUMROWS=32 ROWSIZE=3 TRACSIZE=NUMROWS*ROWSIZE '==== MEMORY MAP ==== GLOBAL AINST,APATT,ATRAC AINST=$A000 APATT=AINST+NUMINST*INSTSIZE ATRAC=APATT+NUMPATT*PATTSIZE ACOPYINST=ATRAC+NUMTRAC*TRACSIZE ACOPYPATT=ACOPYINST+INSTSIZE ACOPYTRAC=ACOPYPATT+PATTSIZE IF ACOPYTRAC+TRACSIZE>$E000 THEN END '====================== DIM GLOBAL MENU$(6) 'EDIT FOR DIFFERENT KEYBOARD LAYOUTS GLOBAL KEYS$, VALKEYS$ KEYS$="ZSXDCVGBHNJMQ2W3ER5T6Y7UI" VALKEYS$="0123456789ABCDEF" DIM GLOBAL NOTES$(11), HEXS$(15), SNDWAV$(3), LFOWAV$(3), FLAG$(1) DATA "C-","C#","D-","D#","E-","F-" DATA "F#","G-","G#","A-","A#","B-" FOR I=0 TO 11 READ NOTES$(I) NEXT I 'CACHE HEX VALUES 0-F FOR I=0 TO 15 HEXS$(I)=HEX$(I) NEXT I DATA "SAW","TRI","PUL","NOI" FOR I=0 TO 3 READ SNDWAV$(I) NEXT I DATA "TRI","SAW","SQR","RND" FOR I=0 TO 3 READ LFOWAV$(I) NEXT I FLAG$(0)="OFF" FLAG$(1)="ON " GLOBAL METERSENABLED, OLDX, OLDY GLOBAL CURPAT, CURVOI, CURROW, CURTRA, CURCOL, CUROCT, CURSND, CURNOTE, FOCUS, SELTAB, TRACKERMODE CALL INITSTATUS SUB INITSTATUS CURPAT=0 CURVOI=0 CURROW=0 CURTRA=0 CURCOL=0 CUROCT=3 CURSND=0 CURNOTE=46 FOCUS=-1 SELTAB=0 TRACKERMODE=0 END SUB GLOBAL SOUNDFILE,FILESOFFS CALL CLEARMUSIC 'LOAD MAIN SOUND SOUNDFILE=15 FILESOFFS=6 OK=0 R=0 UPD=0 CALL BLOAD(OK) KEYBOARD OPTIONAL '==== PLAYER ==== GLOBAL PLAYER_MODE, PLAYER_SPEED, PLAYER_TICK, PLAYER_PAT, PLAYER_ROW, PLAYER_BREAK GLOBAL PLAYER_TRA, PLAYER_VOI ON VBL CALL UPDATEPLAYER '==== TOUCH ZONES INIT ==== 'SETTINGS GLOBAL MAX_ZONE, ZONE_PAL 'STATUS GETTERS GLOBAL CUR_ZONE, ZONE_EVENT, ZONE_IN_X, ZONE_IN_Y, ZONE_RESULT 'INTERNAL GLOBAL ZONE_LAST_X, ZONE_LAST_Y GLOBAL E_DOWN, E_UP, E_OUT, E_DRAG E_DOWN=1 E_UP=2 E_OUT=3 E_DRAG=4 MAX_ZONE=35 DIM GLOBAL ZONEX(MAX_ZONE), ZONEY(MAX_ZONE), ZONEW(MAX_ZONE), ZONEH(MAX_ZONE), ZONEP(MAX_ZONE) TOUCHSCREEN '======== MAIN: IF SELTAB=0 THEN GOTO PATTERNEDITOR IF SELTAB=1 THEN GOTO TRACKEDITOR IF SELTAB=2 THEN GOTO SOUNDEDITOR END '======== PATTERNEDITOR: SELTAB=0 SPRITE OFF SPRITE 0 PAL 3 FLIP 0,0 SPRITE 1 PAL 3 FLIP 1,0 SPRITE 2 PAL 3 FLIP 0,1 SPRITE 3 PAL 3 FLIP 1,1 CALL METERSON CALL RESETZONES BG SOURCE ROM(3) BG COPY 0,0,20,2 TO 0,0 ZONE_PAL=1 CALL SETZONE(0,0,0,2,2) CALL SETZONE(1,2,0,2,2) CALL SETZONE(2,4,0,2,2) CALL SETZONE(3,6,0,2,2) CALL SETZONE(4,8,0,2,2) CALL SETZONE(5,10,0,2,2) ZONE_PAL=-1 CALL SETZONE(6,12,0,2,2) CALL SETZONE(7,14,0,2,2) CALL SETZONE(8,16,0,2,2) ZONE_PAL=1 CALL SETZONE(9,18,0,2,2) ZONE_PAL=-1 CALL SETZONE(10,0,2,2,2) CALL SETZONE(11,3,2,3,2) CALL SETZONE(12,7,2,3,2) CALL SETZONE(13,11,2,3,2) CALL SETZONE(14,15,2,3,2) ZONE_PAL=1 CALL SETZONE(15,18,2,2,2) ZONE_PAL=-1 CALL SETZONE(30,0,4,20,10) FOCUS=-1 CALL DRAWPATINFO CALL DRAWPATTERN CALL SHOWKEYBOARD CALL UPDATEPATCURSOR OLDX=-1 OLDY=-1 DRAGGED=0 DO CALL UPDATEZONES IF ZONE_EVENT=E_UP THEN IF CUR_ZONE=0 THEN CALL PLAYMUSIC(CURPAT,1) IF CUR_ZONE=1 THEN CALL PLAYMUSIC(CURPAT,2) IF CUR_ZONE=2 THEN STOP IF PLAYER_MODE>0 THEN CALL STOPPLAYER ELSE IF CURROW>0 THEN CURROW=0 CALL DRAWPATTERN ELSE CURPAT=CURPAT-1 CALL GETLOOPSTART(CURPAT) CALL DRAWPATINFO CALL DRAWPATTERN END IF END IF IF CUR_ZONE=5 THEN GOTO PATTERNMENU IF CUR_ZONE=9 THEN GOTO DISKMENU END IF IF ZONE_EVENT=E_DOWN THEN IF CUR_ZONE=3 AND CURPAT>0 THEN CURPAT=CURPAT-1 CALL CHANGEMUSIC(CURPAT) CALL DRAWPATINFO CALL DRAWPATTERN END IF IF CUR_ZONE=4 AND CURPAT-1 THEN FOCUS=-1 CALL SHOWKEYBOARD CALL UPDATEPATCURSOR END IF OLDY=ZONE_IN_Y DRAGGED=0 ELSE IF ZONE_EVENT=E_DRAG THEN IF PLAYER_MODE<>1 AND PLAYER_MODE<>2 THEN CURROW=MIN(NUMROWS-1,MAX(0,CURROW+OLDY-ZONE_IN_Y)) CALL DRAWPATTERN CALL UPDATEPATCURSOR OLDY=ZONE_IN_Y END IF DRAGGED=-1 ELSE IF ZONE_EVENT=E_UP THEN IF NOT DRAGGED THEN CURVOI=MIN(3,MAX(0,(ZONE_IN_X-3)\4)) IF PLAYER_MODE<>1 AND PLAYER_MODE<>2 THEN CURROW=MIN(NUMROWS-1,MAX(0,CURROW+ZONE_IN_Y-4)) END IF CALL DRAWPATTERN CALL UPDATEPATCURSOR END IF ELSE IF ZONE_EVENT=E_OUT THEN END IF END IF IF ZONE_EVENT=E_DOWN AND CUR_ZONE>=10 AND CUR_ZONE<=14 THEN FOCUS=CUR_ZONE IF FOCUS>=11 AND FOCUS<=14 THEN CURVOI=FOCUS-11 CALL SHOWWHEEL CALL UPDATEPATCURSOR END IF IF ZONE_EVENT=E_UP AND CUR_ZONE=15 THEN CALL TOGGLELOOP CALL DRAWLOOP END IF K$=INKEY$ IF K$=" " THEN STOP IF PLAYER_MODE>0 THEN CALL STOPPLAYER ELSE CALL PLAYMUSIC(CURPAT,2) END IF ELSE IF K$<>"" AND FOCUS=-1 THEN K=ASC(K$) IF K=17 THEN CURVOI=(CURVOI+1) MOD 4 CALL UPDATEPATCURSOR ELSE IF K=18 THEN CURVOI=(CURVOI+3) MOD 4 CALL UPDATEPATCURSOR END IF IF PLAYER_MODE<>1 AND PLAYER_MODE<>2 THEN IF K=19 THEN CURROW=(CURROW+1) MOD NUMROWS CALL DRAWPATTERN ELSE IF K=20 THEN CURROW=(CURROW+NUMROWS-1) MOD NUMROWS CALL DRAWPATTERN END IF END IF END IF VOIX=3+CURVOI*4 CALL GETTRACK(CURPAT,CURVOI,CURTRA) CALL HANDLEKEYBOARD(0,VOIX,K$,UPD) IF K$<>"" AND UPD AND PLAYER_MODE<>1 AND PLAYER_MODE<>2 THEN CURROW=(CURROW+1) MOD NUMROWS CALL DRAWPATTERN END IF IF FOCUS=10 THEN CALL HANDLEWHEEL(CURPAT,0,NUMPATT-1,K$,UPD) IF UPD THEN CALL DRAWPATINFO CALL DRAWPATTERN END IF END IF IF FOCUS>=11 AND FOCUS<=14 THEN CALL HANDLEWHEEL(CURTRA,-1,NUMTRAC-1,K$,UPD) IF UPD THEN CALL SETTRACK(CURPAT,CURVOI,CURTRA) CALL DRAWPATINFO CALL DRAWTRACK(CURTRA,VOIX) END IF END IF IF PLAYER_MODE=1 OR PLAYER_MODE=2 THEN IF PLAYER_ROW<>CURROW OR PLAYER_PAT<>CURPAT THEN P=CURPAT CURROW=PLAYER_ROW CURPAT=PLAYER_PAT IF CURPAT<>P THEN CALL DRAWPATINFO CALL DRAWPATTERN END IF END IF WAIT VBL LOOP PATTERNMENU: MENU$(0)="COPY" MENU$(1)="PASTE" MENU$(2)="INSERT EMPTY" MENU$(3)="REMOVE" MENU$(4)="CANCEL" CALL SHOWMENU("EDIT PATTERN",4,R) IF R=0 THEN COPY APATT+CURPAT*PATTSIZE,PATTSIZE TO ACOPYPATT IF R=1 THEN COPY ACOPYPATT,PATTSIZE TO APATT+CURPAT*PATTSIZE IF R=2 THEN COPY APATT+CURPAT*PATTSIZE,(NUMPATT-CURPAT-1)*PATTSIZE TO APATT+(CURPAT+1)*PATTSIZE FILL APATT+CURPAT*PATTSIZE,PATTSIZE,64 END IF IF R=3 THEN COPY APATT+(CURPAT+1)*PATTSIZE,(NUMPATT-CURPAT-1)*PATTSIZE TO APATT+CURPAT*PATTSIZE FILL APATT+(NUMPATT-1)*PATTSIZE,PATTSIZE,64 END IF GOTO PATTERNEDITOR SUB DRAWPATTERN PAL 3 BG FILL 0,4 TO 20,13 CHAR 0 CALL DRAWPOS T=-1 FOR V=0 TO 3 CALL GETTRACK(CURPAT,V,T) CALL DRAWTRACK(T,3+V*4) NEXT V END SUB SUB DRAWPATINFO PAL 0 BG FILL 0,2 TO 19,3 CHAR 1 TEXT 0,2,"PA" PAL 2 NUMBER 0,3,CURPAT,2 T=-1 FOR V=0 TO 3 CALL GETTRACK(CURPAT,V,T) X=3+V*4 PAL 0 TEXT X,2,"V" NUMBER X+1,2,V,1 TEXT X,3,"T" PAL 2 IF T<0 THEN TEXT X+1,3,"--" ELSE NUMBER X+1,3,T,2 END IF NEXT V CALL DRAWLOOP END SUB SUB DRAWLOOP V=0 CALL GETLOOP(CURPAT,0,V) FLIP 0,1 IF V=1 THEN PAL 0 ELSE PAL 2 CELL 18,2,46 CALL GETLOOP(CURPAT,1,V) FLIP 1,0 IF V=1 THEN PAL 0 ELSE PAL 2 CELL 19,2,46 CALL GETLOOP(CURPAT,2,V) FLIP 0,0 IF V=1 THEN PAL 0 ELSE PAL 2 CELL 19,3,47 END SUB SUB TOGGLELOOP V1=0 V2=0 V3=0 CALL GETLOOP(CURPAT,0,V1) CALL GETLOOP(CURPAT,1,V2) CALL GETLOOP(CURPAT,2,V3) V=V1+V2*2+V3*4 V=(V+1) MOD 5 CALL SETLOOP(CURPAT,0,V MOD 2) CALL SETLOOP(CURPAT,1,V\2 MOD 2) CALL SETLOOP(CURPAT,2,V\4 MOD 2) END SUB SUB DRAWPOS PAL 1 BG FILL 0,8 TO 19,8 CHAR 1 FOR I=0 TO 9 P=I+CURROW-4 IF P>=0 AND P= I*8 AND NOTE2 >= I*8 THEN CELL CX, CY, CC1+C2 ELSE IF NOTE1 >= I*8 AND NOTE2 < I*8-8 THEN CELL CX, CY, CC1+3 ELSE IF NOTE1 < I*8-8 AND NOTE2 >= I*8 THEN CELL CX, CY, 116+C2 ELSE IF NOTE1 < I*8-8 AND NOTE2 < I*8-8 THEN CELL CX, CY, 0 ELSE IF NOTE1 >= I*8-8 AND NOTE1=7 THEN L1=8 IF L2<0 THEN L2=0 IF L2>=7 THEN L2=8 CALL DRAWTIP(NUMC, L1, L2, (C1+1) MOD 2, (C1+1)\2, (C2+1) MOD 2, (C2+1)\2) CELL CX, CY, NUMC END IF NEXT I 'PAL 0 END SUB SUB DRAWTRACK2(TRA, ROW) NOTE1=0 SND1=0 VOL=0 COM=0 PAR=0 CALL GETROW(TRA,ROW,NOTE1,SND1,VOL,COM,PAR) NOTE2=0 SND2=0 VOL=0 COM=0 PAR=0 CALL GETROW(TRA,ROW+1,NOTE2,SND2,VOL,COM,PAR) CALL DRAWSLIDER(ROW, NOTE1, NOTE2, SND1, SND2) PAL 0 END SUB SUB DRAWTRACK(TRA,X) FOR I=0 TO 9 R=I+CURROW-4 IF R>=0 AND R=0 THEN CALL SETCURSOR(ZONEX(FOCUS), ZONEY(FOCUS), ZONEW(FOCUS), ZONEH(FOCUS)) ELSE CALL SETCURSOR(3+CURVOI*4,8,3,1) END IF END SUB SUB SETCURSOR(X,Y,W,H) SPRITE 0,X*8-1,Y*8-1,32 SPRITE 1,(X+W)*8-7,Y*8-1,32 SPRITE 2,X*8-1,(Y+H)*8-7,32 SPRITE 3,(X+W)*8-7,(Y+H)*8-7,32 END SUB SUB PREPARETRACK(TRA,VOIX) IF TRA=-1 THEN CALL GETFREETRACK(TRA) CALL SETTRACK(CURPAT,CURVOI,TRA) CALL DRAWPATINFO CALL DRAWTRACK(TRA,VOIX) END IF END SUB '=================================== TRACKEDITOR: IF TRACKERMODE=1 THEN GOTO TRACKEDITOR2 CLS SELTAB=1 SPRITE OFF CALL METERSON CALL RESETZONES BG SOURCE ROM(3) BG COPY 0,8,20,2 TO 0,0 ZONE_PAL=1 CALL SETZONE(0,0,0,2,2) CALL SETZONE(1,2,0,2,2) CALL SETZONE(2,4,0,2,2) CALL SETZONE(3,6,0,2,2) CALL SETZONE(4,8,0,2,2) CALL SETZONE(5,10,0,2,2) ZONE_PAL=-1 CALL SETZONE(6,12,0,2,2) CALL SETZONE(7,14,0,2,2) CALL SETZONE(8,16,0,2,2) ZONE_PAL=1 CALL SETZONE(9,18,0,2,2) ZONE_PAL=-1 CALL SETZONE(10,0,2,2,2) ZONE_PAL=-1 CALL SETZONE(30,0,4,20,10) FOCUS=-1 CURCOL=0 IF CURTRA=-1 THEN CURTRA=0 CALL DRAWTRAINFO CALL DRAWFULLTRACK CALL UPDATETRACURSOR CALL UPDATETRAINPUT OLDX=-1 OLDY=-1 DRAGGED=0 DO CALL UPDATEZONES IF ZONE_EVENT=E_UP THEN IF CUR_ZONE=0 THEN CALL PLAYTRACK(CURTRA,CURVOI) IF CUR_ZONE=1 THEN STOP IF PLAYER_MODE>0 THEN CALL STOPPLAYER ELSE IF CURROW>0 THEN CURROW=0 CALL DRAWFULLTRACK END IF END IF IF CUR_ZONE=5 THEN GOTO TRACKMENU IF CUR_ZONE=9 THEN GOTO DISKMENU END IF IF ZONE_EVENT=E_DOWN THEN IF CUR_ZONE=2 AND CURTRA>0 THEN CURTRA=CURTRA-1 CALL CHANGETRACK(CURTRA) CALL DRAWTRAINFO CALL DRAWFULLTRACK END IF IF CUR_ZONE=3 AND CURTRA-1 THEN FOCUS=-1 CALL UPDATETRACURSOR END IF OLDY=ZONE_IN_Y DRAGGED=0 ELSE IF ZONE_EVENT=E_DRAG THEN IF PLAYER_MODE<>3 THEN CURROW=MIN(NUMROWS-1,MAX(0,CURROW+OLDY-ZONE_IN_Y)) CALL DRAWFULLTRACK CALL UPDATETRACURSOR OLDY=ZONE_IN_Y END IF DRAGGED=-1 ELSE IF ZONE_EVENT=E_UP THEN IF NOT DRAGGED THEN IF ZONE_IN_X<7 THEN CURCOL=0 ELSE CURCOL=MIN(4,1+(ZONE_IN_X-7)\2) END IF IF PLAYER_MODE<>3 THEN CURROW=MIN(NUMROWS-1,MAX(0,CURROW+ZONE_IN_Y-4)) END IF CALL DRAWFULLTRACK CALL UPDATETRACURSOR END IF 'CALL UPDATETRAINPUT END IF END IF K$=INKEY$ IF K$=" " THEN STOP IF PLAYER_MODE>0 THEN CALL STOPPLAYER ELSE CALL PLAYTRACK(CURTRA,CURVOI) END IF ELSE IF K$<>"" AND FOCUS=-1 THEN K=ASC(K$) IF K=17 THEN CURCOL=(CURCOL+1) MOD 5 CALL UPDATETRACURSOR CALL UPDATETRAINPUT ELSE IF K=18 THEN CURCOL=(CURCOL+4) MOD 5 CALL UPDATETRACURSOR CALL UPDATETRAINPUT END IF IF PLAYER_MODE<>3 THEN IF K=19 THEN CURROW=(CURROW+1) MOD NUMROWS CALL DRAWFULLTRACK ELSE IF K=20 THEN CURROW=(CURROW+NUMROWS-1) MOD NUMROWS CALL DRAWFULLTRACK END IF END IF END IF IF FOCUS=10 THEN CALL HANDLEWHEEL(CURTRA,0,NUMTRAC-1,K$,UPD) IF UPD THEN CALL DRAWTRAINFO CALL DRAWFULLTRACK END IF END IF IF CURCOL=0 THEN CALL HANDLEKEYBOARD(1,3,K$,UPD) ELSE CALL HANDLEHEXPICKER(K$,UPD) END IF IF K$<>"" AND UPD AND PLAYER_MODE<>3 THEN CURROW=(CURROW+1) MOD NUMROWS CALL DRAWFULLTRACK END IF IF PLAYER_MODE=3 THEN IF PLAYER_ROW<>CURROW OR PLAYER_TRA<>CURTRA THEN T=CURTRA CURROW=PLAYER_ROW CURTRA=PLAYER_TRA IF CURTRA<>T THEN CALL DRAWTRAINFO CALL DRAWFULLTRACK END IF END IF WAIT VBL LOOP '------------- ATTEMPT TO DO A TACTILE TRACKEDITOR @GREENPILLOZ ------------ TRACKEDITOR2: CLS SELTAB=1 SPRITE OFF CALL METERSOFF CALL RESETZONES BG SOURCE ROM(3) BG COPY 0,8,20,2 TO 0,0 ZONE_PAL=1 CALL SETZONE(0,0,0,2,2) CALL SETZONE(1,2,0,2,2) CALL SETZONE(2,4,0,2,2) CALL SETZONE(3,6,0,2,2) CALL SETZONE(4,8,0,2,2) CALL SETZONE(5,10,0,2,2) ZONE_PAL=-1 CALL SETZONE(6,12,0,2,2) CALL SETZONE(7,14,0,2,2) CALL SETZONE(8,16,0,2,2) ZONE_PAL=1 CALL SETZONE(9,18,0,2,2) ZONE_PAL=-1 CALL SETZONE(10,0,2,2,2) 'SND CALL SETZONE(11, 8,2,2,1) 'VOL CALL SETZONE(12,11,2,2,1) 'COM CALL SETZONE(13,14,2,2,1) 'PAR CALL SETZONE(14,17,2,2,1) ZONE_PAL=-1 CALL SETZONE(30,-1,3,22,20) FOCUS=-1 CURCOL=0 IF CURTRA=-1 THEN CURTRA=0 CALL DRAWTRAINFO ROW=0 WHILE ROW<32-1 CALL DRAWTRACK2(CURTRA, ROW) ADD ROW, 2 WEND OLDX=-1 OLDY=-1 DRAGGED=0 CURVOL=0 CURCOM=0 CURPAR=0 DO CALL UPDATEZONES 'MENUS IF ZONE_EVENT=E_UP THEN IF CUR_ZONE=0 THEN CALL PLAYTRACK(CURTRA,CURVOI) IF CUR_ZONE=1 THEN STOP IF PLAYER_MODE>0 THEN CALL STOPPLAYER ELSE IF CURROW>0 THEN CURROW=0 'CALL DRAWFULLTRACK END IF END IF IF CUR_ZONE=5 THEN GOTO TRACKMENU IF CUR_ZONE=9 THEN GOTO DISKMENU IF CUR_ZONE=11 THEN CURSND=(CURSND+1) MOD 16 IF CUR_ZONE=12 THEN CURVOL=(CURVOL+1) MOD 16 IF CUR_ZONE=13 THEN CURCOM=(CURCOM+1) MOD 16 IF CUR_ZONE=14 THEN CURPAR=(CURPAR+1) MOD 16 END IF IF ZONE_EVENT=E_DOWN THEN IF CUR_ZONE=2 AND CURTRA>0 THEN CURTRA=CURTRA-1 CALL CHANGETRACK(CURTRA) CALL DRAWTRAINFO ROW=0 WHILE ROW<32-2 CALL DRAWTRACK2(CURTRA, ROW) ADD ROW, 2 WEND END IF IF CUR_ZONE=3 AND CURTRA=0 AND R<=31 AND N<=96 THEN IF N<0 THEN IF N>-4 THEN N=0 ELSE SND=0 VOL=0 COM=0 PAR=0 CALL GETROW(CURTRA,R,N,SND,VOL,COM,PAR) END IF END IF IF N>=1 THEN TEXT 4,2,NOTES$((N-1) MOD 12) NUMBER 6,2,(N-1)\12,1 CALL PLAYROW(CURTRA,R,CURVOI) ELSE TEXT 4,2," " END IF CALL SETNOTE(CURTRA,R,N) CALL SETVOL(CURTRA,R,CURVOL) CALL SETCOM(CURTRA,R,CURCOM) CALL SETPAR(CURTRA,R,CURPAR) CALL DRAWTRACK2(CURTRA, R\2*2) ELSE IF R>=34 AND N<=96 THEN IF N<0 THEN N=0 IF N>=1 THEN TEXT 4,2,NOTES$((N-1) MOD 12) NUMBER 6,2,(N-1)\12,1 CALL PLAYROW(CURTRA,R-34,CURVOI) ELSE TEXT 4,2," " END IF FOR I=0 TO 7 R2=R-34+I*4 CALL SETNOTE(CURTRA,R2,N) CALL SETVOL(CURTRA,R2,CURVOL) CALL SETCOM(CURTRA,R2,CURCOM) CALL SETPAR(CURTRA,R2,CURPAR) CALL DRAWTRACK2(CURTRA, R2\2*2) NEXT I END IF END IF K$=INKEY$ IF K$=" " THEN STOP IF PLAYER_MODE>0 THEN CALL STOPPLAYER ELSE CALL PLAYTRACK(CURTRA,CURVOI) END IF END IF IF PLAYER_MODE=3 THEN IF PLAYER_ROW<>CURROW OR PLAYER_TRA<>CURTRA THEN T=CURTRA CURROW=PLAYER_ROW CURTRA=PLAYER_TRA IF CURTRA<>T THEN CALL DRAWTRAINFO 'CALL DRAWFULLTRACK END IF END IF WAIT VBL LOOP ' ------------------------------------------ TRACKMENU: MENU$(0)="COPY" MENU$(1)="PASTE" MENU$(2)="OCTAVE UP" MENU$(3)="OCTAVE DOWN" MENU$(4)="NOTE UP" MENU$(5)="NOTE DOWN" MENU$(6)="CANCEL" CALL SHOWMENU("EDIT TRACK",6,R) IF R=0 THEN COPY ATRAC+CURTRA*TRACSIZE,TRACSIZE TO ACOPYTRAC IF R=1 THEN COPY ACOPYTRAC,TRACSIZE TO ATRAC+CURTRA*TRACSIZE IF R=2 THEN CALL TRANSPOSE(CURTRA,+12) IF R=3 THEN CALL TRANSPOSE(CURTRA,-12) IF R=4 THEN CALL TRANSPOSE(CURTRA,+1) IF R=5 THEN CALL TRANSPOSE(CURTRA,-1) GOTO TRACKEDITOR SUB UPDATETRACURSOR IF FOCUS>=0 THEN CALL SETCURSOR(ZONEX(FOCUS), ZONEY(FOCUS), ZONEW(FOCUS), ZONEH(FOCUS)) ELSE IF CURCOL=0 THEN CALL SETCURSOR(3,8,3,1) ELSE CALL SETCURSOR(7+(CURCOL-1)*2,8,1,1) END IF END IF END SUB SUB UPDATETRAINPUT IF CURCOL=0 THEN CALL SHOWKEYBOARD ELSE CALL SHOWHEXPICKER END IF END SUB SUB DRAWTRAINFO PAL 0 IF TRACKERMODE=0 THEN BG FILL 0,2 TO 19,3 CHAR 1 TEXT 0,2,"TR" PAL 2 NUMBER 0,3,CURTRA,2 PAL 0 TEXT 3,3,"N S V C P" CELL 8, 0, 76 CELL 9, 0, 77 CELL 8, 1, 17 CELL 9, 1, 108 ELSE BG FILL 1,15 TO 19,15 CHAR 1 BG FILL 1,16 TO 19,16 CHAR 1 'BG FILL 0,3 TO 0,16 CHAR 1 CELL 0,15, 1 BG FILL 0,2 TO 19,2 CHAR 1 BG FILL 18,3 TO 18,14 CHAR 105 BG FILL 19,3 TO 19,14 CHAR 105 'CELL 19,15, 1 FOR I=1 TO 8 CELL I*2-1, 15, 106 CELL I*2, 15, 107 NEXT I FOR I=0 TO 11 CELL 0, 14-I, 110 - ((I MOD 3) * 16) CELL 17, 14-I, 111 - ((I MOD 3) * 16) NEXT I 'CELL 1,15,1 'CELL 18,15,1 CELL 8, 0, 92 CELL 9, 0, 93 CELL 8, 1, 17 CELL 9, 1, 81 TEXT 8, 2, "S" TEXT 11, 2, "V" TEXT 14, 2, "C" TEXT 17, 2, "P" END IF END SUB SUB DRAWFULLTRACK PAL 3 BG FILL 0,4 TO 20,13 CHAR 0 CALL DRAWPOS CALL DRAWTRACK(CURTRA,3) CALL DRAWTRACKPARAMS END SUB SUB DRAWTRACKPARAMS FOR I=0 TO 9 R=I+CURROW-4 IF R>=0 AND R0 AND NOTE<255 THEN TEXT 7,Y,HEXS$(SND) TEXT 9,Y,HEXS$(VOL) ELSE TEXT 7,Y,"- -" END IF IF COM>0 OR PAR>0 THEN TEXT 11,Y,HEXS$(COM) TEXT 13,Y,HEXS$(PAR) ELSE TEXT 11,Y,"- -" END IF END SUB '=================================== SOUNDEDITOR: SELTAB=2 CALL METERSOFF SPRITE OFF CALL RESETZONES BG SOURCE ROM(3) BG COPY 0,10,20,2 TO 0,0 PAL 0 BG FILL 0,2 TO 19,16 CHAR 1 BG COPY 0,12,20,2 TO 0,2 TEXT 0,2,"SND" FOR I=0 TO 15 TEXT 4+I,2,HEXS$(I) NEXT I PAL 0 TEXT 0,5,"SND:" TEXT 4,5,"WAV" TEXT 8,5,"PW" TEXT 12,5,"LEN" TEXT 0,7,"ENV:" TEXT 4,7,"ATT" TEXT 8,7,"DEC" TEXT 12,7,"SUS" TEXT 16,7,"REL" TEXT 0,9,"LFO:" TEXT 4,9,"RAT" TEXT 8,9,"FRQ" TEXT 12,9,"VOL" TEXT 16,9,"PW" TEXT 4,11,"WAV" TEXT 8,11,"INV" TEXT 12,11,"ENV" TEXT 16,11,"TRG" ZONE_PAL=1 CALL SETZONE(0,0,0,2,2) CALL SETZONE(1,2,0,2,2) CALL SETZONE(2,4,0,2,2) ZONE_PAL=-1 CALL SETZONE(6,12,0,2,2) CALL SETZONE(7,14,0,2,2) CALL SETZONE(8,16,0,2,2) ZONE_PAL=1 CALL SETZONE(9,18,0,2,2) ZONE_PAL=-1 CALL SETZONE(10,4,2,16,2) CALL SETZONE(11,4,5,3,2) CALL SETZONE(12,8,5,3,2) CALL SETZONE(13,12,5,3,2) CALL SETZONE(14,4,7,3,2) CALL SETZONE(15,8,7,3,2) CALL SETZONE(16,12,7,3,2) CALL SETZONE(17,16,7,3,2) CALL SETZONE(18,4,9,3,2) CALL SETZONE(19,8,9,3,2) CALL SETZONE(30,12,9,3,2) CALL SETZONE(31,16,9,3,2) CALL SETZONE(32,4,11,3,2) CALL SETZONE(33,8,11,3,2) CALL SETZONE(34,12,11,3,2) CALL SETZONE(35,16,11,3,2) FOCUS=-1 CALL DRAWSNDSEL CALL DRAWSNDPARAMS CALL SHOWKEYBOARD CALL UPDATESNDCURSOR OLDX=-1 DO CALL UPDATEZONES IF ZONE_EVENT=E_UP THEN IF CUR_ZONE=0 THEN STOP CALL STOPPLAYER END IF IF CUR_ZONE=2 THEN GOTO SOUNDMENU IF CUR_ZONE=9 THEN GOTO DISKMENU END IF IF ZONE_EVENT=E_DOWN THEN IF CUR_ZONE=1 THEN FOCUS=-1 CALL SHOWKEYBOARD END IF IF CUR_ZONE=6 THEN GOTO PATTERNEDITOR IF CUR_ZONE=7 THEN GOTO TRACKEDITOR END IF IF CUR_ZONE=10 AND (ZONE_EVENT=E_DOWN OR ZONE_EVENT=E_DRAG) THEN CURSND=ZONE_IN_X CALL DRAWSNDSEL CALL DRAWSNDPARAMS END IF IF ZONE_EVENT=E_DOWN THEN IF (CUR_ZONE>=12 AND CUR_ZONE<=19) OR (CUR_ZONE>=30 AND CUR_ZONE<=31) THEN IF FOCUS<>CUR_ZONE THEN FOCUS=CUR_ZONE IF CUR_ZONE=13 THEN CALL SHOWWHEEL ELSE CALL SHOWHEXPICKER END IF END IF ELSE IF CUR_ZONE=11 OR CUR_ZONE>=32 THEN IF FOCUS>=0 THEN FOCUS=-1 CALL SHOWKEYBOARD END IF END IF CALL UPDATESNDCURSOR A=AINST+CURSND*INSTSIZE IF CUR_ZONE=11 THEN 'WAVEFORM V=(PEEK(A)\16) AND %11 POKE A,(PEEK(A) AND %11001111) OR (((V+1) MOD 4)*16) CALL DRAWSNDPARAMS END IF IF CUR_ZONE=32 THEN 'LFO WAVEFORM V=PEEK(A+4) AND %11 POKE A+4,(PEEK(A+4) AND %11111100) OR ((V+1) MOD 4) CALL DRAWSNDPARAMS END IF IF CUR_ZONE=33 THEN 'LFO INVERT POKE A+4,PEEK(A+4) XOR %00000100 CALL DRAWSNDPARAMS END IF IF CUR_ZONE=34 THEN 'LFO ENV MODE POKE A+4,PEEK(A+4) XOR %00001000 CALL DRAWSNDPARAMS END IF IF CUR_ZONE=35 THEN 'LFO TRIGGER POKE A+4,PEEK(A+4) XOR %00010000 CALL DRAWSNDPARAMS END IF END IF K$=INKEY$ IF K$=" " THEN STOP CALL STOPPLAYER END IF IF FOCUS=-1 THEN CALL HANDLEKEYBOARD(2,0,K$,UPD) ELSE IF FOCUS=13 THEN 'WHEEL: LENGTH IF CUR_ZONE=20 THEN IF ZONE_EVENT=E_DOWN THEN VOLUME CURVOI,15,%11 CALL SETSOUND(CURVOI,CURSND) PLAY CURVOI,CURNOTE ELSE IF ZONE_EVENT=E_UP OR ZONE_EVENT=E_OUT THEN STOP CURVOI END IF END IF A=AINST+CURSND*INSTSIZE V=PEEK(A+1) CALL HANDLEWHEEL(V,0,255,K$,UPD) IF UPD THEN POKE A+1,V IF V>0 THEN POKE A,PEEK(A) OR %01000000 ELSE POKE A,PEEK(A) AND %10111111 END IF CALL DRAWSNDPARAMS CALL SETSOUND(CURVOI,CURSND) PLAY CURVOI,CURNOTE END IF ELSE CALL HANDLESNDHEXPICKER(K$) END IF WAIT VBL LOOP SOUNDMENU: MENU$(0)="COPY" MENU$(1)="PASTE" MENU$(2)="CANCEL" CALL SHOWMENU("EDIT SOUND",2,R) IF R=0 THEN COPY AINST+CURSND*INSTSIZE,INSTSIZE TO ACOPYINST IF R=1 THEN COPY ACOPYINST,INSTSIZE TO AINST+CURSND*INSTSIZE GOTO SOUNDEDITOR SUB UPDATESNDCURSOR IF FOCUS>=0 THEN CALL SETCURSOR(ZONEX(FOCUS), ZONEY(FOCUS), ZONEW(FOCUS), ZONEH(FOCUS)) ELSE SPRITE OFF END IF END SUB SUB DRAWSNDSEL BG TINT 4,2 TO 19,3 PAL 0 BG TINT 4+CURSND,2 TO 4+CURSND,3 PAL 1 END SUB SUB DRAWSNDPARAMS A=AINST+CURSND*INSTSIZE PAL 2 'SND: TEXT 4,6,SNDWAV$(PEEK(A)\16 MOD 4) TEXT 8,6,HEXS$(PEEK(A) MOD 16) IF PEEK(A) AND %01000000 THEN TEXT 12,6," " TEXT 12,6,STR$(PEEK(A+1)) ELSE TEXT 12,6,"OFF" END IF 'ENV: TEXT 4,8,HEXS$(PEEK(A+2) MOD 16) TEXT 8,8,HEXS$(PEEK(A+2)\16) TEXT 12,8,HEXS$(PEEK(A+3) MOD 16) TEXT 16,8,HEXS$(PEEK(A+3)\16) 'LFO: TEXT 4,10,HEXS$(PEEK(A+5) MOD 16) TEXT 8,10,HEXS$(PEEK(A+5)\16) TEXT 12,10,HEXS$(PEEK(A+6) MOD 16) TEXT 16,10,HEXS$(PEEK(A+6)\16) 'LFO ATTR: TEXT 4,12,LFOWAV$(PEEK(A+4) MOD 4) TEXT 8,12,FLAG$(PEEK(A+4)\4 MOD 2) TEXT 12,12,FLAG$(PEEK(A+4)\8 MOD 2) TEXT 16,12,FLAG$(PEEK(A+4)\16 MOD 2) END SUB SUB HANDLESNDHEXPICKER(KEY$) KEYVAL=INSTR(VALKEYS$,KEY$)-1 IF CUR_ZONE=20 OR KEYVAL>=0 THEN IF ZONE_EVENT=E_DOWN OR ZONE_EVENT=E_DRAG OR KEYVAL>=0 THEN A=AINST+CURSND*INSTSIZE IF KEYVAL>=0 THEN N=KEYVAL ELSE N=ZONE_IN_X 'SND: IF FOCUS=12 THEN POKE A,(PEEK(A) AND $F0) OR N 'ENV: IF FOCUS=14 THEN POKE A+2,(PEEK(A+2) AND $F0) OR N IF FOCUS=15 THEN POKE A+2,(PEEK(A+2) AND $0F) OR N*16 IF FOCUS=16 THEN POKE A+3,(PEEK(A+3) AND $F0) OR N IF FOCUS=17 THEN POKE A+3,(PEEK(A+3) AND $0F) OR N*16 'LFO: IF FOCUS=18 THEN POKE A+5,(PEEK(A+5) AND $F0) OR N IF FOCUS=19 THEN POKE A+5,(PEEK(A+5) AND $0F) OR N*16 IF FOCUS=30 THEN POKE A+6,(PEEK(A+6) AND $F0) OR N IF FOCUS=31 THEN POKE A+6,(PEEK(A+6) AND $0F) OR N*16 CALL DRAWSNDPARAMS VOLUME CURVOI,15,%11 CALL SETSOUND(CURVOI,CURSND) PLAY CURVOI,CURNOTE ELSE IF ZONE_EVENT=E_UP OR ZONE_EVENT=E_OUT THEN STOP CURVOI END IF END IF END SUB '==== INPUT BARS ==== SUB SHOWKEYBOARD BG COPY 0,2,20,2 TO 0,14 CALL DRAWOCTAVE CALL CLEARZONES(20,29) ZONE_PAL=-1 CALL SETZONE(20,4,14,12,2) ZONE_PAL=1 CALL SETZONE(21,0,14,2,2) CALL SETZONE(22,2,14,2,2) CALL SETZONE(23,16,14,2,2) CALL SETZONE(24,18,14,2,2) END SUB 'MODE 0: PATTERN EDITOR 'MODE 1: TRACK EDITOR 'MODE 2: SOUND EDITOR SUB HANDLEKEYBOARD(MODE,VOIX,KEY$,UPD) UPD=0 KEY=INSTR(KEYS$,KEY$) IF FOCUS=-1 THEN IF CUR_ZONE=20 OR KEY>0 THEN IF ZONE_EVENT=E_DOWN OR ZONE_EVENT=E_DRAG OR KEY>0 THEN IF MODE=0 THEN CALL PREPARETRACK(CURTRA,VOIX) IF KEY>0 THEN N=CUROCT*12+KEY ELSE N=CUROCT*12+ZONE_IN_X+1 END IF IF N>=1 AND N<=95 THEN CURNOTE=N IF MODE=2 THEN VOLUME CURVOI,15,%11 CALL SETSOUND(CURVOI,CURSND) PLAY CURVOI,N ELSE IF CURTRA>=0 THEN CALL SETNOTE(CURTRA,CURROW,N) UPD=-1 CALL PLAYROW(CURTRA,CURROW,CURVOI) END IF END IF ELSE IF ZONE_EVENT=E_UP OR ZONE_EVENT=E_OUT THEN STOP CURVOI END IF END IF IF CUR_ZONE=21 AND ZONE_EVENT=E_DOWN THEN IF CUROCT>0 THEN CUROCT=CUROCT-1 CALL DRAWOCTAVE END IF END IF IF CUR_ZONE=22 AND ZONE_EVENT=E_DOWN THEN IF CUROCT<7 THEN CUROCT=CUROCT+1 CALL DRAWOCTAVE END IF END IF IF MODE<>2 THEN IF (CUR_ZONE=23 AND ZONE_EVENT=E_UP) OR KEY$=CHR$(10) THEN IF MODE=0 THEN CALL PREPARETRACK(CURTRA,VOIX) IF CURTRA>=0 THEN CALL SETNOTE(CURTRA,CURROW,255) UPD=-1 STOP CURVOI END IF END IF IF ((CUR_ZONE=24 AND ZONE_EVENT=E_UP) OR KEY$=CHR$(8)) AND CURTRA>=0 THEN CALL SETNOTE(CURTRA,CURROW,0) UPD=-1 STOP CURVOI END IF IF UPD THEN CALL DRAWNOTE(CURTRA,CURROW,VOIX,8) IF MODE=1 THEN CALL DRAWPARAM(CURTRA,CURROW,8) END IF END IF END IF END SUB SUB SHOWWHEEL BG COPY 0,4,20,2 TO 0,14 CALL CLEARZONES(20,29) ZONE_PAL=-1 CALL SETZONE(20,0,14,20,2) END SUB SUB HANDLEWHEEL(VALUE,VMIN,VMAX,KEY$,UPD) UPD=0 IF CUR_ZONE=20 THEN IF ZONE_EVENT=E_DOWN THEN OLDX=ZONE_IN_X ELSE IF ZONE_EVENT=E_DRAG THEN VALUE=MAX(VMIN,MIN(VMAX,VALUE+ZONE_IN_X-OLDX)) UPD=-1 OLDX=ZONE_IN_X END IF END IF IF KEY$<>"" THEN K=ASC(KEY$) IF K=17 THEN VALUE=MAX(VMIN,MIN(VMAX,VALUE+10)) UPD=-1 ELSE IF K=18 THEN VALUE=MAX(VMIN,MIN(VMAX,VALUE-10)) UPD=-1 ELSE IF K=19 THEN VALUE=MAX(VMIN,MIN(VMAX,VALUE-1)) UPD=-1 ELSE IF K=20 THEN VALUE=MAX(VMIN,MIN(VMAX,VALUE+1)) UPD=-1 ELSE IF KEY$>="0" AND KEY$<="9" THEN V$=STR$(MAX(0,VALUE)) IF VMAX<99 THEN L=1 ELSE L=2 V$=RIGHT$(V$,L)+KEY$ V=VAL(V$) IF V>VMAX THEN V=VAL(KEY$) VALUE=V UPD=-1 ELSE IF KEY$=CHR$(8) THEN VALUE=VMIN UPD=-1 END IF END IF END SUB SUB SHOWHEXPICKER BG COPY 0,6,20,2 TO 0,14 PAL 0 FOR I=0 TO 15 TEXT I,15,HEXS$(I) NEXT I CALL CLEARZONES(20,29) ZONE_PAL=-1 CALL SETZONE(20,0,14,16,2) END SUB SUB HANDLEHEXPICKER(KEY$,UPD) UPD=0 KEYVAL=INSTR(VALKEYS$,KEY$)-1 IF FOCUS=-1 THEN IF CUR_ZONE=20 OR KEYVAL>=0 THEN IF ZONE_EVENT=E_DOWN OR ZONE_EVENT=E_DRAG OR KEYVAL>=0 THEN IF KEYVAL>=0 THEN N=KEYVAL ELSE N=ZONE_IN_X IF CURCOL=1 THEN CALL SETSND(CURTRA,CURROW,N) CALL PLAYROW(CURTRA,CURROW,CURVOI) CURSND=N END IF IF CURCOL=2 THEN CALL SETVOL(CURTRA,CURROW,N) CALL PLAYROW(CURTRA,CURROW,CURVOI) END IF IF CURCOL=3 THEN CALL SETCOM(CURTRA,CURROW,N) IF CURCOL=4 THEN CALL SETPAR(CURTRA,CURROW,N) CALL DRAWPARAM(CURTRA,CURROW,8) UPD=-1 ELSE IF ZONE_EVENT=E_UP OR ZONE_EVENT=E_OUT THEN STOP CURVOI END IF END IF END IF END SUB '=================================== DISKMENU: CALL METERSOFF SPRITE OFF CALL RESETZONES FILES CALL DRAWDISKMENU ZONE_PAL=-1 CALL SETZONE(0,0,2,18,10) ZONE_PAL=1 CALL SETZONE(1,18,2,2,2) CALL SETZONE(2,18,10,2,2) CALL SETZONE(3,1,13,2,2) CALL SETZONE(4,15,13,2,2) CALL SETZONE(5,17,13,2,2) CALL SETZONE(6,13,13,2,2) DO CALL UPDATEZONES IF ZONE_EVENT=E_DOWN OR ZONE_EVENT=E_DRAG THEN IF CUR_ZONE=0 THEN SOUNDFILE=ZONE_IN_Y+FILESOFFS CALL DRAWFILES END IF END IF IF ZONE_EVENT=E_DOWN THEN IF CUR_ZONE=1 THEN FILESOFFS=0 CALL DRAWFILES END IF IF CUR_ZONE=2 THEN FILESOFFS=6 CALL DRAWFILES END IF END IF IF ZONE_EVENT=E_UP THEN IF CUR_ZONE=3 THEN GOTO MAIN IF CUR_ZONE=4 THEN OK=0 CALL BLOAD(OK) IF OK THEN GOTO MAIN END IF IF CUR_ZONE=5 THEN OK=0 CALL BSAVE(OK) IF OK THEN GOTO MAIN END IF IF CUR_ZONE=6 THEN MENU$(0)="CLEAR ALL" MENU$(1)="KEEP SOUNDS" MENU$(2)="CANCEL" CALL SHOWMENU("CLEAR MUSIC?",2,R) CALL DRAWDISKMENU IF R=0 THEN CALL BNEW GOTO MAIN END IF IF R=1 THEN CALL BCLEARTRACKS GOTO MAIN END IF END IF END IF WAIT VBL LOOP SUB DRAWDISKMENU BG SOURCE ROM(4) BG COPY 0,0,20,16 TO 0,0 PAL 1 TEXT 0,0," DISK MENU " SPRITE OFF CALL DRAWFILES END SUB SUB DRAWFILES FOR I=0 TO 9 N=I+FILESOFFS IF N=SOUNDFILE THEN PAL 1 ELSE PAL 0 NUMBER 0,2+I,N,2 TEXT 2,2+I,": " TEXT 3,2+I,LEFT$(FILE$(N),17) NEXT I END SUB SUB BLOAD(OK) OK=0 IF SOUNDFILE=-1 THEN CALL SHOWMESSAGE("SELECT FILE") EXIT SUB END IF CALL CLEARMUSIC LOAD SOUNDFILE,$A000 CALL INITSTATUS OK=-1 END SUB SUB BSAVE(OK) IF SOUNDFILE=-1 THEN CALL SHOWMESSAGE("SELECT FILE") EXIT SUB END IF LT=-1 HP=0 CALL GETLASTTRACK(LT) CALL HASPATTERNS(HP) F$=FILE$(SOUNDFILE) IF F$="" THEN F$="SOUND" S=NUMINST*INSTSIZE IF LT>=0 OR HP THEN S=S+NUMPATT*PATTSIZE+(LT+1)*TRACSIZE END IF SAVE SOUNDFILE,F$,$A000,S CALL DRAWFILES CALL SHOWMESSAGE("SAVED") OK=-1 END SUB SUB BNEW CALL CLEARMUSIC CALL INITSTATUS SOUNDFILE=-1 END SUB SUB BCLEARTRACKS CALL CLEARPATTERNS CALL CLEARTRACKS CALL INITSTATUS SOUNDFILE=-1 END SUB '=================================== SUB SETNOTE(TRA,ROW,N) A=ATRAC+TRA*TRACSIZE+ROW*ROWSIZE POKE A,N IF N>0 AND N<255 THEN CALL SETSND(TRA,ROW,CURSND) CALL SETVOL(TRA,ROW,15) ELSE IF N=0 THEN POKE A+1,0 END IF END SUB SUB SETSND(TRA,ROW,N) A=ATRAC+TRA*TRACSIZE+ROW*ROWSIZE NOTE=PEEK(A) IF NOTE>0 AND NOTE<255 THEN POKE A+1,(PEEK(A+1) AND $0F) OR N*16 END IF END SUB SUB SETVOL(TRA,ROW,N) A=ATRAC+TRA*TRACSIZE+ROW*ROWSIZE NOTE=PEEK(A) IF NOTE>0 AND NOTE<255 THEN POKE A+1,(PEEK(A+1) AND $F0) OR N END IF END SUB SUB SETCOM(TRA,ROW,N) A=ATRAC+TRA*TRACSIZE+ROW*ROWSIZE+2 POKE A,(PEEK(A) AND $0F) OR N*16 END SUB SUB SETPAR(TRA,ROW,N) A=ATRAC+TRA*TRACSIZE+ROW*ROWSIZE+2 POKE A,(PEEK(A) AND $F0) OR N END SUB SUB GETROW(TRA,ROW,NOTE,SND,VOL,COM,PAR) A=ATRAC+TRA*TRACSIZE+ROW*ROWSIZE NOTE=PEEK(A) SND=PEEK(A+1)\16 VOL=PEEK(A+1) AND $0F COM=PEEK(A+2)\16 PAR=PEEK(A+2) AND $0F END SUB SUB TRANSPOSE(TRA,N) FOR ROW=0 TO NUMROWS-1 A=ATRAC+TRA*TRACSIZE+ROW*ROWSIZE NOTE=PEEK(A) IF NOTE>0 AND NOTE<255 THEN TN=NOTE+N IF TN>0 AND TN<255 THEN POKE A,TN END IF NEXT ROW END SUB SUB SETTRACK(PAT,VOI,TRA) A=APATT+PAT*PATTSIZE+VOI HI=PEEK(A) AND %10000000 IF TRA>=0 THEN POKE A,(TRA OR HI) ELSE POKE A,(%01000000 OR HI) END SUB SUB GETTRACK(PAT,VOI,TRA) A=APATT+PAT*PATTSIZE+VOI TRA=(PEEK(A) AND %01111111) IF TRA=%01000000 THEN TRA=-1 END SUB SUB ISPATTERNEMPTY(PAT,EMP) EMP=-1 T=-1 FOR V=0 TO 3 CALL GETTRACK(PAT,V,T) IF T>=0 THEN EMP=0 EXIT SUB END IF NEXT V END SUB SUB HASPATTERNS(HAS) HAS=0 EMP=0 FOR P=0 TO NUMPATT-1 CALL ISPATTERNEMPTY(P,EMP) IF NOT EMP THEN HAS=-1 EXIT SUB END IF NEXT P END SUB SUB GETFREETRACK(TRA) NOTE=0 SND=0 VOL=0 COM=0 PAR=0 FOR T=0 TO NUMTRAC-1 OK=-1 FOR R=0 TO NUMROWS-1 CALL GETROW(T,R,NOTE,SND,VOL,COM,PAR) IF NOTE>0 OR SND>0 OR VOL>0 OR COM>0 OR PAR>0 THEN OK=0 R=31 END IF NEXT R IF OK THEN TRA=T EXIT SUB END IF NEXT T TRA=-1 END SUB SUB GETLOOPSTART(PAT) V=0 FOR P=PAT TO 0 STEP -1 CALL GETLOOP(P,0,V) IF V=1 THEN PAT=P EXIT SUB END IF NEXT P PAT=0 END SUB SUB SETLOOP(PAT,PARAM,VALUE) A=APATT+PAT*PATTSIZE+PARAM TRA=(PEEK(A) AND %01111111) POKE A,(VALUE*128 OR TRA) END SUB SUB GETLOOP(PAT,PARAM,VALUE) A=APATT+PAT*PATTSIZE+PARAM VALUE=PEEK(A)\128 END SUB SUB CLEARMUSIC 'SOUNDS CALL CLEARSOUNDS 'PATTERNS CALL CLEARPATTERNS 'TRACKS CALL CLEARTRACKS END SUB SUB CLEARPATTERNS FILL APATT,NUMPATT*PATTSIZE,%01000000 END SUB SUB CLEARTRACKS FOR T=0 TO NUMTRAC-1 CALL CLEARTRACK(T) NEXT T END SUB SUB CLEARSOUNDS COPY ROM(15),NUMINST*INSTSIZE TO AINST END SUB SUB CLEARTRACK(TRA) A=ATRAC+TRA*TRACSIZE FILL A,TRACSIZE,0 END SUB SUB GETLASTTRACK(TRA) NOTE=0 SND=0 VOL=0 COM=0 PAR=0 FOR T=NUMTRAC-1 TO 0 STEP -1 OK=0 FOR R=0 TO NUMROWS-1 CALL GETROW(T,R,NOTE,SND,VOL,COM,PAR) IF NOTE>0 OR SND>0 OR VOL>0 OR COM>0 OR PAR>0 THEN OK=-1 R=31 END IF NEXT R IF OK THEN TRA=T EXIT SUB END IF NEXT T TRA=-1 END SUB '==== PLAYER ==== 'MODE 1: SONG 'MODE 2: PATTERN SUB PLAYMUSIC(PAT,MODE) STOP PLAYER_PAT=PAT PLAYER_MODE=MODE PLAYER_SPEED=8 PLAYER_TICK=-1 PLAYER_ROW=0 PLAYER_BREAK=0 PLAYER_TRA=-1 PLAYER_VOI=-1 SYSTEM 0,0 END SUB SUB PLAYTRACK(TRA,VOI) STOP PLAYER_TRA=TRA PLAYER_VOI=VOI PLAYER_MODE=3 PLAYER_SPEED=8 PLAYER_TICK=-1 PLAYER_ROW=0 PLAYER_BREAK=0 PLAYER_PAT=-1 SYSTEM 0,0 END SUB SUB CHANGEMUSIC(PAT) IF PLAYER_MODE<1 OR PLAYER_MODE>2 THEN EXIT SUB STOP PLAYER_PAT=PAT PLAYER_TICK=-1 PLAYER_ROW=0 END SUB SUB CHANGETRACK(TRA) IF PLAYER_MODE<>3 THEN EXIT SUB STOP PLAYER_TRA=TRA PLAYER_TICK=-1 PLAYER_ROW=0 END SUB SUB STOPPLAYER PLAYER_MODE=0 SYSTEM 0,1 END SUB SUB UPDATEPLAYER CALL UPDMETERSVBL IF PLAYER_MODE=0 THEN EXIT SUB IF PLAYER_TICK=-1 THEN PLAYER_TICK=0 ELSE IF PLAYER_TICK=0 THEN IF PLAYER_BREAK THEN PLAYER_BREAK=0 PLAYER_ROW=0 ELSE PLAYER_ROW=(PLAYER_ROW+1) MOD NUMROWS END IF IF PLAYER_ROW=0 AND PLAYER_MODE=1 THEN V=0 CALL GETLOOP(PLAYER_PAT,2,V) IF V=1 THEN PLAYER_MODE=0 EXIT SUB END IF CALL GETLOOP(PLAYER_PAT,1,V) IF V=1 THEN CALL GETLOOPSTART(PLAYER_PAT) ELSE P=PLAYER_PAT+1 IF P=0 THEN CALL PLAYROW(T,PLAYER_ROW,V) NEXT V END IF IF PLAYER_SPEED=0 THEN PLAYER_MODE=0 EXIT SUB END IF END IF PLAYER_TICK=(PLAYER_TICK+1) MOD PLAYER_SPEED END SUB SUB PLAYROW(TRA,ROW,VOI) NOTE=0 SND=0 VOL=0 COM=0 PAR=0 CALL GETROW(TRA,ROW,NOTE,SND,VOL,COM,PAR) IF NOTE>0 AND NOTE<255 THEN CALL SETSOUND(VOI,SND) IF VOL>0 THEN VOLUME VOI,VOL, CALL COMMAND(VOI,COM,PAR) IF NOTE=255 THEN STOP VOI ELSE IF NOTE>0 THEN PLAY VOI,NOTE END IF END SUB SUB SETSOUND(VOI,SND) A=AINST+SND*INSTSIZE TA=$FF40+VOI*12+4 COPY A,INSTSIZE TO TA END SUB SUB COMMAND(VOI,COM,PAR) IF COM=0 AND PAR=0 THEN EXIT SUB IF COM=$0 THEN VOLUME VOI,,PAR AND %11 ELSE IF COM=$1 THEN ENVELOPE VOI,PAR,,, ELSE IF COM=$2 THEN ENVELOPE VOI,,PAR,, ELSE IF COM=$3 THEN ENVELOPE VOI,,,PAR, ELSE IF COM=$4 THEN ENVELOPE VOI,,,,PAR ELSE IF COM=$5 THEN LFO VOI,PAR,,, ELSE IF COM=$6 THEN LFO VOI,,PAR,, ELSE IF COM=$7 THEN LFO VOI,,,PAR, ELSE IF COM=$8 THEN LFO VOI,,,,PAR ELSE IF COM=$9 THEN SOUND VOI,,PAR, ELSE IF COM=$D THEN PLAYER_SPEED=$10+PAR ELSE IF COM=$E THEN PLAYER_SPEED=PAR ELSE IF COM=$F THEN IF PAR=0 THEN PLAYER_BREAK=-1 ELSE IF PAR=1 THEN STOP VOI VOLUME VOI,0, END IF END IF END SUB '==== GENERIC UI ==== SUB SHOWMESSAGE(MSG$) COPY $9000,40 TO $D000 PAL 1 BG FILL 0,0 TO 19,0 CHAR 192 TEXT 0,0,MSG$ WAIT 60 COPY $D000,40 TO $9000 END SUB SUB SHOWMENU(MSG$,MAXI,RESULT) PAL 1 PRIO 1 BG FILL 0,0 TO 19,0 CHAR 192 TEXT (20-LEN(MSG$))/2,0,MSG$ PAL 0 Y=3+MAXI*2 BG FILL 0,1 TO 19,Y CHAR 1 BG FILL 0,1 TO 19,1 CHAR 31 BG FILL 0,Y TO 19,Y CHAR 16 FOR I=0 TO MAXI T$=MENU$(I) TEXT (20-LEN(T$))/2,2+I*2,T$ NEXT I WHILE TOUCH WAIT VBL WEND DO IF TOUCH AND TOUCH.Y>=12 THEN I=(((TOUCH.Y-4)\8)-1)\2 IF I<=MAXI THEN CALL HIGHLIGHT(0,2+I*2,19,2+I*2) WHILE TOUCH WAIT VBL WEND RESULT=I GOTO EXITMENU END IF END IF WAIT VBL LOOP EXITMENU: PRIO 0 END SUB SUB HIGHLIGHT(X1,Y1,X2,Y2) BG TINT X1,Y1 TO X2,Y2 PAL 1 END SUB SUB METERSON SPRITE OFF 60 TO 63 FOR V=0 TO 3 SPRITE 60+V PAL 4 SIZE 3 NEXT V METERSENABLED=-1 ON RASTER CALL UPDMETERSRASTER END SUB SUB METERSOFF METERSENABLED=0 ON RASTER OFF SPRITE OFF 60 TO 63 END SUB SUB UPDMETERSVBL IF NOT METERSENABLED THEN EXIT SUB IF SELTAB=0 THEN FOR V=0 TO 3 PEAK=PEEK($FF40+V*12+3) SPRITE 60+V,(6+V*4)*8,(255-PEAK)/8+32,128 NEXT V ELSE IF SELTAB=1 THEN PEAK=PEEK($FF40+CURVOI*12+3) SPRITE 60,6*8,(255-PEAK)/8+32,128 END IF END SUB SUB UPDMETERSRASTER IF RASTER=64 THEN SPRITE OFF 60 TO 63 END SUB '==== TOUCH ZONES SUBPROGRAMS ==== SUB SETZONE(N,X,Y,W,H) ZONEX(N)=X ZONEY(N)=Y ZONEW(N)=W ZONEH(N)=H IF ZONE_PAL>=0 AND ZONE_PAL<8 THEN 'HIGHLIGHT AND NORMAL PALETTE P=CELL.A(X,Y) AND %111 ZONEP(N)=(ZONE_PAL*16)+P ELSE 'NO HIGHLIGHT ZONEP(N)=$FF END IF END SUB SUB CLEARZONE(N) CALL SETZONE(N,0,0,0,0) END SUB SUB CLEARZONES(N,M) FOR I=N TO M CALL SETZONE(I,0,0,0,0) NEXT I END SUB SUB RESETZONES FOR I=0 TO MAX_ZONE CALL CLEARZONE(I) NEXT I CUR_ZONE=-1 ZONE_PAL=-1 END SUB SUB UPDATEZONES CX=TOUCH.X\8 CY=TOUCH.Y\8 IF ZONE_EVENT=E_UP OR ZONE_EVENT=E_OUT THEN CUR_ZONE=-1 ZONE_EVENT=0 IF CUR_ZONE>=0 THEN CALL INSIDEZONE(CUR_ZONE,CX,CY) IF ZONE_RESULT THEN ZONE_IN_X=CX-ZONEX(CUR_ZONE) ZONE_IN_Y=CY-ZONEY(CUR_ZONE) IF NOT TOUCH THEN CALL PAINTZONE(CUR_ZONE,0) ZONE_EVENT=E_UP ELSE IF CX<>ZONE_LAST_X OR CY<>ZONE_LAST_Y THEN ZONE_EVENT=E_DRAG END IF ELSE CALL PAINTZONE(CUR_ZONE,0) ZONE_EVENT=E_OUT END IF ELSE IF TAP THEN FOR I=0 TO MAX_ZONE IF ZONEW(I)>0 THEN CALL INSIDEZONE(I,CX,CY) IF ZONE_RESULT THEN ZONE_EVENT=E_DOWN CUR_ZONE=I ZONE_IN_X=CX-ZONEX(I) ZONE_IN_Y=CY-ZONEY(I) CALL PAINTZONE(I,1) END IF END IF NEXT I END IF ZONE_LAST_X=CX ZONE_LAST_Y=CY END SUB SUB INSIDEZONE(N,CX,CY) ZONE_RESULT=(CX>=ZONEX(N) AND CX=ZONEY(N) AND CY$FF THEN IF SEL THEN P=P\16 ELSE P=P MOD 16 BG TINT ZONEX(N),ZONEY(N) TO ZONEX(N)+ZONEW(N)-1,ZONEY(N)+ZONEH(N)-1 PAL P END IF END SUB '======== #1:MAIN PALETTES 003F2A15000F050000052A00000A0030 003F3C38001F373D0008221B001D0731 #2:MAIN CHARACTERS 00000000000000000000000000000000 0000000000000000FFFFFFFFFFFFFFFF FF809BB28AB28080007F7F7F7F7F7F7F FE0119A1A999010101FFFFFFFFFFFFFF FF80B1AAB3A28080007F7F7F7F7F7F7F FE0139919191010101FFFFFFFFFFFFFF FF80808080818387007F7F7F7F7F7F7F FE0101010181C1E101FFFFFFFFFFFFFF 01452911294501FFFFFFFFFFFFFFFFFF 014931FD314901FFFFFFFFFFFFFFFFFF FF80B2AAAAB28080007F7F7F7F7F7F7F FE01D59955D5010101FFFFFFFFFFFFFF 808898BE9888807F7F7F7F7F7F7F7FFF 80888CBE8C88807F7F7F7F7F7F7F7FFF 80808080808080807F7F7F7F7F7F7F7F 0101010101010101FFFFFFFFFFFFFFFF 00000000000000FFFFFFFFFFFFFFFFFF 808080808080807F7F7F7F7F7F7F7FFF FDFDFDFDFDFD01FFFFFFFFFFFFFFFFFF C1F1FDFDF1C101FFFFFFFFFFFFFFFFFF FF809BB189B18080007F7F7F7F7F7F7F FE0191292911010101FFFFFFFFFFFFFF 8F9F80808080807F7F7F7F7F7F7F7FFF F1F90101010101FFFFFFFFFFFFFFFFFF FF8091AAAA918080007F7F7F7F7F7F7F FE01B9111191010101FFFFFFFFFFFFFF FF80A1A2A2B98080007F7F7F7F7F7F7F FE0111A9B929010101FFFFFFFFFFFFFF FF80B1B2ABB28080007F7F7F7F7F7F7F FE0119A1A199010101FFFFFFFFFFFFFF FF000000000000FF00FFFFFFFFFFFFFF FF0000000000000000FFFFFFFFFFFFFF FF80808080808080FF80808080808080 FEFEFEFEFEFEFEFE0101010101010101 BEFEFEFEFEBEBEBEFEBEBEBEBEFEFEFE FFAA5555555555550055FFFFFFFFFFFF 012161FD612101FFFFFFFFFFFFFFFFFF 011119FD191101FFFFFFFFFFFFFFFFFF FF80808080809F8F007F7F7F7F7F7F7F FE0101010101F9F101FFFFFFFFFFFFFF FEFEFEE6DEDEE6FE0101010101010101 FDFDFDFDFD7D01FFFF878787B7FFFFFF FF8099B28BB28080007F7F7F7F7F7F7F FE0129A9A991010101FFFFFFFFFFFFFF FFAA557560FF60750055FFDF9F009FDF FFAA555507FF07550055FFFBF900F9FB 00003044463F0604FFFFCFBBB9C0F9FB 00003C3C3C3C0000FFFFC3C3C3C3FFFF FE81818181818181017F7F7F7F7F7F7F FEFEFEFEFEFE807F0101010101017FFF FEFEFEFEFEFE8000FEFEFEFEFEFE8000 555555555555FFFFFFFFFFFFFFFFFFFF FF80B3ABAAB38080007F7F7F7F7F7F7F FE01A12121B9010101FFFFFFFFFFFFFF 878381808080807F7F7F7F7F7F7F7FFF E1C18101010101FFFFFFFFFFFFFFFFFF EED6D6D6EEFE807F0101010101017FFF EECEEEEEC6FE807F0101010101017FFF CEF6EEDEC6FE807F0101010101017FFF CEF6EEF6CEFE807F0101010101017FFF DED6C6F6F6FE807F0101010101017FFF C6DECEF6CEFE807F0101010101017FFF E6DECED6EEFE807F0101010101017FFF C6F6EEEEEEFE807F0101010101017FFF FF80BB9293928080007F7F7F7F7F7F7F FE0111A939A9010101FFFFFFFFFFFFFF 3F40808080808080C0BF7F7F7F7F7F7F FC0201010101010103FFFFFFFFFFFFFF 000000003F408080FFFFFFFFC0BF7F7F 00000000FC020101FFFFFFFF03FFFFFF 01010101010101FFFFFFFFFFFFFFFFFF 017D7D7D7D7D01FFFFABABAB8383FFFF FF80B3ABAAAB8080007F7F7F7F7F7F7F FE01A92939B9010101FFFFFFFFFFFFFF FF80BBB2A2BB8080007F7F7F7F7F7F7F FE0101818101010101FFFFFFFFFFFFFF FF80B3AAABB28080007F7F7F7F7F7F7F FE0111A939A9010101FFFFFFFFFFFFFF 0F000F000F000F0FF0F0F0F0F0F0F0F0 F000F000F000F0F00F0F0F0F0F0F0F0F 81A1E9FDE9A181FFFFFFFFFFFFFFFFFF 011D011D011D01FFFFFFFFFFFFFFFFFF 80808080808080FF7F7F7F7F7F7F7FFF 016D016D016D01FFFFFFFFFFFFFFFFFF FF80808080808080007F7F7F7F7F7F7F 818181818181817F7F7F7F7F7F7F7FFF FF80ABB3AAAB8080007F7F7F7F7F7F7F FE01A9291191010101FFFFFFFFFFFFFF 0101017D391101FFFFFFFFFFFFFFFFFF 1D3D7D7D7D7D01FFFFE7C7C7C7FFFFFF FF80808080808080007F7F7F7F7F7F7F FE0101010101010101FFFFFFFFFFFFFF FF80BB9293928080007F7F7F7F7F7F7F FE0111A939A9010101FFFFFFFFFFFFFF 000F000F0F000F00F0F0F0F0F0F0F0F0 00F000F0F000F0000F0F0F0F0F0F0F0F CCCCCCCCCCCCCCCC0000000000000000 C0C0C0C0C0C0C0C00C0C0C0C0C0C0C0C CCCCCCCCCCCCCCCC0C0C0C0C0C0C0C0C C0C0C0C0C0C0C0C00000000000000000 CCCCCCCCCCCCCCCCC0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0CCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 00000000000000000000000000000000 CCCCCCCCCCCCCCCCFFFFFFFFFFFFFFFF FFC0C00000FFFF00CCFFFFFFFFFFFFFF FF00000000FFFF00CCFFFFFFFFFFFFFF 818181A1A9A901FFFFFFFFFFFFFFFFFF 00000000000000000000000000000000 0F000F0F000F000FF0F0F0F0F0F0F0F0 F000F0F000F000F00F0F0F0F0F0F0F0F 0C0C0C0C0C0C0C0CC0C0C0C0C0C0C0C0 0000000000000000CCCCCCCCCCCCCCCC 0C0C0C0C0C0C0C0CCCCCCCCCCCCCCCCC 0000000000000000C0C0C0C0C0C0C0C0 0C0C0C0C0C0C0C0C0000000000000000 00000000000000000C0C0C0C0C0C0C0C 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0101010101010101FEFEFEFEFEFEFEFE 8080808080808080FFFFFFFFFFFFFFFF 24242424242424241C1C1C1C1C1C1C1C 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 24242424242424241C1C1C1C1C1C1C1C 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 24242424242424241C1C1C1C1C1C1C1C 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 24242424242424241C1C1C1C1C1C1C1C 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000000FFFFFFFFFFFFFFFF 0018181818001800FFE7E7E7E7FFE7FF 006C6C2400000000FF9393DBFFFFFFFF 00247E24247E2400FFDB81DBDB81DBFF 00083E380E3E0800FFF7C1C7F1C1F7FF 0062640810264600FF9D9BF7EFD9B9FF 001C34386E643A00FFE3CBC7919BC5FF 0018183000000000FFE7E7CFFFFFFFFF 000C183030180C00FFF3E7CFCFE7F3FF 0030180C0C183000FFCFE7F3F3E7CFFF 000024187E182400FFFFDBE781E7DBFF 000018187E181800FFFFE7E781E7E7FF 0000000018183000FFFFFFFFE7E7CFFF 000000007E000000FFFFFFFF81FFFFFF 0000000000181800FFFFFFFFFFE7E7FF 00060C1830604000FFF9F3E7CF9FBFFF 003C666E76663C00FFC399918999C3FF 0018381818187E00FFE7C7E7E7E781FF 003C660C18307E00FFC399F3E7CF81FF 003C660C06663C00FFC399F3F999C3FF 0066667E06060600FF999981F9F9F9FF 007E607C06067C00FF819F83F9F983FF 001C307C66663C00FFE3CF839999C3FF 007E060C18303000FF81F9F3E7CFCFFF 003C663C66663C00FFC399C39999C3FF 003C663E06663C00FFC399C1F999C3FF 0000001800180000FFFFFFE7FFE7FFFF 0000001800183000FFFFFFE7FFE7CFFF 00000C1830180C00FFFFF3E7CFE7F3FF 0000007E007E0000FFFFFF81FF81FFFF 000030180C183000FFFFCFE7F3E7CFFF 003C660C18001800FFC399F3E7FFE7FF 003C666E6E603C00FFC39991919FC3FF 00183C667E666600FFE7C399819999FF 007C667C66667C00FF839983999983FF 003C666060663C00FFC3999F9F99C3FF 00786C66666C7800FF879399999387FF 007E607860607E00FF819F879F9F81FF 007E607860606000FF819F879F9F9FFF 003C606E66663C00FFC39F919999C3FF 0066667E66666600FF999981999999FF 003C181818183C00FFC3E7E7E7E7C3FF 001E060606663C00FFE1F9F9F999C3FF 00666C78786C6600FF999387879399FF 0060606060607E00FF9F9F9F9F9F81FF 0042667E7E666600FFBD9981819999FF 0066767E6E666600FF998981919999FF 003C666666663C00FFC399999999C3FF 007C667C60606000FF8399839F9F9FFF 003C66666A6C3E00FFC399999593C1FF 007C667C786C6600FF839983879399FF 003E603C06067C00FFC19FC3F9F983FF 007E181818181800FF81E7E7E7E7E7FF 0066666666663C00FF9999999999C3FF 00666666663C1800FF99999999C3E7FF 0066667E7E664200FF9999818199BDFF 00663C183C666600FF99C3E7C39999FF 0066663C18181800FF9999C3E7E7E7FF 007E0C1830607E00FF81F3E7CF9F81FF 003C303030303C00FFC3CFCFCFCFC3FF 006030180C060200FF9FCFE7F3F9FDFF 003C0C0C0C0C3C00FFC3F3F3F3F3C3FF 00183C6600000000FFE7C399FFFFFFFF 0000000000007E00FFFFFFFFFFFF81FF #3:MAIN BG 00001410020003000400050014001500 04000500040005004A004B0042004300 44004500440045000A000B0011001300 11001300110012001100240011002500 11005800520053005200510052005000 11002900180019001800190028002200 21002200210021002200210022002100 22002100140015003400350011002400 11002500380032003100320031003100 32003100320031003200310011000900 11000800230023002300230023002300 2300230023002C002D00230023002300 23002300230023002300230033003300 33003300330033003300330033003300 33003300330033003300330033003300 33003300300030003000300030003000 30003000300030003000300030003000 3000300054001F001F001F0001000100 01000100010001000100010001000100 0100010001000100010001000E000100 01000100400041001400150040004100 400041004C004D004A004B0044004500 42004300440045000A000B0011001300 11001200110024001100250011005D00 11005800520053005200510052005000 1100290014001500560057004A004B00 01000100010001000100010044004500 44004500420043000A000B0011001200 11004700110058001000100010001000 10001000520053005200510052005000 110029000100010001000F0001000100 01000100010001000100010001000100 01000100010001000100010010001000 10004600550055005500550055005500 55005500550055005500550055005500 55005500000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000 #4:DISK BG 00001410000000000000000000000000 00000000000000000000000000000000 0000000000000000000000001E001E00 1E001E001E001E001E001E001E001E00 1E001E001E001E001E001E001E001E00 1E001E00000000000000000000000000 00000000000000000000000000000000 00000000000000000600070000000000 00000000000000000000000000000000 00000000000000000000000000000000 16001700000000000000000000000000 00000000000000000000000000000000 00000000000000000E00010000000000 00000000000000000000000000000000 00000000000000000000000000000000 0E000100000000000000000000000000 00000000000000000000000000000000 00000000000000000E00010000000000 00000000000000000000000000000000 00000000000000000000000000000000 0E000100000000000000000000000000 00000000000000000000000000000000 00000000000000000E00010000000000 00000000000000000000000000000000 00000000000000000000000000000000 0E000100000000000000000000000000 00000000000000000000000000000000 00000000000000002600270000000000 00000000000000000000000000000000 00000000000000000000000000000000 360037001F001E001E001E001E001E00 1E001E001E001E001E001E001E001E00 1E001E001E001E001E001F000F001C00 1D000100010001000100010001000100 010001000100480049001A001B002A00 2B000E000F0011002400010001000100 01000100010001000100010001001100 59000C0029000D0029000E0001001F00 1F001F001F001F001F001F001F001F00 1F001F001F001F001F001F001F001F00 1F000100 #5:BG 00001410000000000000000000000000 00000000000000000000000000000000 0000000000000000000000001E001E00 1E001E001E001E001E001E001E001E00 1E001E001E001E001E001E001E001E00 1E001E000E000F000000000000000000 00000000000000000000000000000000 00000000000000000E000F000E000F00 00000000000000000000000000000000 00000000000000000000000000000000 0E000F000E000F000000000000000000 00100010001000000000000000000000 00000000000000000E000F000E000F00 00000000000000000010001000000000 00100010001000100010000000000000 0E000F000E000F000000000000000000 00100010000000000010001000000010 00100000000000000E000F000E000F00 4C000000000000000000001000100010 0000000000004C004C004C0000000000 0E000F000E000F005C005C005C004C00 4C004C004C000010001000104C005C00 5C005C004C004C000E000F000E000F00 5C005C005C005C005C005C005C004C00 4C004C005C005C005C005C005C005C00 0E000F000E000F005C005C005C005C00 5C005C005C005C005C005C005C005C00 5C005C005C005C000E000F000E000F00 5C005C005C005C005C005C005C005C00 5C005C005C005C005C005C005C005C00 0E000F001F001E001E001E001E001E00 1E001E001E001E001E001E001E001E00 1E001E001E001E001E001F000F001C00 1D000100010001000100010001000100 010001000100480049001A001B002A00 2B000E000F0011002400010001000100 01000100010001000100010001001100 59000C0029000D0029000E0001001F00 1F001F001F001F001F001F001F001F00 1F001F001F001F001F001F001F001F00 1F000100 #15:SOUND PRESETS 2800303A000000001800846C003A0000 08006060000000002800303019FE0000 38002020000000003800505000000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000