option fieldsep,| 
  dialog CREATE,ID3 Tag Editor,-1,0,394,305 
  dialog ADD,TEXT,tFilename,8,8,,,Filename: 
  dialog ADD,EDIT,eFilename,8,88,264,24,,,readonly 
  dialog ADD,BUTTON,bFilename,10,360,24,18,... 
  dialog ADD,TEXT,tTitle,40,8,,,Title: 
  dialog ADD,EDIT,eTitle,40,88,296,24 
  dialog ADD,TEXT,tArtist,72,8,,,Artist: 
  dialog ADD,EDIT,eArtist,72,88,296,24 
  dialog ADD,TEXT,tAlbum,104,8,,,Album: 
  dialog ADD,EDIT,eAlbum,104,88,296,24 
  dialog ADD,TEXT,tYear,136,8,,,Year: 
  dialog ADD,EDIT,eYear,136,88,296,24 
  dialog ADD,TEXT,tComment,168,8,,,Comment: 
  dialog ADD,EDIT,eComment,168,88,296,24 
  dialog ADD,TEXT,tTrack,200,8,,,Track: 
  dialog ADD,EDIT,eTrack,200,88,296,24 
  dialog ADD,TEXT,tGenre,232,8,,,Genre: 
  dialog ADD,EDIT,eGenre,232,88,296,24 
  dialog ADD,BUTTON,bWrite,272,288,96,24,&Write changes 
  dialog SHOW 
  %%offset = 
:evloop 
  wait event 
  goto @event() 
:bFilenamebutton 
  %%file = @filedlg("MP3 Files|*.mp3|All Files (*.*)|*.*",Select MP3 file) 
  if %%file 
    if %%offset 
      binfile close,4 
    end 
    dialog set,eFilename,%%file 
    binfile open,4,%%file 
    %%offset = @diff(@file(%%file,Z),128) 
    gosub readid3 
    if @not(%%tag) 
      %%offset = @sum(%%offset,128) 
    end 
    parse "eTitle;eArtist;eAlbum;eYear;eComment;eTrack;eGenre",%%title|%%artist|%%album|%%year|%%comment|%%track|%%genre 
  end 
  goto evloop 
:bWritebutton 
  if %%offset 
    parse "%%title;%%artist;%%album;%%year;%%comment;%%track;%%genre",@dlgtext(eTitle)|@dlgtext(eArtist)|@dlgtext(eAlbum)|@dlgtext(eYear)|@dlgtext(eComment)|@dlgtext(eTrack)|@dlgtext(eGenre) 
    gosub writeid3 
  end 
  goto evloop 
:close 
  if %%offset 
    binfile close,4 
  end 
  exit 

  rem ID3v1.0 
  rem "TAG"       =    3 bytes 
  rem song title  =   30 bytes 
  rem artist      =   30 bytes 
  rem album       =   30 bytes 
  rem year        =    4 bytes 
  rem comment     =   30 bytes 
  rem genre       =    1 byte 
  rem               ----------- + 
  rem total       =  128 bytes 

  rem ID3v1.1 
  rem "TAG"       =    3 bytes 
  rem song title  =   30 bytes 
  rem artist      =   30 bytes 
  rem album       =   30 bytes 
  rem year        =    4 bytes 
  rem comment     =   28 bytes 
  rem @chr(0)     =    1 byte 
  rem album track =    1 byte 
  rem genre       =    1 byte 
  rem               ----------- + 
  rem total       =  128 bytes 

:readid3 
  rem Inputs: 
  rem   - %%offset 
  rem   - binfile 4 
  rem Outputs: 
  rem   - %%tag; %%title; %%artist; %%album; %%year; %%comment; %%track; %%genre 

  binfile seek,4,%%offset 
  %%tag = @binfile(read,4,text,3) 
  if @equal(%%tag,TAG) 
    %%max = 30 
    gosub read 
    %%title = %%result 
    if @greater(%%max,%%count) 
      %%dummy = @binfile(read,4,text,@diff(%%max,%%count)) 
    end 

    gosub read 
    %%artist = %%result 
    if @greater(%%max,%%count) 
      %%dummy = @binfile(read,4,text,@diff(%%max,%%count)) 
    end 

    gosub read 
    %%album = %%result 
    if @greater(%%max,%%count) 
      %%dummy = @binfile(read,4,text,@diff(%%max,%%count)) 
    end 

    %%max = 4 
    gosub read 
    %%year = %%result 
    if @greater(%%max,%%count) 
      %%dummy = @binfile(read,4,text,@diff(%%max,%%count)) 
    end 

    %%max = 30 
    gosub read 
    %%comment = %%result 
    if @greater(%%max,%%count) 
      %%dummy = @binfile(read,4,text,@diff(@pred(%%max),%%count)) 
      %%track = @substr(@binfile(read,4,binary,1),1,-1) 
      if @equal(%%track,0) 
        %%track = 
      end 
    end 

    %%genre = @substr(@binfile(read,4,binary,1),1,-1) 
  else 
    %%tag     = 
    %%title   = 
    %%artist  = 
    %%album   = 
    %%year    = 
    %%comment = 
    %%track   = 
    %%genre   = 
  end 
  exit 
:read 
  %i = 0 
  %%result = 
  %%count = 0 
  repeat 
    %i = @succ(%i) 
    %%char = @substr(@binfile(read,4,binary,1),1,-1) 
    %%count = @succ(%%count) 
    if @not(@equal(%%char,0)) 
      %%result = %%result@chr(%%char) 
    end 
  until @equal(%i,%%max)@equal(%%char,0) 
  %%result = @trim(%%result) 
  exit 
:writeid3 
  rem Inputs: 
  rem   - %%offset; %%title; %%artist; %%album; %%year; %%comment; %%track; %%genre 
  rem   - binfile 4 
  rem Outputs: 
  rem   - binfile 4 

  binfile seek,4,%%offset 
  binfile write,4,text,TAG 

  %%data = %%title 
  %%length = 30 
  gosub write 

  %%data = %%artist 
  %%length = 30 
  gosub write 

  %%data = %%album 
  %%length = 30 
  gosub write 

  %%data = %%year 
  %%length = 4 
  gosub write 

  if %%track 
    %%data = %%comment 
    %%length = 28 
    gosub write 

    binfile write,4,binary,0| 
    binfile write,4,binary,%%track| 
  else 
    %%data = %%comment 
    %%length = 30 
    gosub write 
  end 
  if @not(%%genre) 
    %%genre = 255 
  end 
  binfile write,4,binary,%%genre| 

  exit 
:write 
  if @substr(%%data,1,%%length) 
    binfile write,4,text,@substr(%%data,1,%%length) 
  end 
  %%length = @diff(%%length,@len(%%data)) 
  if @greater(%%length,0) 
    repeat 
      binfile write,4,binary,0| 
      %%length = @pred(%%length) 
    until @equal(%%length,0) 
  end 
  exit