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%)
<