Home » Archimedes archive » Acorn User » AU 1994-05.adf » !Armony_Armony » !Armony/!RunImage
!Armony/!RunImage
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Acorn User » AU 1994-05.adf » !Armony_Armony |
Filename: | !Armony/!RunImage |
Read OK: | ✔ |
File size: | E1A7 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM +------------------------------------------+ 20REM | !Armony, by Mike Smith, | 30REM | Version 1.32 (29/12/93), based on | 40REM | BareBones Wimp application program | 50REM | Version 1.00 (4/10/92) | 60REM | (C) Alan Senior 1992 | 70REM | Dabs Press : Basic Wimp Programming | 80REM +------------------------------------------+ 90: 100ON ERROR REPORT:PRINT" at line ";ERL DIV10:END 110SYS263872 120PROCdefine_arrays:PROCdefine_variables 130ON ERROR PROCerror(ERR,REPORT$):PROCquit 140task_handle%=FNtask_initialise(app_name$) 150PROCload_sprites:PROCload_windows:PROCinstall_icon 160PROCcreate_windows:PROCmenus:PROCinfo 170PROCload_check 180ON ERROR PROCerror(ERR,REPORT$) 190SYS263873 200: 210PROCwimp_poll:PROCquit 220: 230DEFPROCdefine_arrays 240DIM blk% &2000:DIM temp_blk% &2000:DIM errorblk% &100:DIM workstart% &1000 250workfree%=workstart%:workend%=workstart%+&1000 260DIM sequlen%(25):sequlen%()=0 270DIM chord$(25,32):chord$()=" " 280DIM rhythm$(25,32):rhythm$()="a" 290DIM rhythm_name$(25):rhythm_name$()=" " 300FOR r%=0 TO 25:rhythm_name$(r%)=CHR$(r%+97):NEXT 310DIM nobeats%(25):nobeats%()=8 320DIM vol%(25,7,16):vol%()=-1 330DIM ins%(25,7,16):ins%()=0 340DIM fx%(6):fx%()=7 350DIMfxchannel%(6):fxchannel%()=FALSE 360DIM stereo%(8) 370DIM p%(6) 380DIM lkc 16:DIM hkc 24 390DIM sequence_window%(25):DIM rhythm_window%(25) 400DIM chord_icon%(25,32):DIM rhythm_icon%(25,32):DIM beat_icon%(7,16) 410ENDPROC 420: 430DEFPROCdefine_variables 440app_sprite$="!Armony":app_name$="!Armony":app_purpose$="A chord sequencer" 450app_author$="� Mike Smith 1993" 460app_version$="Version 1.00, 14th Oct 1993" 470app_directory$=FNsystem_variable("Armony$Dir") 480errorcount%=0:menufile%=0:icon_bar%=-2 490select_click%=4:menu_click%=2:adjust_click%=1:select_menu_click%=6 500select_drag%=64:adjust_drag%=16:quit%=FALSE 510tempo%=32:trans%=0:coct%=3:boct%=2:koct%=2: 520sequences%=1:rhythms%=1:structure$="A" 530stereo%(1)=-3:stereo%(2)=-2:stereo%(3)=-1:stereo%(4)=1:stereo%(5)=2:stereo%(6)=3:stereo%(7)=0:stereo%(8)=0 540play_rhythm%=FALSE:repeat%=FALSE:edit_sequence%=0 550root$="C D EF G A B":chord_input$="ABCDEFG#bmMs+-13679/" 560rhythm_input$="abcdefghijklmnopqrstuvwxyz" 570lowkey$="zsxdcvgbhnjm,l.;/":highkey$="a1q2we4r5t6yu8i9op-[=]�\f" 580cvol%=1:bvol%=2:fxvol%=1 590FOR i%=1 TO 17:READ lkc?i%:NEXT 600DATA 98,82,67,51,83,100,84,101,85,86,70,102,103,87,104,88,105 610FOR i%=1 TO 25:READ hkc?i%:NEXT 620DATA 97,49,17,50,34,35,19,52,20,36,53,69,54,22,38,39,55,56,24,57,94,89,47,121,62 630*FX11,0 640SOUND ON:VOICES 8 650chord_voice%=2:FOR ch%=1 TO 6:OSCLI("CHANNELVOICE "+STR$(ch%)+" 2"):NEXT 660SYS262531,0,2 TO chord_voice$,F% 670bass_voice%=1:*CHANNELVOICE 7 1 680SYS262531,0,1 TO bass_voice$,F% 690keyboard_voice%=3:*CHANNELVOICE 8 3 700SYS262531,0,3 TO keyboard_voice$,F% 710ok_icon%=0:name_icon%=1:file_icon%=2:rhythm_name_icon%=1:rhythm_file_icon%=2 720B%=1:C%=1:R%=0:S%=1:Z%=0:last_r%=R%:last_b%=B%:last_vol%=15 730play_rhythm%=FALSE:play_sequence%=FALSE:play_song%=FALSE:repeat%=FALSE 740ENDPROC 750: 760DEFPROCinstall_icon 770icon_bar_handle%=FNput_icon_on_bar(app_sprite$,"RIGHT") 780ENDPROC 790: 800DEFPROCload_sprites 810sprites%=FNload_sprites(app_directory$+".Sprites") 820ENDPROC 830: 840DEFPROCload_windows 850save%=FNnew_template(app_directory$+".Templates","save%",workfree%,workend%) 860save_rthm%=FNnew_template(app_directory$+".Templates","save_rthm%",workfree%,workend%) 870ENDPROC 880: 890DEFPROCcreate_windows 900info%=FNcreate_info_window 910PROCstereo_window:PROCstereo 920: 930PROCcreate_show_value 940: 950PROCupdate_windows("Newsong") 960ENDPROC 970: 980DEFPROCupdate_windows(file$) 990LOCAL s%,r% 1000FOR s%=0 TO sequences%-1:PROCsequence_window(s%):NEXT 1010FOR r%=0 TO rhythms%-1:PROCrhythm_window(r%):NEXT 1020PROCkeyboard_window(file$) 1030ENDPROC 1040: 1050DEFPROCopen_windows 1060LOCAL s%,r% 1070FOR s%=0 TO sequences%-1:PROCopen_window(sequence_window%(s%)):NEXT 1080FOR r%=0 TO rhythms%-1:PROCopen_window(rhythm_window%(r%)):NEXT 1090ENDPROC 1100: 1110DEFPROCdelete_windows 1120LOCAL s%,r% 1130PROCdelete_window(keyboard_window%) 1140FOR s%=0 TO sequences%-1:PROCdelete_window(sequence_window%(s%)):NEXT 1150FOR r%=0 TO rhythms%-1:PROCdelete_window(rhythm_window%(r%)):NEXT 1160ENDPROC 1170: 1180DEFPROCkeyboard_window(title$) 1190LOCAL icon%,f%,w%,h%,vw%,vh%,px%,py%,note$,k%,minx%,maxx% 1200f%=%10000111000000000000000000010010 1210w%=1280:h%=432:vw%=w%:vh%=h%:px%=0:py%=54 1220keyboard_window%=FNcreate_window(title$,f%,w%,h%,px%,vw%,py%,vh%) 1230icon%=FNadd_icon_block(keyboard_window%,16,-408,752,-24,1) 1240PROCborder_icon(keyboard_window%,icon%) 1250note$="1 2 4 5 6 8 9 - = �" 1260icon%=FNadd_icon("label",note$,keyboard_window%,272,-24,0,0,0) 1270note$="s d g h j l ;" 1280icon%=FNadd_icon("label",note$,keyboard_window%,48,-72,0,0,0) 1290note$="C D E F G A B C D E F G A B C D E F G A B C" 1300icon%=FNadd_icon("label",note$,keyboard_window%,32,-264,0,0,0) 1310note$="T q w e r t y u i o p [ ] \ I" 1320icon%=FNadd_icon("label",note$,keyboard_window%,256,-312,0,0,0) 1330note$="z x c v b n m , . /" 1340icon%=FNadd_icon("label",note$,keyboard_window%,32,-360,0,0,0) 1350FOR k%=1 TO 22 1360 minx%=32*k%+4:maxx%=minx%+24 1370 icon%=FNadd_icon_block(keyboard_window%,minx%,-260,maxx%,-124,0) 1380 PROCborder_icon(keyboard_window%,icon%) 1390 NEXT 1400FOR k%=1 TO 20 1410 minx%=32*k%+20:maxx%=minx%+24 1420 IF k%<>3 AND k%<>7 AND k%<>10 AND k%<>14 AND k%<>17 THEN 1430 icon%=FNadd_icon_block(keyboard_window%,minx%,-202,maxx%,-124,7) 1440 PROCborder_icon(keyboard_window%,icon%) 1450 ENDIF 1460 NEXT 1470: 1480icon%=FNadd_icon("label","Tempo",keyboard_window%,790,-24,0,0,0) 1490icon%=FNadd_icon("label","Keybd",keyboard_window%,790,-120,0,0,0) 1500icon%=FNadd_icon("label","Sustn",keyboard_window%,790,-216,0,0,0) 1510on_icon%=FNadd_icon("write"," OFF ",keyboard_window%,790,-168,1,0,1) 1520PROCicon_validation(keyboard_window%,on_icon%,"K") 1530PROCicon_bg_colour(keyboard_window%,on_icon%,1) 1540sustain%=0 1550sustain_icon%=FNadd_icon("report"," OFF ",keyboard_window%,790,-264,5,0,1) 1560icon%=FNadd_icon("label","Trans",keyboard_window%,790,-312,0,0,0) 1570icon%=FNadd_icon("label"," Structure/Pause",keyboard_window%,928,-24,0,0,0) 1580icon%=FNadd_icon("label"," Chords instrument",keyboard_window%,928,-120,0,0,0) 1590icon%=FNadd_icon("label"," Bass instrument",keyboard_window%,928,-216,0,0,0) 1600icon%=FNadd_icon("label","Keyboard instrument",keyboard_window%,928,-312,0,0,0) 1610tempo_icon%=FNadd_icon("report"," ",keyboard_window%,790,-72,5,0,1) 1620left_tempo_icon%=FNadd_icon("sprite","left",keyboard_window%,794,-76,0,sprites%,0) 1630right_tempo_icon%=FNadd_icon("sprite","right",keyboard_window%,866,-76,0,sprites%,0) 1640trans_icon%=FNadd_icon("report"," ",keyboard_window%,790,-360,5,0,1) 1650left_trans_icon%=FNadd_icon("sprite","left",keyboard_window%,794,-364,0,sprites%,0) 1660right_trans_icon%=FNadd_icon("sprite","right",keyboard_window%,866,-364,0,sprites%,0) 1670structure_icon%=FNadd_icon("report"," ",keyboard_window%,928,-72,19,0,1) 1680PROCicon_bg_colour(keyboard_window%,structure_icon%,11) 1690chord_ins_icon%=FNadd_icon("report"," ",keyboard_window%,928,-168,19,0,1) 1700bass_ins_icon%=FNadd_icon("report"," ",keyboard_window%,928,-264,19,0,1) 1710keyboard_ins_icon%=FNadd_icon("report"," ",keyboard_window%,928,-360,19,0,1) 1720PROCput_icon_text(keyboard_window%,tempo_icon%,STR$(tempo%)) 1730PROCput_icon_text(keyboard_window%,trans_icon%,STR$(trans%)) 1740C%=1:S%=1:Z%=0 1750structure_pos$=LEFT$(structure$,S%-1)+"("+MID$(structure$,S%,1)+")"+MID$(structure$,S%+1,19-S%) 1760PROCput_icon_text(keyboard_window%,structure_icon%,structure_pos$) 1770PROCput_icon_text(keyboard_window%,chord_ins_icon%,chord_voice$) 1780PROCput_icon_text(keyboard_window%,bass_ins_icon%,bass_voice$) 1790PROCput_icon_text(keyboard_window%,keyboard_ins_icon%,keyboard_voice$) 1800ENDPROC 1810: 1820DEFPROCsequence_window(s%) 1830LOCAL title$,px%,py%,type$,c%,x%,y% 1840sf%=%10000111000000000000000000010010 1850sw%=512:sh%=448:svw%=512:svh%=448:px%=s%*48:py%=532-s%*48 1860title$="Chord Sequence "+CHR$(s%+65):type$="write" 1870sequence_window%(s%)=FNcreate_window(title$,sf%,sw%,sh%,px%,svw%,py%,svh%) 1880window%=sequence_window%(s%) 1890FOR c%=1 TO sequlen%(s%)-1*(sequlen%(s%)<32) 1900 text$=chord$(s%,c%)+STRING$(4-LEN(chord$(s%,c%))," ") 1910 x%=((c%-1)MOD4)*128+4:y%=-((c%-1)DIV4)*56-4 1920 chord_icon%(s%,c%)=FNadd_icon(type$,text$,window%,x%,y%,4,0,1) 1930 PROCicon_validation(window%,chord_icon%(s%,c%),chord_input$) 1940 IF text$=" " PROCput_icon_text(window%,chord_icon%(s%,c%),"") 1950 text$=rhythm$(s%,c%) 1960 rhythm_icon%(s%,c%)=FNadd_icon(type$,text$,window%,x%+88,y%,1,0,1) 1970 PROCicon_validation(window%,rhythm_icon%(s%,c%),rhythm_input$) 1980 PROCicon_bg_colour(window%,rhythm_icon%(s%,c%),14) 1990 PROCicon_fg_colour(window%,rhythm_icon%(s%,c%),11) 2000 NEXT 2010ENDPROC 2020: 2030DEFPROCrhythm_window(r%) 2040LOCAL title$,type$,window%,w%,vw%,px%,py%,b%,c%,x%,y%,icon% 2050rf%=%10000111000000000000000000010010 2060rh%=392:rvh%=rh%:w%=88+40*nobeats%(r%):vw%=w%:px%=640+r%*48:py%=588-r%*48 2070title$="Rhythm "+CHR$(r%+97)+" ("+rhythm_name$(r%)+")":type$="label" 2080rhythm_window%(r%)=FNcreate_window(title$,rf%,w%,rh%,px%,vw%,py%,rvh%) 2090window%=rhythm_window%(r%) 2100icon%=FNadd_icon(type$,"6 ",window%,4,-4,4,0,1) 2110icon%=FNadd_icon(type$,"5 ",window%,4,-60,4,0,1) 2120icon%=FNadd_icon(type$,"4 ",window%,4,-116,4,0,1) 2130icon%=FNadd_icon(type$,"3 ",window%,4,-172,4,0,1) 2140icon%=FNadd_icon(type$,"2 ",window%,4,-228,4,0,1) 2150icon%=FNadd_icon(type$,"1 ",window%,4,-284,4,0,1) 2160icon%=FNadd_icon(type$,"bass",window%,4,-340,4,0,1) 2170type$="select" 2180FOR b%=1 TO nobeats%(r%):FOR c%=1 TO 7 2190 IF ins%(r%,c%,b%)=0 text$=" " ELSE text$=STR$(ins%(r%,c%,b%)) 2200 x%=52+b%*40: y%=52-c%*56 2210 beat_icon%(c%,b%)=FNadd_icon(type$,text$,window%,x%,y%,1,0,1) 2220 IF vol%(r%,c%,b%)<0 bg_colour%=15 ELSE bg_colour%=vol%(r%,c%,b%) 2230 PROCicon_bg_colour(window%,beat_icon%(c%,b%),bg_colour%) 2240 IF c%<7 PROCicon_fg_colour(window%,beat_icon%(c%,b%),11) 2250 IF c%=7 PROCicon_fg_colour(window%,beat_icon%(c%,b%),10) 2260 NEXT:NEXT 2270ENDPROC 2280: 2290DEFPROCstereo_window 2300LOCAL p%,c%,on% 2310f%=%10000100000000000000000000010010 2320title$="Stereo Positions" 2330w%=576:h%=816:vw%=w%:vh%=h%:px%=0:py%=0 2340stereo_pos%=FNcreate_window(title$,f%,w%,h%,px%,vw%,py%,vh%) 2350FOR p%=0 TO 6:FOR c%=1 TO 8 2360 IF stereo%(c%)=p%-3 on%=1 ELSE on%=0 2370 icon%=FNadd_icon("radio"," ",stereo_pos%,224+48*p%,-(c%*96-54),on%,c%,0) 2380 NEXT:NEXT 2390icon%=FNadd_icon("label","Chords 6",stereo_pos%,32,-48,0,0,1) 2400icon%=FNadd_icon("label"," 5",stereo_pos%,32,-144,0,0,1) 2410icon%=FNadd_icon("label"," 4",stereo_pos%,32,-240,0,0,1) 2420icon%=FNadd_icon("label"," 3",stereo_pos%,32,-336,0,0,1) 2430icon%=FNadd_icon("label"," 2",stereo_pos%,32,-432,0,0,1) 2440icon%=FNadd_icon("label"," 1",stereo_pos%,32,-528,0,0,1) 2450icon%=FNadd_icon("label","Bass ",stereo_pos%,32,-624,0,0,1) 2460icon%=FNadd_icon("label","Keyboard",stereo_pos%,32,-720,0,0,1) 2470ENDPROC 2480: 2490DEFPROCinfo 2500PROCput_info_text(info%,app_name$,app_purpose$,app_author$,app_version$) 2510ENDPROC 2520: 2530DEFPROCmenus 2540PROCload_menus(app_directory$+".menus") 2550PROCname_voices 2560PROCclear_flags 2570PROCput_writem(5,"A") 2580ENDPROC 2590: 2600DEFPROCclear_flags 2610FOR menu%=14 TO 17:FOR item%=0 TO 31:PROCclear_write_flag(menu%,item%) 2620NEXT:NEXT 2630ENDPROC 2640: 2650DEFPROCadd_flags 2660FOR menu%=14 TO 17:FOR item%=0 TO 31:PROCadd_write_flag(menu%,item%) 2670NEXT:NEXT 2680ENDPROC 2690: 2700DEFPROCwimp_poll 2710LOCAL poll_mask% 2720poll_mask%=&832 2730REPEAT 2740 SYS262343,poll_mask%,blk% TO event% 2750 CASE event% OF 2760 WHEN 2:PROCopen_window_event 2770 WHEN 3:window%=!blk%:PROCclose_window(window%) 2780 WHEN 6:PROCmouse_button 2790 WHEN 7:PROCdrag_over 2800 WHEN 8:PROCkey_press 2810 WHEN 9:PROCmenu_selection 2820 WHEN12:PROCgain_caret 2830 WHEN17,18:PROCmessage 2840 ENDCASE 2850 PROCevent 2860UNTIL quit% 2870ENDPROC 2880: 2890DEFPROCopen_window_event 2900SYS262341,,blk% 2910ENDPROC 2920: 2930DEFPROCclose_window(window%) 2940!blk%=window%:SYS262342,,blk% 2950ENDPROC 2960: 2970DEF PROCmouse_button 2980LOCAL wx%,wy%,x%,y% 2990mousex%=blk%!0:mousey%=blk%!4:mousebut%=blk%!8 3000window_handle%=blk%!12:icon_handle%=blk%!16 3010wx%=FNwindow_x_origin(window_handle%):wy%=FNwindow_y_origin(window_handle%) 3020x%=mousex%-wx%:y%=wy%-mousey% 3030CASE window_handle% OF 3040 WHEN icon_bar%:PROCicon_bar_click 3050 WHEN keyboard_window%:PROCkeyboard_window_click 3060 WHEN save%:PROCsave_click 3070 WHEN save_rthm%:PROCsave_rhythm_click 3080 WHEN stereo_pos%:PROCstereo_click 3090ENDCASE 3100FOR s%=0 TO sequences%-1 3110 IF sequence_window%(s%)=window_handle% THEN 3120 edit_sequence%=s%:PROCsequence_window_click 3130 ENDIF 3140NEXT 3150FOR s%=0 TO rhythms%-1 3160 IF rhythm_window%(s%)=window_handle% THEN 3170 edit_rhythm%=s% 3180 edit_beat%=1+(x%-88)DIV40 3190 edit_channel%=1+y%DIV56 3200 edit_icon%=icon_handle% 3210 PROCrhythm_window_click 3220 ENDIF 3230NEXT 3240ENDPROC 3250: 3260DEFPROCdrag_over 3270LOCAL window%,icon%,x%,y%,file$,start%,size%,type% 3280SYS262351,,blk% 3290x%=blk%!0:y%=blk%!4 3300window%=blk%!12:icon%=blk%!16 3310CASE drag_window% OF 3320 WHEN save% 3330 file$=FNleaf(FNget_icon_text(save%,name_icon%)) 3340 type%=FNicon_sprite_type(save%,file_icon%) 3350 PROCinitiate_save(window%,icon%,x%,y%,file$,END,0,type%) 3360 WHEN save_rthm% 3370 file$=FNleaf(FNget_icon_text(save_rthm%,rhythm_name_icon%)) 3380 type%=FNicon_sprite_type(save_rthm%,rhythm_file_icon%) 3390 PROCinitiate_save(window%,icon%,x%,y%,file$,END,0,type%) 3400 ENDCASE 3410ENDPROC 3420: 3430DEFPROCkey_press 3440LOCAL window_handle%,icon_handle%,key% 3450window_handle%=blk%!0:icon_handle%=blk%!4:key%=blk%!24 3460IF key%=&61 OR key%=&66 ENDPROC 3470IF key%=&18A key%=&61 3480IF key%=&1CD key%=&66 3490CASE window_handle% OF 3500 WHEN save%:PROCsave_key_press(key%,icon_handle%) 3510 WHEN save_rthm%:PROCsave_rhythm_key_press(key%,icon_handle%) 3520 WHEN keyboard_window%:PROCkeyboard(key%) 3530 OTHERWISE 3540 SYS262364,key% 3550 ENDCASE 3560FOR s%=0 TO sequences%-1 3570 IF sequence_window%(s%)=window_handle% edit_sequence%=s% 3580 NEXT 3590FOR c%=1 TO sequlen%(edit_sequence%)-1*(sequlen%(edit_sequence%)<32) 3600 IF chord_icon%(edit_sequence%,c%)=icon_handle% PROCchord_key_press(window_handle%,icon_handle%,edit_sequence%,c%,key%) 3610 NEXT 3620FOR r%=1 TO sequlen%(edit_sequence%)-1*(sequlen%(edit_sequence%)<32) 3630 IF rhythm_icon%(edit_sequence%,r%)=icon_handle% PROCrhythm_key_press(window_handle%,icon_handle%,edit_sequence%,r%,key%) 3640 NEXT 3650ENDPROC 3660: 3670DEFPROCmenu_selection 3680LOCAL menu_path$,menu_item$ 3690menu_path$=FNdecode_menu(current_menu%,blk%) 3700menu_item$=FNleaf(menu_path$) 3710CASE current_menu% OF 3720 WHEN menu%(1):PROCmain_menu(menu_item$) 3730 WHEN menu%(2):PROCsequence_menu(menu_item$) 3740 WHEN menu%(4):PROCrhythm_menu(menu_item$) 3750 WHEN menu%(5):PROCkeyboard_menu(menu_item$) 3760ENDCASE 3770SYS262351,,blk% 3780IF blk%!8=adjust_click% SYS262356,,current_menu%,menu_x%,menu_y% 3790ENDPROC 3800: 3810DEFPROCgain_caret 3820window_handle%=blk%!0:icon_handle%=blk%!4 3830IF window_handle%=keyboard_window% THEN 3840 PROCicon_bg_colour(keyboard_window%,on_icon%,14) 3850 PROCput_icon_text(keyboard_window%,on_icon%," ON ") 3860ELSE 3870 PROCicon_bg_colour(keyboard_window%,on_icon%,1) 3880 PROCput_icon_text(keyboard_window%,on_icon%," OFF ") 3890ENDIF 3900ENDPROC 3910: 3920DEFPROCmessage 3930LOCAL message_type% 3940message_type%=blk%!16 3950CASE message_type% OF 3960 WHEN 0:quit%=TRUE 3970 WHEN 1:PROCsave_request 3980 WHEN 2:PROCsave_demand 3990 WHEN 3:PROCload_request 4000 WHEN 4:PROCmenu_close 4010 WHEN 5:PROCdouble_click 4020ENDCASE 4030ENDPROC 4040: 4050DEFPROCicon_bar_click 4060LOCAL r%,s% 4070CASE mousebut% OF 4080 WHEN menu_click% 4090 current_menu%=menu%(1) 4100 menu_x%=mousex%-64:menu_y%=FNmenu_height(menu%(1))+96 4110 SYS262356,,current_menu%,menu_x%,menu_y% 4120 WHEN select_click%:PROCopen_windows 4130 WHEN adjust_click%:PROCopen_window(keyboard_window%) 4140ENDCASE 4150ENDPROC 4160: 4170DEFPROCsave_click 4180CASE mousebut% OF 4190 WHEN select_click%,adjust_click% 4200 IF icon_handle%=ok_icon% THEN 4210 file_name$=FNget_icon_text(save%,name_icon%) 4220 file_type%=FNicon_sprite_type(save%,file_icon%) 4230 IF INSTR(file_name$,".") THEN 4240 $(blk%+44)=file_name$+CHR$0:PROCsave(file_name$):PROCmenu_close 4250 ELSE 4260 $(blk%+44)=app_directory$+".songs."+file_name$+CHR$0 4270 PROCsave(app_directory$+".songs."+file_name$) 4280 ENDIF 4290 ENDIF 4300 WHEN select_drag%,adjust_drag% 4310 IF icon_handle%=file_icon% THEN 4320 drag_icon%=file_icon%:drag_window%=save%:PROCdrag_box(save%,file_icon%) 4330 ENDIF 4340 ENDCASE 4350ENDPROC 4360: 4370DEFPROCsave_rhythm_click 4380CASE mousebut% OF 4390 WHEN select_click%,adjust_click% 4400 IF icon_handle%=ok_icon% THEN 4410 file_name$=FNget_icon_text(save_rthm%,rhythm_name_icon%) 4420 file_type%=FNicon_sprite_type(save_rthm%,rhythm_file_icon%) 4430 IF INSTR(file_name$,".") THEN 4440 $(blk%+44)=file_name$+CHR$0:PROCsave_rhythm(file_name$):PROCmenu_close 4450 ELSE 4460 $(blk%+44)=app_directory$+".rhythms."+file_name$+CHR$0 4470 PROCsave_rhythm(app_directory$+".rhythms."+file_name$) 4480 ENDIF 4490 ENDIF 4500 WHEN select_drag%,adjust_drag% 4510 IF icon_handle%=rhythm_file_icon% THEN 4520 drag_icon%=rhythm_file_icon%:drag_window%=save_rthm% 4530 PROCdrag_box(save_rthm%,rhythm_file_icon%) 4540 ENDIF 4550 ENDCASE 4560ENDPROC 4570: 4580DEFPROCkeyboard_window_click 4590CASE mousebut% OF 4600 WHEN menu_click% 4610 current_menu%=menu%(5):menu_x%=mousex%-64:menu_y%=mousey% 4620 SYS262356,,current_menu%,menu_x%,menu_y% 4630 WHEN select_click% 4640 CASE icon_handle% OF 4650 WHEN sustain_icon% 4660 IF sustain%=0 THEN 4670 sustain%=1 4680 PROCput_icon_text(keyboard_window%,sustain_icon%,"ON") 4690 ELSE sustain%=0 4700 PROCput_icon_text(keyboard_window%,sustain_icon%,"OFF") 4710 ENDIF 4720 WHEN structure_icon% 4730 IF play_rhythm%=FALSE THEN 4740 play_rhythm%=TRUE 4750 PROCicon_bg_colour(keyboard_window%,structure_icon%,0) 4760 ELSE 4770 play_rhythm%=FALSE 4780 PROCicon_bg_colour(keyboard_window%,structure_icon%,11) 4790 ENDIF 4800 WHEN left_tempo_icon% 4810 tempo%-=1:IF tempo%<4 tempo%=4 4820 PROCput_icon_text(keyboard_window%,tempo_icon%,STR$(tempo%)) 4830 WHEN right_tempo_icon% 4840 tempo%+=1:IF tempo%>999 tempo%=999 4850 PROCput_icon_text(keyboard_window%,tempo_icon%,STR$(tempo%)) 4860 WHEN left_trans_icon% 4870 trans%-=1:IF trans%<-96 trans%=-96 4880 PROCput_icon_text(keyboard_window%,trans_icon%,STR$(trans%)) 4890 WHEN right_trans_icon% 4900 trans%+=1:IF trans%>96 trans%=96 4910 PROCput_icon_text(keyboard_window%,trans_icon%,STR$(trans%)) 4920 ENDCASE 4930 WHEN adjust_click% 4940 CASE icon_handle% OF 4950 WHEN left_tempo_icon% 4960 tempo%=tempo%DIV2:IF tempo%<4 tempo%=4 4970 PROCput_icon_text(keyboard_window%,tempo_icon%,STR$(tempo%)) 4980 WHEN right_tempo_icon% 4990 tempo%=tempo%*2:IF tempo%>999 tempo%=999 5000 PROCput_icon_text(keyboard_window%,tempo_icon%,STR$(tempo%)) 5010 WHEN left_trans_icon% 5020 trans%-=8:IF trans%<-96 trans%=-96 5030 PROCput_icon_text(keyboard_window%,trans_icon%,STR$(trans%)) 5040 WHEN right_trans_icon% 5050 trans%+=8:IF trans%>96 trans%=96 5060 PROCput_icon_text(keyboard_window%,trans_icon%,STR$(trans%)) 5070 ENDCASE 5080 ENDCASE 5090PROCput_writem(3,STR$(tempo%)):PROCput_writem(4,STR$(trans%)) 5100ENDPROC 5110: 5120DEFPROCsequence_window_click 5130CASE mousebut% OF 5140 WHEN menu_click%:current_menu%=menu%(2):menu_x%=mousex%-64:menu_y%=mousey% 5150 SYS262356,,current_menu%,menu_x%,menu_y% 5160 ENDCASE 5170ENDPROC 5180: 5190DEFPROCrhythm_window_click 5200LOCAL r%,c%,b% 5210r%=edit_rhythm%:c%=edit_channel%:b%=edit_beat%:i%=edit_icon% 5220PROCput_icon_text(save_rthm%,1,rhythm_name$(r%)) 5230CASE mousebut% OF 5240 WHEN menu_click%:current_menu%=menu%(4):menu_x%=mousex%-64:menu_y%=mousey% 5250 SYS262356,,current_menu%,menu_x%,menu_y% 5260 WHEN select_click% 5270 IF vol%(r%,c%,b%)<0 THEN 5280 vol%(r%,c%,b%)+=8 5290 PROCicon_bg_colour(rhythm_window%(r%),i%,vol%(r%,c%,b%)) 5300 ELSE 5310 vol%(r%,c%,b%)-=8 5320 PROCicon_bg_colour(rhythm_window%(r%),i%,15) 5330 ENDIF 5340 WHEN adjust_click% 5350 vol%(r%,c%,b%)-=1:IF vol%(r%,c%,b%)<0 vol%(r%,c%,b%)=7 5360 PROCicon_bg_colour(rhythm_window%(r%),i%,vol%(r%,c%,b%)) 5370 WHEN select_menu_click%:ins%(r%,c%,b%)+=1 5380 IF ins%(r%,c%,b%)>6 THEN 5390 ins%(r%,c%,b%)=0:ins$=" " 5400 ELSE ins$=STR$(ins%(r%,c%,b%)) 5410 ENDIF 5420 PROCput_icon_text(rhythm_window%(r%),i%,ins$) 5430 ENDCASE 5440ENDPROC 5450: 5460DEFPROCstereo_click 5470LOCAL channel%,position% 5480CASE mousebut% OF 5490 WHEN select_click%,adjust_click% 5500 IF icon_handle%<56 AND icon_handle%>-1 THEN 5510 channel%=1+icon_handle%MOD8:IFchannel%=1 5520 position%=icon_handle%DIV8 5530 stereo%(channel%)=position%-3 5540 SYS262466,channel%,stereo%(channel%)*32 5550 ENDIF 5560 IF mousebut%=select_click% PROCmenu_close 5570 ENDCASE 5580ENDPROC 5590: 5600DEFPROCmain_menu(item$) 5610CASE item$ OF 5620 WHEN "Quit" 5630 quit%=TRUE 5640 WHEN "Keyboard" 5650 PROCopen_window(keyboard_window%) 5660 WHEN "Chords and Rhythms" 5670 FOR s%=0 TO sequences%-1:PROCopen_window(sequence_window%(s%)):NEXT 5680 FOR r%=0 TO rhythms%-1:PROCopen_window(rhythm_window%(r%)):NEXT 5690 WHEN "Update Instruments" 5700 SYS263872 5710 PROCadd_flags:PROCname_voices:PROCclear_flags 5720 SYS263873 5730 ENDCASE 5740ENDPROC 5750: 5760DEFPROCkeyboard_menu(item$) 5770LOCAL l%,s% 5780numeric_path$=FNmenu_path(blk%) 5790CASE numeric_path$ OF 5800 WHEN "0.0":file_path$=FNget_writem(2):PROCload(file_path$) 5810 WHEN "2" 5820 play_song%=TRUE:play_sequence%=TRUE:play_rhythm%=TRUE 5830 PROCicon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),0) 5840 PROCicon_bg_colour(keyboard_window%,structure_icon%,0) 5850 B%=1:C%=1:S%=1:TIME=0 5860 structure_pos$=LEFT$(structure$,S%-1)+"("+MID$(structure$,S%,1)+")"+MID$(structure$,S%+1,19-S%) 5870 PROCput_icon_text(keyboard_window%,structure_icon%,structure_pos$) 5880 Z%=ASC(MID$(structure$,S%,1))-65 5890 PROCchord(chord$(Z%,C%)) 5900 R%=ASC(rhythm$(Z%,C%))-97 5910 WHEN "3" 5920 IF repeat%=FALSE THEN 5930 PROCtick(2,1,TRUE):PROCtick(4,1,TRUE):PROCtick(5,3,TRUE) 5940 repeat%=TRUE 5950 ELSE PROCtick(2,1,FALSE):PROCtick(4,1,FALSE):PROCtick(5,3,FALSE) 5960 repeat%=FALSE 5970 ENDIF 5980 WHEN "4.0":structure$=item$ 5990 structure_pos$=LEFT$(structure$,S%-1)+"("+MID$(structure$,S%,1)+")"+MID$(structure$,S%+1,19-S%) 6000 PROCput_icon_text(keyboard_window%,structure_icon%,structure_pos$) 6010 WHEN "5.0":tempo%=VAL(item$) 6020 PROCput_icon_text(keyboard_window%,tempo_icon%,item$) 6030 WHEN "11.0":trans%=VAL(item$) 6040 PROCput_icon_text(keyboard_window%,trans_icon%,item$) 6050 ENDCASE 6060l%=VAL(LEFT$(numeric_path$,1)) 6070IF l%>5 AND l%<9 PROCoctaves(numeric_path$) 6080IF l%=9 PROCinstruments(numeric_path$) 6090ENDPROC 6100: 6110DEFPROCsequence_menu(item$) 6120numeric_path$=FNmenu_path(blk%) 6130CASE numeric_path$ OF 6140 WHEN "0" 6150 play_sequence%=TRUE:play_rhythm%=TRUE:play_song%=FALSE 6160 PROCicon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),0) 6170 PROCicon_bg_colour(keyboard_window%,structure_icon%,0) 6180 B%=1:C%=1:S%=1:TIME=0:Z%=edit_sequence% 6190 PROCchord(chord$(Z%,C%)) 6200 R%=ASC(rhythm$(Z%,C%))-97 6210 WHEN "1" 6220 IF repeat%=FALSE THEN 6230 PROCtick(2,1,TRUE):PROCtick(4,1,TRUE):PROCtick(5,3,TRUE) 6240 repeat%=TRUE 6250 ELSE PROCtick(2,1,FALSE):PROCtick(4,1,FALSE):PROCtick(5,3,FALSE) 6260 repeat%=FALSE 6270 ENDIF 6280 WHEN "2":PROCcopy_sequence(edit_sequence%) 6290 WHEN "3":PROCadd_sequence 6300 WHEN "4":PROCclear_sequence(edit_sequence%) 6310 WHEN "5.0":r$=item$ 6320 IF ASC(r$)<65 OR ASC(r$)>122 r$="a":PROCput_writem(1,r$) 6330 IF ASC(r$)<97 r$=CHR$(ASC(r$)+32):PROCput_writem(1,r$) 6340 PROCglobal_rhythm(r$,edit_sequence%) 6350 ENDCASE 6360ENDPROC 6370: 6380DEFPROCrhythm_menu(item$) 6390numeric_path$=FNmenu_path(blk%) 6400CASE numeric_path$ OF 6410 WHEN "0" 6420 play_rhythm%=TRUE:play_sequence%=FALSE:play_song%=FALSE 6430 PROCicon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),0) 6440 PROCicon_bg_colour(keyboard_window%,structure_icon%,0) 6450 B%=1:C%=1:S%=1:Z%=0:TIME=0:PROCchord("C"):R%=edit_rhythm% 6460 WHEN "1" 6470 IF repeat%=FALSE THEN 6480 PROCtick(2,1,TRUE):PROCtick(4,1,TRUE):PROCtick(5,3,TRUE):repeat%=TRUE 6490 ELSE PROCtick(2,1,FALSE):PROCtick(4,1,FALSE):PROCtick(5,3,FALSE) 6500 repeat%=FALSE 6510 ENDIF 6520 WHEN "2":PROCcopy_rhythm(edit_rhythm%) 6530 WHEN "3":PROCadd_rhythm 6540 WHEN "4":PROCclear_rhythm(edit_rhythm%) 6550 WHEN "5.0":n%=VAL(item$):IF n%>16 n%=16:PROCput_writem(5,STR$(n%)) 6560 nobeats%(edit_rhythm%)=n%:PROCno_beats(edit_rhythm%) 6570 WHEN "6.0":cvol%=1:PROCtick(20,0,TRUE):PROCtick(20,1,FALSE) 6580 WHEN "6.1":cvol%=2:PROCtick(20,0,FALSE):PROCtick(20,1,TRUE) 6590 WHEN "7.0":bvol%=1:PROCtick(21,0,TRUE):PROCtick(21,1,FALSE) 6600 WHEN "7.1":bvol%=2:PROCtick(21,0,FALSE):PROCtick(21,1,TRUE) 6610 WHEN "8.0":fxvol%=1:PROCtick(22,0,TRUE):PROCtick(22,1,FALSE) 6620 WHEN "8.1":fxvol%=2:PROCtick(22,0,FALSE):PROCtick(22,1,TRUE) 6630 WHEN "9.0":file_path$=FNget_writem(135) 6640 IF INSTR(file_path$,".")=0 file_path$=app_directory$+".rhythms."+file_path$ 6650 PROCload_rhythm(file_path$) 6660 ENDCASE 6670ENDPROC 6680: 6690DEFPROCsave_key_press(key%,icon_handle%) 6700LOCAL file_name$,file_type% 6710CASE key% OF 6720 WHEN 13 6730 file_name$=FNget_icon_text(save%,name_icon%) 6740 file_type%=FNicon_sprite_type(save%,file_icon%) 6750 IF INSTR(file_name$,".") THEN 6760 $(blk%+44)=file_name$+CHR$0 6770 PROCsave(file_name$):PROCmenu_close 6780 ELSE 6790 $(blk%+44)=app_directory$+".songs."+file_name$+CHR$0 6800 PROCsave(app_directory$+".songs."+file_name$) 6810 ENDIF 6820 ENDCASE 6830ENDPROC 6840: 6850DEFPROCsave_rhythm_key_press(key%,icon_handle%) 6860LOCAL file_name$,file_type% 6870CASE key% OF 6880 WHEN 13 6890 file_name$=FNget_icon_text(save_rthm%,rhythm_name_icon%) 6900 file_type%=FNicon_sprite_type(save_rthm%,rhythm_file_icon%) 6910 IF INSTR(file_name$,".") THEN 6920 $(blk%+44)=file_name$+CHR$0:PROCsave_rhythm(file_name$):PROCmenu_close 6930 ELSE 6940 $(blk%+44)=app_directory$+".rhythms."+file_name$+CHR$0 6950 PROCsave_rhythm(app_directory$+".rhythms."+file_name$) 6960 ENDIF 6970 ENDCASE 6980ENDPROC 6990: 7000DEFPROCchord_key_press(window%,icon%,s%,c%,key%) 7010CASE key% OF 7020 WHEN 13:PROCenter_chord(window%,icon%,s%,c%) 7030 WHEN &4:PROCdelete_chord(window%,icon%,s%,c%) 7040 WHEN &9:PROCinsert_chord(window%,icon%,s%,c%) 7050ENDCASE 7060ENDPROC 7070: 7080DEFPROCrhythm_key_press(window%,icon%,s%,p%,key%) 7090CASE key% OF 7100 WHEN 13 7110 rhythm$(s%,p%)=FNget_icon_text(window%,icon%) 7120 IF p%<sequlen%(s%) PROCplace_caret(window%,rhythm_icon%(s%,p%+1),1) 7130 ENDCASE 7140ENDPROC 7150: 7160DEFPROCsave_request 7170LOCAL to_window%,to_icon%,data_type% 7180to_window%=blk%!20:to_icon%=blk%!24:data_type%=blk%!40 7190CASE data_type% OF 7200 WHEN &00A 7210 file_name$=FNget_string(blk%+44,255) 7220 blk%!12=blk%!8:blk%!16=4:SYS262375,17,blk%,blk%!4 7230 PROCload(file_name$) 7240 WHEN &00B 7250 file_name$=FNget_string(blk%+44,255) 7260 blk%!12=blk%!8:blk%!16=4:SYS262375,17,blk%,blk%!4 7270 PROCload_rhythm(file_name$) 7280 ENDCASE 7290ENDPROC 7300: 7310DEFPROCload_request 7320LOCAL file_type%,file_name$ 7330file_type%=blk%!40 7340CASE file_type% OF 7350 WHEN &00A:file_name$=FNget_string(blk%+44,255):PROCload(file_name$) 7360 WHEN &00B:file_name$=FNget_string(blk%+44,255):PROCload_rhythm(file_name$) 7370 ENDCASE 7380ENDPROC 7390: 7400DEFPROCsave_demand 7410LOCAL file_name$,file_type% 7420file_name$=FNget_string(blk%+44,255) 7430IF blk%!36=-1 THEN to_filer%=FALSE ELSE to_filer%=TRUE 7440file_type%=blk%!40 7450CASE drag_window% OF 7460 WHEN save%:PROCsave(file_name$):PROCmessage_save_reply 7470 IF to_filer% PROCput_icon_text(save%,1,file_name$) 7480 WHEN save_rthm%:PROCsave_rhythm(file_name$):PROCmessage_save_reply 7490 IF to_filer% PROCput_icon_text(save_rthm%,1,file_name$) 7500 ENDCASE 7510PROCmenu_close 7520ENDPROC 7530: 7540DEFPROCdouble_click 7550LOCAL file_type%,file$ 7560file_type%=blk%!40 7570CASE file_type% OF 7580 WHEN &00A:file_name$=FNget_string(blk%+44,255) 7590 blk%!12=blk%!8:blk%!16=4:SYS262375,17,blk%,blk%!4 7600 PROCload(file_name$) 7610 WHEN &00B:file_name$=FNget_string(blk%+44,255) 7620 blk%!12=blk%!8:blk%!16=4:SYS262375,17,blk%,blk%!4 7630 PROCload_rhythm(file_name$) 7640 ENDCASE 7650ENDPROC 7660: 7670DEFPROCload_check 7680file_to_load$=FNcommand_line 7690IF file_to_load$<>"" THEN 7700 CASE FNfile_type(file_to_load$) OF 7710 WHEN &00A:PROCload(file_to_load$) 7720 WHEN &00B:PROCload_rhythm(file_to_load$) 7730 ENDCASE 7740ENDIF 7750ENDPROC 7760: 7770DEFPROCsave(file$) 7780SYS263872 7790LOCAL s%,c%,r%,b%,v% 7800F%=OPENOUT(file$) 7810PRINT#F%,tempo%,sequences%,rhythms%,structure$ 7820FOR s%=0 TO sequences%-1:PRINT#F%,sequlen%(s%):FOR c%=1 TO sequlen%(s%) 7830 PRINT#F%,chord$(s%,c%),rhythm$(s%,c%) 7840 NEXT:NEXT 7850FOR r%=0 TO rhythms%-1:PRINT#F%,nobeats%(r%),rhythm_name$(r%):FOR c%=1 TO 7:FOR b%=1 TO nobeats%(r%) 7860 PRINT#F%,vol%(r%,c%,b%),ins%(r%,c%,b%) 7870 NEXT:NEXT:NEXT 7880FOR v%=1 TO 6:PRINT#F%,fx%(v%),fxchannel%(v%):NEXT 7890CLOSE#F%:PROCmenu_close 7900SYS8,&12,blk%+44,&00A:SYS263873 7910ENDPROC 7920: 7930DEFPROCload(file$) 7940LOCAL s%,c%,r%,b%,v% 7950FOR c%=1 TO 8:SOUND c%,0,0,-1:NEXT 7960F%=OPENIN(file$) 7970IF F%=0 PROCreport_error("File not found","Loading"):ENDPROC 7980SYS263872 7990PROCdelete_windows:FOR s%=0 TO sequences%-1:FOR c%=1 TO sequlen%(s%):chord$(s%,c%)=" ":rhythm$(s%,c%)="a":NEXT:NEXT 8000FOR r%=0 TO rhythms%-1:rhythm_name$(r%)=CHR$(r%+97):NEXT 8010INPUT#F%,tempo%,sequences%,rhythms%,structure$ 8020FOR s%=0 TO sequences%-1:INPUT#F%,sequlen%(s%):FOR c%=1 TO sequlen%(s%) 8030 INPUT#F%,chord$(s%,c%),rhythm$(s%,c%) 8040 NEXT:NEXT 8050FOR r%=0 TO rhythms%-1:INPUT#F%,nobeats%(r%),rhythm_name$(r%):FOR c%=1 TO 7:FOR b%=1 TO nobeats%(r%) 8060 INPUT#F%,vol%(r%,c%,b%),ins%(r%,c%,b%) 8070 NEXT:NEXT:NEXT 8080FOR v%=1 TO 6:INPUT#F%,fx%(v%),fxchannel%(v%):NEXT 8090CLOSE#F%:PROCupdate_windows(file$) 8100PROCput_writem(3,STR$(tempo%)):PROCput_writem(4,STR$(trans%)):PROCput_writem(5,structure$):PROCput_icon_text(save%,1,file$) 8110PROCopen_windows:PROCopen_window(keyboard_window%):SYS263873 8120play_rhythm%=0 8130ENDPROC 8140: 8150DEFPROCsave_rhythm(file$) 8160SYS263872 8170LOCAL c%,r%,b%:r%=edit_rhythm%:F%=OPENOUT(file$):PRINT#F%,nobeats%(r%) 8180FOR c%=1 TO 7:FOR b%=1 TO nobeats%(r%):PRINT#F%,vol%(r%,c%,b%),ins%(r%,c%,b%) 8190 NEXT:NEXT 8200CLOSE#F%:rhythm_name$(r%)=FNleaf(file$) 8210PROCdelete_window(rhythm_window%(r%)):PROCrhythm_window(r%) 8220PROCopen_window(rhythm_window%(r%)) 8230SYS8,&12,blk%+44,&00B:SYS263873 8240ENDPROC 8250: 8260DEFPROCload_rhythm(file$) 8270IF rhythms%=26:PROCreport_error("Only 26 rhythms possible!","Load Rhythm"):ENDPROC 8280F%=OPENIN(file$):IF F%=0 PROCreport_error("File not found","Loading"):ENDPROC 8290SYS263872:LOCAL c%,r%,b%:r%=rhythms%:INPUT#F%,nobeats%(r%) 8300FOR c%=1 TO 7:FOR b%=1 TO nobeats%(r%):INPUT#F%,vol%(r%,c%,b%),ins%(r%,c%,b%) 8310 NEXT:NEXT 8320rhythm_name$(r%)=FNleaf(file$) 8330PROCrhythm_window(rhythms%):PROCopen_window(rhythm_window%(rhythms%)) 8340rhythms%+=1:CLOSE#F%:SYS263873 8350ENDPROC 8360: 8370DEFPROCerror(!errorblk%,error$) 8380errorcount%+=1 8390IF errorcount%>5:ERROR EXT 0,"Too many errors!" 8400IF ERR<200 error$+=" at line "+STR$(ERL DIV10) 8410IF ERR=200 error$="*** Error in menu file! *** "+error$ 8420IF ERR=201 error$="*** Menu error *** "+error$ 8430IF ERR=202 error$="*** Icon error *** "+error$ 8440IF ERR=203 error$="*** File error *** "+error$ 8450IF ERR=204 error$="*** Window error *** "+error$ 8460SYS131085,0,menufile% 8470SYS393434 8480$(errorblk%+4)=error$ 8490SYS262367,errorblk%,1,app_name$ 8500ENDPROC 8510: 8520DEFPROCquit 8530*FX12 8540SYS262365 8550END 8560ENDPROC 8570: 8580DEFPROCevent 8590IF sustain%=0 PROCkeyboard(0) 8600IF TIME>tempo% TIME=0:IF play_rhythm% PROCstrum 8610ENDPROC 8620: 8630DEFPROCstereo 8640FOR ch%=1 TO 8:SYS262466,ch%,stereo%(ch%)*32:NEXT 8650ENDPROC 8660: 8670DEFPROCcopy_sequence(s%) 8680LOCAL c% 8690SYS263872 8700IF sequences%=26:PROCreport_error("Only 26 sequences possible!","Copy Sequence"):ENDPROC 8710FOR c%=1 TO sequlen%(s%) 8720 chord$(sequences%,c%)=chord$(s%,c%):rhythm$(sequences%,c%)=rhythm$(s%,c%) 8730 NEXT 8740sequlen%(sequences%)=sequlen%(s%) 8750PROCsequence_window(sequences%):PROCopen_window(sequence_window%(sequences%)) 8760sequences%+=1:SYS263873 8770ENDPROC 8780: 8790DEFPROCadd_sequence 8800SYS263872 8810IF sequences%=26:PROCreport_error("Only 26 sequences possible!","Add Sequence"):ENDPROC 8820PROCsequence_window(sequences%):PROCopen_window(sequence_window%(sequences%)) 8830sequences%+=1:SYS263873 8840ENDPROC 8850: 8860DEFPROCclear_sequence(s%) 8870LOCAL c% 8880SYS263872 8890FOR c%=1 TO 32:chord$(s%,c%)=" ":rhythm$(s%,c%)="a":NEXT 8900sequlen%(s%)=0:PROCdelete_window(sequence_window%(s%)) 8910PROCsequence_window(s%):PROCopen_window(sequence_window%(s%)) 8920SYS263873 8930ENDPROC 8940: 8950DEFPROCglobal_rhythm(r$,s%) 8960LOCAL c% 8970SYS263872 8980FOR c%=1 TO 32:rhythm$(s%,c%)=r$:NEXT 8990PROCclose_window(sequence_window%(s%)) 9000PROCsequence_window(s%):PROCopen_window(sequence_window%(s%)) 9010SYS263873 9020ENDPROC 9030: 9040DEFPROCcopy_rhythm(r%) 9050LOCAL c%,b% 9060SYS263872 9070IF rhythms%=26:PROCreport_error("Only 26 rhythms possible!","Copy Rhythm"):ENDPROC 9080nobeats%(rhythms%)=nobeats%(r%) 9090FOR c%=1 TO 7:FOR b%=1 TO nobeats%(r%) 9100 vol%(rhythms%,c%,b%)=vol%(r%,c%,b%) 9110 ins%(rhythms%,c%,b%)=ins%(r%,c%,b%) 9120 NEXT:NEXT 9130PROCrhythm_window(rhythms%):PROCopen_window(rhythm_window%(rhythms%)) 9140rhythms%+=1:SYS263873 9150ENDPROC 9160: 9170DEFPROCadd_rhythm 9180SYS263872 9190IF rhythms%=26:PROCreport_error("Only 26 rhythms possible!","Add Rhythm"):ENDPROC 9200PROCrhythm_window(rhythms%):PROCopen_window(rhythm_window%(rhythms%)) 9210rhythms%+=1:SYS263873 9220ENDPROC 9230: 9240DEFPROCclear_rhythm(r%) 9250LOCAL c%,b% 9260SYS263872 9270FOR c%=1 TO 7:FOR b%=1 TO nobeats%(r%) 9280 vol%(r%,c%,b%)=-1 9290 ins%(r%,c%,b%)=0 9300 NEXT:NEXT 9310PROCclose_window(rhythm_window%(r%)) 9320PROCrhythm_window(r%):PROCopen_window(rhythm_window%(r%)) 9330SYS263873 9340ENDPROC 9350: 9360DEFPROCno_beats(r%) 9370SYS263872 9380PROCclose_window(rhythm_window%(r%)) 9390PROCrhythm_window(r%):PROCopen_window(rhythm_window%(r%)) 9400SYS263873 9410ENDPROC 9420: 9430DEFPROCoctaves(choice$) 9440LOCAL p%,o% 9450p%=VAL(LEFT$(choice$,1)):o%=VAL(MID$(choice$,3,1))+1 9460CASE p% OF 9470 WHEN 6:PROCtick(10,coct%-1,FALSE):coct%=o%:PROCtick(10,o%-1,TRUE) 9480 WHEN 7:PROCtick(11,boct%-1,FALSE):boct%=o%:PROCtick(11,o%-1,TRUE) 9490 WHEN 8:PROCtick(12,koct%-1,FALSE):koct%=o%:PROCtick(12,o%-1,TRUE) 9500ENDCASE 9510ENDPROC 9520: 9530DEFPROCname_voices 9540LOCAL m%,voice$ 9550FOR m%=0 TO 127 9560 SYS262531,0,1+m%MOD32 TO voice$,F% 9570 IF INSTR(voice$,"!K")=0 THEN 9580 IF m%>95 voice$=" "+voice$ 9590 PROCput_writem(m%+6,voice$):PROCshade(14+m%DIV32,m%MOD32,FALSE) 9600 ELSE 9610 PROCput_writem(m%+6,STR$(1+m%MOD32)):PROCshade(14+m%DIV32,m%MOD32,TRUE) 9620 ENDIF 9630NEXT 9640ENDPROC 9650: 9660DEFPROCinstruments(choice$) 9670LOCAL r%,p%,v%,F%,voice$ 9680p%=VAL(MID$(choice$,3,1)):v%=VAL(MID$(choice$,5))+1 9690CASE p% OF 9700 WHEN 0:PROCtick(14,chord_voice%-1,FALSE):chord_voice%=v% 9710 PROCtick(14,chord_voice%-1,TRUE) 9720 SYS262531,0,chord_voice% TO chord_voice$,F% 9730 PROCput_icon_text(keyboard_window%,chord_ins_icon%,chord_voice$) 9740 WHEN 1:PROCtick(15,bass_voice%-1,FALSE):bass_voice%=v% 9750 PROCtick(15,bass_voice%-1,TRUE) 9760 SYS262533,7,bass_voice% 9770 SYS262531,0,bass_voice% TO bass_voice$,F% 9780 PROCput_icon_text(keyboard_window%,bass_ins_icon%,bass_voice$) 9790 WHEN 2:PROCtick(16,keyboard_voice%-1,FALSE):keyboard_voice%=v% 9800 PROCtick(16,keyboard_voice%-1,TRUE) 9810 SYS262533,8,keyboard_voice% 9820 SYS262531,0,keyboard_voice% TO keyboard_voice$,F% 9830 PROCput_icon_text(keyboard_window%,keyboard_ins_icon%,keyboard_voice$) 9840 WHEN 3,4,5,6,7,8 9850 IF LEFT$(FNget_writem(101+fx%(p%-2)),1)=STR$(p%-2) THEN 9860 SYS262531,0,fx%(p%-2) TO voice$,F% 9870 PROCput_writem(101+fx%(p%-2)," "+voice$) 9880 ENDIF 9890 fx%(p%-2)=v% 9900 SYS262531,0,v% TO voice$,F% 9910 PROCput_writem(101+v%,STR$(p%-2)+" "+voice$) 9920 WHEN 9 9930 IF fxchannel%(v%)=TRUE THEN 9940 fxchannel%(v%)=FALSE:PROCtick(18,v%-1,FALSE) 9950 FOR r%=0 TO rhythms%-1:PROCput_icon_text(rhythm_window%(r%),(v%-1)*5,STR$(7-v%)+" "):NEXT 9960 ELSE fxchannel%(v%)=TRUE:PROCtick(18,v%-1,TRUE) 9970 FOR r%=0 TO rhythms%-1:PROCput_icon_text(rhythm_window%(r%),(v%-1)*5,STR$(7-v%)+" FX"):NEXT 9980 ENDIF 9990 ENDCASE 10000ENDPROC 10010: 10020DEFPROCenter_chord(window%,icon%,s%,c%) 10030LOCAL type$,x%,y% 10040type$="write":chord$(s%,c%)=FNget_icon_text(window%,icon%) 10050IF c%=sequlen%(s%)+1 THEN 10060 sequlen%(s%)+=1 10070 IF c%<32 THEN 10080 PROCclose_window(window%) 10090 c%+=1:x%=((c%-1)MOD4)*128+4:y%=-((c%-1)DIV4)*56-4 10100 text$=chord$(s%,c%) 10110 chord_icon%(s%,c%)=FNadd_icon(type$,text$,window%,x%,y%,4,0,1) 10120 PROCput_icon_text(window%,chord_icon%(s%,c%),"") 10130 text$=rhythm$(s%,c%) 10140 rhythm_icon%(s%,c%)=FNadd_icon(type$,text$,window%,x%+88,y%,1,0,1) 10150 PROCicon_bg_colour(window%,rhythm_icon%(s%,c%),14) 10160 PROCicon_fg_colour(window%,rhythm_icon%(s%,c%),11) 10170 PROCopen_window(window%):PROCplace_caret(window%,chord_icon%(s%,c%),0) 10180 ENDIF 10190 ELSE 10200 IF c%<32 PROCplace_caret(window%,chord_icon%(s%,c%+1),0) 10210 ENDIF 10220ENDPROC 10230: 10240DEFPROCdelete_chord(window%,icon%,s%,chord%) 10250LOCAL c% 10260IF sequlen%(s%)=1 OR chord%=sequlen%(s%)+1 ENDPROC 10270FOR c%=chord% TO sequlen%(s%)+1*(sequlen%(s%)=32) 10280 chord$(s%,c%)=chord$(s%,c%+1) 10290 PROCput_icon_text(window%,chord_icon%(s%,c%),chord$(s%,c%)) 10300 IF chord$(s%,c%+1)=" " PROCput_icon_text(window%,chord_icon%(s%,c%),"") 10310 rhythm$(s%,c%)=rhythm$(s%,c%+1) 10320 PROCput_icon_text(window%,rhythm_icon%(s%,c%),rhythm$(s%,c%)) 10330 NEXT 10340IF sequlen%(s%)=32 THEN 10350 chord$(s%,c%+1)="" 10360 PROCput_icon_text(window%,chord_icon%(s%,c+1%),chord$(s%,c+1%)) 10370ELSE 10380 FOR c%=0 TO 4 10390 PROCdelete_icon(window%,chord_icon%(s%,sequlen%(s%)+1)+c%) 10400 PROCdelete_icon(window%,rhythm_icon%(s%,sequlen%(s%)+1)+c%) 10410 NEXT 10420ENDIF 10430sequlen%(s%)-=1 10440ENDPROC 10450: 10460DEFPROCinsert_chord(window%,icon%,s%,chord%) 10470IF sequlen%(s%)=32 OR chord%>sequlen%(s%) ENDPROC 10480LOCAL c%,type$,x%,y% 10490type$="write" 10500PROCclose_window(window%) 10510IF sequlen%(s%)<31 THEN 10520 c%=sequlen%(s%)+2:x%=((c%-1)MOD4)*128+4:y%=-((c%-1)DIV4)*56-4 10530 chord_icon%(s%,c%)=FNadd_icon(type$," ",window%,x%,y%,4,0,1) 10540 PROCput_icon_text(window%,chord_icon%(s%,c%),"") 10550 rhythm_icon%(s%,c%)=FNadd_icon(type$,"a",window%,x%+88,y%,1,0,1) 10560 PROCicon_bg_colour(window%,rhythm_icon%(s%,c%),14) 10570 PROCicon_fg_colour(window%,rhythm_icon%(s%,c%),11) 10580 ENDIF 10590sequlen%(s%)+=1 10600FOR c%=sequlen%(s%) TO chord%+1 STEP -1 10610 chord$(s%,c%)=chord$(s%,c%-1) 10620 PROCput_icon_text(window%,chord_icon%(s%,c%),chord$(s%,c%)) 10630 rhythm$(s%,c%)=rhythm$(s%,c%-1) 10640 PROCput_icon_text(window%,rhythm_icon%(s%,c%),rhythm$(s%,c%)) 10650 NEXT 10660chord$(s%,chord%)=" ":PROCput_icon_text(window%,chord_icon%(s%,c%),"") 10670PROCopen_window(window%):PROCplace_caret(window%,chord_icon%(s%,chord%),0) 10680ENDPROC 10690: 10700DEFPROCkeyboard(k%) 10710N%=INSTR(lowkey$,CHR$k%)+INSTR(highkey$,CHR$k%)-12*(INSTR(highkey$,CHR$k%)>0) 10720IF INSTR(lowkey$,CHR$k%) L%=lkc?(INSTR(lowkey$,CHR$k%)) 10730IF INSTR(highkey$,CHR$k%) L%=hkc?(INSTR(highkey$,CHR$k%)) 10740IF N%=0 N%=INKEY(-L%) 10750IF N%=-1 OR N%=255 ENDPROC 10760IF N%=0 SOUND 8,0,0,-1:ENDPROC 10770SOUND 8,-15,(N%-1)*&155+(koct%*&1000)+trans%*&2B,-1 10780ENDPROC 10790: 10800DEFPROCstrum 10810LOCAL ch%,i%,v%,p% 10820FOR ch%=1 TO 6 10830 i%=0:v%=-1:i%=ins%(R%,ch%,B%) 10840 IF i% THEN 10850 v%=vol%(R%,ch%,B%)*fxvol%:IF v%>-1 SYS262533,ch%,fx%(i%) 10860 ELSE 10870 v%=vol%(R%,ch%,B%)*cvol%:IF v%>-1 SYS262533,ch%,chord_voice% 10880 ENDIF 10890 IF fxchannel%(ch%)=FALSE p%=p%(7-ch%)*&155+coct%*&1000+trans%*&2B ELSE p%=&3000+trans%*&2B 10900 IF v%>-1 IF p%(7-ch%)>-1 SOUND ch%,-v%,p%,255 10910NEXT 10920v%=vol%(R%,7,B%)*bvol%:p%=p%(ins%(R%,7,B%))*&155+boct%*&1000+trans%*&2B 10930IF v%>-1 IF p%(ins%(R%,7,B%))>-1 SOUND 7,-v%,p%,255 10940IF tempo%>7 PROCbeat 10950IF B%=1 PROCicon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),10) 10960B%+=1 10970IF B%>nobeats%(R%) THEN 10980 B%=1:IF play_sequence%=FALSE AND repeat%=FALSE play_rhythm%=FALSE 10990 PROCicon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),0) 11000 IF play_sequence%=TRUE C%+=1 11010 IF C%>sequlen%(Z%) THEN 11020 C%=1:IF play_song%=FALSE AND repeat%=FALSE play_sequence%=FALSE:play_rhythm%=FALSE 11030 IF play_song%=TRUE S%+=1 11040 IF S%>LEN(structure$) THEN 11050 S%=1:IF repeat%=FALSE play_song%=FALSE:play_sequence%=FALSE:play_rhythm%=FALSE 11060 ENDIF 11070 structure_pos$=LEFT$(structure$,S%-1)+"("+MID$(structure$,S%,1)+")"+MID$(structure$,S%+1,19-S%) 11080 PROCput_icon_text(keyboard_window%,structure_icon%,structure_pos$) 11090 IF play_song% Z%=ASC(MID$(structure$,S%,1))-65 11100 ENDIF 11110 IF play_sequence% PROCchord(chord$(Z%,C%)):R%=ASC(rhythm$(Z%,C%))-97 11120ENDIF 11130ENDPROC 11140: 11150DEFPROCbeat 11160PROCicon_bg_colour(rhythm_window%(last_r%),beat_icon%(1,last_b%),last_vol%) 11170PROCicon_bg_colour(rhythm_window%(R%),beat_icon%(1,B%),14) 11180last_r%=R%:last_b%=B%:last_vol%=vol%(R%,1,B%):IF last_vol%<0 last_vol%=15 11190ENDPROC 11200: 11210DEFPROCchord(c$) 11220LOCAL r% 11230IF c$="/" ENDPROC 11240IF c$="" OR LEFT$(c$,1)=" " p%()=-1:ENDPROC 11250r%=INSTR(root$,LEFT$(c$,1))-1 11260IF INSTR(c$,"#") r%+=1 11270IF INSTR(c$,"b") r%-=1 11280p%()=r%:p%(2)+=4:p%(3)+=7:p%(4)+=12:p%(5)+=16:p%(6)+=19 11290IF (INSTR(c$,"m") OR INSTR(c$,"-")) AND NOT INSTR(c$,"M") p%(2)-=1:p%(5)-=1 11300IF (INSTR(c$,"7") OR INSTR(c$,"11")) AND NOT INSTR(c$,"M") p%(4)-=2 11310IF INSTR(c$,"M7") p%(4)-=1 11320IF INSTR(c$,"+") p%(3)+=1:p%(6)+=1 11330IF INSTR(c$,"-") p%(2)-=1:p%(3)-=1:p%(4)-=3:p%(5)-=4:p%(6)-=5 11340IF INSTR(c$,"s") OR INSTR(c$,"11") p%(2)+=1:p%(5)+=1 11350IF INSTR(c$,"6") OR INSTR(c$,"13") p%(3)+=2:p%(6)+=2 11360IF INSTR(c$,"9") OR INSTR(c$,"13") p%(4)+=2 11370ENDPROC 11380: 11390DEFFNfile_size(file$) 11400LOCAL size%,found% 11410SYS8,17,file$ TO found%,,,,size% 11420IF found%<>1 THEN ERROR 203,"File '"+FNleaf(file$)+"' not found!" 11430=size% 11440: 11450DEFFNfile_type(file$) 11460LOCAL temp%,found% 11470SYS"OS_File",17,file$ TO found%,,temp% 11480IF found%<>1 THEN ERROR 203,"File "+FNleaf(file$)+", not found!" 11490IF(temp%>>>20)=&FFFTHEN=(temp%>>>8)AND&FFF ELSE=0 11500: 11510DEFPROCinitiate_save(window%,icon%,x%,y%,file$,start%,size%,type%) 11520blk%!0=256 11530blk%!12=0 11540blk%!16=1 11550blk%!20=window% 11560blk%!24=icon% 11570blk%!28=x% 11580blk%!32=y% 11590blk%!36=size% 11600blk%!40=type% 11610$(blk%+44)=file$+CHR$0 11620SYS262375,17,blk%,window%,icon% TO destination_task% 11630ENDPROC 11640: 11650DEFPROCmessage_save_reply 11660blk%!12=blk%!8:blk%!16=3:SYS262375,17,blk%,blk%!4 11670ENDPROC 11680: 11690DEFFNcommand_line 11700LOCAL pos%,cmd_line$ 11710SYS "OS_GetEnv" TO cmd_line$ 11720pos%=INSTR(cmd_line$," -quit ") 11730IF pos%=0 ="" 11740pos%+=7 11750WHILEMID$(cmd_line$,pos%,1)=" ":pos%+=1:ENDWHILE 11760pos%=INSTR(cmd_line$+" "," ",pos%+1) 11770REPEATpos%+=1:UNTILMID$(cmd_line$,pos%,1)<>" " 11780cmd_line$=MID$(cmd_line$,pos%) 11790cmd_line$=LEFT$(cmd_line$,INSTR(cmd_line$+" "," ")-1) 11800=cmd_line$ 11810: 11820DEFFNadd_icon(type$,text$,window%,x%,y%,sl%,esg_sp%,border%) 11830LOCAL icon%,text_space%,name_space%,val_space%,w%,h%,mode%,xs%,ys%,sel% 11840sel%=sl% 11850IF sl%<LENtext$ sl%=LENtext$ 11860IF sl%<LENtype$ sl%=LENtype$ 11870DIM text_space% sl% 11880temp_blk%!0=window% 11890temp_blk%!4=x% 11900temp_blk%!8=y%-48 11910temp_blk%!12=x%+16+16*LENtext$ 11920temp_blk%!16=y% 11930$text_space%=text$ 11940temp_blk%!20=&17000139 11950temp_blk%!24=text_space% 11960temp_blk%!28=-1 11970temp_blk%!32=LENtext$ 11980CASE LEFT$(type$,5) OF 11990 WHEN "file_" 12000 SYS262377,&28,,type$+CHR$(0) TO ,,,w%,h%,,mode% 12010 SYS53,mode%,4 TO ,,xs% 12020 SYS53,mode%,5 TO ,,ys% 12030 h%=h%<<ys%:w%=w%<<xs% 12040 IF text$="" THEN 12050 temp_blk%!8=y%-h% 12060 temp_blk%!12=x%+w% 12070 temp_blk%!20=&1700613A 12080 temp_blk%!28=1 12090 temp_blk%!32=LENtype$ 12100 $text_space%=type$ 12110 ELSE 12120 temp_blk%!8=y%-h%-(10<<ys%) 12130 sl%=(8<<xs%)*LENtext$:IF sl%>w% w%=sl% 12140 temp_blk%!12=x%+w% 12150 temp_blk%!20=&1700612B 12160 DIM name_space% (2+LENtype$) 12170 $name_space%="s"+type$ 12180 temp_blk%!28=name_space% 12190 ENDIF 12200 WHEN "sprit" 12210 SYS46,&128,esg_sp%,text$+CHR$(0) TO ,,,w%,h%,,mode% 12220 SYS53,mode%,4 TO ,,xs% 12230 SYS53,mode%,5 TO ,,ys% 12240 h%=h%<<ys%:w%=w%<<xs% 12250 temp_blk%!8=y%-h% 12260 temp_blk%!12=x%+w% 12270 temp_blk%!20=&1700313A 12280 temp_blk%!28=esg_sp% 12290 temp_blk%!32=LENtext$ 12300 $text_space%=text$ 12310 WHEN "selec":temp_blk%!20=&17003139 12320 WHEN "actio":temp_blk%!20=&C71F913D. 12330 WHEN "repor":temp_blk%!20=&0700313D 12340 WHEN "optio" 12350 temp_blk%!8=y%-52 12360 temp_blk%!12=x%+40+16+16*LENtext$ 12370 temp_blk%!20=&1700B133 12380 IF sel% temp_blk%!20=&17303133 12390 DIM val_space% (2+LEN"soptoff,opton") 12400 $val_space%="soptoff,opton" 12410 temp_blk%!28=val_space% 12420 WHEN "radio" 12430 temp_blk%!8=y%-52 12440 temp_blk%!12=x%+40+16+16*LENtext$ 12450 IF (esg_sp%<1) OR (esg_sp%>31) THEN esg_sp%=1 12460 temp_blk%!20=&1700B133 OR (esg_sp%*&10000) 12470 IF sel% temp_blk%!20=&1720B133 OR (esg_sp%*&10000) 12480 DIM text_space% (2+LEN"sradiooff,radioon") 12490 $text_space%="sradiooff,radioon" 12500 temp_blk%!28=text_space% 12510 WHEN "write" 12520 temp_blk%!12=x%+16+16*LENtext$ 12530 temp_blk%!20=&0700F131 12540 DIM val_space% 27 12550 $val_space%="" 12560 temp_blk%!28=val_space% 12570 IF sel%<(LENtext$) sel%=LENtext$ 12580 temp_blk%!32=sel%+1 12590 ENDCASE 12600SYS262338,,temp_blk% TO icon% 12610IF border%>0 PROCborder_icon(window%,icon%) 12620=icon% 12630: 12640DEFFNadd_icon_block(window_handle%,minx%,miny%,maxx%,maxy%,colour%) 12650LOCAL icon% 12660temp_blk%!0=window_handle% 12670IF minx%>maxx% SWAP minx%,maxx% 12680IF miny%>maxy% SWAP miny%,maxy% 12690IF minx%=maxx% maxx%+=1 12700IF miny%=maxy% maxy%+=1 12710temp_blk%!4=minx% 12720temp_blk%!8=miny% 12730temp_blk%!12=maxx% 12740temp_blk%!16=maxy% 12750temp_blk%!20=32+(colour%<<28) 12760SYS262338,,temp_blk% TO icon% 12770=icon% 12780: 12790DEFPROCborder_icon(window_handle%,icon_handle%) 12800LOCAL icon%,minx%,miny%,maxx%,maxy%,flag%,tl%,br% 12810temp_blk%!0=window_handle% 12820temp_blk%!4=icon_handle% 12830SYS262350,,temp_blk% 12840minx%=temp_blk%!8 12850miny%=temp_blk%!12 12860maxx%=temp_blk%!16 12870maxy%=temp_blk%!20 12880flag%=temp_blk%!24 12890tl%=0:br%=4 12900IF (flag% AND 4)=4 minx%-=4:maxx%+=4:miny%-=4:maxy%+=4:tl%=4:br%=0 12910icon%=FNadd_icon_block(window_handle%,maxx%,miny%-4,maxx%+4,maxy%+4,br%) 12920icon%=FNadd_icon_block(window_handle%,minx%-4,maxy%,maxx%+2,maxy%+4,tl%) 12930icon%=FNadd_icon_block(window_handle%,minx%-4,miny%-4,minx%,maxy%,tl%) 12940icon%=FNadd_icon_block(window_handle%,minx%-2,miny%-4,maxx%+2,miny%,br%) 12950ENDPROC 12960: 12970DEFPROCdelete_icon(window_handle%,icon_handle%) 12980LOCAL minx%,miny%,maxx%,maxy% 12990temp_blk%!0=window_handle%:temp_blk%!4=icon_handle% 13000SYS262350,,temp_blk% 13010minx%=temp_blk%!8:miny%=temp_blk%!12:maxx%=temp_blk%!16:maxy%=temp_blk%!20 13020SYS262340,,temp_blk% 13030SYS262353,window_handle%,minx%,miny%,maxx%,maxy% 13040ENDPROC 13050: 13060DEFPROCdrag_box(window_handle%,icon_handle%) 13070LOCAL x%,y% 13080temp_blk%!0=window_handle% 13090SYS262347,,temp_blk% 13100x%=temp_blk%!4-temp_blk%!20:y%=temp_blk%!16-temp_blk%!24 13110temp_blk%!4=icon_handle% 13120SYS262350,,temp_blk% 13130IF (temp_blk%!24 AND &B000)=&B000 ENDPROC 13140IF (temp_blk%!24 AND &800000)=&800000 ENDPROC 13150temp_blk%!4=5 13160temp_blk%!8+=x% 13170temp_blk%!12+=y% 13180temp_blk%!16+=x% 13190temp_blk%!20+=y% 13200temp_blk%!24=-1 13210temp_blk%!28=-1 13220temp_blk%!32=&7FFFFFFF 13230temp_blk%!36=&7FFFFFFF 13240SYS262352,,temp_blk% 13250ENDPROC 13260: 13270DEFFNget_icon_text(window_handle%,icon_handle%) 13280temp_blk%!0=window_handle% 13290temp_blk%!4=icon_handle% 13300SYS262350,,temp_blk% 13310IF (temp_blk%!24 AND &101)<>&101 THEN 13320 ERROR 202,"Icon "+STR$icon%+" not indirected!" 13330 ="" 13340ENDIF 13350=$temp_blk%!28 13360: 13370DEFPROCicon_bg_colour(window_handle%,icon_handle%,colour%) 13380IF colour%<0 OR colour%>15 ENDPROC 13390temp_blk%!0=window_handle% 13400temp_blk%!4=icon_handle% 13410SYS262350,,temp_blk% 13420IF (temp_blk%!24 AND 1<<6) THEN ENDPROC 13430temp_blk%!12=&F0000000 13440temp_blk%!8=colour%<<28:SYS262349,,temp_blk% 13450ENDPROC 13460: 13470DEFPROCicon_fg_colour(window_handle%,icon_handle%,colour%) 13480IF colour%<0 OR colour%>15 ENDPROC 13490temp_blk%!0=window_handle% 13500temp_blk%!4=icon_handle% 13510SYS262350,,temp_blk% 13520IF (temp_blk%!24 AND 1<<6) THEN ENDPROC 13530temp_blk%!12=&F000000 13540temp_blk%!8=colour%<<24:SYS262349,,temp_blk% 13550ENDPROC 13560: 13570DEFPROCicon_validation(window_handle%,icon_handle%,type$) 13580temp_blk%!0=window_handle% 13590temp_blk%!4=icon_handle% 13600SYS262350,,temp_blk% 13610IF (temp_blk%!24 AND &E101)<>&E101 THEN 13620 ERROR 202,"Icon "+STR$icon_handle%+" not writable and not indirected!" 13630 ENDPROC 13640ENDIF 13650CASE type$ OF 13660 WHEN "number":$temp_blk%!32="A0-9." 13670 WHEN "file":$temp_blk%!32="A~ $&@\\^:.#*|"+CHR$34 13680OTHERWISE 13690 $temp_blk%!32="A"+type$ 13700ENDCASE 13710ENDPROC 13720: 13730DEFPROCplace_caret(window_handle%,icon_handle%,position%) 13740temp_blk%!0=window_handle% 13750temp_blk%!4=icon_handle% 13760SYS262350,,temp_blk% 13770IF (temp_blk%!24 AND &E101)<>&E101 THEN 13780 ERROR 202,"Icon "+STR$icon_handle%+" not writable and not indirected!" 13790 ENDPROC 13800ENDIF 13810text$=$temp_blk%!28 13820IF position%>LENtext$ position%=LENtext$ 13830SYS262354,window_handle%,icon_handle%,0,0,-1,position% 13840ENDPROC 13850: 13860DEFPROCput_icon_text(window_handle%,icon_handle%,text$) 13870temp_blk%!0=window_handle% 13880temp_blk%!4=icon_handle% 13890SYS262350,,temp_blk% 13900IF (temp_blk%!24 AND &101)<>&101 THEN 13910 ERROR 202,"Icon "+STR$icon_handle%+" not indirected!" 13920 ENDPROC 13930ENDIF 13940text$=LEFT$(text$,temp_blk%!36):REM -1 allows for <RETURN> chr! 13950$temp_blk%!28=text$ 13960temp_blk%!8=0 13970temp_blk%!12=0 13980SYS262349,,temp_blk% 13990ENDPROC 14000: 14010DEFFNput_icon_on_bar(sprite_name$,side$) 14020LOCAL handle% 14030IF side$="RIGHT" !temp_blk%=-1 ELSE !temp_blk%=-2 14040temp_blk%!4=0 14050temp_blk%!8=0 14060temp_blk%!12=68 14070temp_blk%!16=68 14080temp_blk%!20=&1700202A 14090$(temp_blk%+24)=sprite_name$ 14100SYS262338,,temp_blk% TO handle% 14110=handle% 14120: 14130DEFPROCput_info_text(window_handle%,name$,purpose$,author$,version$) 14140PROCput_icon_text(window_handle%,1,name$) 14150PROCput_icon_text(window_handle%,2,purpose$) 14160PROCput_icon_text(window_handle%,3,author$) 14170PROCput_icon_text(window_handle%,4,version$) 14180ENDPROC 14190: 14200DEF FNtask_initialise(title$) 14210LOCAL version% 14220version%=200 14230SYS262336,version%,&4B534154,title$ TO version%,this_task% 14240=this_task% 14250: 14260DEFPROCadd_menu_item(line$) 14270LOCAL menuflag%,iconflag%,param$,sub%,itemtext$,writable%,maxlength% 14280iconflag%=&7000021:sub%=-1:writable%=FALSE 14290itemtext$=FNmenu_item_text(line$):maxlength%=LENitemtext$ 14300REPEAT 14310 param$=FNmenu_item_param(line$) 14320 CASE LEFT$(param$,4) OF 14330 WHEN"tick":menuflag%=menuflag%OR1 14340 WHEN"line":menuflag%=menuflag%OR2 14350 WHEN"shad":iconflag%=iconflag%OR&400000 14360 WHEN"subm":sub%=FNmenu_submenu(FNmenuvar(param$)) 14370 WHEN"wind":sub%=FNmenu_window(FNmenuvar(param$)) 14380 WHEN"icon":iconflag%=FNmenu_iconflag(FNmenuvar(param$)) 14390 WHEN"writ":PROCmenu_writable(FNmenuvar(param$)) 14400 ENDCASE 14410 UNTIL param$="" 14420pointer%!0=menuflag% 14430pointer%!4=sub% 14440IF LEN(itemtext$)>12 OR writable% THEN 14450 pointer%!8=iconflag% OR &100 14460 PROCindirected_item(pointer%,writable%,maxlength%) 14470ELSE 14480 pointer%!8=iconflag% 14490 $(pointer%+12)=LEFT$(itemtext$+CHR$(0),12) 14500ENDIF 14510pointer%+=24 14520ENDPROC 14530: 14540DEFFNbeginmenu(line$) 14550IF LEFT$(line$,9)="beginmenu" =TRUE 14560=FALSE 14570: 14580DEFFNdecode_menu(menustart%,listptr%) 14590LOCAL text_path$ 14600SYS262357,,menustart%,listptr%,blk%+256 TO ,,,text_path$ 14610=text_path$ 14620: 14630DEFPROCdim_menu_arrays(menucount%,itemcount%,writecount%,windowcount%) 14640DIM menustart% (menucount%*28)+(itemcount%*24) 14650DIM menuwidth%(menucount%) 14660DIM menu%(menucount%) 14670DIM writable_item%(writecount%) 14680DIM writable_len%(writecount%) 14690ENDPROC 14700: 14710DEFFNget_writem(writem%) 14720LOCAL temp$ 14730IF writem%<1 OR writem%>DIM(writable_item%(),1) THEN 14740 ERROR 201,"writable menu item "+STR$(writem%)+" does not exist!" 14750ENDIF 14760writem%=writable_item%(writem%) 14770temp$="": WHILE ?writem%>31:temp$+=CHR$?writem%:writem%+=1:ENDWHILE 14780=temp$ 14790: 14800DEFPROCgoto_beginmenu 14810LOCAL temp%,line$ 14820PTR#menufile%=0 14830REPEAT temp%=PTR#menufile%:line$=GET$#menufile% 14840UNTIL FNbeginmenu(line$) OR EOF#menufile% 14850IF EOF#menufile% ERROR 200,"No 'beginmenu' found in menu file" 14860PTR#menufile%=temp% 14870ENDPROC 14880: 14890DEFPROCindirected_item(menu_ptr%,writable%,length%) 14900LOCAL indir_ptr% 14910IF writable% DIM indir_ptr% length%+1 ELSE DIM indir_ptr% 1+LENitemtext$ 14920menu_ptr%!12=indir_ptr%:REM pointer to indirection buffer 14930$indir_ptr%=itemtext$+CHR$(0) 14940IF writable% THEN 14950 writable_item%(writable%)=indir_ptr% 14960 writable_len%(writable%)=length% 14970 indir_ptr%+=length%+1 14980 menu_ptr%!20=length%+1 14990ELSE 15000 indir_ptr%+=1+LENitemtext$ 15010 menu_ptr%!20=1+LENitemtext$:REM Buffer length 15020ENDIF 15030?indir_ptr%=0 15040menu_ptr%!16=indir_ptr%:REM Pointer to validation string (null) 15050ENDPROC 15060: 15070DEFFNitem_count(menu_ptr%) 15080LOCAL count% 15090count%=1:menu_ptr%+=28 15100WHILE (!menu_ptr% AND &80)=0:menu_ptr%+=24:count%+=1:ENDWHILE 15110=count% 15120: 15130DEFPROCload_menus(menufile$) 15140LOCAL menucount%,header%,line$,pointer%,menustart% 15150PROCsize_menu_arrays(menufile$) 15160menufile%=OPENINmenufile$ 15170PROCset_menu_arrays:PROCgoto_beginmenu 15180menucount%=0:header%=FALSE 15190REPEAT 15200 line$=GET$#menufile% 15210 IF FNbeginmenu(line$) THEN 15220 IFheader% ERROR 200,"Bad menu file, no items in menu "+STR$(menucount%) 15230 IFmenucount% PROCmark_menu_end(pointer%) 15240 menucount%+=1:line$=GET$#menufile% 15250 PROCmake_menu_header(pointer%,line$,menuwidth%(menucount%)):header%=TRUE 15260 ELSE 15270 PROCadd_menu_item(line$):header%=FALSE 15280 ENDIF 15290UNTIL EOF#menufile% 15300PROCmark_menu_end(pointer%) 15310SYS131085,0,menufile%:menufile%=0 15320IFheader% ERROR 200,"Bad menu file, no items in menu "+STR$(menucount%) 15330ENDPROC 15340: 15350DEFPROCmake_menu_header(RETURN pointer%,title$,width%) 15360$pointer%=LEFT$(title$,12)+CHR$(0) 15370pointer%?12=7 15380pointer%?13=2 15390pointer%?14=7 15400pointer%?15=0 15410pointer%!16=width% 15420pointer%!20=44 15430pointer%!24=0 15440pointer%+=28 15450ENDPROC 15460: 15470DEFPROCmark_menu_end(pointer%) 15480!(pointer%-24)=!(pointer%-24) OR &80 15490ENDPROC 15500: 15510DEFPROCmenu_close 15520SYS262356,,-1 15530ENDPROC 15540: 15550DEFFNmenu_height(menu_ptr%) 15560LOCAL itemcount%,linecount%,height% 15570itemcount%=1 15580height%=menu_ptr%!20+menu_ptr%!24 15590menu_ptr%+=28 15600WHILE (!menu_ptr% AND &80)=0 15610 itemcount%+=1 15620 IF (!menu_ptr% AND &2) linecount%+=1 15630 menu_ptr%+=24 15640ENDWHILE 15650IF (!menu_ptr% AND &2) linecount%+=1 15660=itemcount%*height%+linecount%*24 15670: 15680DEFFNmenu_iconflag(var$) 15690IFvar$="" ERROR 200,"Menu icon flag value missing!" 15700=EVAL(var$) 15710: 15720DEFFNmenu_item_param(RETURN item$) 15730LOCAL param$ 15740IF INSTR(item$,",") THEN 15750 item$=MID$(item$,INSTR(item$,",")+1):param$=LEFT$(item$,INSTR(item$,",")-1) 15760ELSE 15770 param$="" 15780ENDIF 15790=param$ 15800: 15810DEFFNmenu_item_text(item$) 15820IF INSTR(item$,",") item$=LEFT$(item$,INSTR(item$,",")-1) 15830=item$ 15840: 15850DEFFNmenu_path(ptr%) 15860LOCAL path$ 15870path$=STR$(!ptr%) 15880ptr%+=4 15890WHILE !ptr%<>-1 path$+="."+STR$(!ptr%):ptr%+=4:ENDWHILE 15900=path$ 15910: 15920DEFFNmenu_submenu(var$) 15930IF VAL(var$)<1 OR VAL(var$)>DIM(menu%(),1) THEN 15940 ERROR 200,"Can't find menu "+var$+", as referred to in:- "+param$ 15950ENDIF 15960IF VAL(var$)=menucount% THEN 15970 ERROR 200,"An item in menu "+var$+" cannot have menu "+var$+" as a submenu!" 15980ENDIF 15990=menu%(VAL(var$)) 16000: 16010DEFFNmenuvar(var$) 16020var$=MID$(var$,INSTR(var$,"(")+1):var$=LEFT$(var$,INSTR(var$,")")-1) 16030=var$ 16040: 16050DEFFNmenu_window(var$) 16060LOCAL handle% 16070LOCAL ERROR 16080ONERROR ERROR EXT 0,"Menu file error. Window variable "+var$+" not found." 16090handle%=EVAL(var$) 16100IF handle%<1 THEN 16110 SYS131085,0,menufile% 16120 ERROR 16130ENDIF 16140=handle% 16150: 16160: 16170DEFPROCmenu_writable(var$) 16180maxlength%=0 16190IF INSTR(var$,":") THEN 16200 maxlength%=VAL(MID$(var$,INSTR(var$,":")+1)) 16210 IFLEN(itemtext$)>maxlength% maxlength%=LENitemtext$ 16220ELSE 16230 maxlength%=LENitemtext$ 16240ENDIF 16250menuflag%=menuflag%OR4:writable%=VAL(var$) 16260ENDPROC 16270: 16280DEFPROCput_writem(writem%,text$) 16290IF writem%<1 OR writem%>DIM(writable_item%(),1) THEN 16300 ERROR 201,"writable menu item "+STR$(writem%)+" does not exist!" 16310ENDIF 16320IF LENtext$>writable_len%(writem%) THEN 16330 IF LENtext$>100 text$=LEFT$(text$,100)+"......" 16340 ERROR 201,"Text '"+text$+"' too long for writable item "+STR$writem%+"!" 16350ENDIF 16360$writable_item%(writem%)=text$ 16370ENDPROC 16380: 16390DEFPROCclear_write_flag(menu%,item%) 16400LOCAL flagaddress% 16410 IFmenu%<1 OR menu%>DIM(menu%(),1) THEN 16420 ERROR 201,"Clear write flag error. Out of range menu number!" 16430 ENDIF 16440IF item%<0 OR item%>FNitem_count(menu%(menu%)) THEN 16450 ERROR 201,"Clear write flag error. Out of range item number!" 16460 ENDIF 16470flagaddress%=menu%(menu%)+28+(24*item%):!flagaddress%=(!flagaddress% AND &FFFFFFFB) 16480ENDPROC 16490: 16500DEFPROCadd_write_flag(menu%,item%) 16510LOCAL flagaddress% 16520IFmenu%<1 OR menu%>DIM(menu%(),1) THEN 16530 ERROR 201,"Add write flag error. Out of range menu number!" 16540 ENDIF 16550IF item%<0 OR item%>FNitem_count(menu%(menu%)) THEN 16560 ERROR 201,"Add write flag error. Out of range item number!" 16570 ENDIF 16580flagaddress%=menu%(menu%)+28+(24*item%):!flagaddress%=(!flagaddress% OR 4) 16590ENDPROC 16600: 16610DEFPROCset_menu_arrays 16620LOCAL itemcount%,line$,width% 16630menucount%=0:pointer%=menustart%:PROCgoto_beginmenu 16640REPEAT 16650 line$=GET$#menufile% 16660 IF FNbeginmenu(line$) THEN 16670 menu%(menucount%+1)=menustart%+(menucount%*28)+(itemcount%*24) 16680 line$=GET$#menufile%:REM Get title line 16690 menucount%+=1:line$=LEFT$(line$,12):menuwidth%(menucount%)=12+16*LENline$ 16700 ELSE 16710 itemcount%+=1 16720 IF INSTR(line$,",") THEN 16730 width%=12+16*LEN(LEFT$(line$,INSTR(line$,",")-1)) 16740 ELSE 16750 width%=12+16*LENline$ 16760 ENDIF 16770 IF width%>menuwidth%(menucount%) menuwidth%(menucount%)=width% 16780 ENDIF 16790UNTIL EOF#menufile% 16800ENDPROC 16810: 16820DEFPROCshade(menu%,item%,shade%) 16830LOCAL flagaddress% 16840IFmenu%<1 OR menu%>DIM(menu%(),1) THEN 16850 ERROR 201,"Item shade error. Out of range menu number!" 16860ENDIF 16870IF item%<0 OR item%>FNitem_count(menu%(menu%)) THEN 16880 ERROR 201,"Item shade error. Out of range menu item number!" 16890ENDIF 16900flagaddress%=menu%(menu%)+28+(24*item%)+8 16910IF shade%=TRUE shade%=&400000 ELSE shade%=0 16920!flagaddress%=(!flagaddress% AND &FFBFFFFF) OR shade% 16930ENDPROC 16940: 16950DEFPROCsize_menu_arrays(menufile$) 16960LOCAL menucount%,itemcount%,writecount%,windowcount%,line$ 16970menufile%=OPENINmenufile$ 16980REPEAT 16990 line$=GET$#menufile% 17000 IF FNbeginmenu(line$) THEN 17010 menucount%+=1:line$=GET$#menufile%:REM Next line is an item 17020 ELSE 17030 IF INSTR(line$,",writ") writecount%+=1 17040 IF INSTR(line$,",wind") windowcount%+=1 17050 itemcount%+=1 17060 ENDIF 17070UNTIL EOF#menufile% 17080SYS131085,0,menufile%:menufile%=0 17090PROCdim_menu_arrays(menucount%,itemcount%,writecount%,windowcount%) 17100ENDPROC 17110: 17120DEFPROCtick(menu%,item%,tick%) 17130LOCAL flagaddress% 17140IFmenu%<1 OR menu%>DIM(menu%(),1) THEN 17150 ERROR 201,"Item tick error. Out of range menu number!" 17160ENDIF 17170IF item%<0 OR item%>FNitem_count(menu%(menu%)) THEN 17180 ERROR 201,"Item tick error. Out of range item number!" 17190ENDIF 17200flagaddress%=menu%(menu%)+28+(24*item%) 17210IF tick%=TRUE tick%=1 ELSE tick%=0 17220!flagaddress%=(!flagaddress% AND &FFFFFFFE) OR tick% 17230ENDPROC 17240: 17250DEFFNget_string(pointer%,length%) 17260LOCAL temp$ 17270IF length%=0 length%=255 17280FOR pointer%=pointer% TO pointer%+length%-1 17290 IF ?pointer%<32 THEN 17300 =temp$ 17310 ELSE 17320 temp$+=CHR$(?pointer%) 17330 ENDIF 17340NEXT 17350=temp$ 17360: 17370DEFFNleaf(path$) 17380WHILE INSTR(path$,"."):path$=MID$(path$,INSTR(path$,".")+1):ENDWHILE 17390=path$ 17400: 17410DEFPROCreport_error(message$,title$) 17420message$=CHR$0+CHR$0+CHR$0+CHR$0+message$+CHR$0 17430SYS262367,message$,18,title$ 17440ENDPROC 17450: 17460DEFPROCshow_value(line%,variable$) 17470line%=line%MOD4 17480IF INSTR(variable$,"$") THEN 17490 variable$+="="+EVAL(variable$) 17500ELSE 17510 IF INSTR(variable$," ") THEN 17520 ELSE 17530 variable$+="="+STR$(EVAL(variable$)) 17540 ENDIF 17550ENDIF 17560PROCput_icon_text(show_value%,line%,LEFT$(variable$,35)) 17570PROCopen_window(show_value%) 17580ENDPROC 17590: 17600DEFFNsystem_variable(sys_var$) 17610LOCAL length% 17620SYS131107,sys_var$+CHR$(0),temp_blk%,-1 TO ,,length% 17630IF length%=0 ERROR EXT 0,"System variable '"+sys_var$+"' not found!" 17640SYS131107,sys_var$+CHR$(0),temp_blk%,255,,3 TO ,,length% 17650?(temp_blk%+length%)=13 17660=$temp_blk% 17670: 17680DEFFNget_sprite_name(window_handle%,icon_handle%) 17690LOCAL temp$ 17700temp_blk%!0=window_handle% 17710temp_blk%!4=icon_handle% 17720SYS262350,,temp_blk% 17730CASE (temp_blk%!24 AND &103) OF 17740 WHEN &002,&003:=FNget_string(temp_blk%!28,256) 17750 WHEN &102 17760 IF temp_blk%!36>0 THEN 17770 =FNget_string(temp_blk%!28,temp_blk%!36) 17780 ELSE 17790 ERROR 202,"No sprite name in icon "+STR$icon_handle%:="" 17800 ENDIF 17810 WHEN &103:=MID$(FNget_string(temp_blk%!32,temp_blk%!36),2) 17820 OTHERWISE 17830 ERROR 202,"No sprite name in icon "+STR$icon_handle%:="" 17840 ENDCASE 17850=temp$ 17860: 17870DEFFNicon_sprite_type(window_handle%,icon_handle%) 17880=EVAL("&"+RIGHT$(FNget_sprite_name(window_handle%,icon_handle%),3)) 17890: 17900DEFFNload_sprites(file$) 17910LOCAL sprites%,size% 17920size%=FNfile_size(file$)+16 17930DIM sprites% size% 17940sprites%!0=size% 17950sprites%!8=16 17960SYS46,&10A,sprites%,file$:REM Load sprite file 17970=sprites% 17980: 17990DEFFNnew_template(template_file$,window_name$,RETURN memfree%,memend%) 18000LOCAL window_handle% 18010SYS262361,,template_file$ 18020window_handle%=FNtemplate(window_name$,memfree%,memend%) 18030SYS262362 18040=window_handle% 18050: 18060DEFFNtemplate(window_name$,RETURN ptr%,end%) 18070LOCAL found%,window_handle% 18080SYS262363,,blk%,ptr%,end%,-1,window_name$,0 TO ,,ptr%,,,,found% 18090IF found% THEN 18100 SYS262337,,blk% TO window_handle% 18110ELSE 18120 ERROR EXT 0,"Window "+window_name$+" not found in template file!" 18130 window_handle%=0 18140ENDIF 18150=window_handle% 18160: 18170DEF PROCclose_window(window_handle%) 18180!temp_blk%=window_handle% 18190SYS262342,,temp_blk% 18200ENDPROC 18210: 18220DEFFNcreate_info_window 18230LOCAL icon% 18240info%=FNcreate_window("About this program",&84000012,660,212,0,660,999,999) 18250icon%=FNadd_icon("label"," Name:",info%,8,-4,0,0,0) 18260icon%=FNadd_icon("report",STRING$(30," "),info%,156,-4,0,0,0) 18270icon%=FNadd_icon("report",STRING$(30," "),info%,156,-56,0,0,0) 18280icon%=FNadd_icon("report",STRING$(30," "),info%,156,-108,0,0,0) 18290icon%=FNadd_icon("report",STRING$(30," "),info%,156,-160,0,0,0) 18300icon%=FNadd_icon("label","Purpose:",info%,8,-56,0,0,0) 18310icon%=FNadd_icon("label"," Author:",info%,8,-108,0,0,0) 18320icon%=FNadd_icon("label","Version:",info%,8,-160,0,0,0) 18330=info% 18340: 18350DEFPROCcreate_show_value 18360LOCAL icon% 18370show_value%=FNcreate_window("Show Variable",0,608,212,300,999,350,999) 18380icon%=FNadd_icon("report",STRING$(36," "),show_value%,8,-4,0,0,0) 18390icon%=FNadd_icon("report",STRING$(36," "),show_value%,8,-56,0,0,0) 18400icon%=FNadd_icon("report",STRING$(36," "),show_value%,8,-108,0,0,0) 18410icon%=FNadd_icon("report",STRING$(36," "),show_value%,8,-160,0,0,0) 18420ENDPROC 18430: 18440DEFFNcreate_window(title$,wf%,x_size%,y_size%,left%,width%,bottom%,height%) 18450LOCAL title_space%,handle% 18460DIM title_space% (1+LENtitle$) 18470temp_blk%!0=left% 18480temp_blk%!4=bottom% 18490temp_blk%!8=left%+width% 18500temp_blk%!12=bottom%+height% 18510temp_blk%!16=0 18520temp_blk%!20=0 18530temp_blk%!24=-1 18540IF wf%=0 wf%=&FF000012 18550temp_blk%!28=wf% 18560temp_blk%?32=7 18570temp_blk%?33=2 18580temp_blk%?34=7 18590temp_blk%?35=1 18600temp_blk%?36=3 18610temp_blk%?37=1 18620temp_blk%?38=12 18630temp_blk%?39=0 18640temp_blk%!40=0 18650temp_blk%!44=-y_size% 18660temp_blk%!48=x_size% 18670temp_blk%!52=0 18680temp_blk%!56=&119 18690temp_blk%!60=&6000 18700temp_blk%!64=1 18710temp_blk%?68=0 18720temp_blk%?69=0 18730temp_blk%?70=0 18740temp_blk%?71=0 18750$title_space%=title$ 18760temp_blk%!72=title_space% 18770temp_blk%!76=-1 18780temp_blk%!80=LEN(title$)+1 18790temp_blk%!84=0 18800SYS262337,,temp_blk% TO handle% 18810=handle% 18820: 18830DEF PROCdelete_window(window_handle%) 18840!temp_blk%=window_handle%:SYS262339,,temp_blk% 18850ENDPROC 18860: 18870DEF PROCopen_window(window_handle%) 18880!temp_blk%=window_handle% 18890SYS262347,,temp_blk% 18900SYS262341,,temp_blk% 18910ENDPROC 18920: 18930DEFFNwindow_x_origin(window_handle%) 18940temp_blk%!0=window_handle%:SYS262347,,temp_blk% 18950=temp_blk%!4-temp_blk%!20 18960: 18970DEFFNwindow_y_origin(window_handle%) 18980temp_blk%!0=window_handle%:SYS262347,,temp_blk% 18990=temp_blk%!16-temp_blk%!24 19000:
?� +------------------------------------------+ ?� | !Armony, by Mike Smith, | ?� | Version 1.32 (29/12/93), based on | (?� | BareBones Wimp application program | 2?� | Version 1.00 (4/10/92) | <?� | (C) Alan Senior 1992 | F?� | Dabs Press : Basic Wimp Programming | P?� +------------------------------------------+ Z: d� � �:�" at line ";� �10:� nș263872 x$�define_arrays:�define_variables �� � �error(�,�$):�quit �,task_handle%=�task_initialise(app_name$) �-�load_sprites:�load_windows:�install_icon � �create_windows:�menus:�info ��load_check �� � �error(�,�$) �ș263873 �: ��wimp_poll:�quit �: ���define_arrays �F� blk% &2000:� temp_blk% &2000:� errorblk% &100:� workstart% &1000 �2workfree%=workstart%:workend%=workstart%+&1000 � sequlen%(25):sequlen%()=0 #� chord$(25,32):chord$()=" " "� rhythm$(25,32):rhythm$()="a" "2� rhythm_name$(25):rhythm_name$()=" " ,+� r%=0 � 25:rhythm_name$(r%)=�(r%+97):� 6� nobeats%(25):nobeats%()=8 @� vol%(25,7,16):vol%()=-1 J� ins%(25,7,16):ins%()=0 T� fx%(6):fx%()=7 ^!�fxchannel%(6):fxchannel%()=� h� stereo%(8) r� p%(6) |� lkc 16:� hkc 24 �/� sequence_window%(25):� rhythm_window%(25) �A� chord_icon%(25,32):� rhythm_icon%(25,32):� beat_icon%(7,16) �� �: ���define_variables �Napp_sprite$="!Armony":app_name$="!Armony":app_purpose$="A chord sequencer" �#app_author$="� Mike Smith 1993" �.app_version$="Version 1.00, 14th Oct 1993" �1app_directory$=�system_variable("Armony$Dir") �*errorcount%=0:menufile%=0:icon_bar%=-2 �Fselect_click%=4:menu_click%=2:adjust_click%=1:select_menu_click%=6 �+select_drag%=64:adjust_drag%=16:quit%=� �/tempo%=32:trans%=0:coct%=3:boct%=2:koct%=2: *sequences%=1:rhythms%=1:structure$="A" nstereo%(1)=-3:stereo%(2)=-2:stereo%(3)=-1:stereo%(4)=1:stereo%(5)=2:stereo%(6)=3:stereo%(7)=0:stereo%(8)=0 -play_rhythm%=�:repeat%=�:edit_sequence%=0 &<root$="C D EF G A B":chord_input$="ABCDEFG#bmMs+-13679/" 0.rhythm_input$="abcdefghijklmnopqrstuvwxyz" :Dlowkey$="zsxdcvgbhnjm,l.;/":highkey$="a1q2we4r5t6yu8i9op-[=]�\f" Dcvol%=1:bvol%=2:fxvol%=1 N� i%=1 � 17:� lkc?i%:� X>� 98,82,67,51,83,100,84,101,85,86,70,102,103,87,104,88,105 b� i%=1 � 25:� hkc?i%:� lQ� 97,49,17,50,34,35,19,52,20,36,53,69,54,22,38,39,55,56,24,57,94,89,47,121,62 v*FX11,0 �� �:Ƞ 8 �?chord_voice%=2:� ch%=1 � 6:�("CHANNELVOICE "+�(ch%)+" 2"):� �"ș262531,0,2 � chord_voice$,F% �#bass_voice%=1:*CHANNELVOICE 7 1 �!ș262531,0,1 � bass_voice$,F% �'keyboard_voice%=3:*CHANNELVOICE 8 3 �%ș262531,0,3 � keyboard_voice$,F% �Pok_icon%=0:name_icon%=1:file_icon%=2:rhythm_name_icon%=1:rhythm_file_icon%=2 �?B%=1:C%=1:R%=0:S%=1:Z%=0:last_r%=R%:last_b%=B%:last_vol%=15 �:play_rhythm%=�:play_sequence%=�:play_song%=�:repeat%=� �� �: ���install_icon :icon_bar_handle%=�put_icon_on_bar(app_sprite$,"RIGHT") � : ��load_sprites *5sprites%=�load_sprites(app_directory$+".Sprites") 4� >: H��load_windows ROsave%=�new_template(app_directory$+".Templates","save%",workfree%,workend%) \Ysave_rthm%=�new_template(app_directory$+".Templates","save_rthm%",workfree%,workend%) f� p: z��create_windows �info%=�create_info_window ��stereo_window:�stereo �: ��create_show_value �: ��update_windows("Newsong") �� �: ���update_windows(file$) �� s%,r% �0� s%=0 � sequences%-1:�sequence_window(s%):� �,� r%=0 � rhythms%-1:�rhythm_window(r%):� ��keyboard_window(file$) � : ��open_windows $� s%,r% .>� s%=0 � sequences%-1:�open_window(sequence_window%(s%)):� 8:� r%=0 � rhythms%-1:�open_window(rhythm_window%(r%)):� B� L: V��delete_windows `� s%,r% j$�delete_window(keyboard_window%) t@� s%=0 � sequences%-1:�delete_window(sequence_window%(s%)):� ~<� r%=0 � rhythms%-1:�delete_window(rhythm_window%(r%)):� �� �: ���keyboard_window(title$) �9� icon%,f%,w%,h%,vw%,vh%,px%,py%,note$,k%,minx%,maxx% �(f%=%10000111000000000000000000010010 �-w%=1280:h%=432:vw%=w%:vh%=h%:px%=0:py%=54 �Dkeyboard_window%=�create_window(title$,f%,w%,h%,px%,vw%,py%,vh%) �=icon%=�add_icon_block(keyboard_window%,16,-408,752,-24,1) �(�border_icon(keyboard_window%,icon%) �%note$="1 2 4 5 6 8 9 - = �" �Aicon%=�add_icon("label",note$,keyboard_window%,272,-24,0,0,0) �note$="s d g h j l ;" @icon%=�add_icon("label",note$,keyboard_window%,48,-72,0,0,0) 7note$="C D E F G A B C D E F G A B C D E F G A B C" Aicon%=�add_icon("label",note$,keyboard_window%,32,-264,0,0,0) )note$="T q w e r t y u i o p [ ] \ I" (Bicon%=�add_icon("label",note$,keyboard_window%,256,-312,0,0,0) 2note$="z x c v b n m , . /" <Aicon%=�add_icon("label",note$,keyboard_window%,32,-360,0,0,0) F� k%=1 � 22 P! minx%=32*k%+4:maxx%=minx%+24 ZD icon%=�add_icon_block(keyboard_window%,minx%,-260,maxx%,-124,0) d) �border_icon(keyboard_window%,icon%) n � x� k%=1 � 20 �" minx%=32*k%+20:maxx%=minx%+24 �1 � k%<>3 � k%<>7 � k%<>10 � k%<>14 � k%<>17 � �E icon%=�add_icon_block(keyboard_window%,minx%,-202,maxx%,-124,7) �* �border_icon(keyboard_window%,icon%) � � � � �: �Cicon%=�add_icon("label","Tempo",keyboard_window%,790,-24,0,0,0) �Dicon%=�add_icon("label","Keybd",keyboard_window%,790,-120,0,0,0) �Dicon%=�add_icon("label","Sustn",keyboard_window%,790,-216,0,0,0) �Gon_icon%=�add_icon("write"," OFF ",keyboard_window%,790,-168,1,0,1) �3�icon_validation(keyboard_window%,on_icon%,"K") �0�icon_bg_colour(keyboard_window%,on_icon%,1) sustain%=0 Msustain_icon%=�add_icon("report"," OFF ",keyboard_window%,790,-264,5,0,1) Dicon%=�add_icon("label","Trans",keyboard_window%,790,-312,0,0,0) "Oicon%=�add_icon("label"," Structure/Pause",keyboard_window%,928,-24,0,0,0) ,Qicon%=�add_icon("label"," Chords instrument",keyboard_window%,928,-120,0,0,0) 6Picon%=�add_icon("label"," Bass instrument",keyboard_window%,928,-216,0,0,0) @Ricon%=�add_icon("label","Keyboard instrument",keyboard_window%,928,-312,0,0,0) JJtempo_icon%=�add_icon("report"," ",keyboard_window%,790,-72,5,0,1) TUleft_tempo_icon%=�add_icon("sprite","left",keyboard_window%,794,-76,0,sprites%,0) ^Wright_tempo_icon%=�add_icon("sprite","right",keyboard_window%,866,-76,0,sprites%,0) hKtrans_icon%=�add_icon("report"," ",keyboard_window%,790,-360,5,0,1) rVleft_trans_icon%=�add_icon("sprite","left",keyboard_window%,794,-364,0,sprites%,0) |Xright_trans_icon%=�add_icon("sprite","right",keyboard_window%,866,-364,0,sprites%,0) �]structure_icon%=�add_icon("report"," ",keyboard_window%,928,-72,19,0,1) �8�icon_bg_colour(keyboard_window%,structure_icon%,11) �^chord_ins_icon%=�add_icon("report"," ",keyboard_window%,928,-168,19,0,1) �]bass_ins_icon%=�add_icon("report"," ",keyboard_window%,928,-264,19,0,1) �akeyboard_ins_icon%=�add_icon("report"," ",keyboard_window%,928,-360,19,0,1) �:�put_icon_text(keyboard_window%,tempo_icon%,�(tempo%)) �:�put_icon_text(keyboard_window%,trans_icon%,�(trans%)) �C%=1:S%=1:Z%=0 �Vstructure_pos$=�structure$,S%-1)+"("+�structure$,S%,1)+")"+�structure$,S%+1,19-S%) �C�put_icon_text(keyboard_window%,structure_icon%,structure_pos$) �A�put_icon_text(keyboard_window%,chord_ins_icon%,chord_voice$) �?�put_icon_text(keyboard_window%,bass_ins_icon%,bass_voice$) �G�put_icon_text(keyboard_window%,keyboard_ins_icon%,keyboard_voice$) � : ��sequence_window(s%) &#� title$,px%,py%,type$,c%,x%,y% 0)sf%=%10000111000000000000000000010010 :=sw%=512:sh%=448:svw%=512:svh%=448:px%=s%*48:py%=532-s%*48 D3title$="Chord Sequence "+�(s%+65):type$="write" NMsequence_window%(s%)=�create_window(title$,sf%,sw%,sh%,px%,svw%,py%,svh%) X window%=sequence_window%(s%) b-� c%=1 � sequlen%(s%)-1*(sequlen%(s%)<32) l1 text$=chord$(s%,c%)+�4-�(chord$(s%,c%))," ") v, x%=((c%-1)�4)*128+4:y%=-((c%-1)�4)*56-4 �B chord_icon%(s%,c%)=�add_icon(type$,text$,window%,x%,y%,4,0,1) �> �icon_validation(window%,chord_icon%(s%,c%),chord_input$) �A � text$=" " �put_icon_text(window%,chord_icon%(s%,c%),"") � text$=rhythm$(s%,c%) �F rhythm_icon%(s%,c%)=�add_icon(type$,text$,window%,x%+88,y%,1,0,1) �@ �icon_validation(window%,rhythm_icon%(s%,c%),rhythm_input$) �4 �icon_bg_colour(window%,rhythm_icon%(s%,c%),14) �4 �icon_fg_colour(window%,rhythm_icon%(s%,c%),11) � � �� �: ���rhythm_window(r%) �;� title$,type$,window%,w%,vw%,px%,py%,b%,c%,x%,y%,icon% )rf%=%10000111000000000000000000010010 Mrh%=392:rvh%=rh%:w%=88+40*nobeats%(r%):vw%=w%:px%=640+r%*48:py%=588-r%*48 Etitle$="Rhythm "+�(r%+97)+" ("+rhythm_name$(r%)+")":type$="label" Irhythm_window%(r%)=�create_window(title$,rf%,w%,rh%,px%,vw%,py%,rvh%) *window%=rhythm_window%(r%) 44icon%=�add_icon(type$,"6 ",window%,4,-4,4,0,1) >5icon%=�add_icon(type$,"5 ",window%,4,-60,4,0,1) H6icon%=�add_icon(type$,"4 ",window%,4,-116,4,0,1) R6icon%=�add_icon(type$,"3 ",window%,4,-172,4,0,1) \6icon%=�add_icon(type$,"2 ",window%,4,-228,4,0,1) f6icon%=�add_icon(type$,"1 ",window%,4,-284,4,0,1) p6icon%=�add_icon(type$,"bass",window%,4,-340,4,0,1) ztype$="select" �$� b%=1 � nobeats%(r%):� c%=1 � 7 �; � ins%(r%,c%,b%)=0 text$=" " � text$=�(ins%(r%,c%,b%)) � x%=52+b%*40: y%=52-c%*56 �A beat_icon%(c%,b%)=�add_icon(type$,text$,window%,x%,y%,1,0,1) �A � vol%(r%,c%,b%)<0 bg_colour%=15 � bg_colour%=vol%(r%,c%,b%) �: �icon_bg_colour(window%,beat_icon%(c%,b%),bg_colour%) �9 � c%<7 �icon_fg_colour(window%,beat_icon%(c%,b%),11) �9 � c%=7 �icon_fg_colour(window%,beat_icon%(c%,b%),10) � �:� �� �: ���stereo_window �� p%,c%,on% (f%=%10000100000000000000000000010010 title$="Stereo Positions" +w%=576:h%=816:vw%=w%:vh%=h%:px%=0:py%=0 $?stereo_pos%=�create_window(title$,f%,w%,h%,px%,vw%,py%,vh%) .� p%=0 � 6:� c%=1 � 8 8% � stereo%(c%)=p%-3 on%=1 � on%=0 BL icon%=�add_icon("radio"," ",stereo_pos%,224+48*p%,-(c%*96-54),on%,c%,0) L �:� V@icon%=�add_icon("label","Chords 6",stereo_pos%,32,-48,0,0,1) `Aicon%=�add_icon("label"," 5",stereo_pos%,32,-144,0,0,1) jAicon%=�add_icon("label"," 4",stereo_pos%,32,-240,0,0,1) tAicon%=�add_icon("label"," 3",stereo_pos%,32,-336,0,0,1) ~Aicon%=�add_icon("label"," 2",stereo_pos%,32,-432,0,0,1) �Aicon%=�add_icon("label"," 1",stereo_pos%,32,-528,0,0,1) �Aicon%=�add_icon("label","Bass ",stereo_pos%,32,-624,0,0,1) �Aicon%=�add_icon("label","Keyboard",stereo_pos%,32,-720,0,0,1) �� �: � ��info �I�put_info_text(info%,app_name$,app_purpose$,app_author$,app_version$) �� �: ���menus �(�load_menus(app_directory$+".menus") ��name_voices �clear_flags �put_writem(5,"A") � : (��clear_flags 2A� menu%=14 � 17:� item%=0 � 31:�clear_write_flag(menu%,item%) <�:� F� P: Z��add_flags d?� menu%=14 � 17:� item%=0 � 31:�add_write_flag(menu%,item%) n�:� x� �: ���wimp_poll �� poll_mask% �poll_mask%=&832 �� �& ș262343,poll_mask%,blk% � event% � Ȏ event% � � � 2:�open_window_event �. � 3:window%=!blk%:�close_window(window%) � � 6:�mouse_button � � 7:�drag_over � � 8:�key_press � � 9:�menu_selection �12:�gain_caret �17,18:�message � " �event ,� quit% 6� @: J��open_window_event Tș262341,,blk% ^� h: r��close_window(window%) | !blk%=window%:ș262342,,blk% �� �: �� �mouse_button �� wx%,wy%,x%,y% �2mousex%=blk%!0:mousey%=blk%!4:mousebut%=blk%!8 �/window_handle%=blk%!12:icon_handle%=blk%!16 �Mwx%=�window_x_origin(window_handle%):wy%=�window_y_origin(window_handle%) �!x%=mousex%-wx%:y%=wy%-mousey% �Ȏ window_handle% � � � icon_bar%:�icon_bar_click �. � keyboard_window%:�keyboard_window_click � � save%:�save_click �$ � save_rthm%:�save_rhythm_click � stereo_pos%:�stereo_click � � s%=0 � sequences%-1 &, � sequence_window%(s%)=window_handle% � 0. edit_sequence%=s%:�sequence_window_click : � D� N� s%=0 � rhythms%-1 X* � rhythm_window%(s%)=window_handle% � b edit_rhythm%=s% l edit_beat%=1+(x%-88)�40 v edit_channel%=1+y%�56 � edit_icon%=icon_handle% � �rhythm_window_click � � �� �� �: ���drag_over �2� window%,icon%,x%,y%,file$,start%,size%,type% �ș262351,,blk% �x%=blk%!0:y%=blk%!4 �!window%=blk%!12:icon%=blk%!16 �Ȏ drag_window% � � � save% 3 file$=�leaf(�get_icon_text(save%,name_icon%)) / type%=�icon_sprite_type(save%,file_icon%) 9 �initiate_save(window%,icon%,x%,y%,file$,�,0,type%) � save_rthm% *? file$=�leaf(�get_icon_text(save_rthm%,rhythm_name_icon%)) 4; type%=�icon_sprite_type(save_rthm%,rhythm_file_icon%) >9 �initiate_save(window%,icon%,x%,y%,file$,�,0,type%) H � R� \: f��key_press p&� window_handle%,icon_handle%,key% z:window_handle%=blk%!0:icon_handle%=blk%!4:key%=blk%!24 �� key%=&61 � key%=&66 � �� key%=&18A key%=&61 �� key%=&1CD key%=&66 �Ȏ window_handle% � �/ � save%:�save_key_press(key%,icon_handle%) �; � save_rthm%:�save_rhythm_key_press(key%,icon_handle%) �' � keyboard_window%:�keyboard(key%) � � ș262364,key% � � �� s%=0 � sequences%-1 �< � sequence_window%(s%)=window_handle% edit_sequence%=s% � � E� c%=1 � sequlen%(edit_sequence%)-1*(sequlen%(edit_sequence%)<32) w � chord_icon%(edit_sequence%,c%)=icon_handle% �chord_key_press(window_handle%,icon_handle%,edit_sequence%,c%,key%) � $E� r%=1 � sequlen%(edit_sequence%)-1*(sequlen%(edit_sequence%)<32) .y � rhythm_icon%(edit_sequence%,r%)=icon_handle% �rhythm_key_press(window_handle%,icon_handle%,edit_sequence%,r%,key%) 8 � B� L: V��menu_selection `� menu_path$,menu_item$ j/menu_path$=�decode_menu(current_menu%,blk%) t menu_item$=�leaf(menu_path$) ~Ȏ current_menu% � �& � menu%(1):�main_menu(menu_item$) �* � menu%(2):�sequence_menu(menu_item$) �( � menu%(4):�rhythm_menu(menu_item$) �* � menu%(5):�keyboard_menu(menu_item$) �� �ș262351,,blk% �B� blk%!8=adjust_click% ș262356,,current_menu%,menu_x%,menu_y% �� �: ���gain_caret �-window_handle%=blk%!0:icon_handle%=blk%!4 �'� window_handle%=keyboard_window% � 2 �icon_bg_colour(keyboard_window%,on_icon%,14) 5 �put_icon_text(keyboard_window%,on_icon%," ON ") � 1 �icon_bg_colour(keyboard_window%,on_icon%,1) (6 �put_icon_text(keyboard_window%,on_icon%," OFF ") 2� <� F: P ��message Z� message_type% dmessage_type%=blk%!16 nȎ message_type% � x � 0:quit%=� � � 1:�save_request � � 2:�save_demand � � 3:�load_request � � 4:�menu_close � � 5:�double_click �� �� �: ���icon_bar_click �� r%,s% �Ȏ mousebut% � � � menu_click% � current_menu%=menu%(1) : menu_x%=mousex%-64:menu_y%=�menu_height(menu%(1))+96 - ș262356,,current_menu%,menu_x%,menu_y% " � select_click%:�open_windows "3 � adjust_click%:�open_window(keyboard_window%) ,� 6� @: J��save_click TȎ mousebut% � ^" � select_click%,adjust_click% h � icon_handle%=ok_icon% � r2 file_name$=�get_icon_text(save%,name_icon%) |5 file_type%=�icon_sprite_type(save%,file_icon%) � � �file_name$,".") � �> $(blk%+44)=file_name$+�0:�save(file_name$):�menu_close � � �9 $(blk%+44)=app_directory$+".songs."+file_name$+�0 �2 �save(app_directory$+".songs."+file_name$) � � � � � � select_drag%,adjust_drag% �! � icon_handle%=file_icon% � �K drag_icon%=file_icon%:drag_window%=save%:�drag_box(save%,file_icon%) � � � � �� : ��save_rhythm_click Ȏ mousebut% � &" � select_click%,adjust_click% 0 � icon_handle%=ok_icon% � :> file_name$=�get_icon_text(save_rthm%,rhythm_name_icon%) DA file_type%=�icon_sprite_type(save_rthm%,rhythm_file_icon%) N � �file_name$,".") � XE $(blk%+44)=file_name$+�0:�save_rhythm(file_name$):�menu_close b � l; $(blk%+44)=app_directory$+".rhythms."+file_name$+�0 v; �save_rhythm(app_directory$+".rhythms."+file_name$) � � � � � � select_drag%,adjust_drag% �( � icon_handle%=rhythm_file_icon% � �; drag_icon%=rhythm_file_icon%:drag_window%=save_rthm% �. �drag_box(save_rthm%,rhythm_file_icon%) � � � � �� �: ���keyboard_window_click �Ȏ mousebut% � � � menu_click% ? current_menu%=menu%(5):menu_x%=mousex%-64:menu_y%=mousey% - ș262356,,current_menu%,menu_x%,menu_y% � select_click% Ȏ icon_handle% � * � sustain_icon% 4 � sustain%=0 � > sustain%=1 H< �put_icon_text(keyboard_window%,sustain_icon%,"ON") R � sustain%=0 \= �put_icon_text(keyboard_window%,sustain_icon%,"OFF") f � p � structure_icon% z � play_rhythm%=� � � play_rhythm%=� �< �icon_bg_colour(keyboard_window%,structure_icon%,0) � � � play_rhythm%=� �= �icon_bg_colour(keyboard_window%,structure_icon%,11) � � � � left_tempo_icon% �% tempo%-=1:� tempo%<4 tempo%=4 �> �put_icon_text(keyboard_window%,tempo_icon%,�(tempo%)) � � right_tempo_icon% �) tempo%+=1:� tempo%>999 tempo%=999 �> �put_icon_text(keyboard_window%,tempo_icon%,�(tempo%)) � � left_trans_icon% ) trans%-=1:� trans%<-96 trans%=-96 > �put_icon_text(keyboard_window%,trans_icon%,�(trans%)) � right_trans_icon% $' trans%+=1:� trans%>96 trans%=96 .> �put_icon_text(keyboard_window%,trans_icon%,�(trans%)) 8 � B � adjust_click% L Ȏ icon_handle% � V � left_tempo_icon% `+ tempo%=tempo%�2:� tempo%<4 tempo%=4 j> �put_icon_text(keyboard_window%,tempo_icon%,�(tempo%)) t � right_tempo_icon% ~/ tempo%=tempo%*2:� tempo%>999 tempo%=999 �> �put_icon_text(keyboard_window%,tempo_icon%,�(tempo%)) � � left_trans_icon% �) trans%-=8:� trans%<-96 trans%=-96 �> �put_icon_text(keyboard_window%,trans_icon%,�(trans%)) � � right_trans_icon% �' trans%+=8:� trans%>96 trans%=96 �> �put_icon_text(keyboard_window%,trans_icon%,�(trans%)) � � � � �5�put_writem(3,�(tempo%)):�put_writem(4,�(trans%)) �� �: ��sequence_window_click Ȏ mousebut% � L � menu_click%:current_menu%=menu%(2):menu_x%=mousex%-64:menu_y%=mousey% - ș262356,,current_menu%,menu_x%,menu_y% ( � 2� <: F��rhythm_window_click P� r%,c%,b% Z@r%=edit_rhythm%:c%=edit_channel%:b%=edit_beat%:i%=edit_icon% d1�put_icon_text(save_rthm%,1,rhythm_name$(r%)) nȎ mousebut% � xL � menu_click%:current_menu%=menu%(4):menu_x%=mousex%-64:menu_y%=mousey% �- ș262356,,current_menu%,menu_x%,menu_y% � � select_click% � � vol%(r%,c%,b%)<0 � � vol%(r%,c%,b%)+=8 �< �icon_bg_colour(rhythm_window%(r%),i%,vol%(r%,c%,b%)) � � � vol%(r%,c%,b%)-=8 �0 �icon_bg_colour(rhythm_window%(r%),i%,15) � � � � adjust_click% �; vol%(r%,c%,b%)-=1:� vol%(r%,c%,b%)<0 vol%(r%,c%,b%)=7 �; �icon_bg_colour(rhythm_window%(r%),i%,vol%(r%,c%,b%)) �+ � select_menu_click%:ins%(r%,c%,b%)+=1 � ins%(r%,c%,b%)>6 � ins%(r%,c%,b%)=0:ins$=" " � ins$=�(ins%(r%,c%,b%)) " � ,0 �put_icon_text(rhythm_window%(r%),i%,ins$) 6 � @� J: T��stereo_click ^� channel%,position% hȎ mousebut% � r" � select_click%,adjust_click% |+ � icon_handle%<56 � icon_handle%>-1 � �, channel%=1+icon_handle%�8:�channel%=1 � position%=icon_handle%�8 �$ stereo%(channel%)=position%-3 �- ș262466,channel%,stereo%(channel%)*32 � � �+ � mousebut%=select_click% �menu_close � � �� �: ���main_menu(item$) �Ȏ item$ � � � "Quit" � quit%=� � "Keyboard" $ �open_window(keyboard_window%) � "Chords and Rhythms" &@ � s%=0 � sequences%-1:�open_window(sequence_window%(s%)):� 0< � r%=0 � rhythms%-1:�open_window(rhythm_window%(r%)):� : � "Update Instruments" D ș263872 N* �add_flags:�name_voices:�clear_flags X ș263873 b � l� v: ���keyboard_menu(item$) �� l%,s% �"numeric_path$=�menu_path(blk%) �Ȏ numeric_path$ � �8 � "0.0":file_path$=�get_writem(2):�load(file_path$) � � "2" �2 play_song%=�:play_sequence%=�:play_rhythm%=� �@ �icon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),0) �9 �icon_bg_colour(keyboard_window%,structure_icon%,0) � B%=1:C%=1:S%=1:�=0 �X structure_pos$=�structure$,S%-1)+"("+�structure$,S%,1)+")"+�structure$,S%+1,19-S%) �E �put_icon_text(keyboard_window%,structure_icon%,structure_pos$) � Z%=�(�structure$,S%,1))-65 �chord(chord$(Z%,C%)) R%=�(rhythm$(Z%,C%))-97 � "3" � repeat%=� � *- �tick(2,1,�):�tick(4,1,�):�tick(5,3,�) 4 repeat%=� >. � �tick(2,1,�):�tick(4,1,�):�tick(5,3,�) H repeat%=� R � \ � "4.0":structure$=item$ fX structure_pos$=�structure$,S%-1)+"("+�structure$,S%,1)+")"+�structure$,S%+1,19-S%) pE �put_icon_text(keyboard_window%,structure_icon%,structure_pos$) z � "5.0":tempo%=�(item$) �8 �put_icon_text(keyboard_window%,tempo_icon%,item$) � � "11.0":trans%=�(item$) �8 �put_icon_text(keyboard_window%,trans_icon%,item$) � � �l%=�(�numeric_path$,1)) �)� l%>5 � l%<9 �octaves(numeric_path$) �&� l%=9 �instruments(numeric_path$) �� �: ���sequence_menu(item$) �"numeric_path$=�menu_path(blk%) �Ȏ numeric_path$ � � � "0" 2 play_sequence%=�:play_rhythm%=�:play_song%=� @ �icon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),0) 9 �icon_bg_colour(keyboard_window%,structure_icon%,0) $* B%=1:C%=1:S%=1:�=0:Z%=edit_sequence% . �chord(chord$(Z%,C%)) 8 R%=�(rhythm$(Z%,C%))-97 B � "1" L � repeat%=� � V- �tick(2,1,�):�tick(4,1,�):�tick(5,3,�) ` repeat%=� j. � �tick(2,1,�):�tick(4,1,�):�tick(5,3,�) t repeat%=� ~ � �) � "2":�copy_sequence(edit_sequence%) � � "3":�add_sequence �* � "4":�clear_sequence(edit_sequence%) � � "5.0":r$=item$ �5 � �(r$)<65 � �(r$)>122 r$="a":�put_writem(1,r$) �1 � �(r$)<97 r$=�(�(r$)+32):�put_writem(1,r$) �' �global_rhythm(r$,edit_sequence%) � � �� �: ���rhythm_menu(item$) �"numeric_path$=�menu_path(blk%) Ȏ numeric_path$ � � "0" 2 play_rhythm%=�:play_sequence%=�:play_song%=� @ �icon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),0) (9 �icon_bg_colour(keyboard_window%,structure_icon%,0) 29 B%=1:C%=1:S%=1:Z%=0:�=0:�chord("C"):R%=edit_rhythm% < � "1" F � repeat%=� � P7 �tick(2,1,�):�tick(4,1,�):�tick(5,3,�):repeat%=� Z. � �tick(2,1,�):�tick(4,1,�):�tick(5,3,�) d repeat%=� n � x% � "2":�copy_rhythm(edit_rhythm%) � � "3":�add_rhythm �& � "4":�clear_rhythm(edit_rhythm%) �; � "5.0":n%=�(item$):� n%>16 n%=16:�put_writem(5,�(n%)) �7 nobeats%(edit_rhythm%)=n%:�no_beats(edit_rhythm%) �0 � "6.0":cvol%=1:�tick(20,0,�):�tick(20,1,�) �0 � "6.1":cvol%=2:�tick(20,0,�):�tick(20,1,�) �0 � "7.0":bvol%=1:�tick(21,0,�):�tick(21,1,�) �0 � "7.1":bvol%=2:�tick(21,0,�):�tick(21,1,�) �1 � "8.0":fxvol%=1:�tick(22,0,�):�tick(22,1,�) �1 � "8.1":fxvol%=2:�tick(22,0,�):�tick(22,1,�) �( � "9.0":file_path$=�get_writem(135) �K � �file_path$,".")=0 file_path$=app_directory$+".rhythms."+file_path$ � �load_rhythm(file_path$) � � : "'��save_key_press(key%,icon_handle%) ,� file_name$,file_type% 6 Ȏ key% � @ � 13 J1 file_name$=�get_icon_text(save%,name_icon%) T4 file_type%=�icon_sprite_type(save%,file_icon%) ^ � �file_name$,".") � h $(blk%+44)=file_name$+�0 r$ �save(file_name$):�menu_close | � �8 $(blk%+44)=app_directory$+".songs."+file_name$+�0 �1 �save(app_directory$+".songs."+file_name$) � � � � �� �: �.��save_rhythm_key_press(key%,icon_handle%) �� file_name$,file_type% � Ȏ key% � � � 13 �= file_name$=�get_icon_text(save_rthm%,rhythm_name_icon%) �@ file_type%=�icon_sprite_type(save_rthm%,rhythm_file_icon%) � � �file_name$,".") � D $(blk%+44)=file_name$+�0:�save_rhythm(file_name$):�menu_close � : $(blk%+44)=app_directory$+".rhythms."+file_name$+�0 &: �save_rhythm(app_directory$+".rhythms."+file_name$) 0 � : � D� N: X/��chord_key_press(window%,icon%,s%,c%,key%) b Ȏ key% � l+ � 13:�enter_chord(window%,icon%,s%,c%) v, � &4:�delete_chord(window%,icon%,s%,c%) �, � &9:�insert_chord(window%,icon%,s%,c%) �� �� �: �0��rhythm_key_press(window%,icon%,s%,p%,key%) � Ȏ key% � � � 13 �2 rhythm$(s%,p%)=�get_icon_text(window%,icon%) �E � p%<sequlen%(s%) �place_caret(window%,rhythm_icon%(s%,p%+1),1) � � �� �: ���save_request $� to_window%,to_icon%,data_type% :to_window%=blk%!20:to_icon%=blk%!24:data_type%=blk%!40 Ȏ data_type% � � &00A *) file_name$=�get_string(blk%+44,255) 46 blk%!12=blk%!8:blk%!16=4:ș262375,17,blk%,blk%!4 > �load(file_name$) H � &00B R) file_name$=�get_string(blk%+44,255) \6 blk%!12=blk%!8:blk%!16=4:ș262375,17,blk%,blk%!4 f �load_rhythm(file_name$) p � z� �: ���load_request �� file_type%,file_name$ �file_type%=blk%!40 �Ȏ file_type% � �A � &00A:file_name$=�get_string(blk%+44,255):�load(file_name$) �H � &00B:file_name$=�get_string(blk%+44,255):�load_rhythm(file_name$) � � �� �: ���save_demand �� file_name$,file_type% �'file_name$=�get_string(blk%+44,255) ,� blk%!36=-1 � to_filer%=� � to_filer%=� file_type%=blk%!40 Ȏ drag_window% � $2 � save%:�save(file_name$):�message_save_reply .4 � to_filer% �put_icon_text(save%,1,file_name$) 8> � save_rthm%:�save_rhythm(file_name$):�message_save_reply B9 � to_filer% �put_icon_text(save_rthm%,1,file_name$) L � V�menu_close `� j: t��double_click ~� file_type%,file$ �file_type%=blk%!40 �Ȏ file_type% � �/ � &00A:file_name$=�get_string(blk%+44,255) �6 blk%!12=blk%!8:blk%!16=4:ș262375,17,blk%,blk%!4 � �load(file_name$) �/ � &00B:file_name$=�get_string(blk%+44,255) �6 blk%!12=blk%!8:blk%!16=4:ș262375,17,blk%,blk%!4 � �load_rhythm(file_name$) � � �� �: ���load_check file_to_load$=�command_line � file_to_load$<>"" � # Ȏ �file_type(file_to_load$) � ! � &00A:�load(file_to_load$) (( � &00B:�load_rhythm(file_to_load$) 2 � <� F� P: Z��save(file$) dș263872 n� s%,c%,r%,b%,v% xF%=�(file$) �.�#F%,tempo%,sequences%,rhythms%,structure$ �A� s%=0 � sequences%-1:�#F%,sequlen%(s%):� c%=1 � sequlen%(s%) �& �#F%,chord$(s%,c%),rhythm$(s%,c%) � �:� �[� r%=0 � rhythms%-1:�#F%,nobeats%(r%),rhythm_name$(r%):� c%=1 � 7:� b%=1 � nobeats%(r%) �' �#F%,vol%(r%,c%,b%),ins%(r%,c%,b%) � �:�:� �,� v%=1 � 6:�#F%,fx%(v%),fxchannel%(v%):� ��#F%:�menu_close �!ș8,&12,blk%+44,&00A:ș263873 �� �: ���load(file$) � s%,c%,r%,b%,v% � c%=1 � 8:� c%,0,0,-1:� F%=�(file$) "6� F%=0 �report_error("File not found","Loading"):� ,ș263872 6k�delete_windows:� s%=0 � sequences%-1:� c%=1 � sequlen%(s%):chord$(s%,c%)=" ":rhythm$(s%,c%)="a":�:� @3� r%=0 � rhythms%-1:rhythm_name$(r%)=�(r%+97):� J.�#F%,tempo%,sequences%,rhythms%,structure$ TA� s%=0 � sequences%-1:�#F%,sequlen%(s%):� c%=1 � sequlen%(s%) ^& �#F%,chord$(s%,c%),rhythm$(s%,c%) h �:� r[� r%=0 � rhythms%-1:�#F%,nobeats%(r%),rhythm_name$(r%):� c%=1 � 7:� b%=1 � nobeats%(r%) |' �#F%,vol%(r%,c%,b%),ins%(r%,c%,b%) � �:�:� �,� v%=1 � 6:�#F%,fx%(v%),fxchannel%(v%):� ��#F%:�update_windows(file$) �m�put_writem(3,�(tempo%)):�put_writem(4,�(trans%)):�put_writem(5,structure$):�put_icon_text(save%,1,file$) �9�open_windows:�open_window(keyboard_window%):ș263873 �play_rhythm%=0 �� �: ���save_rhythm(file$) �ș263872 �<� c%,r%,b%:r%=edit_rhythm%:F%=�(file$):�#F%,nobeats%(r%) �G� c%=1 � 7:� b%=1 � nobeats%(r%):�#F%,vol%(r%,c%,b%),ins%(r%,c%,b%) � �:� &�#F%:rhythm_name$(r%)=�leaf(file$) 9�delete_window(rhythm_window%(r%)):�rhythm_window(r%) $�open_window(rhythm_window%(r%)) &!ș8,&12,blk%+44,&00B:ș263873 0� :: D��load_rhythm(file$) NL� rhythms%=26:�report_error("Only 26 rhythms possible!","Load Rhythm"):� XBF%=�(file$):� F%=0 �report_error("File not found","Loading"):� b5ș263872:� c%,r%,b%:r%=rhythms%:�#F%,nobeats%(r%) lG� c%=1 � 7:� b%=1 � nobeats%(r%):�#F%,vol%(r%,c%,b%),ins%(r%,c%,b%) v �:� �!rhythm_name$(r%)=�leaf(file$) �C�rhythm_window(rhythms%):�open_window(rhythm_window%(rhythms%)) �rhythms%+=1:�#F%:ș263873 �� �: ���error(!errorblk%,error$) �errorcount%+=1 �,� errorcount%>5:� � 0,"Too many errors!" �(� �<200 error$+=" at line "+�(� �10) �8� �=200 error$="*** Error in menu file! *** "+error$ �8� �=201 error$="*** Menu error *** "+error$ �8� �=202 error$="*** Icon error *** "+error$ �8� �=203 error$="*** File error *** "+error$ !8� �=204 error$="*** Window error *** "+error$ !ș131085,0,menufile% !ș393434 ! $(errorblk%+4)=error$ !*"ș262367,errorblk%,1,app_name$ !4� !>: !H ��quit !R *FX12 !\ș262365 !f� !p� !z: !���event !�� sustain%=0 �keyboard(0) !�(� �>tempo% �=0:� play_rhythm% �strum !�� !�: !���stereo !�.� ch%=1 � 8:ș262466,ch%,stereo%(ch%)*32:� !�� !�: !���copy_sequence(s%) !�� c% !�ș263872 !�R� sequences%=26:�report_error("Only 26 sequences possible!","Copy Sequence"):� "� c%=1 � sequlen%(s%) "N chord$(sequences%,c%)=chord$(s%,c%):rhythm$(sequences%,c%)=rhythm$(s%,c%) " � "$%sequlen%(sequences%)=sequlen%(s%) ".K�sequence_window(sequences%):�open_window(sequence_window%(sequences%)) "8sequences%+=1:ș263873 "B� "L: "V��add_sequence "`ș263872 "jQ� sequences%=26:�report_error("Only 26 sequences possible!","Add Sequence"):� "tK�sequence_window(sequences%):�open_window(sequence_window%(sequences%)) "~sequences%+=1:ș263873 "�� "�: "���clear_sequence(s%) "�� c% "�ș263872 "�9� c%=1 � 32:chord$(s%,c%)=" ":rhythm$(s%,c%)="a":� "�7sequlen%(s%)=0:�delete_window(sequence_window%(s%)) "�;�sequence_window(s%):�open_window(sequence_window%(s%)) "�ș263873 "�� "�: "���global_rhythm(r$,s%) # � c% # ș263872 ##� c%=1 � 32:rhythm$(s%,c%)=r$:� #'�close_window(sequence_window%(s%)) #(;�sequence_window(s%):�open_window(sequence_window%(s%)) #2ș263873 #<� #F: #P��copy_rhythm(r%) #Z� c%,b% #dș263872 #nL� rhythms%=26:�report_error("Only 26 rhythms possible!","Copy Rhythm"):� #x#nobeats%(rhythms%)=nobeats%(r%) #�$� c%=1 � 7:� b%=1 � nobeats%(r%) #�) vol%(rhythms%,c%,b%)=vol%(r%,c%,b%) #�) ins%(rhythms%,c%,b%)=ins%(r%,c%,b%) #� �:� #�C�rhythm_window(rhythms%):�open_window(rhythm_window%(rhythms%)) #�rhythms%+=1:ș263873 #�� #�: #���add_rhythm #�ș263872 #�K� rhythms%=26:�report_error("Only 26 rhythms possible!","Add Rhythm"):� #�C�rhythm_window(rhythms%):�open_window(rhythm_window%(rhythms%)) #�rhythms%+=1:ș263873 $� $: $��clear_rhythm(r%) $"� c%,b% $,ș263872 $6$� c%=1 � 7:� b%=1 � nobeats%(r%) $@ vol%(r%,c%,b%)=-1 $J ins%(r%,c%,b%)=0 $T �:� $^%�close_window(rhythm_window%(r%)) $h7�rhythm_window(r%):�open_window(rhythm_window%(r%)) $rș263873 $|� $�: $���no_beats(r%) $�ș263872 $�%�close_window(rhythm_window%(r%)) $�7�rhythm_window(r%):�open_window(rhythm_window%(r%)) $�ș263873 $�� $�: $���octaves(choice$) $�� p%,o% $�+p%=�(�choice$,1)):o%=�(�choice$,3,1))+1 $�Ȏ p% � $�6 � 6:�tick(10,coct%-1,�):coct%=o%:�tick(10,o%-1,�) %6 � 7:�tick(11,boct%-1,�):boct%=o%:�tick(11,o%-1,�) %6 � 8:�tick(12,koct%-1,�):koct%=o%:�tick(12,o%-1,�) %� %&� %0: %:��name_voices %D� m%,voice$ %N� m%=0 � 127 %X# ș262531,0,1+m%�32 � voice$,F% %b � �voice$,"!K")=0 � %l � m%>95 voice$=" "+voice$ %v7 �put_writem(m%+6,voice$):�shade(14+m%�32,m%�32,�) %� � %�; �put_writem(m%+6,�(1+m%�32)):�shade(14+m%�32,m%�32,�) %� � %�� %�� %�: %���instruments(choice$) %�� r%,p%,v%,F%,voice$ %�+p%=�(�choice$,3,1)):v%=�(�choice$,5))+1 %�Ȏ p% � %�3 � 0:�tick(14,chord_voice%-1,�):chord_voice%=v% %� �tick(14,chord_voice%-1,�) %�/ ș262531,0,chord_voice% � chord_voice$,F% &C �put_icon_text(keyboard_window%,chord_ins_icon%,chord_voice$) &1 � 1:�tick(15,bass_voice%-1,�):bass_voice%=v% & �tick(15,bass_voice%-1,�) & ș262533,7,bass_voice% &*- ș262531,0,bass_voice% � bass_voice$,F% &4A �put_icon_text(keyboard_window%,bass_ins_icon%,bass_voice$) &>9 � 2:�tick(16,keyboard_voice%-1,�):keyboard_voice%=v% &H# �tick(16,keyboard_voice%-1,�) &R ș262533,8,keyboard_voice% &\5 ș262531,0,keyboard_voice% � keyboard_voice$,F% &fI �put_icon_text(keyboard_window%,keyboard_ins_icon%,keyboard_voice$) &p � 3,4,5,6,7,8 &z0 � ��get_writem(101+fx%(p%-2)),1)=�(p%-2) � &�' ș262531,0,fx%(p%-2) � voice$,F% &�- �put_writem(101+fx%(p%-2)," "+voice$) &� � &� fx%(p%-2)=v% &� ș262531,0,v% � voice$,F% &�, �put_writem(101+v%,�(p%-2)+" "+voice$) &� � 9 &� � fxchannel%(v%)=� � &�( fxchannel%(v%)=�:�tick(18,v%-1,�) &�V � r%=0 � rhythms%-1:�put_icon_text(rhythm_window%(r%),(v%-1)*5,�(7-v%)+" "):� &�) � fxchannel%(v%)=�:�tick(18,v%-1,�) &�V � r%=0 � rhythms%-1:�put_icon_text(rhythm_window%(r%),(v%-1)*5,�(7-v%)+" FX"):� &� � ' � '� ': '$&��enter_chord(window%,icon%,s%,c%) '.� type$,x%,y% '8=type$="write":chord$(s%,c%)=�get_icon_text(window%,icon%) 'B� c%=sequlen%(s%)+1 � 'L sequlen%(s%)+=1 'V � c%<32 � '` �close_window(window%) 'j4 c%+=1:x%=((c%-1)�4)*128+4:y%=-((c%-1)�4)*56-4 't text$=chord$(s%,c%) '~D chord_icon%(s%,c%)=�add_icon(type$,text$,window%,x%,y%,4,0,1) '�4 �put_icon_text(window%,chord_icon%(s%,c%),"") '� text$=rhythm$(s%,c%) '�H rhythm_icon%(s%,c%)=�add_icon(type$,text$,window%,x%+88,y%,1,0,1) '�6 �icon_bg_colour(window%,rhythm_icon%(s%,c%),14) '�6 �icon_fg_colour(window%,rhythm_icon%(s%,c%),11) '�G �open_window(window%):�place_caret(window%,chord_icon%(s%,c%),0) '� � '� � '�; � c%<32 �place_caret(window%,chord_icon%(s%,c%+1),0) '� � '�� '�: ( +��delete_chord(window%,icon%,s%,chord%) ( � c% (.� sequlen%(s%)=1 � chord%=sequlen%(s%)+1 � (2� c%=chord% � sequlen%(s%)+1*(sequlen%(s%)=32) ((" chord$(s%,c%)=chord$(s%,c%+1) (2= �put_icon_text(window%,chord_icon%(s%,c%),chord$(s%,c%)) (<K � chord$(s%,c%+1)=" " �put_icon_text(window%,chord_icon%(s%,c%),"") (F$ rhythm$(s%,c%)=rhythm$(s%,c%+1) (P? �put_icon_text(window%,rhythm_icon%(s%,c%),rhythm$(s%,c%)) (Z � (d� sequlen%(s%)=32 � (n chord$(s%,c%+1)="" (xA �put_icon_text(window%,chord_icon%(s%,c+1%),chord$(s%,c+1%)) (�� (� � c%=0 � 4 (�= �delete_icon(window%,chord_icon%(s%,sequlen%(s%)+1)+c%) (�> �delete_icon(window%,rhythm_icon%(s%,sequlen%(s%)+1)+c%) (� � (�� (�sequlen%(s%)-=1 (�� (�: (�+��insert_chord(window%,icon%,s%,chord%) (�-� sequlen%(s%)=32 � chord%>sequlen%(s%) � (�� c%,type$,x%,y% (�type$="write" )�close_window(window%) )� sequlen%(s%)<31 � )> c%=sequlen%(s%)+2:x%=((c%-1)�4)*128+4:y%=-((c%-1)�4)*56-4 )"C chord_icon%(s%,c%)=�add_icon(type$," ",window%,x%,y%,4,0,1) ),2 �put_icon_text(window%,chord_icon%(s%,c%),"") )6D rhythm_icon%(s%,c%)=�add_icon(type$,"a",window%,x%+88,y%,1,0,1) )@4 �icon_bg_colour(window%,rhythm_icon%(s%,c%),14) )J4 �icon_fg_colour(window%,rhythm_icon%(s%,c%),11) )T � )^sequlen%(s%)+=1 )h%� c%=sequlen%(s%) � chord%+1 � -1 )r" chord$(s%,c%)=chord$(s%,c%-1) )|= �put_icon_text(window%,chord_icon%(s%,c%),chord$(s%,c%)) )�$ rhythm$(s%,c%)=rhythm$(s%,c%-1) )�? �put_icon_text(window%,rhythm_icon%(s%,c%),rhythm$(s%,c%)) )� � )�Jchord$(s%,chord%)=" ":�put_icon_text(window%,chord_icon%(s%,c%),"") )�H�open_window(window%):�place_caret(window%,chord_icon%(s%,chord%),0) )�� )�: )���keyboard(k%) )�9N%=�lowkey$,�k%)+�highkey$,�k%)-12*(�highkey$,�k%)>0) )�*� �lowkey$,�k%) L%=lkc?(�lowkey$,�k%)) )�,� �highkey$,�k%) L%=hkc?(�highkey$,�k%)) )�� N%=0 N%=�(-L%) )�� N%=-1 � N%=255 � *� N%=0 � 8,0,0,-1:� *3� 8,-15,(N%-1)*&155+(koct%*&1000)+trans%*&2B,-1 *� *&: *0��strum *:� ch%,i%,v%,p% *D� ch%=1 � 6 *N" i%=0:v%=-1:i%=ins%(R%,ch%,B%) *X � i% � *b< v%=vol%(R%,ch%,B%)*fxvol%:� v%>-1 ș262533,ch%,fx%(i%) *l � *v@ v%=vol%(R%,ch%,B%)*cvol%:� v%>-1 ș262533,ch%,chord_voice% *� � *�W � fxchannel%(ch%)=� p%=p%(7-ch%)*&155+coct%*&1000+trans%*&2B � p%=&3000+trans%*&2B *�, � v%>-1 � p%(7-ch%)>-1 � ch%,-v%,p%,255 *�� *�Kv%=vol%(R%,7,B%)*bvol%:p%=p%(ins%(R%,7,B%))*&155+boct%*&1000+trans%*&2B *�1� v%>-1 � p%(ins%(R%,7,B%))>-1 � 7,-v%,p%,255 *�� tempo%>7 �beat *�F� B%=1 �icon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),10) *� B%+=1 *�� B%>nobeats%(R%) � *�7 B%=1:� play_sequence%=� � repeat%=� play_rhythm%=� *�? �icon_bg_colour(sequence_window%(Z%),chord_icon%(Z%,C%),0) *� � play_sequence%=� C%+=1 + � C%>sequlen%(Z%) � +E C%=1:� play_song%=� � repeat%=� play_sequence%=�:play_rhythm%=� + � play_song%=� S%+=1 + � S%>�(structure$) � +*D S%=1:� repeat%=� play_song%=�:play_sequence%=�:play_rhythm%=� +4 � +>X structure_pos$=�structure$,S%-1)+"("+�structure$,S%,1)+")"+�structure$,S%+1,19-S%) +HE �put_icon_text(keyboard_window%,structure_icon%,structure_pos$) +R- � play_song% Z%=�(�structure$,S%,1))-65 +\ � +fC � play_sequence% �chord(chord$(Z%,C%)):R%=�(rhythm$(Z%,C%))-97 +p� +z� +�: +� ��beat +�L�icon_bg_colour(rhythm_window%(last_r%),beat_icon%(1,last_b%),last_vol%) +�;�icon_bg_colour(rhythm_window%(R%),beat_icon%(1,B%),14) +�Llast_r%=R%:last_b%=B%:last_vol%=vol%(R%,1,B%):� last_vol%<0 last_vol%=15 +�� +�: +���chord(c$) +�� r% +�� c$="/" � +�"� c$="" � �c$,1)=" " p%()=-1:� +�r%=�root$,�c$,1))-1 +�� �c$,"#") r%+=1 ,� �c$,"b") r%-=1 ,;p%()=r%:p%(2)+=4:p%(3)+=7:p%(4)+=12:p%(5)+=16:p%(6)+=19 ,:� (�c$,"m") � �c$,"-")) � � �c$,"M") p%(2)-=1:p%(5)-=1 ,$2� (�c$,"7") � �c$,"11")) � � �c$,"M") p%(4)-=2 ,.� �c$,"M7") p%(4)-=1 ,8 � �c$,"+") p%(3)+=1:p%(6)+=1 ,B;� �c$,"-") p%(2)-=1:p%(3)-=1:p%(4)-=3:p%(5)-=4:p%(6)-=5 ,L,� �c$,"s") � �c$,"11") p%(2)+=1:p%(5)+=1 ,V,� �c$,"6") � �c$,"13") p%(3)+=2:p%(6)+=2 ,`#� �c$,"9") � �c$,"13") p%(4)+=2 ,j� ,t: ,~ݤfile_size(file$) ,�� size%,found% ,�"ș8,17,file$ � found%,,,,size% ,�<� found%<>1 � � 203,"File '"+�leaf(file$)+"' not found!" ,� =size% ,�: ,�ݤfile_type(file$) ,�� temp%,found% ,�(ș"OS_File",17,file$ � found%,,temp% ,�;� found%<>1 � � 203,"File "+�leaf(file$)+", not found!" ,�,�(temp%>>>20)=&FFF�=(temp%>>>8)�&FFF �=0 ,�: ,�A��initiate_save(window%,icon%,x%,y%,file$,start%,size%,type%) - blk%!0=256 - blk%!12=0 - blk%!16=1 -blk%!20=window% -(blk%!24=icon% -2blk%!28=x% -<blk%!32=y% -Fblk%!36=size% -Pblk%!40=type% -Z$(blk%+44)=file$+�0 -d6ș262375,17,blk%,window%,icon% � destination_task% -n� -x: -���message_save_reply -�4blk%!12=blk%!8:blk%!16=3:ș262375,17,blk%,blk%!4 -�� -�: -�ݤcommand_line -�� pos%,cmd_line$ -�ș "OS_GetEnv" � cmd_line$ -�pos%=�cmd_line$," -quit ") -�� pos%=0 ="" -�pos%+=7 -�&ȕ�cmd_line$,pos%,1)=" ":pos%+=1:� -�#pos%=�cmd_line$+" "," ",pos%+1) -�%�pos%+=1:��cmd_line$,pos%,1)<>" " .cmd_line$=�cmd_line$,pos%) ./cmd_line$=�cmd_line$,�cmd_line$+" "," ")-1) .=cmd_line$ .": .,=ݤadd_icon(type$,text$,window%,x%,y%,sl%,esg_sp%,border%) .6G� icon%,text_space%,name_space%,val_space%,w%,h%,mode%,xs%,ys%,sel% .@sel%=sl% .J� sl%<�text$ sl%=�text$ .T� sl%<�type$ sl%=�type$ .^� text_space% sl% .htemp_blk%!0=window% .rtemp_blk%!4=x% .|temp_blk%!8=y%-48 .� temp_blk%!12=x%+16+16*�text$ .�temp_blk%!16=y% .�$text_space%=text$ .�temp_blk%!20=&17000139 .�temp_blk%!24=text_space% .�temp_blk%!28=-1 .�temp_blk%!32=�text$ .�Ȏ �type$,5) � .� � "file_" .�0 ș262377,&28,,type$+�(0) � ,,,w%,h%,,mode% .� ș53,mode%,4 � ,,xs% .� ș53,mode%,5 � ,,ys% .� h%=h%<<ys%:w%=w%<<xs% / � text$="" � / temp_blk%!8=y%-h% / temp_blk%!12=x%+w% /& temp_blk%!20=&1700613A /0 temp_blk%!28=1 /: temp_blk%!32=�type$ /D $text_space%=type$ /N � /X" temp_blk%!8=y%-h%-(10<<ys%) /b* sl%=(8<<xs%)*�text$:� sl%>w% w%=sl% /l temp_blk%!12=x%+w% /v temp_blk%!20=&1700612B /� � name_space% (2+�type$) /� $name_space%="s"+type$ /� temp_blk%!28=name_space% /� � /� � "sprit" /�4 ș46,&128,esg_sp%,text$+�(0) � ,,,w%,h%,,mode% /� ș53,mode%,4 � ,,xs% /� ș53,mode%,5 � ,,ys% /� h%=h%<<ys%:w%=w%<<xs% /� temp_blk%!8=y%-h% /� temp_blk%!12=x%+w% /� temp_blk%!20=&1700313A /� temp_blk%!28=esg_sp% 0 temp_blk%!32=�text$ 0 $text_space%=text$ 0% � "selec":temp_blk%!20=&17003139 0 & � "actio":temp_blk%!20=&C71F913D. 0*% � "repor":temp_blk%!20=&0700313D 04 � "optio" 0> temp_blk%!8=y%-52 0H% temp_blk%!12=x%+40+16+16*�text$ 0R temp_blk%!20=&1700B133 0\# � sel% temp_blk%!20=&17303133 0f' � val_space% (2+�"soptoff,opton") 0p! $val_space%="soptoff,opton" 0z temp_blk%!28=val_space% 0� � "radio" 0� temp_blk%!8=y%-52 0�% temp_blk%!12=x%+40+16+16*�text$ 0�. � (esg_sp%<1) � (esg_sp%>31) � esg_sp%=1 0�/ temp_blk%!20=&1700B133 � (esg_sp%*&10000) 0�6 � sel% temp_blk%!20=&1720B133 � (esg_sp%*&10000) 0�, � text_space% (2+�"sradiooff,radioon") 0�& $text_space%="sradiooff,radioon" 0� temp_blk%!28=text_space% 0� � "write" 0�" temp_blk%!12=x%+16+16*�text$ 0� temp_blk%!20=&0700F131 0� � val_space% 27 1 $val_space%="" 1 temp_blk%!28=val_space% 1! � sel%<(�text$) sel%=�text$ 1$ temp_blk%!32=sel%+1 1. � 18ș262338,,temp_blk% � icon% 1B+� border%>0 �border_icon(window%,icon%) 1L =icon% 1V: 1`Dݤadd_icon_block(window_handle%,minx%,miny%,maxx%,maxy%,colour%) 1j� icon% 1ttemp_blk%!0=window_handle% 1~ � minx%>maxx% Ȕ minx%,maxx% 1� � miny%>maxy% Ȕ miny%,maxy% 1�� minx%=maxx% maxx%+=1 1�� miny%=maxy% maxy%+=1 1�temp_blk%!4=minx% 1�temp_blk%!8=miny% 1�temp_blk%!12=maxx% 1�temp_blk%!16=maxy% 1�!temp_blk%!20=32+(colour%<<28) 1�ș262338,,temp_blk% � icon% 1� =icon% 1�: 1�.��border_icon(window_handle%,icon_handle%) 2 1� icon%,minx%,miny%,maxx%,maxy%,flag%,tl%,br% 2 temp_blk%!0=window_handle% 2temp_blk%!4=icon_handle% 2ș262350,,temp_blk% 2(minx%=temp_blk%!8 22miny%=temp_blk%!12 2<maxx%=temp_blk%!16 2Fmaxy%=temp_blk%!20 2Pflag%=temp_blk%!24 2Ztl%=0:br%=4 2dC� (flag% � 4)=4 minx%-=4:maxx%+=4:miny%-=4:maxy%+=4:tl%=4:br%=0 2nKicon%=�add_icon_block(window_handle%,maxx%,miny%-4,maxx%+4,maxy%+4,br%) 2xKicon%=�add_icon_block(window_handle%,minx%-4,maxy%,maxx%+2,maxy%+4,tl%) 2�Iicon%=�add_icon_block(window_handle%,minx%-4,miny%-4,minx%,maxy%,tl%) 2�Kicon%=�add_icon_block(window_handle%,minx%-2,miny%-4,maxx%+2,miny%,br%) 2�� 2�: 2�.��delete_icon(window_handle%,icon_handle%) 2�� minx%,miny%,maxx%,maxy% 2�7temp_blk%!0=window_handle%:temp_blk%!4=icon_handle% 2�ș262350,,temp_blk% 2�Nminx%=temp_blk%!8:miny%=temp_blk%!12:maxx%=temp_blk%!16:maxy%=temp_blk%!20 2�ș262340,,temp_blk% 2�3ș262353,window_handle%,minx%,miny%,maxx%,maxy% 2�� 2�: 3+��drag_box(window_handle%,icon_handle%) 3� x%,y% 3temp_blk%!0=window_handle% 3"ș262347,,temp_blk% 3,<x%=temp_blk%!4-temp_blk%!20:y%=temp_blk%!16-temp_blk%!24 36temp_blk%!4=icon_handle% 3@ș262350,,temp_blk% 3J$� (temp_blk%!24 � &B000)=&B000 � 3T(� (temp_blk%!24 � &800000)=&800000 � 3^temp_blk%!4=5 3htemp_blk%!8+=x% 3rtemp_blk%!12+=y% 3|temp_blk%!16+=x% 3�temp_blk%!20+=y% 3�temp_blk%!24=-1 3�temp_blk%!28=-1 3�temp_blk%!32=&7FFFFFFF 3�temp_blk%!36=&7FFFFFFF 3�ș262352,,temp_blk% 3�� 3�: 3�0ݤget_icon_text(window_handle%,icon_handle%) 3�temp_blk%!0=window_handle% 3�temp_blk%!4=icon_handle% 3�ș262350,,temp_blk% 3�#� (temp_blk%!24 � &101)<>&101 � 4, � 202,"Icon "+�icon%+" not indirected!" 4 ="" 4� 4&=$temp_blk%!28 40: 4:9��icon_bg_colour(window_handle%,icon_handle%,colour%) 4D� colour%<0 � colour%>15 � 4Ntemp_blk%!0=window_handle% 4Xtemp_blk%!4=icon_handle% 4bș262350,,temp_blk% 4l� (temp_blk%!24 � 1<<6) � � 4vtemp_blk%!12=&F0000000 4�/temp_blk%!8=colour%<<28:ș262349,,temp_blk% 4�� 4�: 4�9��icon_fg_colour(window_handle%,icon_handle%,colour%) 4�� colour%<0 � colour%>15 � 4�temp_blk%!0=window_handle% 4�temp_blk%!4=icon_handle% 4�ș262350,,temp_blk% 4�� (temp_blk%!24 � 1<<6) � � 4�temp_blk%!12=&F000000 4�/temp_blk%!8=colour%<<24:ș262349,,temp_blk% 4�� 4�: 58��icon_validation(window_handle%,icon_handle%,type$) 5temp_blk%!0=window_handle% 5temp_blk%!4=icon_handle% 5 ș262350,,temp_blk% 5*%� (temp_blk%!24 � &E101)<>&E101 � 54D � 202,"Icon "+�icon_handle%+" not writable and not indirected!" 5> � 5H� 5RȎ type$ � 5\% � "number":$temp_blk%!32="A0-9." 5f0 � "file":$temp_blk%!32="A~ $&@\\^:.#*|"+�34 5p 5z $temp_blk%!32="A"+type$ 5�� 5�� 5�: 5�8��place_caret(window_handle%,icon_handle%,position%) 5�temp_blk%!0=window_handle% 5�temp_blk%!4=icon_handle% 5�ș262350,,temp_blk% 5�%� (temp_blk%!24 � &E101)<>&E101 � 5�D � 202,"Icon "+�icon_handle%+" not writable and not indirected!" 5� � 5�� 5�text$=$temp_blk%!28 5�'� position%>�text$ position%=�text$ 69ș262354,window_handle%,icon_handle%,0,0,-1,position% 6� 6: 6$6��put_icon_text(window_handle%,icon_handle%,text$) 6.temp_blk%!0=window_handle% 68temp_blk%!4=icon_handle% 6Bș262350,,temp_blk% 6L#� (temp_blk%!24 � &101)<>&101 � 6V3 � 202,"Icon "+�icon_handle%+" not indirected!" 6` � 6j� 6t<text$=�text$,temp_blk%!36):� -1 allows for <RETURN> chr! 6~$temp_blk%!28=text$ 6�temp_blk%!8=0 6�temp_blk%!12=0 6�ș262349,,temp_blk% 6�� 6�: 6�)ݤput_icon_on_bar(sprite_name$,side$) 6� � handle% 6�1� side$="RIGHT" !temp_blk%=-1 � !temp_blk%=-2 6�temp_blk%!4=0 6�temp_blk%!8=0 6�temp_blk%!12=68 6�temp_blk%!16=68 7 temp_blk%!20=&1700202A 7 $(temp_blk%+24)=sprite_name$ 7!ș262338,,temp_blk% � handle% 7=handle% 7(: 72C��put_info_text(window_handle%,name$,purpose$,author$,version$) 7<*�put_icon_text(window_handle%,1,name$) 7F-�put_icon_text(window_handle%,2,purpose$) 7P,�put_icon_text(window_handle%,3,author$) 7Z-�put_icon_text(window_handle%,4,version$) 7d� 7n: 7x� �task_initialise(title$) 7�� version% 7�version%=200 7�<ș262336,version%,&4B534154,title$ � version%,this_task% 7�=this_task% 7�: 7���add_menu_item(line$) 7�D� menuflag%,iconflag%,param$,sub%,itemtext$,writable%,maxlength% 7�*iconflag%=&7000021:sub%=-1:writable%=� 7�:itemtext$=�menu_item_text(line$):maxlength%=�itemtext$ 7�� 7�# param$=�menu_item_param(line$) 7� Ȏ �param$,4) � 7�# �"tick":menuflag%=menuflag%�1 8# �"line":menuflag%=menuflag%�2 8) �"shad":iconflag%=iconflag%�&400000 82 �"subm":sub%=�menu_submenu(�menuvar(param$)) 8"1 �"wind":sub%=�menu_window(�menuvar(param$)) 8,8 �"icon":iconflag%=�menu_iconflag(�menuvar(param$)) 86. �"writ":�menu_writable(�menuvar(param$)) 8@ � 8J � param$="" 8Tpointer%!0=menuflag% 8^pointer%!4=sub% 8h#� �(itemtext$)>12 � writable% � 8r pointer%!8=iconflag% � &100 8|4 �indirected_item(pointer%,writable%,maxlength%) 8�� 8� pointer%!8=iconflag% 8�' $(pointer%+12)=�itemtext$+�(0),12) 8�� 8�pointer%+=24 8�� 8�: 8�ݤbeginmenu(line$) 8�� �line$,9)="beginmenu" =� 8�=� 8�: 8�&ݤdecode_menu(menustart%,listptr%) 8�� text_path$ 9:ș262357,,menustart%,listptr%,blk%+256 � ,,,text_path$ 9=text_path$ 9: 9&E��dim_menu_arrays(menucount%,itemcount%,writecount%,windowcount%) 900� menustart% (menucount%*28)+(itemcount%*24) 9:� menuwidth%(menucount%) 9D� menu%(menucount%) 9N!� writable_item%(writecount%) 9X � writable_len%(writecount%) 9b� 9l: 9vݤget_writem(writem%) 9�� temp$ 9�1� writem%<1 � writem%>�(writable_item%(),1) � 9�> � 201,"writable menu item "+�(writem%)+" does not exist!" 9�� 9�#writem%=writable_item%(writem%) 9�:temp$="": ȕ ?writem%>31:temp$+=�?writem%:writem%+=1:� 9� =temp$ 9�: 9���goto_beginmenu 9�� temp%,line$ 9��#menufile%=0 9�)� temp%=�#menufile%:line$=�#menufile% 9�%� �beginmenu(line$) � �#menufile% :;� �#menufile% � 200,"No 'beginmenu' found in menu file" :�#menufile%=temp% :� : : :*2��indirected_item(menu_ptr%,writable%,length%) :4� indir_ptr% :>B� writable% � indir_ptr% length%+1 � � indir_ptr% 1+�itemtext$ :H;menu_ptr%!12=indir_ptr%:� pointer to indirection buffer :R$indir_ptr%=itemtext$+�(0) :\� writable% � :f) writable_item%(writable%)=indir_ptr% :p% writable_len%(writable%)=length% :z indir_ptr%+=length%+1 :� menu_ptr%!20=length%+1 :�� :� indir_ptr%+=1+�itemtext$ :�. menu_ptr%!20=1+�itemtext$:� Buffer length :�� :�?indir_ptr%=0 :�Amenu_ptr%!16=indir_ptr%:� Pointer to validation string (null) :�� :�: :�ݤitem_count(menu_ptr%) :�� count% :�count%=1:menu_ptr%+=28 :�5ȕ (!menu_ptr% � &80)=0:menu_ptr%+=24:count%+=1:� ;=count% ;: ;��load_menus(menufile$) ;$2� menucount%,header%,line$,pointer%,menustart% ;. �size_menu_arrays(menufile$) ;8menufile%=�menufile$ ;B$�set_menu_arrays:�goto_beginmenu ;Lmenucount%=0:header%=� ;V� ;` line$=�#menufile% ;j � �beginmenu(line$) � ;tE �header% � 200,"Bad menu file, no items in menu "+�(menucount%) ;~* �menucount% �mark_menu_end(pointer%) ;�% menucount%+=1:line$=�#menufile% ;�H �make_menu_header(pointer%,line$,menuwidth%(menucount%)):header%=� ;� � ;�% �add_menu_item(line$):header%=� ;� � ;�� �#menufile% ;��mark_menu_end(pointer%) ;�$ș131085,0,menufile%:menufile%=0 ;�C�header% � 200,"Bad menu file, no items in menu "+�(menucount%) ;�� ;�: ;�0��make_menu_header(� pointer%,title$,width%) <