[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference napalm::guitar

Title:GUITARnotes - Where Every Note has Emotion
Notice:Discussion of the finer stringed instruments
Moderator:KDX200::COOPER
Created:Thu Aug 14 1986
Last Modified:Fri Jun 06 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:3280
Total number of notes:61432

1906.0. "Tab 1.0" by ESSB::NWARNER (I Pink, Therefore I Ham) Fri Jul 20 1990 10:59

program Tab_editor
!
!		1990 A Slartibartfast Program
!		-------------------------------
!   This program is a TAB editor for the VT340, a mouse is required !
!   It will PROBABLY run on a workstation although the colours may not
!   be quite the same. To modify the colours used by the program modify
!   the colour map on your terminal, the program does not set it's own.
!
!   This is the basic playtest version provided for user feedback and
!   inhancement requests. If you take this program and use it take note
!   that you should, for your own protection, contribute back to the notes
!   file some tasty licks or pieces in TAB form. Elsewise, in the dark of
!   the night the great god ORM will come unto you and wind your entrails
!   out on a stick.
!
!   Requests for enhancements/bugfixes considered.
!   
!   Current Version V1.0 BL1
!
!   BL1 : The basic editor, provides the capability to enter TAB's on 
!         multiple screens and save same to an interim .TAB file.
!
!   BL2: Coming soon, the ability to generate a color sixel file
!		  for later printing
!
!   Operating instructions:
!
!	The program is controlled by a mouse. After the screen settles down
!	you will see four tab lines and a menu strip. On the left of the strip
!       are the numbers 1-22. These are fret numbers, position the cursor on
!       the character cell area and click the middle button. You will then
!	see a message to the effect that the pen is loaded. Move the cursor
!	to a position and click again, the character will be placed not quite
!	where you would expect it to be,ie down and to the right. This is
!       because of manifold reasons, basicly ORM wants it that way and who are
!	we to argue ?
!	
!       If you wish to delete a glyph you have placed on the screen move the
!	mouse to the D option and click. The last object placed on the screen
!       will be deleted leaving a hole. If this offends you chose the R option
!       to refresh the screen.
!
!	The B option draws a vertical bar. Place the horizontal bar of the 
!	cursor on the base E string, when it is perfectly placed you will
!	see it change colour. Click. 
!
!	The M option dumps the TAB to an interim file, called rather grandly
!	a meta_file. The name of this file is fixed at the moment. You can 
!	however rename it after a session. As it is a basic type of file it
!	should be possible to post a meta_file as a note. When extracting
!	the note name it metafile.tab and edit it to remove whatever looks
!	to be Notes added crap. You should then be able to load it into TAB
!	via the G option.
!
!	The < and > options troll you up and down pages, the E option is
!	exit. You might want to save your TAB before you envoke this.
!
!	The h and p options are provided as a primitive way of indicating
!	hammer_on and pull_off.
!
!	The T option allows text to be placed on the screen. It can be used
!	for title of piece etc as well as strategicly placed hints such as
!	'with attitude ' or 'express by dolefull grimace when changing 
!	chord the empty clamour that is life' or, for faster pieces, 'Here
!	would be a good place to bite of own sexual organs in a frenzy
!       of excitement and fling them to the crowd '
!
!	At the moment there is no delete key functioning when you enter text,
!	you need to get it right first time, this will be fixed soon. You
!	are also limited to an 80 char string.
!
!	To turn this file into an EXE extract it to a file called Tab_editor.bas
!	Edit the file to remove any spurious rubbish and then
!	$ basic tab_editor
!	$ link tab_editor
!	$ run tab_editor.
!
!   Definitions: some definitions of variables, variables of standard types will
!	         be defined on the fly by assignment , others are built here.
!
    EXTERNAL LONG FUNCTION SMG$CREATE_VIRTUAL_KEYBOARD (LONG, STRING)
    EXTERNAL LONG FUNCTION SMG$READ_KEYSTROKE(LONG,LONG,STRING,LONG,LONG)
!+
! Record point is used to specify a pixel by horizontal and vertical coordinates
!-
    RECORD point
	integer point_h 
        integer	point_v
    END RECORD point
!+
! Record Active cell is used to hold the coordinates and glyph of an object.
! The active cells are painted onto the screen and act as a menu system. 
! Clicking the middle button while the cursor is inside one of the active
! regions will result in the pen being loaded with the cell contents.
!-
    RECORD active_cell
	point top_left
	point bot_right
        point position
        string cell_contents = 80%
    END RECORD active_cell
!+
! Record painted_glyphs works as follows. Clicking the middle button while
! the pen is loaded will result in the creation of a painted glyph that will
! be daubed on the screen at the current position. The glyph will be added
! on to the list of active glyphs, ie the things you have chosen to add
! to the background of tablines.
!-
    RECORD painted_glyphs
        integer h_pos
	integer v_pos
	integer class
        integer screen_no
	string brushload = 80%
    END RECORD painted_glyphs
!+
!   Now we make a map for a interim metafile
!_
    MAP (Metafile_map) Painted_glyphs Metafile_record

!+
! There are currently 40 possible triggers, ie active areas and up to 500
! possible objects that can be on one screen.
!-
    DIMENSION active_cell triggers(40%)
    DIMENSION painted_glyphs image_segments(500%)
!+
! Here we declare a few important variables
!-
    DECLARE Long Current_page
!+
!   Setups.....Initialise the mouse buttons
!   The following has the effect of causing the mouse to transmit
!   the specified codes when pressed. Each button transmits a letter
!   and then a set of coordinates when it is pressed (P) or released (R)
!-
    %include "$smgdef" %from %LIBRARY "sys$library:basic$starlet"
    declare long keyboard
    declare long term
    ss% = smg$create_virtual_keyboard(keyboard,"SYS$INPUT")
    esc$ = chr$(27)
    print esc$ + "P1$w1/44/45" + esc$ + "\"  ! left P = D ,R = E
    print esc$ + "P1$w2/46/47" + esc$ + "\"  ! Middle P = F,R = G
    print esc$ + "P1$w3/48/49" + esc$ + "\"  ! right P = H, R = I
!+
!   Paint clear screen and enable multi_shot mouse
!+
    print esc$ + "P1p;s(e,C0,C(I1))w(i7,V)R(I1)"
!
!+
! Here we initialize a few important system variables
!-
    Current_page = 1
    terminated% = 1%
    next_free_segment% = 1%
    action_holder% = 0%
    action% = 0%
!    
    s% = FN$paint_menu%
    s% = FN$tab_lines%
!
    while terminated% <> 2% 
    picture$ = space$(1%)
     action%  = FN$interpret_command%(FN$get_mouse_command$)
      select action% 
       case 0% to 22%
         s% = FN$message%("Pen : Fret Position " + num1$(action%))
         s% = FN$add_fixed_glyph%(action%,picture$)
         s% = FN$message%("Pen : Not Loaded")
       case 23%
         s% = FN$message%("Pen : Bar Line " )
         s% = FN$add_fixed_glyph%(action%,picture$)
         s% = FN$message%("Pen : Not Loaded")
       case 24%
         s% = FN$message%("Pen : Hammer On " )
         s% = FN$add_fixed_glyph%(action%,picture$)
         s% = FN$message%("Pen : Not Loaded")
       case 25%
         s% = FN$message%("Pen : Pull Off" )
         s% = FN$add_fixed_glyph%(action%,picture$)
         s% = FN$message%("Pen : Not Loaded")
      case 26%
         s% = FN$message%("Entering Text" )
         picture$ = fn$get_alpha$
         s% = FN$message%("Position Text" )
         s% = FN$add_fixed_glyph%(action%,picture$)
         s% = FN$message%("Pen : Not Loaded")
      case 27%
	 print "s(e)"
	 s% = FN$paint_menu%
	 s% = FN$tab_lines%	 
	 for j% = 1% to next_free_segment%
	 s% = fn$paint_segment%(j%)
	 next j%
      case 28%
         s% = FN$message%("Deleting Last Object" )
	 If next_free_segment% <> 1% then
	  next_free_segment% = next_free_segment% - 1%
	  s% = fn$erase_object%(next_free_segment%)	 
	 end if
      case 29%
         s% = FN$message%("Creating Metafile" )
	 s% = fn$dump%	 
      case 30%
         s% = FN$message%("Reading Metafile" )
	 s% = fn$get%	 
      case 31%
         s% = FN$message%("Terminating..." )
	 linput a$			    ! eat another button
	 print esc$ + "\"
	 call lib$stop(0%)
      case 32%
         s% = FN$message%("Page Up" )
	 s% = fn$page_up%
	 s% = FN$message%("Pen Unloaded" )
      case 33%
         s% = FN$message%("Page Down" )
	 s% = fn$page_Down%
	 s% = FN$message%("Pen Unloaded" )
      end select

    next
!+
!   end of program, start of functions
!-
!======================================================================
def FN$paint_menu%
!======================================================================
 print "@.L(A2)'A'AA55AA55AA55AA55AA55"
 print "'S'FFFFFFFFFFFFFFFFFFFF'B'00"
 print "'C'88008800880088008800'D'8142241818244281"
 print "'U'8142241881422418'F'FF818181FF818181FF"
 print "'G'80402010080402018040'H'11224488112244881122"
 print "'V'01020408102040800102"
 print "'J'81818181818181818181"
 print "T(A2,S1)"
 print "p[0,0]w(s'C',i1)v[+799][,+478][-799][,-478]w(s0)"
 print "p[0,0]w(i2)v[+799][,+478][-799][,-478]w(s0)"
 print "p[10,10]"
 print "w(i0,s1)v[+779][,+458][-779][,-458]w(s0)"
 print "p[10,10]"
 print "w(i2,s0)v[+779][,+458][-779][,-458]w(s0)"
 print "p[0,450]w(i2,s1)v(b)[+799][,+29][-799](e)w(s0)"
 print "p[5,455]w(i3,s1)v(b)[+789][,+19][-789](e)w(s0)T(a0,s1)"
!
  l_t% = 5%
  r_t% = 15%
  p_h% = 10%
  p_v% = 455%
!
 for j% = 0% to 9%
 triggers(j%)::top_left::point_h = l_t%
 triggers(j%)::top_left::point_v = 455
 triggers(j%)::bot_right::point_h = r_t%
 triggers(j%)::bot_right::point_v = 474
 triggers(j%)::position::point_h = p_h%
 triggers(j%)::position::point_v = p_v% 
 triggers(j%)::cell_contents = "w(i7)T(s1)'" + num1$(j%) + "'"
 l_t% = l_t% + 12%
 r_t% = r_t% + 12%
 p_h% = p_h% + 12% 
 s% = FN$spit%(j%)
 next j%

  l_t% = 125%
  r_t% = 145%
  p_h% = 130%
  p_v% = 455%
!
!   
!
 for j% = 10% to 22%
 triggers(j%)::top_left::point_h = l_t%
 triggers(j%)::top_left::point_v = 455
 triggers(j%)::bot_right::point_h = r_t%
 triggers(j%)::bot_right::point_v = 474
 triggers(j%)::position::point_h = p_h%
 triggers(j%)::position::point_v = p_v% 
 triggers(j%)::cell_contents = "w(i7)T(s1)'" + num1$(j%) + "'"
 l_t% = h_t% + 24%
 r_t% = r_t% + 24%
 p_h% = p_h% + 24% 
 s% = FN$spit%(j%)
 next j%
!
 triggers(23%)::top_left::point_h = 480
 triggers(23%)::top_left::point_v = 455
 triggers(23%)::bot_right::point_h = 490
 triggers(23%)::bot_right::point_v = 474
 triggers(23%)::position::point_h = 480
 triggers(23%)::position::point_v = 455
 triggers(23%)::cell_contents = "w(i7,V)V[,-75]"
 print "p[480,455]T'B'"
!
 triggers(24%)::top_left::point_h = 495
 triggers(24%)::top_left::point_v = 455
 triggers(24%)::bot_right::point_h = 505
 triggers(24%)::bot_right::point_v = 474
 triggers(24%)::position::point_h = 495
 triggers(24%)::position::point_v = 455
 triggers(24%)::cell_contents = "w(i15,V)T'h'"
 print "p[495,455]T'h'"
!
 triggers(25%)::top_left::point_h = 510
 triggers(25%)::top_left::point_v = 455
 triggers(25%)::bot_right::point_h = 525
 triggers(25%)::bot_right::point_v = 474
 triggers(25%)::position::point_h = 510
 triggers(25%)::position::point_v = 455
 triggers(25%)::cell_contents = "w(i15,V)T'p'"
 print "p[510,455]T'p'"
!
 triggers(26%)::top_left::point_h = 525
 triggers(26%)::top_left::point_v = 455
 triggers(26%)::bot_right::point_h = 540
 triggers(26%)::bot_right::point_v = 474
 triggers(26%)::position::point_h = 525
 triggers(26%)::position::point_v = 455
 triggers(26%)::cell_contents = "w(i15,V)T'T'"
 print ";p[525,455]T'T'"
!
 triggers(27%)::top_left::point_h = 540
 triggers(27%)::top_left::point_v = 455
 triggers(27%)::bot_right::point_h = 555
 triggers(27%)::bot_right::point_v = 474
 triggers(27%)::position::point_h = 540
 triggers(27%)::position::point_v = 455
 triggers(27%)::cell_contents = "w(i15,V)T'R'"
 print ";p[540,455]T'R'"
!
 triggers(28%)::top_left::point_h = 555
 triggers(28%)::top_left::point_v = 455
 triggers(28%)::bot_right::point_h = 570
 triggers(28%)::bot_right::point_v = 474
 triggers(28%)::position::point_h = 555
 triggers(28%)::position::point_v = 455
 triggers(28%)::cell_contents = "w(i15,V)T'D'"
 print ";p[555,455]T'D'"
!
 triggers(29%)::top_left::point_h = 570
 triggers(29%)::top_left::point_v = 455
 triggers(29%)::bot_right::point_h = 585
 triggers(29%)::bot_right::point_v = 474
 triggers(29%)::position::point_h = 570
 triggers(29%)::position::point_v = 455
 triggers(29%)::cell_contents = "w(i15,V)T'M'"
 print ";p[570,455]T'M'"
!
 triggers(30%)::top_left::point_h = 585
 triggers(30%)::top_left::point_v = 455
 triggers(30%)::bot_right::point_h = 600
 triggers(30%)::bot_right::point_v = 474
 triggers(30%)::position::point_h = 585
 triggers(30%)::position::point_v = 455
 triggers(30%)::cell_contents = "w(i15,V)T'M'"
 print ";p[585,455]T'G'"
!
 triggers(31%)::top_left::point_h = 600
 triggers(31%)::top_left::point_v = 455
 triggers(31%)::bot_right::point_h = 615
 triggers(31%)::bot_right::point_v = 474
 triggers(31%)::position::point_h = 600
 triggers(31%)::position::point_v = 455
 triggers(31%)::cell_contents = "w(i15,V)T'E'"
 print ";p[600,455]T'E'"
!
 triggers(32%)::top_left::point_h = 615
 triggers(32%)::top_left::point_v = 455
 triggers(32%)::bot_right::point_h = 630
 triggers(32%)::bot_right::point_v = 474
 triggers(32%)::position::point_h = 615
 triggers(32%)::position::point_v = 455
 triggers(32%)::cell_contents = "w(i15,V)T'<'"
 print ";p[615,455]T'<'"
!
 triggers(33%)::top_left::point_h = 630
 triggers(33%)::top_left::point_v = 455
 triggers(33%)::bot_right::point_h = 645
 triggers(33%)::bot_right::point_v = 474
 triggers(33%)::position::point_h = 630
 triggers(33%)::position::point_v = 455
 triggers(33%)::cell_contents = "w(i15,V)T'>'"
 print ";p[630,455]T'>'"
!


 FN$paint_menu% = 1%
end def
!======================================================================
def FN$spit%( a_pointer%)
!======================================================================
    print "P[";triggers(a_pointer%)::position::point_h;",";	    &
	       triggers(a_pointer%)::position::point_V;"]";	    &
	       triggers(a_pointer%)::cell_contents;
end def
!======================================================================
def FN$get_mouse_command$
!======================================================================
    linput command$
    FN$get_mouse_command$ = command$
end def    
!======================================================================
def FN$interpret_command%(current_state$)
!======================================================================
    k% = 42%
    If seg$(current_state$,1%,1%) = "F" then
     c_pos_len% = len(current_state$)
     comma_pos% = instr(1%,current_state$,",")
     h_cords$ = seg$(current_state$,3%,comma_pos% - 1%)
     v_cords$ = seg$(current_state$,comma_pos% + 1%,c_pos_len% -1%)
     hcords% = val%(h_cords$)
     vcords% = val%(v_cords$)
     j% = 0%
     if vcords% > 455% then
      while (k% = 42%) AND (j% < 41%)
       if (hcords% >  triggers(j%)::top_left::point_h) AND	    &
         (hcords% <  triggers(j%)::bot_right::point_h) then
	  k% = J%
       end if  
      j% = j% + 1%
     next
     end if
    end if
    FN$interpret_command% = k%    	      
end def
!======================================================================
def FN$message%(message$)
!======================================================================
    print "p[0,429]w(i0,R,s1)v(b)[+300][,+20][-300](e)w(v,i7,s0)"
    print "p[0,429]T'";message$;"'"
    FN$message% = 0%
end def
!======================================================================
def FN$tab_lines%
!======================================================================
    print ";P[20,30]"
    for J% = 1% to 6% 
     print "w(i7,f15,V)V(B)[+760](e)p[,+15]"
    next J%
    print "p[25,30]T(s2)'T'"
    print "p[25,55]T(s2)'A:'"
    print "p[25,80]T(s2)'B'T(s1)"
!
    print ";P[20,130]"
    for J% = 1% to 6% 
     print "w(i7,f15,V)V(B)[+760](e)p[,+15]"
    next J%
    print "p[25,130]T(s2)'T'"
    print "p[25,155]T(s2)'A:'"
    print "p[25,180]T(s2)'B'T(s1)"
!
    print ";P[20,230]"
    for J% = 1% to 6% 
     print "w(i7,f15,V)V(B)[+760](e)p[,+15]"
    next J%
    print "p[25,230]T(s2)'T'"
    print "p[25,255]T(s2)'A:'"
    print "p[25,280]T(s2)'B'T(s1)"
!
    print ";P[20,330]"
    for J% = 1% to 6% 
     print "w(i7,f15,V)V(B)[+760](e)p[,+15]"
    next J%
    print "p[25,330]T(s2)'T'"
    print "p[25,355]T(s2)'A:'"
    print "p[25,380]T(s2)'B'T(s1)"
    FN$tab_lines% = 0%
end def
!======================================================================
def FN$add_fixed_glyph%(glyph_no%,represent$)
!======================================================================
    k% = 0%
    current_state$ = " "
    while seg$(current_state$,1%,1%) <> "D" 
    while (seg$(current_state$,1%,1%) <> "F") AND       &
	seg$(current_state$,1%,1%) <> "D" 
     current_state$ = FN$get_mouse_command$
    next
    if seg$(current_state$,1%,1%) = "F" then
     current_state$ = FN$get_mouse_command$	! unsolicited up
     c_pos_len% = len(current_state$)
     comma_pos% = instr(1%,current_state$,",")
     h_cords$ = seg$(current_state$,3%,comma_pos% - 1%)
     v_cords$ = seg$(current_state$,comma_pos% + 1%,c_pos_len% -1%)
     hcords% = val%(h_cords$)
     vcords% = val%(v_cords$)
     image_segments(next_free_segment%)::h_pos = hcords%
     image_segments(next_free_segment%)::v_pos = vcords%
     image_segments(next_free_segment%)::screen_no = Current_page
     image_segments(next_free_segment%)::class  = glyph_no%
     If len(represent$) < 2% then
     image_segments(next_free_segment%)::brushload  =	&
	    triggers(glyph_no%)::cell_contents
     else
     image_segments(next_free_segment%)::brushload  = "T'" + represent$ + "';"
     end if
     s% = FN$paint_segment%(next_free_segment%)
     next_free_segment% = next_free_segment% + 1%      
     end if
     next
    FN$add_fixed_glyph% = 0%    	      
end def
!======================================================================
def FN$paint_segment%(pointer%)
!======================================================================
    if image_segments(pointer%)::screen_no = current_page then
     print "P[";image_segments(pointer%)::h_pos;",";	    &
	       image_segments(pointer%)::v_pos;"]"
     print image_segments(pointer%)::brushload
    end if
    FN$paint_segment% = 0%
end def
!======================================================================
def fn$get_alpha$
!======================================================================
   print "p[0,429]"
   print "T(i0)W(s1,E,)V(B)[+750][,+20][-750](E)W(s0,C)"
   Print "W(I7,V)"
   print "p[0,429]"
   term  = 0
   usertext$ = "*****"
   while seg$(usertext$,1,1) <> "G" 
    linput usertext$
    next
   usertext$ = ""
   print "p[0,429]T'Txt>'"
   while term <> 13
   ss% = smg$read_keystroke(keyboard,term,,,)
   usertext$ = usertext$ + chr$(term)
   print "p[0,429]T'Txt> ";usertext$ + "';"
   next
   fn$get_alpha$ = usertext$
end def
!======================================================================
def fn$erase_object%(pointer%)
!======================================================================
    print "P[";image_segments(pointer%)::h_pos;",";	    &
	       image_segments(pointer%)::v_pos;"]w(E)"
     print image_segments(pointer%)::brushload;"w(V)"
     image_segments(pointer%)::h_pos = 0%
     image_segments(pointer%)::v_pos = 0%
     image_segments(pointer%)::class  = 0%
     image_segments(pointer%)::brushload  = " "
    FN$erase_object%= 0%
end def
!======================================================================
def fn$get%
!======================================================================
    next_free_segment% = 1%
    j% = 1%
    open "Metafile.TAB" for input as #2%,	    &
	    map metafile_map,		    &
	    sequential    
    when error in
     for J% = 1% to 500%
     get #2%
     image_segments(next_free_segment%)::h_pos = metafile_record::h_pos
     image_segments(next_free_segment%)::V_pos = metafile_record::v_pos 
     image_segments(next_free_segment%)::class = metafile_record::class
     image_segments(next_free_segment%)::screen_no = metafile_record::screen_no 
     image_segments(next_free_segment%)::brushload = metafile_record::brushload
     next_free_segment% = next_free_segment% + 1%
     next j%
    use
     s% = fn$message%("File Restored")
    end when	    
end def

!====================================================================*
def fn$dump%
!====================================================================
    open "Metafile.TAB" for output as #2%,	    &
	    map metafile_map,		    &
	    sequential
    for j% = 1% to next_free_segment%
    metafile_record::h_pos = image_segments(J%)::h_pos
    metafile_record::v_pos = image_segments(J%)::v_pos
    metafile_record::class = image_segments(J%)::class
    metafile_record::screen_no = image_segments(J%)::screen_no
    metafile_record::brushload = space$(80%)
    metafile_record::brushload = image_segments(J%)::brushload
    put #2%
    next j%
    s% = fn$message%("File written")
    close #2%
end def
!+
! The following two functions move the current page counter up and down
! When the page counter is changed the program refreshes the screen and
! paints it with whatever glyphs reside on that page, there is no limit
! to the number of pages, there is however to the no of possible glyphs.
!-
!======================================================================
def FN$page_up%
!======================================================================
    current_page = current_page + 1%
    s% = FN$refresh%
end def
!======================================================================
def FN$page_down%
!======================================================================
    If current_page > 1 then
       Current_page = current_page - 1
    end if
    s% = FN$refresh%
end def
!+
! This routine refreshes the screen with the current page number
!-
!======================================================================
def FN$refresh%
!======================================================================
    print "s(e)"
    s% = FN$paint_menu%
    s% = FN$tab_lines%	 
    for j% = 1% to next_free_segment%
     s% = fn$paint_segment%(j%)
    next j%
end def
END program	! End of SUB report_cursor cursor_report
    
T.RTitleUserPersonal
Name
DateLines
1906.1ApologiesESSB::NWARNERI Pink, Therefore I HamFri Jul 20 1990 11:1010
    
    Apologies to any who tried to run the first posting, I took out
    most, but not all, of a debuging trace option which resulted in
    it falling over.
    
    I also forgot to mention that the left button on the mouse works as
    a pen unloader...I will post a short tab here that can be loaded into
    the program later.
    
    Nigel
1906.2Short TabESSB::NWARNERI Pink, Therefore I HamFri Jul 20 1990 11:3567
    
    Here is a short tab, extract then edit to take out everything down to
    the data and rename metafile.tab , bring into program using G(et) 
    
    
5�w(i7,V)V[,-75]                                                                  
61w(i7,V)V[,-75]                                                                  
8�w(i7,V)V[,-75]                                                                  
7iw(i7,V)V[,-75]                                                                  
L_w(i7)T(s1)'7'                                                                   

b^w(i7)T(s1)'8'                                                                   
v^
w(i7)T(s1)'10'                                                                  
�Ow(i7)T(s1)'7'                                                                   
�iw(i7,V)V[,-75]                                                                  
�O	w(i7)T(s1)'9'                                                                   
�P
w(i7)T(s1)'10'                                                                  
�@w(i7)T(s1)'7'                                                                   
P
w(i7)T(s1)'10'                                                                  
!iw(i7,V)V[,-75]                                                                  
3Q	w(i7)T(s1)'9'                                                                   
jP	w(i7)T(s1)'9'                                                                   
NOw(i7)T(s1)'7'                                                                   
�O
w(i7)T(s1)'10'                                                                  
�iw(i7,V)V[,-75]                                                                  
�@w(i7)T(s1)'7'                                                                   
�A	w(i7)T(s1)'9'                                                                   
�A
w(i7)T(s1)'10'                                                                  
B	w(i7)T(s1)'9'                                                                   
-iw(i7,V)V[,-75]                                                                  
BAw(i7)T(s1)'7'                                                                   
[P
w(i7)T(s1)'10'                                                                  
N	w(i7)T(s1)'9'                                                                   
�Ow(i7)T(s1)'7'                                                                   
�iw(i7,V)V[,-75]                                                                  

N�	w(i7)T(s1)'9'                                                                   
j�
w(i7)T(s1)'10'                                                                  
��w(i7)T(s1)'7'                                                                   
��
w(i7)T(s1)'10'                                                                  
��w(i7,V)V[,-75]                                                                  
��	w(i7)T(s1)'9'                                                                   
�	w(i7)T(s1)'9'                                                                   
��w(i7)T(s1)'7'                                                                   
/�
w(i7)T(s1)'10'                                                                  
M�w(i7,V)V[,-75]                                                                  
c�w(i7)T(s1)'7'                                                                   
��	w(i7)T(s1)'9'                                                                   
��
w(i7)T(s1)'10'                                                                  
��w(i7)T(s1)'12'                                                                  
��w(i7,V)V[,-75]                                                                  
�	w(i7)T(s1)'9'                                                                   
!�w(i7)T(s1)'11'                                                                  
I�w(i7)T(s1)'12'                                                                  
u�w(i7)T(s1)'11'                                                                  
��w(i7,V)V[,-75]                                                                  
J�w(i7)T(s1)'12'                                                                  
r�w(i7)T(s1)'11'                                                                  
��	w(i7)T(s1)'9'                                                                   
��w(i7)T(s1)'12'                                                                  
�1w(i7,V)V[,-75]                                                                  
��	w(i7)T(s1)'9'                                                                   

T'Buckley/Gilbert Lick
';                                                       
��T'slide
';                                                                      
��T'Wide finger vibrato
';                                                        

    
1906.3FYIUPWARD::HEISERtrimmed &amp; burnin&#039;Fri Jul 20 1990 16:1123
    This looks interesting so far.  However, when I bring up the tab
    screen and press MB2 on fret 8 (only fret I used) I received this stack
    dump (thought you should know):
    
    %BAS-F-ILLNUM, Illegal number
    -BAS-I-FRODEFMOD, In DEF FN$INTERPRET_COMMAND% in module TAB_EDITOR
    -BAS-I-FROMOD, In module TAB_EDITOR
    %TRACE-F-TRACEBACK, symbolic stack dump follows
    module name     routine name                     line       rel PC   abs PC
    
                                                              0004F194  0004F194
    ----- above condition handler called with exception 001A81A4:
    %BAS-F-ILLNUM, Illegal number
    -BAS-I-FRODEFMOD, In DEF FN$INTERPRET_COMMAND% in module TAB_EDITOR
    ----- end of exception message
                                                               0004F194 0004F194
    ----- above condition handler called with exception 001A81A4:
    %BAS-F-ILLNUM, Illegal number
    ----- end of exception message
                                                               0004E2D8 0004E2D8
                                                               0005CFE2 0005CFE2
    TAB_EDITOR      FN$INTERPRET_COMMAND%             852      00000096 000024AB
    TAB_EDITOR      TAB_EDITOR                        605      000001F4 000013F4
1906.4DNEAST::GREVE_STEVEJonathan Livingston Cat Barf..Fri Jul 20 1990 16:215
    
    
    
    	Shoot, those are errors!!  I took em' home with Buck's TAB and
    tried to play em'...  
1906.5HmmmmESSB::NWARNERI Pink, Therefore I HamMon Jul 23 1990 07:439
    
    re -2
    
    	Are you running on a workstation by chance. I was able to create
    	the tab file in.3 ok...
    
    	I will try to have a look sometime today.
    
    	Nigel
1906.6UPWARD::HEISERtrimmed &amp; burnin&#039;Mon Jul 23 1990 13:446
>    	Are you running on a workstation by chance. I was able to create
>    	the tab file in.3 ok...
    
    yes.
    
    Mike
1906.7HEEEELLLP!!!!NEEPS::IRVINEIn the game of pleasure &amp; painMon Oct 29 1990 11:569
    This is probably a bore to most... but...
    
    Can anyone send me details on how to use this program, which machines
    it can run on, what version of VMS is required... and all that stuff??
    
    Many thanks 
    
    Bob I.