           ͻ
                   Q S E Q : QUICK SEQUENCER        
                                                    
            Copyright 1993-1995 by David HAUBENSACK 
                     All Rights Reserved            
                                                    
                version 1.2b, 15 june 1995          
           ͼ


Ŀ
00 - Author, Copyright, Money, and those kind of things...


Read this, it contains lotsa info !!!


  Hi there,

First of all, let me tell you that,... I'm French.  So don't be scared off
by some of the language booboos you will probably notice in this doc-file.
So forget about Shakespeare and Hemmingway, just learn French and call me.

This piece of software was (and probably still is) developped by:

    David HAUBENSACK
    Chemin de Barraban
    84240 GRAMBOIS
    FRANCE
    home phone: (+33)-90779719
    work phone: (+33)-42254292
    work fax  : (+33)-42252780
    email     : hbsk@rhum.cad.cea.fr (not hbsk@hostsit or hbsk@h2o anymore !!!)

You must not: sell, copy, nor give away the fully functional version of this
program, except to your baby sister, provided she is less than three years old
but I doubt if she will thank you for it,... especially if you just have one
brother and a cat. You may not use it for private, nor commercial purposes,
unless you have purchased and received an explicite licence from me.

The price for a licence of the "FULL-FEATURED" version 1.2 is 350.00 Francs or
$70.00 US, including shipping. That's cheap, believe me. Yes, believe me ! If
you can't pay in french francs nor in dollars, use today's currency rates and
convert 350.00FF to your currency. Don't cheat on the conversion, OK ?
Anyway, I will check it out in the financial section of my newspaper. All that
cash-money will then be integrally wasted into the purchase of a musical
instrument of some kind. I promise !

If you want to buy "QSEQ" send me a postcard with your exact name and address,
and a check or a money order made out to my name. If you can't find a pretty
postcard, don't worry, the check will do nicely. Remember to tell me what
kind of floppy-disk you need (either: 3.5 or 5.25"). Registered users will be
able to buy future releases for a special friendly price. Did I say:
"friendly"? I'm feeling so generous today! I must have caught a cold or
something. Future release means changes in the major or minor version number...
You'll be able to get correction versions for free, if you're on Internet or if
you send me a floppy with your address on it. Correction version numbers are
followed by a lower-case letter (e.g. qseq v1.0d). To get an upgrade, don't
forget to tell me your name, address and your previous licence number.

For the "DEMO" version, you can run it for your private use, then give away
copies of it to whoever you want. Just don't sell it, unless you are a crook.
Beware, the demo version is not the full version... You cannot save music files
with it!  Tough luck, unless you own "2" PCs, and "2" MIDI-cards like a good
friend of mine (he says he's not a crook, should I believe him?...). Anyway,
even this DEMO version can be used as a very good midifile player and a sysex
dumper (cos' you can save sysex files with it), that's why I don't consider it
as real crippleware.

For those who hate those kind of crippled demo, let me tell you my story:
"Once upon a time, I uploaded freeware of mine on the Internet. Then I got back
a lot of calls from a lot of people that were just curious about the software
or who didn't understand what it was about (cos they didn't even read the doc).
Some of them were very rude because they seemed to think that I had to help
them with the software, as if I was a commercial hotline! I get buzzed about
this. Now I'm asking for a little money ($70.00 US is really small in comparison
with comparable commercial products), and I can tell you that it is a very good
filter: now I mostly get in touch with motivated people who dare to read the
documentation and invest time in seriously testing the product. I'm ready to
help those kind of people. End of the story. Conclusion of the fairy tale: they
were happy and conceived a lot of baby-midi-softwares together..."

The date of this version is written at the beginning of this document.
But if today is 23/12/2021, there is probably a new release coming soon. Just
ask me. Next major version will probably wait for a year to come, depending also
on the success of this one... God, let me become a millionnaire with this
marvellous program. Amen. (addition: after one year on the market, I'm still
not a millionnaire but I'm satisfied...)

You can probably find the latest demo version of qseq-*.zip on Internet via
anonymous ftp in one of the following servers/directory:

     Rochester, MI:  OAK.Oakland.Edu (141.210.10.117)
                       /SimTel/msdos
     St. Louis, MO:  wuarchive.wustl.edu (128.252.135.4)
                       /systems/ibmpc/simtel/msdos
        Norman, OK:  ftp.uoknor.edu (129.15.10.20)
                       /mirrors/SimTel/msdos
     Corvallis, OR:  ftp.orst.edu (128.193.4.2)
                       /pub/mirrors/simtel/msdos
         Australia:  archie.au (139.130.4.6)
                       /micros/pc/SimTel/msdos
           England:  micros.hensa.ac.uk (148.88.8.84)
                       /mirrors/simtel/msdos
           England:  src.doc.ic.ac.uk (146.169.2.10)
                       /pub/packages/simtel
           Finland:  ftp.funet.fi (128.214.248.6)
                       /pub/mirrors/oak.oakland.edu/Simtel/msdos
            France:  ftp.ibp.fr (132.227.60.2)
                       /pub/pc/SimTel/msdos
           Germany:  ftp.uni-paderborn.de (131.234.2.32)
                       /SimTel/msdos
         Hong Kong:  ftp.cs.cuhk.hk (137.189.4.57)
                       /pub/simtel/msdos
            Israel:  ftp.technion.ac.il (132.68.1.10)
                       /pub/unsupported/simtel/msdos
       Netherlands:  ftp.nic.surfnet.nl (192.87.46.3)
                       /mirror-archive/software/simtel-msdos
            Poland:  ftp.cyf-kr.edu.pl (149.156.1.8)
                       /pub/mirror/simtel/msdos
      South Africa:  ftp.sun.ac.za (146.232.212.21)
                       /pub/simtel/msdos
            Sweden:  ftp.sunet.se (130.238.127.3)
                       /pub/pc/mirror/SimTel/msdos
       Switzerland:  ftp.switch.ch (130.59.1.40)
                       /mirror/simtel/msdos
            Taiwan:  NCTUCCCA.edu.tw (140.111.1.10)
                       /PC/simtel
          Thailand:  ftp.nectec.or.th (192.150.251.33)
                       /pub/mirrors/SimTel/msdos
            Turkey:  ftp.metu.edu.tr (144.122.1.102)
                       /pub/mirrors/simtel/msdos

           Finland:  garbo.uwasa.fi (103.166.120.5)
                       /pc/sb

       Netherlands:  ftp.cs.ruu.nl (131.211.81.17)
                       /pub/MIDI/PROGRAMS/MSDOS

Notice that these servers are often mirrored on CD-ROMs.

If you don't have access to ftp, qseq-*.zip can automatically be emailed to you
uuencoded and split in 40Kb pieces. Just send a message to hbsk@rhum.cad.cea.fr
with one of the following lines in the body of the message:

sendqseqreturn
-> send you QSEQ by return of the mail.

sendqseqto <your-full-internet-email-address>
-> send you QSEQ to the given address.

sendhelpreturn
-> send you a help file (with the last version number) by return of the mail.

sendhelpto <put-your-internet-email-address-here>
-> send you a help file (with the last version number) to the given address.

For example, to get QSEQ, Mr Clinton would write:
sendqseqto president@whitehouse.gov

(!!! don't put any space character before the first keyword, Mr President !!!)

The rest of the message is ignored (the subject line is not used...).

Notice that the main chance to retrieve the very last version is to use this
mailserver.

Let me tell you one good thing. SoundBlaster is a trademark from Creative Labs.
But their MIDI port is so simple that it is quite hard to program efficiently.

MSDOS and Windows are trademarks of Microsoft Corp. But I do not use Windows
for my personnal work.


Ŀ
01 - Contents:


  00 - Author, Copyright, Money... (are you sure you red this one?)
  01 - Contents (you're in, dude!).
  02 - Quick description to make you dream.
  03 - Future releases.
  04 - Bugs, oh no there are no bugs... (see chapter 40)

  10 - What installation ? (READ THIS ONE, PLEASE, BEFORE CALLING ME !!!)
  11 - Philosophy.
  12 - Key conventions.
  13 - The status line.
  14 - Edition conventions.

  20 - GLOBAL view.
  21 - VARIABLE view.
  22 - NOTE view.
  23 - EVENT view.
  24 - FILE view.
  25 - SYSEX view.
  26 - INFO view.
  27 - LOOK view.
  28 - HELP view.

  30 - How to record and play.
  31 - Special keys.
  32 - Command-line options.
  33 - Configuration tool and file.

  40 - Releases, sub-versions, and atomic changes...
  41 - Conclusion.
  42 - "Cul Sec".

  50 - That's all folks !


Ŀ
02 - Quick description, to make you dream:


This sequencer is a text-mode one, written in C and assembly and its
size gives you an average 400K free memory for your music, if you are
running MSDOS 6.0. The upper memory is not used if you have more than 640K.
Its main purpose is to be very easy and quick to use, with most of the
features that any good sequencer offers. Here are these features:

- PC compatible, with MSDOS 3.0 or greater.
- Support the SoundBlaster MIDI interface.
- 80 x 50 colour text display, using direct video memory writing for speed.
- Highly secured and reliable MIDI playing kernel, totally independant from
  the user-interface activity (I worked for this!).
- Time resolution is 1/192th of a beat (called a tick).
- Two recording modes: overwrite existing material or append.
- Punch in/out while recording.
- 40 tracks, with many real-time parameters for each track, including
  selective MIDI events filters, fine delay, key and velocity transpose, etc...
- Recordable tempo change on any track.
- Each track contains up to 16000 MIDI events.
- Each track can be looped a given number of times.
- Each track is individually mutable or archivable, or can be set to solo mode.
- Powerful graphic manipulation of tracks and beats (copy, cut, paste,
  paste-over, join, transpose, etc...), thru a buffer.
- Powerful graphic editing of any MIDI event in a track (notes, control
  changes, aftertouch, bender, program changes, tempi, etc...).
- Tool to smooth continuous MIDI event variations and to filter out
  useless events by linear interpolation.
- Tool to create MIDI events by linear/curved/random progression.
- Tool to split a track according to notes pitch.
- Tool to split one multiple-channels track into several single-channel tracks.
- Tool to humanize a track.
- Tool to quantize a track, with strength and swing percentages.
- Tool to create a legato style of playing.
- Tool to change note lengths according to a linear and/or random function.
- Tool to change note velocities according to a linear and/or random function.
- Tool to change note velocities according to a compression function.
- Tool to change MIDI event values according to a linear and/or random function.
- Sysex file capabilities.
- Info screen to memorize useful information about a sequence, with templates.
- Real time visualisation in hours/minutes/secondes/hundredth of seconds.
- Load, merge and save MIDI files (format 0 or 1) or QSEQ format files.
- Easy manipulation of files and directories.
- Metronome click on the PC speaker or thru MIDI notes.
- Possible emission of real-time messages START/CONTINUE/STOP.
- Synchronized start and stop with external START/CONTINUE/STOP MIDI messages.
- Tool to compute current MIDI controllers and tempo when you start playing
  in the middle of the song (powerful, hu ?).
- Statistic screen to count and sort MIDI events for each track.
- configuration tool and file for custom colours and settings.
- Help screen where you can browse a customizable help file.
- And many many other features that I hope you'll like...


Ŀ
03 - Future releases:


In the future, I plan to integrate new features:

- Support of the MPU interface, as soon as I have the money to buy one.
- Support of the synchronization for tape recording, as soon as I have the money
  to buy a MPU interface supporting sync.
- Support of multiple MIDI ports, as soon as I have the money to buy a MPU
  interface supporting sync and having two MIDI ports to use 32 MIDI channels.
- More new tools to manipulate blocks. No money nor hypergalactic MPU card
  necessary for this one...
- Library of sysex requests, in order to receive sysex dumps without
  manipulating synths' panels. Have to think about a clever way to implement
  this one.
- A C library to manipulate QSQ format files to allow creation of batch tools
  that would increase too much QSEQ size if they were included in it.
- Increase the number of tracks. It is easy but I don't need it and it
  can slow down the MIDI output if you have a real slow machine (like mine).
  Gimme a 486/DX2-66 as a gift and I will do this one!
- Customizable keys for those who are tasteless because my choices are obviously
  the best!
- Any other feature that I need for myself, because I am the first and main
  user of this piece of software. The only difference between you and I is
  that I get it for free money but not free work!

If you have any ideas, don't hesitate to send them to me on a letter or an
email. But remember that I want to keep the program quite small and rapid to
use. So I probably won't use any graphical interface with mouse and all that
stuff if it is what you're thinking about.


Ŀ
04 - Bugs, oh no there are no bugs...


I tested this software on a PC-AT-286/12 MHz with a SoundBlaster Pro card.
It also perfectly works with my MIDI gear (Roland U20 synth, Quadraverb+ unit,
Casio RZ-1 drum machine, Proteus/1 expander). I also tested it on a PC-486/33
of a friend of mine, with YAMAHA synths and a Roland SCC1 card (used as a synth,
not as a MPU interface). I noticed no problem, or if I noticed some, I corrected
them. I also tested it on a PC-386 without MIDI interface. It also works.

But as I am not perfect nor divine for the moment, you could find a bug. I'm
sure I forgot some weird case. Don't hesitate to send me a letter or email to
the address above if you find one. Please describe it as precisely as possible,
cos I already noticed it is sometimes hard for me to put my finger on them...

You will notice that, according to chapter 40, there are already a certain
number of subversions, due to a certain number of bug corrections but also
pure improvements. Thanks to whoever helped me discover these bugs. They
know who they are.


Ŀ
10 - What installation ?


Files provided in the package are:

  - README.TXT : a file to read.

  - QSQ.TXT : this document, i.e. the user's manual.
  - QSQ.HLP : the QSEQ help file.

  - QSQ.EXE : the QSEQ program itself.

  - QSQCONF.EXE : the QSEQ configuration program.

  - QSQ.PIF : the PIF program to execute QSEQ from MS/Windows.
  - QSQ*.ICO : icons you can use under MS/Windows to represent QSEQ.

  - QSQ.CFG : the original complete QSEQ configuration file.
  - VAR.CFG, VAR2.CFG : configuration file restricted to variables.
  - BW_SCR.CFG : configuration file for black & white screens.
  - COL_SCR.CFG : original configuration file for colour screens.
  - COL2_SCR.CFG : green configuration file for colour screens.

  - FRENCH.TPL and  ENGLISH.TPL : examples of template for the INFO view.

  - JAZZ.QSQ, WHATISAY.QSQ and WHATISAY.MID : sample music files under QSEQ
    format and standard MIDIFILE format. I'm not the creator of these examples
    I found on the net. I just modify them to make them obvious. Thanks to Ray
    Charles. I am giving this MIDIFILE, not selling it, so please Ray, if you
    read this (ooops excuse me!), don't ask me for any money... ;-)

  - DEMO.BAT : a DOS script to run QSEQ demo (edit it, run it and press space).

This program needs at least a PC AT/286 with a VGA card and a version of
MSDOS greater than v3.0. The original version is designed for a colour screen
but colours are customizable if you want to use a monochrome display...

It also needs a SoundBlaster card as a MIDI interface.

QSEQ can read the BLASTER environment variable if it is correctly set in the
AUTOEXEC.BAT file (see SoundBlaster Pro's documentation for further
information).

  ex: set BLASTER=A220 I7 D1 T4

Only A and I options are used by QSEQ.

If you have a common SB card, the environment variable you're using should be
SOUND. Anyway, you can add a BLASTER variable to your AUTOEXEC.BAT, that will
be used by QSEQ. You can also use the configuration tool (BLASTERINT and
BLASTERADD tokens) .

If you don't have a SB card, you can test the program interface anyway. When
you record, a MIDI IN input is even simulated. Everything except the MIDI IN
and MIDI OUT routines work normally.

The only useful file is "qsq.exe". Just type "qsq" to enter the program.
You can also type the name of a file on the command line if you want it to be
loaded at the beginning.

You should store qsq.exe somewhere in your DOS search path if you want to be
able to run it from any directory.

You can also set two other environment variables:
- MUSICDIR that contains the path to your most used music files directory.
- SYSEXDIR that contains the path to your most used sysex directory.
- QSEQHELP that contains the full name to your QSEQ help file.

they will be used as default search paths.

ex: set MUSICDIR=c:\qsq\music
    set SYSEXDIR=c:\qsq\sysex
    set QSEQHELP=c:\qsq\qsq.hlp

Don't forget to switch LOCAL CONTROL off on your synth, because QSEQ takes care
about redirecting what is entering its MIDI IN to MIDI OUT, after a little
treatment. If you can't do this, you can reconfigure QSEQ with the MIDITHRU
token value to 0 (QSEQ won't provide any midi thru). If your synth understands
LOCAL CONTROL, you can send this message automatically at the beginning of the
session (reconfigure QSEQ with LOCALCTRL token to 1).

If your synth sends Active Sensing messages every 300ms, you'd better
disable this option if it is possible cos' it can slow down QSEQ, even if QSEQ
ignores them (and doesn't echo them to MIDI OUT).

I don't guarantee that this program works with TSR programs. The results may be
weird because I change the frequency of the timer (without loosing system timing
information of course, I worked for this...).

I am not responsible for any damages QSEQ could do to your PC. But it is just a
formula because nothing happened to mine.


Ŀ
11 - Philosophy:


The Wise Man said:

QSEQ is divided into several views. The main view is the GLOBAL view. Each
view will be described in the following chapters.

At the bottom of the screen, there are 3 lines that are reserved for
menus and interactive questions. The first line is the main menu,
telling you in what view you're in. The current view first letter is
hilighted in a different colour than the others. To change from one view
to another, just type the letter of the new view. Notice that every
view main short-key is a capital letter.

The second line is a submenu that depends on the view you're in. It
works in the same way: just type the hilighted letter of the item you
want to activate.

The third line is either for a subsubmenu or an interactive question
or a sequencer message (report or error).


Ŀ
12 - Key conventions:


In this document, we will use the following notation:

- ^A for Ctrl-A.
- aA for Alt-A.
- sA for Shift-A.

That's all for this chapter. Short isn't it ?


Ŀ
13 - The status line:


At the top of the screen, there is the status line, that contains from the left
to the right:

- the name of the current edited file, preceded by a 'Q' a 'm' or a 'M'
  describing the type of the file when it was last loaded or saved (QSEQ type,
  MIDIFILE type 0 or MIDIFILE type 1).
  type).
- the counter (see "Special keys - aU" for the different available units).
- the tempo in number of beats per minute.
- the signature in number of beats per measure (in the whole sequencer, I
  assume that one beat equals one quarter-note).
- the sequencer mode flag:
  (E): edit mode.
  (P): playing mode.
  (R): recording mode.
  (S): step recording mode.
- the recording mode flag:
  (O): overwrite.
  (A): append.
- the punch-in mode flag:
  (P): on.
  (p): off.
- the metronome flag:
  (M): MIDI metronome on.
  (m): PC SPEAKER metronome on.
  (.): metronome off.
- the midithru flag:
  (T): midithru on.
  (t): midithru off.
- the memory left. In recording modes, it gives the number of free events
  available in the track, assuming one MIDI event uses 4 bytes and each beat
  also uses 4 bytes, and assuming one track contains a maximum of 16380
  events. In every other mode, it gives the total number of thousands of free
  events available. Note that when you run QSEQ with option "-i", it displays
  the memory that was available for its data...


Ŀ
14 - Edition conventions:


In QSEQ, when you are editing a numeric or an alpha-numeric field or data,
the following keys are available:

- LEFT or RIGHT: move one character to the left or to the right.
- ^LEFT or ^RIGHT: move one alpha-numeric word to the left or to the right.
- DEL: erase the current character.
- BACKSP: erase the previous character.
- ^BACKSP or ^Y: erase the whole field (or line).
- ^DEL: delete from the current character to the end of the field (or line).
- HOME or END: go to the beginning or the end of the field (or line).


Ŀ
20 - GLOBAL view:


Type 'G' to go to this view. Notice that from any other view, you just have to
type ESC to return to the GLOBAL view...

The zoom:


The GLOBAL view represents the global content of the 40 tracks of the sequencer,
with or without a zooming feature. So the horizontal direction represents time.

The zoom status is shown at the upper right corner: 'Z' for zoom, 'z' for
unzoom. Use key 'z' to toggle between both modes.

In the zoomed mode, each dot represents a beat (one quarter note or 192 ticks).

In the unzoomed mode, each dot can represent either:

- a measure, if the zoom is based on the signature: each measure contains a
  number of beats equal to the signature shown in the status line. Remember
  that the signature is used for the metronome accent, and for saving in
  MIDIFILES. It is a musical variable. The signature is set with the aS key.
- a group of a user-definable number of beats, independant from the signature.
  We will call this number the zooming number. This number is usefull when you
  want to have an invariant signature but still want to vary the display
  (e.g. if you have a 4/4 signature, choosing a zooming number of 24
  will give you a larger - but less precise - view of your sequence if you are
  in unzoomed mode). So remember that this zoom number is only a display
  variable, with no repercussion on the music. The zoom number is set with the
  aZ key.

You can toggle between these two display modes with the ^Z key.

In the zoomed mode, the upper horizontal scale counts beats. Notice that steps
on the scale depend on whether you use the zooming number or the signature
as the number of beats per group.

In the unzoomed mode, the upper horizontal scale counts measures or zooming
number based groups: it depends on whether you use the zooming number or the
signature as the number of beats per group.

Left part of the screen:


On the left part of the screen, you can read:

- the track name (75 characters max, 17 displayed).
- the channel number. If it is used, each event in the track is forced to
  this channel, otherwise each event keeps the channel it had when it was
  recorded or inserted.
- the optional initial program number which is sent when the sequence is
  played back from beat 0.
- the status mode:
  '-' for an empty track.
  '' for a normal non-empty track.
  'L' for a looped track.
  The following overide the previous ones when used:
  'M' for a muted track.
  'A' for an archived track.
  'S' for a track in solo mode (only one soloed track at the same time).
  Difference between a muted and an archived track: a muted track can be
  de-muted while playing, not an archived track. An archived track is
  totally ignored while playing, so the performance is better on slow
  machines, especially when the archived track contains a lot of events
  such as benders, etc...

Right part of the screen:


The right part of the screen represents the content of each track. A '.'
means that the beat/measure/group of beats is non-defined. A '-' means that
the beat/measure/group of beats is defined but empty. See "secondary menus,
v(f)il" to understand the meaning of other symbols.

The end of a track is shown by a '|'. If it is a '<', it means that you are
in unzoomed mode and that the last measure/group of beats does not contain
a number of beats equal to the signature/zooming number.

If the track is looped, every repetition point of the loop is shown by a 'L',
and the last 'L' shows the real end of the track when it is played. If you
press the aL key, you can also see looping points: a 'L' appears on the beat
where the track is looped, and also at the end of the track. If you want to
hide this looping information, use the aL key again.

A 'M' at the beginning of a track means that the track is muted.
A 'A' at the beginning of a track means that the track is archived.

Secondary menus:


You can use the following secondary menus:

- (m)ute: mutes the current track, or unmutes it (see also ^U).
- (s)olo: sets the current track in solo mode: every other track is
  muted until you select this menu again (see also ^U).
- (a)rch: archives the current track, or unarchives it (see also ^U).
- (l)oop: sets or defeats track(s) looping mode(s) or looping points. See the
  VARIABLE screen to set the number of loops. The following subsubmenus appear
  when you select this submenu:

  * (l)on/off: sets or defeats looping mode for the current track.
  * (o)nall: sets looping mode for all tracks.
  * o(f)fall: defeats looping mode for all tracks.
  * (s)et: sets looping point to current beat for the current track.
  * set(a)ll: sets looping point to current beat for all tracks.

- (i)nsN: inserts n beats or n measures at the cursor position, with or
  without cutting notes that stand on a limit. The INS key is a shortcut
  to do (i)ns1 without cutting.
- (d)elN: deletes n beats or n measures at the cursor position, cutting
  notes that stand on a limit. The DEL key is a shorcut to do (d)el1.

- (b)lock: a block is a group of consecutive beats of the same track.
  There's one buffer that can be used to store one block and to
  copy it in another position. The following subsubmenus appear when you
  select this submenu:

  * (c)opy: copies the marked block to the buffer. You can also use the aF4 key.
  * (p)aste: pastes the content of the buffer at the cursor position,
    inserting the corresponding number of beats. You can repeat this operation
    a given number of times. You can also use the aF5 key.
  * (k)ut: copies the marked block to the buffer and deletes the block from
    the original track. You can also use the aF3 key.
  * (o)ver: pastes the contents of the buffer over the cursor position,
    erasing any material under the buffer area. You can repeat this operation
    a given number of times. You can also use the aF6 key.
  * (j)oin: pastes the contents of the buffer over the cursor position, merging
    the new material with the old one. For notes, old notes are not erased
    by newer ones, for safety reasons. You can repeat this operation a given
    number of times.
  * (d)el: deletes the marked block from the track. Same as (k)ut but leave the
    buffer unchanged.
  * (w)ipe: simply erases the content of the marked block.

  * (b)eg: sets block begining, and also the block's track.
    You can also use the aF1 key.
  * (e)nd: sets block end, and also the block's track.
    You can also use the aF2 key.
  * (z)ero: unmarks the current marked block.
  * (g)lide: moves the block begining to the current cursor position, keeping
    the same block size.
  * (s)ize: asks for a new block size, keeping the same block beginning.
  * (t)rk: translates the block on the current track, without modifying block
    begining nor end.

  * (m)anip: special manipulations on the marked block. The following features
    are sometimes called "tools" in this documentation.

    - (.)..: use this special point submenu to toggle to next (m)anip submenu.

    - (s)etChannel: changes the MIDI channel of all MIDI events contained in
      the marked block.

    - (t)ranspose: transposes all notes contained in the marked block a
      positive or negative number of semi-tones. Notes transposed out of the
      usual 0-127 range are erased.

    - chg(v)elocity: changes the velocity of all notes contained in the marked
      block, according to a linear and/or random function:
      newvelo=A+(B/100*oldvelo)+(C/100*deltatime)+-[0..RND]
      where deltatime is the difference in ticks between the beginning of the
      block and the starting point of the current note: it can be used to
      create crescendo or a diminuendo effects.
      The random factor can be used to "humanize" a group of notes of the same
      velocity. If the result is out of the usual 0-127 range, velocity is
      either set to 0 or 127.

    - com(p)ression: changes the velocity of all notes contained in the marked
      block, according to a compression algorithm:

        ^ newvelo
     127+                 .
        +               .~
        +             .~
        +          ..~
        +      ..-~ I
        +  ..-~     I
        .-~         I
        +           I
        +           I
        +-+-+-+-+-+-I-+-+-+-+-> oldvelo
       0           threshold  127

      The rate of the line before the threshold is rate:1 and 1:1 after.
      This algorithm works like a hardware compressor would, increasing the
      velocity of quietest notes.

      If you give the threshold a negative value, an inversed algorithm is used:

        ^ newvelo
     127+
        +                   ..
        +               ..-~
        +           ..-~
        +         .~I
        +       .~  I
        +     .~    I
        +   .~      I
        + .~        I
        .~+-+-+-+-+-I-+-+-+-+-> oldvelo
       0           threshold  127

      The rate of the line after the absolute value of the threshold is rate:1
      and 1:1 before.

    - chg(e)vtVal: changes the value of every event of a specified type
      contained in the marked block, according to a linear and/or random
      function: newvalue=A+(B/100*oldvalue)+-[0..RND].
      The random factor can be used to "humanize" an event evolution (such as
      volume). If the result is out of the usual range, it is rounded to the
      nearest boundary.

    - time(x)pand: expands or compress the time for all notes contained in the
      marked block, using the beginning of the block as a reference.
      A 100% rate changes nothing; a 50% rate compresses notes starting points
      and lengthes by a factor 2; a 300% rate expands them by a factor 3.
      Note that in case of an expansion, notes can be overwritten and lost
      at block's boundaries : if it happens, a message will be told.

    - (q)uantize: rounds off the starting point of notes to a resolution you
      choose. Imagine a time-grid dividing every beat in equal pieces. Then you
      move every note to the nearest point of the grid.

      example with a beat divisor equal to 4:

        before:

          beat0           beat1           beat2
          I---+---+---+---I---+---+---+---I----  grid
           XXXX                      XXXX
                     XXXXXX
                XXX            XX

        after:

          beat0           beat1           beat2
          I---+---+---+---I---+---+---+---I----  grid
          XXXX                        XXXX
                      XXXXXX
                  XXX         XX

      You can also give a roundoff rate (or strength percentage), between 0 and
      100. A 100% rate keeps notes unchanged; a 0% rate rounds notes precisely
      off; a 50% rate moves notes half-way to the nearest point of the grid.
      Imagine what gives another rate...

      You can also give a swing percentage, that changes uneven points of the
      grid and keeps even points unchanged. A 50% swing rate do nothing. A
      rate less than 50% moves uneven points to the left; a rate greater than
      50% moves them to the right. This swing rate used on drum tracks can
      make them swing (do not use a too big value...).

      example with a beat divisor equal to 4:

        50% swing rate grid:

          beat0           beat1           beat2
          I---+---+---+---I---+---+---+---I---  grid

        25% swing rate grid:

          beat0           beat1           beat2
          I-+-----+-+-----I-+-----+-+-----I-+-  grid

        75% swing rate grid:

          beat0           beat1           beat2
          I-----+-+-----+-I-----+-+-----+-I---  grid

      It happens that some notes cannot be moved because they would overwrite
      other ones. Notes are never lost with this feature.

    - time(g)lide: adds to the starting point of every note a given number of
      ticks, gliding every note to the right of the time scale. If this number
      is negative, notes are glided to the left. This feature is useful when you
      want one track to have the priority (for example the drum kit track): if
      several notes occure at the same time, you can be sure that the note of a
      minus-one-translated track will occure before the others... You can also
      use this feature to create a MIDI echo effect if you copy one track
      in an empty one and translate one from the other. Notice that the same
      result can be obtained on-the-fly with the "dly" variable of the
      VARIABLE view, but in this case the result will not change the way the
      track is stored in memory or even displayed on the NOTE view...
      Note that at block's boundaries, notes can be overwritten and lost:
      if it happens, a message will be told.

    - (h)umanize: adds or subtracts to the starting point of every note a
      random value between 0 and the given number of ticks. When notes are
      entered with the keyboard, it is useful to add a little chaos... It
      "humanizes" the way notes are played or it avoids a mechanical way of
      playing. Notes are never lost with this feature.

    - legat(o): changes notes lengths to get a legato style of playing. For
      every note: note's start does not change ; note's end is moved in order
      to be just before next note's start. The gap between notes is given by
      the user and has a minimum value of 1 tick. If the next note is too close,
      then the next note is taken as a reference, and so on (then simultaneous
      notes - in a chord for example - are still played together). Notes are
      never lost with this feature.

    - chg(l)en: changes the length of all notes contained in the marked
      block, according to a linear and/or random function:
      newlen=A+(B/100*oldlen)+-[0..RND].
      newlen minimum value is 1 ticks.

    - contin(b)eat: notes that end at the tick 191 and start back at tick 0 of
      the next beat are tied together. This feature is useful when you use
      block cut/paste/insert/etc.. that often cuts notes at a beat limit.

    - split(k)ey: creates two tracks from one track. The first new track
      contains all notes between both given limits. The second new track
      contains every other note (strictly outside limits). Other events can
      be duplicated in none, first, second or both tracks. The original track
      is not modified. New tracks inherit the name of the original track with
      either "()" or ")(" at the end of the name. They also inherit the
      original track's parameters (see "VARIABLE view").

    - split(c)hannel: creates several tracks from one track. Each new track
      contains all notes of the original track related to a particular MIDI
      channel. A maximum of 16 tracks can be created. The original track is
      not modified. This feature is useful when you load a format 0 standard
      MIDI file, that contains all channels merged together in one track. New
      tracks inherit the name of the original track with a "Cnn" at the end of
      the name, where nn is the number of the isolated MIDI channel. They also
      inherit the original track's parameters, except the MIDI channel parameter
      that is kept empty.

- (t)rack: in this menu, a track is considered as the content of the track
  together with every parameter or variable related to the track. The buffer
  used in this operation is the same as the buffer used in block operations, so
  be careful not to loose beats or tracks ! The following subsubmenus appear
  when you select this submenu:

  * (i)ns: inserts one track at the current position. All subsequent tracks are
    translated one step down. Not possible if track 39 is not empty.
  * (d)el: deletes current track. All subsequent tracks are translated one step
    up. Be careful, no way to get it back !

  * (c)opy: copies the whole current track into the buffer.
  * (k)ut: copies the whole current track into the buffer and performs a
    "track del" operation.
  * (p)aste: pastes the contents of the buffer into the current track, if it is
    empty, and if the buffer contains the result of a "track kut" or "track
    copy" operation. Variables of the current track are modified.
  * (j)oin: joins or merge the contents of the buffer with the current track.
    Variables of the current track are not modified.
  * (e)rase: erases the contents of the current track. Variables of the current
    track are not modified. If you insert something in the track, they will
    all appear again.
  * (m)ark: marks the whole current track.

- p(u)nch: this feature allows you to record with automatic punch-in and
  punch-out points. When you are in punch mode and hit record, you stay in
  playback mode until you reach the punch-in point, where you are automatically
  transfered to record mode. Then, when you reach the punch-out point, you go
  back automatically to playback mode. This allows you to re-record a precise
  number of beats within an existing track, without loosing surrounding
  material.

  * (u)on/off: switch punch mode on or off. You can also use the aP key.
  * (i)n: set punch-in point to the current beat.
  * (o)ut: set punch-out point to the current beat.

- (j)oker: you can use special items to mark a beat, that I call "jokers". They
  are numbered from 'A' to 'Z' and appear on the horizontal scale. They are not
  associated with text for the moment, but you can use them to clarify the
  structure of your sequence and to mark turning points (intro, chorus, ending,
  etc...):

  * (i)ns: inserts a joker at the current beat. You can also use ^INS.
  * (d)el: deletes any joker at the current position. You can also use ^DEL.
  * (n)ext: goto next joker. You can also use ^F5.
  * (p)revious: goto previous joker. You can also use ^F6.
  * (r)ightTrans: translates one step right all jokers to the right of the
    current point. You can also use ^F7.
  * (l)eftTrans: translates one step leftt all jokers to the right of the
    current point. You can also use ^F8.
  * (c)learAll: clear all jokers.

  You can also use the aJ key to make jokers visible or invisible and ^J to go
  to a specified joker.

- (g)oto:

  * block (b)egin: go to the begining of the marked block.
  * block (e)nd: go to the end of the marked block.
  * punch (i)n: go to the punch in point.
  * punch (o)ut: go to the punch out point.
  * (j)oker: go to specified joker.
  * (l)oop: go to the looping beat of the current track if there's one.

- v(f)il: allows you to set an event-type based filter in the global view.
  You can choose what type of event will be highlighted by a character different
  from '-'. For example, if you choose 'note', the global view will highlight
  beats or measures containing notes by putting a 'n' on them. Any other
  beat or measure that does not contain any notes (but maybe other events such
  as controllers or tempi) will just have a '-' as usual.

  * (n)ote: tags beats or measures containing notes with a 'n'.
  * poly(A)ote: tags beats or measures containing polyphonic aftertouch with
    a 'A'.
  * (c)trl: tags beats or measures containing controllers with a 'c'.
  * (p)rog: tags beats or measures containing program changes with a 'p'.
  * (a)ft: tags beats or measures containing channel aftertouch with a 'a'.
  * (b)end: tags beats or measures containing benders with a 'b'.
  * (t)empo: tags beats or measures containing tempo events with a 't'.
  * no(f)ilter: tags beats or measures containing any event with a ''.

- *: the current cursor position becomes the center of the screen.


Ŀ
21 - VARIABLE view:


Type 'V' to go to this view or F9.

This view gathers information about each track. You can edit this information
depending on the sequencer running mode or the emptiness of the track.

You can move in this view using the four arrows, ^UP and ^DOWN, PGUP, PGDOWN,
HOME and END (test their meaning by yourself), but also by using the secondary
menu that brings you directly to the column you choose. Use ENTER to edit any
field. For numeric variables, you can just type in a new figure. You can also
use F5, F6, F7 and F8 to increase or decrease the hilighted value of one or
several units.

Secondary submenus are, from left to right:

- (n)ame: name of the track (75 characters max, 17 displayed).
  Note that if you press F9 or 'V' a second time, you will enter a special
  subview where you can see track names in their full width. Type F9 again
  to go back to normal VARIABLE view.

- (c)h: MIDI channel of the track. If none, each MIDI event contained in the
  track uses its own channel value when sent to MIDI out. You cannot change
  this value while the sequencer is running...

- (p)rg: original program change. Not available if there is no MIDI channel
  specified above. When playing the sequence from beat 0, the original program
  change is sent at the beginning. Changing this value while the sequencer is
  playing sends the corresponding program change to MIDI out in real-time. If
  recording, this program change is also recorded in the record track.

- v(o)l: original volume controller. Not available if there is no MIDI channel
  specified above. When playing the sequence from beat 0, the original volume
  controller is sent at the beginning. Volume controller is number 7 in the
  MIDI standard. Changing this value while the sequencer is playing sends the
  corresponding volume change to MIDI out in real-time. If recording, this
  volume change is recorded in the record track.

- (b)al: original balance controller. Not available if there is no MIDI channel
  specified above. When playing the sequence from beat 0, the original balance
  controller is sent at the beginning. Balance controller is number 10 in the
  MIDI standard. Changing this value while the sequencer is playing sends the
  corresponding balance change to MIDI out in real-time. If recording, this
  balance change is recorded in the record track.

- (k)+: on-the-fly transpose value. Any note of the current track is transposed
  using this positive or negative number of semi-tones. This does not affect
  the note stored in the memory. You can change this value while the sequencer
  is running ! This transposition affects any note coming from MIDI in, even if
  the sequencer is running. If you want a hard transposition that affects notes
  in the memory, use the "GLOBAL block manip transpose" feature.

- (v)+: on-the-fly velocity change value. This positive or negative amount of
  velocity is added to the velocity of any note of the current track. This does
  not affect the note stored in the memory. You can change this value while
  the sequencer is running ! This transposition affects any note coming from
  MIDI in, even if the sequencer is running. If you want to change multiple
  notes velocities in the memory, use the "GLOBAL block manip chgvelocity"
  feature.

- (d)ly: on-the-fly time translation. The whole track is translated in
  real-time using this negative or positive amount of ticks (=1/192 beat). It
  does not affect the track as it is stored in the memory or even displayed
  on the NOTE view. A positive value is making the track late in comparison
  with a normal one.
  This feature is useful when you want one track to have the priority (for
  example the drum kit track): if several notes occure at the same time, you
  can be sure that the note of a minus-one-translated track will occure before
  the others... You can also use this feature to create a MIDI echo effect if
  you copy one track in an empty one and translate one from the other.

- (g)oto:
- (x)loop:
  Both variables are used to set a looping feature: at the end of a track, you
  can automatically loop to a previous beat. This beat is set with the (g)oto
  submenu or directly in the GLOBAL view with the ^L key (see "Special keys").
  You can repeat this feature a given number of times. This number is set with
  the (x)loop variable (column called "x"). This number is in the range 0..99.
  100 sets an infinite ("hi") number of loop. This feature works in any case,
  even when you start the playback after the end of a looped track. A looped
  track end is shown by a 'L' in the GLOBAL view. When you toggle the looping
  mode in the GLOBAL view, you don't loose the loop number value, which is just
  temporarly set to zero.

- (f)ilter: this feature allows you to filter events by type for each track.
  It does not affect the track as it is stored in the memory. It is only a
  real-time feature used during playback. You can filter out:

  * (n)ote: any notes.
  * poly(A)ft: polyphonic aftertouch events.
  * (c)trlchg: any control changes.
  * (p)rgchg: program changes.
  * mono(a)ft: channel aftertouch events.
  * (b)ender: bender events.
  * (t)empo: tempo changes.

- (i)nfo: this field cannot be edited. It just contains different information.
  You can switch from one piece of information to the next one using this
  submenu. Available information is:

  * size of the track in number of QSQ events, assuming that a MIDI event is
    a QSQ event, but also a beat limit and a tempo change. Each QSQ event uses
    4 bytes in the memory.

  * number of beats in the current track.

  * other information, for my private use. Try to guess...


Ŀ
22 - NOTE view:


Type 'N' or F10 to go to this view.

This view is used to edit notes in the current track. The horizontal direction
still represents time, but more precisely than in the GLOBAL view. In fact,
this view displays a number of beats equal to signature/zooming number (you
can still use ^Z to toggle between both values). The vertical direction
represents notes in semi-tones (from 0 to 127, assuming that 60 stands for
middle C).

One note is represented by a segment ''. Its length represents the duration
of the note. If the note is continued after the left or right edge of the
screen, the cutting point is shown by a ''. If the ending point of one note is
graphically mixed to the starting point of another note, the first note ends
with a 'ܿ'.

The following keys are used:

- LEFT or RIGHT: moves one step left or right.
- INS: inserts one note at the cursor position.
- DEL: deletes the current hilighted note.
- TAB: goto next note.
- BACKTAB: goto previous note.
- ^LEFT or ^RIGHT: moves one beat left or right.
- HOME: goto the left edge of screen.
- END: goto the right edge of screen.
- ^HOME: goto the beginning of the track.
- ^END: goto the end of the track.

- UP or DOWN: moves one semi-tone up or down.
- ^UP or ^DOWN: moves one octave up or down.

- PGUP or PGDOWN: moves one track up or down (according to the track order used
  in the GLOBAL view).
- ^PGUP or ^PGDOWN: moves five tracks up or down.

- *: adjust the cursor and the page vertically in order to be in a zone
  containing notes. When the sequencer is running, the page is automatically
  centered according to positions of notes in the whole page. If you want to
  disable this behaviour, just use UP, DOWN, ^UP or ^DOWN to center the
  page wherever you want in the scale. Then type '*' again to restore the
  original automatic behaviour.

- aF1: sets block begin here.
- aF2: sets block end here.

Notice that in NOTE screen, marked block limits are given in beats/ticks. These
limits are used as default starting and ending points in functions such as
(p)rog or e(x)tract. In the GLOBAL view, marked blocks contain only full beats
(it means you cannot copy half of a beat...).

In this screen, you can also move the cursor vertically using an external
MIDI keyboard. The cursor just follows notes you hit on the keyboard !!!

For this screen, there is a secondary status line. Some submenus are used to
shift from a current edit field to another one. The F5, F6, F7 and F8 keys can
be used to change the current edit field. You can also just type in a new value.
From left to right, fields of the secondary status line are:

- the track number and the track name.

- UNIT/INC: UNIT gives the type of unit used for the following timing fields:

  * tick: each of the following timing values is given in beats and ticks
    (remember that one beat equals 192 ticks). INC represents the number of
    ticks contained in one horizontal cursor jump (using left or right arrows).

  * div: each of the following timing values is given in beats and fractions of
    beats. INC represents a given number that divides one beat in equal
    segments, and is also used as the basic horizontal cursor jump. The INC
    value can be followed by a 'b' for binary or a 't' for ternary.

  Examples:

  * UNIT=tick, INC=048. It means that a cursor jump contained 48 ticks, i.e.
    the quarter of a beat. The START field and the LENGTH field are given in
    beats and ticks.

  * UNIT=div, INC=04b. It means that a cursor jump contained 1/4 of one beat,
    i.e. 48 ticks as in the previous example. The START field and the LENGTH
    field are given in beats and 1/4th of beats. It can be easier to read that
    in the previous example, even if the result is the same.

  * UNIT=div, INC=04t. It means that a cursor jump contained (1/4)*2/3 of one
    beat, i.e. 1/6. It is useful if you want to play with triplets...

  Use the (u)nit submenu to toggle between 'div' and 'tick' and the (i)nc
  submenu to change the INC value.

- ECHO: if it is on, when the cursor is touching a note, this note is issued
  to MIDI out, with the correct length and velocity (using 'key+' and 'vel+'
  offset values of the VARIABLE screen if they are non-zero). Toggle echo
  on or off with the (e)cho submenu.

- MODE: When the cursor is on an existing note, this note is hilighted and
  the MODE field contains 'cur': it means that START, LENGTH, KEY, VEL, OVL
  and CH fields contains values describing the current hilighted note. Any
  change of these fields affects the hilighted note. You cannot insert a note
  on an existing one with the INS key, but you can delete a highlighted note
  with the DEL key...

  If the cursor is on no existing note, the MODE field contains 'ins': it
  means that you can insert a note using default values that stand in START,
  LENGTH, KEY, VEL, OVL and CH fields. These default values can also be
  changed and are not affected by the cur/ins MODE switching. In this MODE,
  you can insert one note with the INS key.

  In the 'cur' MODE, you can use the (m)emo submenu to use the values of the
  current note as the default values for the 'ins' mode.

- START: starting point of the current edited note or of the note to be
  inserted. Use the (s)tart submenu to make this field the edited field.

- LENGTH: length of the current edited note or of the note to be inserted.
  Use the (l)gth submenu to make this field the edited field.

- KEY: pitch of the current edited note or of the note to be inserted,
  in semi-tones. Use the (k)ey submenu to make this field the edited field.

- VEL: velocity of the current edited note or of the note to be inserted.
  Use the (v)el submenu to make this field the edited field.

- OVL: off-velocity of the current edited note or of the note to be inserted.
  Use the (o)vel submenu to make this field the edited field.

- CH: MIDI channel of the current edited note or of the note to be inserted.
  remember that the channel value of the VARIABLE view, if it exists, takes
  priority... Use the (c)h submenu to make this field the edited field.

Other available submenus are:

- sc(a)le: toggles between three representations of the vertical note scale
(MIDI numbers from 0 to 127, notes in anglo-saxo notation A, A#, B, C,...
or A, B-, B, C,...).

- (d)isp: toggles between three types of display: show whole notes, notes-on
  only or notes-off only. Sometimes useful. Notes-on are shown with a '(',
  notes-off with a ')'. If two or more notes-on or notes-off overlap, a 'x' is
  shown.

- (t)ag: enables or disables a gadget that makes the cursor reflect the name
  of the note in anglo-saxon notation. If the letter is in upper case, the note
  is as shown. If the letter is in lower case, the note is raised (if the scale
  display uses raised notes or a number-type display) or lowered (if the scale
  display uses lowered notes).

- (p)rog: tool to automatically create a simple note progression. You give
  starting and ending points in beats/ticks, the number of steps, the MIDI
  channel, first and last note, first and last velocity, a curve rate and
  a random range. If the curve rate is positive, the curve is upside the
  simple linear progression.
  Can be useful with tuned percussion, such as wind chimes... Note that starting
  and ending points values are set by default to block begin and end (it is the
  same for each other tool in the NOTE or EVENT view).

- e(x)tract: tool to erase a precise range of notes. You give starting
  and ending point in beats/ticks, note range (upper and lower value) and
  the channel concerned. Useful if you want to erase very precisely.


Ŀ
23 - EVENT view:


Type 'E' to go to this view.

This view is used to edit events such as MIDI controlers, benders, program
changes, monophonic aftertouch and tempo changes. You can edit only one
event type at a time. The current event type is shown in the EVENT field of
the secondary status line.

To focus on a certain type:
Type 'C' or F11 to select the CONTROLERS view.
Type 'B' or F12 to select the BENDER view.
Type 'P' to select the PROGRAM CHANGE view.
Type 'A' to select the AFTERTOUCH view.
Type 'T' to select the TEMPO view.

The horizontal scale is the same as in the NOTE view. The vertical scale
represents events values. The boundaries are:

- for controlers 0 to 127: 0..127
- for benders: -8192..8191
- for program changes: 0..127
- for monophonic aftertouch: 0..127
- for tempo changes: 6..239 bpm

An event is represented by a black square and events are linked to each other
by gray lines. If several events coexist on the same vertical row, a 'x' appears
at the bottom of the row.

The following keys are used and are sometimes the same as in the NOTE view:

- LEFT or RIGHT: moves one step left or right.
- INS: inserts one event at the cursor position.
- DEL: deletes the current hilighted event.
- TAB: goto next event.
- BACKTAB: goto previous event.
- ^LEFT or ^RIGHT: moves one beat left or right.
- HOME: goto the left edge of screen.
- END: goto the right edge of screen.
- ^HOME: goto the beginning of the track.
- ^END: goto the end of the track.

- UP or DOWN: moves one step up or down.
- ^UP or ^DOWN: moves one big step up or down.

- PGUP or PGDOWN: moves one track up or down (according to the track order used
  in the GLOBAL view).
- ^PGUP or ^PGDOWN: moves five tracks up or down.

- aF1: sets block begin here.
- aF2: sets block end here.

Notice that in the EVENT screen, marked block limits are given in beats/ticks.
These limits are used as default starting and ending points in functions such as
interpo(l), (p)rog or e(x)tract. In the GLOBAL view, marked block contains only
full beats (it means you cannot copy half of a beat...).

For this screen, there is a secondary status line that shows from left to right:

- the track number and the track name.

- UNIT/INC: same as in the NOTE view.

- EVENT: current event type:
  * c-000 to c-127: MIDI controler 0 to 127.
  * aftch: monophonic aftertouch.
  * prog: program changes.
  * bend: benders or pitch wheel.
  * tempo: tempo changes. Notice that you can include tempo changes in any
    track which can be useful but also dangerous to control. Use the GLOBAL
    view filter to watch only tempi if you are lost...
  Use the (n)event submenu to make this field the edited field.

- MODE: When the cursor is on an existing event, this event is hilighted and
  the MODE field contains 'cur': it means that START, VAL and CH fields contain
  values describing the current hilighted event. Any change of these fields
  affects the hilighted event. You cannot insert an event on an existing one,
  but you can delete a highlighted event with the DEL key...

  If the cursor is not on an existing event, the MODE field contains 'ins': it
  means that you can insert an event using default values that stand in START,
  VAL and CH fields. These default values can also be changed and are not
  affected by the cur/ins MODE switching. In this MODE, you can insert one event
  with the INS key.

  In the 'cur' MODE, you can use the (m)emo submenu to use the value of the
  current event as the default value for the 'ins' MODE.

- START: starting point of the current edited event or of the event to be
  inserted. Use the (s)tart submenu to make this field the edited field.

- VAL: value of the current edited event or of the event to be inserted.
  Use the (v)alue submenu to make this field the edited field.

- CH: MIDI channel of the current edited event or of the event to be inserted.
  Remember that the channel value of the VARIABLE view, if it exists, takes
  priority... Use the (c)han submenu to make this field the edited field.

Other available submenus are:

- interpo(l): tool to make a linear interpolation on a subset of events.
  You give starting and ending points in beats/ticks, the size of the step
  in ticks. At the end, you only get one event for each step, which is
  calculated with a linear interpolation using neighbouring values.
  It is useful to interpolate between two events separated by a
  large gap or, on the contrary, to find a clever way to delete events when
  they are too numerous. Notice that some steps may finally not contain any
  event because the process does not allow two successive equal events.
  Use this especially for benders that often generate more events than needed.
  Oh yes, a last parameter is a question about if you want to keep large empty
  gap free of any event: when a large gap of more than 2 steps is encountered,
  the interpolation is not done. It is useful for events such as benders:
  benders are often grouped together in some areas, with empty gaps between:
  using this option will allow you to disable interpolation within these gaps.

- (p)rog: tool to automatically create a simple event progression. You give
  starting and ending points in beats/ticks, the number of steps, the MIDI
  channel, first and last values, a curve rate and a random range.
  Can be useful to create smooth volume increasing for example, with a
  parabolic increasing, or a random variation of the panoramic distribution.

- e(x)tract: tool to erase a precise range of events. You give starting
  and ending point in beats/ticks, event range (upper and lower value) and
  the channel concerned. Useful if you want to erase very precisely.

If you forgot the number of major MIDI controllers, here they are. Note that
some of them may not be recognized by your synth.

#000: bank switch to get more than 128 program changes.
#000-031: continuous controllers 0 to 31 least significant byte.
#001: modulation wheel.
#002: breath control.
#004: foot controller.
#005: portamento time.
#006: data entry.
#007: volume (level).
#010: pan controle (balance).
#011: expression control.
#032-063: continuous controllers 0 to 31 most significant byte.

#064-095: on/off switches (0:off, 127:on).
#064: damper pedal (sustain).
#065: portamento on/off.
#066: sustenuto on/off.
#067: soft pedal on/off.

#091: effect 1 (reverb).
#093: effect 3 (chorus).

#096: data entry +1 (v=127).
#097: data entry -1 (v=127). 
#098-121: Undefined

#122-127: Reserved for Channel Mode messages.
#122: Local Control (v=0="Local Control Off", v=127="Local Control On").
#123: all notes off (v=0).
#124: omni mode off, including all notes off (v=0).
#125: omni mode on, including all notes off (v=0).
#126: mono mode on, including poly mode off and all notes off
      (v=M, where M is the number of channels,
       v=0, the number of channels equals the number of voices in the
       receiver).
#127: poly mode on, including mono mode off and all notes off (v=0).


Ŀ
24 - FILE view:


Type 'F' to go to this view.

The FILE view is used to deal with music files. Now when QSEQ loads a file, it
recognize automatically QSEQ files from standard MIDIFILEs (reading the header).
DOS extensions are not significant anymore. That allows you to use any extension
you want. Notice that you can either load MIDIFILEs format 0 or 1 (mono-track
or multi-track).

A QSEQ file can be a little bigger than a standard MIDIFILE (+20%), but it
contains more information and it's really quicker to load and save. Here is a
list of what is saved:

- version of QSEQ file format.
- initial tempo and signature.
- contents of the INFO view.
- contents of the SYSEX view (names of any linked raw sysex file).
- joker positions.
- for each track:
  - name of the track.
  - variables described in the VARIABLE view.
  - increment of NOTE and EVENT views.
  - any MIDI events with a 1/192th resolution.
  - any other events (tempo changes, etc...).

Note that the first saved item is the version of QSEQ file format. So be
careful: a recent version of QSEQ can load songs saved with older versions
but the inverse is often not true... (logical isn't it ?)

An example file is included in the package. It's a file I found on the Internet,
called WHATISAY.MID. It's a transcription of a tune from Ray Charles. I loaded
it originally under MIDIFILE format, added my changes to make it an obvious
example and saved it under QSEQ format and under MIDIFILE format again, to
allow you to make comparisons. Notice that INFO and SYSEX view information are
not saved under MIDIFILE format, and that, according to the MIDIFILE standard,
all tempo changes are stored in track 0. In the WHATISAY.QSQ example, you can
visualize "jokers", the result of the looping feature, tempo changes mixed with
the drum track, etc...

Available submenus are:

- (l)oad: loads a file, forgetting the previous one. Automatically detects
  the type of the file.

- (a)ppend: loads a file by adding it to any previously loaded file. It is
  done by filling available empty tracks... The values of the VARIABLE view
  are not overwritten. Neither are the initial tempo and the signature.

- (s)ave: saves a file, with the possibility to choose its type and its name.
  You can use F2 at any time to save the current file under its current type and
  name (shown on the status line).
  By default, QSEQ creates a backup copy of any file to be saved, using a ".BAK"
  extension. If you don't want this behaviour, you can configure it using the
  BACKUP token.

- (d)elete: deletes a file on the disk.

- (r)ename: renames a file on the disk. Works just as the DOS rename command.

- (c)learmem: erases the file currently edited, but do not delete it on the
  disk. A confirmation is asked.

When you enter any of the four first submenus, it prompts you for a file
name. Then you have several possibilities:

- type the name of the file. If you are performing a "save", the file is saved.
  The current musicfiles path is used as a reference path if you don't use
  an absolute path beginning with a \. The current musicfiles path is shown
  just before the prompt.
  Note that this current musicfiles path is set to the content of the MUSICDIR
  environement variable when you start QSEQ.
  If you are performing a load, the corresponding file is searched in the
  current musicfiles path or in the absolute path you specified. If it is found,
  it is just loaded. If it is not found, read the next case... (note that if
  you don't put any DOS extension, a QSQ extension is added).

- if you want to see the content of a directory and pick a name in a list of
  existing files, you can either:

  * enter nothing: it displays .MID and .QSQ files contained in the current
    musicfiles directory, and you can pick a file name or even move in the
    disk tree or on other disks. If you move to anothe directory, the
    current musicfiles directory is changed to this directory... When you pick
    up a file, if you use ENTER the pathname is included in the name of the
    file. If you use ^ENTER, you get just the name of the file.

  * enter a DOS name including wildcards '*' or '?'. It displays the content of
    the given directory if you include a path or the content of the current
    musicfiles directory, using the given filter.

See chapter 32 if you want to know how to load files from the DOS command line.

Be aware that when you load a MIDIFILE, tracks longer than 16300 events are
shortened... A MIDIFILE format 0 is considered as one single track, on which a
split channel is done.


Ŀ
25 - SYSEX view:


Type 'S' to go to this view.

Reminder: most synths or MIDI machines can dump part of their memory thru MIDI
OUT in a subset of bytes called a SYSEX dump. It is very useful to save your
programmed sounds, patterns, etc... on an external device, like the hard
drive of your PC or a floppy disk! In the other way, if you send back this
SYSEX dump to your synth, it will load it at the right place in its memory.
So if one of your song uses special programmed sounds you want to save
with your song, just ask QSEQ...

With this view, you can create a list of sysex files to send thru MIDI OUT
(QSEQ does not save SYSEX dumps within the song file, but in separate files
and just remember which sysex files to use with your song).
This list is saved with the sequence. It contains sysex file names possibly
including an absolute or relative path. When no absolute path is included, the
file is assumed to be in the current sysex directory. The current sysex
directory is set to the content of the SYSEXDIR environment variable when you
start QSEQ, and is shown in the secondary status line.

A sysex file contains one or more sysex dumps. A sysex dump is a subset
of bytes. The first byte is F0(hex) and the last is F7(hex). All other bytes
have bit 7 clear. So it is a very simple format. You can use it with other
programs.

Available submenus are:

- (s)end: send the currently selected file thru MIDI OUT. While sending you can
  abort using ESC. QSEQ sends only bytes delimited by a F0(hex) and a F7(hex).
  All other bytes are ignored. The reference directory is still the current
  sysex directory.

- (r)eceive: receive a sysex dump from MIDI IN. First you are prompted for a
  sysex file name (You can use the same facilities as in the FILE view). Then
  prepare your MIDI gear to send a sysex dump. Press a key to put QSEQ in
  waiting mode and send the sysex. It is recorded on the disk and the file
  is added to the list. If there's already a file with the same name on the
  disk, QSEQ asks you if you want to overwrite it, and the old file is backed up
  with a ".BAK" extension, if you did not disable this option using the
  configuration token BACKUP. Be careful: while receiving QSEQ uses a timeout
  of 5 seconds; after that time if it does not receive anything, it aborts.
  Be careful a sysex must finish with a F7(hex) byte! While receiving you can
  abort using ESC. Notice that while receiving QSEQ ignores active sensing
  messages. Sysex dumps that can be received by QSEQ are limited to 65000 bytes.

- send(a)ll: send all sysex files from the SYSEX view. You can do the same
  by typing ^S from any view when the sequencer is not running. While sending
  you can abort using ESC. If an error occurs, the cursor points to the bad
  file in SYSEX view.

- (i)nsfile: prompt you for a sysex file name to add to the list.

- (d)elfile: delete the selected sysex file from the list but not from the disk.

- re(n)name: change the name of the selection. Does not affect files on the
  disk.

- send(p)ause: prompts you for a number of centiseconds to wait between each
  sysex group that may be contained in a single sysex file. Useful for big
  sysex dumps that must be sent to slow synths. Am I thinking of my poor
  Roland U20 ? Maybe... Anyway, this value can also be configured using the
  SYSEXPAUSE token.

- (h)ome: sets the current sysex directory to the content of the SYSEXDIR
  environment variable.

- sh(o)rten: deletes any path included in the hilighted file name.

Note that when there is a sending error (either a sysex file is not found or
does not contain correct sysex data), the name of the bad file is highlighted
in the SYSEX view.


Ŀ
26 - INFO view:


Type 'I' to go to this view.

In this view, you can type any information about the current sequence.
The editor is a simple one. It is always in insert mode. Keys that can be
used are:

- arrows, PGUP, PGDOWN to move around.
- DEL: deletes current character.
- BACKSP: deletes previous character.
- ^BACKSP or ^Y: deletes current line:
- HOME: goto beginning of line.
- END: goto end of line.
- ^HOME: goto beginning of text.
- ENTER: inserts a carriage return and goto next line.

For example it is useful to enter:
- the title of the song.
- the composer of the song.
- the date of the composition.
- electronic instruments.
- structure of the song (chords, music, etc...).
- any comments (on the analog part of the mixdown, effects used, etc...).

The ^F1 key can be used to insert a text file in the text, e.g. a template
file. Template files are included in the package as examples. Their normal
extension are .TPL .

The ^F2 key can be used to insert the current date and time.

The size of this text is limited to 32000 characters.


Ŀ
27 - LOOK view:


Type 'L' to go to this view.

In this view, QSEQ just displays the overall content of the current track
by counting and displaying the number of events in each MIDI categorie.
Displayed values are:

- number of beats.
- number of tempo changes.
- number of NOTE ON.
- number of NOTE ON with nul velocity.
- number of NOTE OFF.
- number of program changes.
- number of benders.
- number of monophonic aftertouch.
- number of polyphonic aftertouch.
- total number of controllers 0-127.
- precise number of each controller.

The following keys can be used:

- PGUP or PGDOWN: moves one track up or down (according to the track order used
  in the GLOBAL view).
- ^PGUP or ^PGDOWN: moves five tracks up or down.


Ŀ
28 - HELP view:


Type 'H' or F1 to go to this view, when the sequencer is not running.

In this view, QSEQ just displays the content of an ascii help file. By default,
this help file is QSQ.HLP, that has to be located in the directory where you
launched QSEQ. But you would better use the QSEQHELP environment variable,
with a full path (put in in your AUTOEXEC.BAT file).

Ex:

set QSEQHELP=c:\qsq\qsq.hlp

If the default help file does not suit your needs, you can use another one.
Limitations are:
- must be an ascii file.
- lines not longer than 78 characters.
- file not bigger than 32Kb.

To save memory, this help file is loaded each time you enter HELP view.

The following keys can be used:

- UP or DOWN: moves one line up or down.
- PGUP or PGDOWN: moves one half-page up or down.


Ŀ
30 - How to record and play:


To start playing back a sequence, press SPACE. The playback starts at the
current beat. If starting at beat 0, initial controllers from the VARIABLE view
are sent to MIDI OUT. If you start anywhere else, be aware that controllers
may not be in their correct position because you didn't play the sequence from
the beginning. To solve this, use the ^F key to determine and send the
latest values of the controllers (see "Special Keys"). While playing, the
sequencer status becomes 'P' in the status line. If starting at beat 0,
and if you are using a non-zero playback countdown value, the playback will
start before the current point to wait for initial controllers to be sent and
understood. This playback countdown value is set with the aC key; it is a
number of beats.

While playing, you can start recording by pressing ^R. The record is assumed
to start at tick 0 of the current beat of the current track. Remember this,
because it is important when you are in overwriting mode. While recording, the
sequencer status becomes 'R' in the status line.

Yes, there are two recording modes: "overwriting" and "appending". You can
switch from one to the other with the aR key. The current mode is shown on the
status line ("Ov" or "Ap").

In overwriting mode, new material overwrites the existing data. This is always
done using full beats. This means that if you start recording while playing at
the middle of a beat, the material of the whole beat will be lost. Same thing
for the end of the recording: the whole last beat is lost. Note that I speak
about beats and not measures...

In appending mode, new material is just appended to the existing data, but new
notes cannot erase old ones at the same position, for safety reasons (in this
case, these new notes will be lost).

You can also start recording directly when the sequencer is not running. Just
press ^R to set the sequencer in recording mode. Press SPACE when you want the
record to begin. If you are using a non-zero record countdown value, the
playback will start before the current point to let you hear previous beats, but
the record begins only when the current point is reached. This record countdown
value is also set with the aC key; it is a number of beats. Note that both
playback and record countdowns default values can be set with the configuration
tool using the COUNTDOWN token.

There is also an interesting feature if you want to insert new material between
two beats and nowhere else. It is the punch in/out feature. Use "GLOBAL p(u)nch"
menu to switch it on and to set the starting and ending beats. Then go before
the starting beat and press ^R and space to start recording. The sequencer will
automatically switch to record mode between the punch-in beat (included) and the
punch-out beat (excluded). Anywhere else, it will stay in playback mode and
leave existing material untouched.

Remember that in any case, only one track is recorded: the one that was
selected when you hit ^R. After you start recording, you can move the cursor
vertically from one track to another: it won't change the recorded track. This
allows you to mute tracks while recording or use any other display features
while recording.

Notice that in any running mode, when a message enters QSEQ thru MIDI IN, the
memory field (upper right corner) blinks. This is a good test to verify that
your MIDI cables are set correctly. You can disable this feature using the
MIDIFLASH configuration token.

QSEQ can send realtime MIDI messages: when you start playing, a START message or
CONTINUE message is sent to MIDI OUT, depending on whether you are playing
from beat 0 or from somewhere else. When you stop playing, a STOP message is
issued to MIDI OUT. These messages can be used by others sequencers or
rhythm machines. If you want QSEQ to use these messages, you should configure
it with the SYNCHRO token or use the aE key.

In the opposite way, QSEQ can also react to external realtime MIDI messages:
when you want to start playing in synchronization with and external MIDI device
such as a rhythm machine, QSEQ can wait for a START or CONTINUE message before
starting to play or record (when you press SPACE, QSEQ does not play directly
but waits for one of these messages). QSEQ can even react to external STOP
messages and stop playing or recording. If you want QSEQ to react to these
external messages, you should configure it with the SYNCHRO token or use the aE
key.


Ŀ
31 - Special keys:


Some features are not accessible thru a menu but thru short-keys:


Normal keys:


SPACE: play/stop. When playing from the first beat, initial controllers from
       the VARIABLE view are sent first and a little pause is made, allowing
       slow MIDI gear to be ready when the sequence begins.

F1   : help.
F2   : saves current file, with optional automatic backup to ".BAK".
F3   : toggles between metronome off / PC SPEAKER metronome / MIDI metronome
       (see also key "aM").
F4   : switches to next unit mode for the counter in the status line.
       (see also key "aU").

F6/F5: increases or decreases any value by one unit.
F8/F7: increases or decreases any value by one "big step".

ESC  : go back to GLOBAL view.
F9   : switch to VARIABLE view.
F10  : switch to NOTE view.
F11  : switch to CTRL view.
F12  : switch to BENDER view.


Alt keys:


aF1  : sets block begin here.
aF2  : sets block end here.
aF3  : cuts block.
aF4  : copies block.
aF5  : pastes block.
aF6  : pastes block over.

aX: to quit, type aX again or 'Y' to confirm.

aT: If the sequencer is stopped, it is used to change the initial tempo
    value. If the sequencer is running, use it to enter tempo change mode.
    If you are recording, tempo changes are also recorded. Use ESC key to
    exit this mode. Valid tempo values are 6..239bpm .

aR: toggles between both recording modes. The current recording mode is
    shown by the second flag of the status line: (O)verwrite / (A)ppend.

aP: toggles punch mode on/off.

aC: to choose countdowns values:
    - record countdown: number of beats to play back before any record. Then you
    can listen for these beats and get the rythm before playing like a maestro.
    - playback countdown: number of beats to play silently when playing back
    from beat 0 to wait for initial controllers to be sent and understood.

aS: to choose the signature. Sets the number of beats per measure, and so
    the metronome variation. Also useful to set the number of beats per
    view in the NOTE view or EVENT views.

aM: Toggles between:
    - metronome off
    - PC SPEAKER metronome
    - MIDI metronome
    ...even while playing or recording. The current mode is shown by a flag
    in the status line which is respectively (.), (m) or (M). You can choose
    the metronome's values using the configuration tool.

aU: to choose the unit of the counter in the status line. You can select one
    of the following menus:
    - (b)eats: beats/ticks.
      The label of the display is "beat-xx", where xx is either the signature
      or the zooming number.
    - (m)eas: measures/subbeats/ticks.
      The label of the display is "m-xx" where xx is the signature.
    - (z)oomnum: zooming number based groups of beats/subbeats/ticks.
      The label of the display is "z-xx" where xx is the zooming number.
    - (t)ime: approximate time in hours/minutes/seconds/ hundredth of seconds.
      This value is interpolated using the initial tempo value, so it
      can be a bit false if you use tempo changes, but it gives a good
      idea of the approximate timing.
    - (c)hrono:
      exact time in hours/minutes/seconds/ hundredth of seconds. This value
      is exact but is reset to zero at any time you start playing or recording.
      If you start from the first beat, it gives you the exact timing of your
      sequence. If you start anywhere in the sequence, it gives you the
      relative exact timing from the beginning of the playing. To use as a
      chronometer.

    For the three first modes, you can also have a total value for the
    whole sequence.

a0: toggles midithru feature, i.e. sequencer local control on/off. The current
    midithru status is shown on the status line ('T' for on, 't' for off).

aF: sets or cancels flashing of the "mem" field on the status line when a MIDI
    byte comes in while the sequencer is running. It does not concern sysex
    bytes or active-sensing bytes (FEh).

aE: toggles synchronization mode between:
    - off
    - send START/CONTINUE messages
    - send START/CONTINUE/STOP messages
    - wait for START/CONTINUE messages
    - wait for START/CONTINUE/STOP messages

aZ: to choose the number of beats per unit in GLOBAL view. This is also the
    number of beats per screen in the NOTE and EVENT view.

aJ: makes jokers visible or invisible in the GLOBAL view.

aL: makes looping points visible or invisible in the GLOBAL view.


Ctrl keys:


^INS : insert a joker.
^DEL : delete a joker.
^F5  : goto previous joker.
^F6  : goto next joker.
^F7  : translates one step right all jokers at the right of the current point.
^F8  : translates one step leftt all jokers at the right of the current point.

^R: enters recording mode and wait. Press SPACE to begin recording or ESC
    to abort before it's too late...

^E: step-record mode: when you are in this mode, any key entered thru MIDI
    IN is used to insert one note in the current track (if you are in NOTE
    view) and to make a step forward. The size of the step is given by the
    INC value in the NOTE view. The length of the note is determined by
    the default "note length value" in the NOTE view.

^P: midi panic: sends all notes off messages, off damper switches, zero
    modulation controller and zero bender on every MIDI channel.

^O: sends alternatively a local control on or off message to your synth, to
    enable or disable their internal loop via MIDI. The MIDI channel on which
    this message is sent is given with the LOCALCTRL configuration token.

^Q: sends initial controllers from the VARIABLE view thru MIDI OUT.

^F: searches for the last value of each controllers/benders/program changes/
    tempo changes before the current beat and send them thru MIDI OUT. It is
    useful when you don't play back the whole track from the beginning but from
    a random location. This function is very acurate and it even takes care
    of loops.

^S: sends all sysex from the SYSEX view to MIDI OUT.

^C: ties notes between the current beat and the previous one, for notes that end
    at tick 191 and start back at tick 0. Useful when you use block
    cut/paste/insert/etc.. that often cuts notes.

^L: shortcut to set the looping beat of the current track to the current
    beat (also available as a parameter in the VARIABLE view).

^Z: toggles between signature or zooming number based global view.

^U: unsolo, unarchive and unmute all tracks.

^B: goto beat.

^T: goto track.

^J: goto joker.

^K: frees the buffer.

^V: refreshes any view, if you have any doubt about what QSEQ displays.

^X: reinitialize SB card if a critical problem occures (very rare, like
    SB buffer overflow, or QSEQ buffer overflow, etc...)


Ŀ
32 - Command-line options:


When you run QSEQ from the MS-DOS shell, you can use the following options:

qsq [-h] [-x] [-i] [-y] [-s] [-q] [file1 [file2...]]

-h  : display this little help.
-x  : don't use the SB card, just simulate: useful if you don't have a SB
      card but still want to test the QSEQ interface. In this case, the PC
      SPEAKER metronome is automatically switched on, so that you can at least
      hear the beat.
-i  : print before entering QSEQ or when leaving QSEQ informations on memory
      and environment.

-y  : automatically send all sysex when entering QSEQ.
-s  : automatically start song when entering QSEQ.
-q  : automatically quit QSEQ after song's end or manual STOP.

These 3 last options can be used to simulate a jukebox from a DOS batch file.
They can also be set using the configuration tool (AUTO token).

File "file1" is loaded normally and any additional files ("file2", etc...) are
just appended to the first one.


Ŀ
33 - Configuration tool and file:


The program QSQCONF.EXE can be used to configure QSEQ. In fact QSQCONF.EXE
reads a configuration file and modifies the actual QSQ.EXE file. Before any
modification it saves the initial QSQ.EXE file under QSQ&.EXE for recovery
(unless you used the -n option on the command line to disable this backup).
You can have several configuration files. Their normal extension are .CFG .
QSQCONF.EXE must reside and be launched in the same directory where QSQ.EXE is.

For example, to change colour settings to black and white, type:

  QSQCONF BW_SCR.CFG

Using several configuration files, you can change the configuration in several
individual steps.

Be careful: QSQCONF is secure but I recommend that you keep the original
version of QSEQ on a floppy in a safe place.

A configuration file contains one configuration command per line. Blank lines or
those beginning with a white space or a # are ignored. Other lines always begun
with a token-word followed by parameters separated by white space. This
configuration often consists in setting default values that can be modified
while QSEQ is running. Here is the token list (default values are marked by
an *):


GLOBAL settings:
----------------
BLASTERINT iii
  sets soundblaster interrupt to iii (2/5/7(*)/10).
BLASTERADD aaa
  sets soundblaster address to aaa in hexadecimal (210/220(*)/230/240/250/260).
  Authorized addresses depend on the type of your SB card.

MIDITHRU n
  n=1: force midi thru on. (*)
  n=0: force midi thru off.

LOCALCTRL ii cc
  ii=0: send no local control at the beginning of the session.
  ii=1: send local control off at the beginning of the session (*).
  ii=2: send local control on at the beginning of the session.
  cc: midi channel where to send the message (1-16,*=15)

SYNCHRO n
  n=0: no synchronization (*).
  n=1: always send START/CONTINUE realtime messages.
  n=2: always send START/CONTINUE/STOP realtime messages.
  n=3: reacts to external START/CONTINUE messages.
  n=4: reacts to external START/CONTINUE/STOP messages.

PANIC beg end
  sends or does not send panic messages at the beginning or at the end of
  a playing/recording session.
  beg=1: sends at the beginning (*).
  beg=0: does not send at the beginning.
  end=1: sends at the end (*).
  end=0: does not send at the end.

MIDIFLASH n
  n=1: make memory field blink each time a MIDI byte comes in (*).
  n=0: do not make memory field blink each time a MIDI byte comes in.

BACKUP n
  n=1: automatic backup of music and sysex files on (*).
  n=0: automatic backup of music and sysex files off.

SYSEXPAUSE sss
  wait sss 1/100sec between each sysex block when sending sysex files (*=10000).

TEMPO ttt
  set default tempo to ttt bpm (*=100).

METRONOME status type
  set default metronome status and type.
  status=1: metronome on.
  status=0: metronome off (*).
  type=1: midi beep.
  type=0: PC speaker beep (*).

METROBEEP freq1 freq2
  freq1: frequency of the beep on the first beat in Hertz (*=9000).
  freq2: frequency of the beep on other beats in Hertz (*=1000).

METROMIDI cc1 nn1 vv1 cc2 nn2 vv2
  note on the first beat:
    cc1: channel (*=16).
    nn1: note (*=37).
    vv1: velocity (*=127).
  note on other beats:
    cc2: channel (*=16).
    nn2: note (*=37).
    vv2: velocity (*=80).

COUNTDOWN rr pp
  default countdowns values in beats:
    rr: record countdown (*=4).
    pp: playback in beat 0 countdown (*=4).

FILENAME name tt
  default filename and type when entering QSEQ:
    name: filename (8+3 char max)
    tt: type of format (0:qseq, 1:midifile-type0, 2: midifile-type1)

AUTO sysex start quit
  automatic behaviour:
    sysex=1: automatically send all sysex when entering QSEQ.
    sysex=0: do not automatically send all sysex when entering QSEQ. (*)
    start=1: automatically start song when entering QSEQ.
    start=0: do not automatically start song when entering QSEQ. (*)
    quit=1: automatically quit QSEQ after song's end or manual STOP.
    quit=0: do not automatically quit QSEQ after song's end or manual STOP. (*)


COLOUR settings:
----------------

Every colour token is used like this:
COLOUR_TOKEN forg backg blink
...where forg is the foreground attribute, backg the background attribute
and blink the blink status. The following values are allowed:

 forg: 0: black      8: darkgrey    backg: 0: black   blink: 0: off
       1: blue       9: lightblue          1: blue           1: on
       2: green     10: lightgreen         2: green
       3: cyan      11: lightcyan          3: cyan
       4: red       12: lightred           4: red
       5: magenta   13: lightmagenta       5: magenta
       6: orange    14: lightyellow        6: yellow
       7: lightgrey 15: white              7: white

The following colour tokens are available:

# GENERAL COLOUR:
A_GEN

# STATUS LINE:
# file field:
A_FILE
# time field:
A_TIME
#tempo field:
A_TEMPO
# sequencer mode field: recording:
A_SSRECORD
# sequencer mode field: playing:
A_SSPLAY
# sequencer mode field: editing:
A_SSEDIT
# punch-in mode/metronome flag/midithru flag fields:
A_STATUS
# memory field (normal/hilight when receiving midi):
A_MEM
A_MEMHI

# hilighted current parameter
A_PARAMHI

# CURSOR in NOTE view:
# when the cursor is not on a note:
A_CURSOFF
# when the cursor is on a note:
A_CURSON
# note's colour when under the cursor:
A_NOTEHI

# Difference of colour to mark octaves, or different steps in the background
# of NOTE/EVENT/GLOBAL view.
A_STEP

# Colour of the cursor when prompting for a string/number/character.
A_ASK

# Colour of the first letter of a menu item: unselected:
A_MENUHI
# Colour of the first letter of a menu item: selected:
A_MENUHISEL

# GLOBAL view
# colour of first loop point, end of the track, archived or muted flags:
A_GSPEC
# colour of next loop points:
A_GLOOP
# colour of the selected area and begin/end points:
A_GSEL
# colour of the recordable area when recording:
A_GREC
# colour of punch in/out points:
A_GPUNCH
# colour of jokers:
A_JOKER

# MESSAGES:
# colour of an information message:
A_MSINFO
# colour of an error message:
A_MSERR
# colour of an "I'm working" message:
A_MSWORK


Ŀ
40 - Releases, sub-versions, and atomic changes...


Here are the different historical versions of QSEQ. Between each release, a list
of remarks shows what were the modifications for each new version. Each remark
is preceded by a keyword: NEW=addition, IMP=improvement, COR=correction. Some
remarks are obviously reserved for my personal understanding. Some bugs or
illogical behaviours was discovered by QSEQ's users. I also included some of
QSEQ's users suggestions. Thanks to all of them.

For each release, you can read the date of the release and the size of the
QSQ.EXE demo file in bytes.

  ------------------

  - I spent 6 monthes writing the initial program in my spare time.

-> frozen version 1.0 (01/01/1994, 175254 bytes)

  This was the very first release, to test the market...
  It was a success in my opinion, because a lot of people tested this
  demo version seriously and reported problems.

  ------------------

  - COR: accepts NOTEON with nul velocity as NOTEOFF when coming from MIDI IN.
    Some synths like YAMAHAs use this convention if they don't use
    off-velocity.
  - NEW: changes in the look, menus and short-keys.
  - NEW: tool to smooth continuous MIDI events variations and to filter out
    useless events by linear interpolation.
  - NEW: tool to create MIDI events by linear or curved progression.

-> frozen version 1.0b (02/03/1994)

  ------------------

  - NEW: implementation of jokers, to hilight the sequence's construction.
  - NEW: portable change in the QSEQ file format to support jokers.
  - NEW: humanize tool.
  - NEW: split-note tool.
  - NEW: split-channel tool.
  - IMP: basic improvements in the MIDI kernel.
  - COR: MIDI IN bug after a SYSEX receive.

-> frozen version 1.0c (02/15/1994, 179318 bytes)

  ------------------

  - COR: bug in the display of GLOBAL view (end of track).
  - COR: track name error in the split-note tool.
  - COR: starting-playing-beat error in the GLOBAL view.
  - COR: illogical thing in the mark track command.
  - COR: make_note_on/make_note_off error (see what it is ?...).
  - IMP: separation of mute between IN and OUT (understand ?...): it means that
    while playing, if you mute a track, notes you are playing live are not
    cut...
  - COR: older notes-on at the beginning of a record.
  - NEW: send initial controlers even for empty tracks.
  - IMP: extension and speed gain in the split-note tool.
  - IMP: speed gain in the split-channel tool.
  - IMP: extension of the change-velocity tool.
  - COR: bug when accepting multiple NOTEON messages with nul velocity as
    NOTEOFF messages (especially on YAMAHA synths).

-> frozen version 1.0d (03/01/1994, 181878 bytes)

  ------------------

  - COR: problem when loading some MIDIFILEs (some MIDIFILE contains
    an ending message with a very weird time stamp...).
  - IMP: improvement of the SB card detection at the beginning of the program.

-> frozen version 1.0e (04/01/1994, 182006 bytes)

  ------------------

  - NEW: implementation of active-sensing recognition: any FEh byte is simply
    ignored. Active-sensing is used on some synths (but alas, for some QSEQ
    users, not mine) to check out MIDI connexions.

-> frozen version 1.0f (04/18/1994, 182038 bytes)

  ------------------

  - COR: (last?) bug in the humanize tool.
  - NEW: you can press 'y' or space bar to keep a recorded track.
  - NEW: use of realtime MIDI messages START/CONTINUE/STOP.
  - NEW: new command-line options.
  - COR: little bug when changing initial tempo after tempo changes.
  - NEW: one increment per track in NOTE and EVENT views, saved in QSEQ files.
  - NEW: easy and automatic manipulation of QSEQ file versions.
  - COR: subtle random lack of screen refresh.
  - NEW: new tool to change MIDI event values.
  - NEW: introduction of the QSEQCMD variable, more command-line options and
    no more OPTION view.
  - NEW: introduction of a "jokers" submenu in the GLOBAL view.

-> frozen version 1.1 (05/18/1994, 184502 bytes)

  I decided to go from 1.0x to 1.1, because it seems that QSEQ is now stable.
  I can now go on thinking about very new improvements... People who already
  have a licence for version 1.0x can get a free upgrade.

  ------------------

  - IMP: improvements in progression tools: addition of a random range.
  - IMP: improvements in the way simple MIDI messages are sent.
  - NEW: local control on/off implementation (command-line and short-key).
  - NEW: modification of the licence number encrypted in QSQ.EXE (one is
    encrypted and the other clear for easily readable information purpose).
    Modification of the licencing software.

-> frozen version 1.1b (06/02/1994, 185222 bytes)

  ------------------

  - IMP: improvements in the NOTE view, concerning page centering when the sequencer
    is running.
  - COR: little MIDI problem when changing track while playing when the
    sequencer is stopped.
  - IMP: reduction in the size of the QSQ.EXE file (minus 15Kb): no more using
    floating point operations in kernel module for frequency operations.
  - IMP: bigger MIDI IN buffer (from 400 to 500 bytes) to fight rapid synths,
    especially while big quick sysex dumps on slow disk drives!
  - IMP: improvements in EVENT/progression and NOTE/progression implementation.
  - COR: bug for looping point change when inserting/deleting a
    buffer.
  - COR: problem with centering (* key) in NOTE view.
  - COR: display of the previous measure on fast computers when starting
    playing in NOTE view.
  - COR: display lack: in NOTE view, when there are only notes that don't start
    and end in the view, the centring is not done...
  - NEW: insertion of zoom size in QSEQ files. Files version 8.
  - COR: rare refresh view problem in NOTE and EVENT view, due to a
    interruption-made update of beat and sbeat. (seems to be corrected)
  - IMP: improvement in the internal filter management.
  - IMP: change of the default filter value.
  - NEW: addition of the rename feature in FILE view.
  - NEW: customization of the title when promting for a file name.
  - IMP: global reduction of the size of the program.
  - IMP: more precision in the "keep PC internal horloge safe" algorithm.
  - NEW: the STATISTIC view by ^S becomes a full-featured LOOK view.
  - ^A for sending all sysex becomes ^S. More logical.
  - NEW: show the blinking text cursor while waiting for a number, string or
    char.
  - NEW: configuration tool and file for custom colours (and then suppression
    of the numerous online options... so please update your configuration.).
  - COR: problem for joker/previous when after any joker.
  - COR: problem while loading file on start (have to forget the first argv).

-> frozen version 1.1c (02/10/1995, 172006 bytes)

  ------------------

  - NEW: automatically proposing *.tpl when loading a file from INFO view.
  - COR: misbehaviour: unsolo when loading another song.
  - COR: problem when selecting a wrong key under FILE view.
  - COR: misbehaviour concerning the size of the step in step recording mode.
  - IMP: possibility of step recording even with MIDI THRU off.
  - COR: corrections of the QSQ.TXT file by J.R. Bowden, cos some expressions
    were obviously typically too frenchy... Thanks to him.
  - IMP: more logical behaviour with keys (^UP/^DOWN/PGUP/PGDOWN).
  - IMP: zero the marked block after loading a new file.

-> frozen version 1.1d (02/16/1995, 167494 bytes)

  ------------------

  - NEW: ask for confirmation in FILE/(c)learmem.
  - IMP: do not care about upper/lowercase when asking for a char.
  - IMP: test precisely the validity of the input char in goto joker.
  - NEW: when sysex sending error, hilight the name of the wrong file in the
    SYSEX view.
  - NEW: ^Y to delete a line in info view.
  - IMP: change in the tag feature: depends on the scale display.
  - COR: more corrections of the QSQ.TXT file by J.R. Bowden.
  - COR: when block/maniping on an empty block, no block appears at the
    beginning of one track.
  - NEW: new Block sub-menu 't' for block/trk.
  - NEW: new ^U key to unmute, unsolo and unarchive all.
  - COR: incorrect error message when deleting an empty location in GLOBAL view.
  - IMP: new way of clipping block begin and end at the end of the track, while
    always memorizing the size of the block.
  - IMP: more precision in messages deliver by sysex receive. Possibility of
    manually stopping with ESC.
  - IMP: filter active sensing bytes out of sysex messages.
  - IMP: simulate sysex dump [0xF0, 0x10, 0x11, 0xFE, 0xFE, 0x12, 0xF7] when no
    card is present. 0xFE is active sensing...
  - NEW: possibility of manually stopping sysex sending. Messages more precise.
  - IMP: different messages in send all sysex.
  - IMP: simplifications in the licencing software.
  - NEW: ^Y deletes field in any prompt.
  - NEW: new chapter 14 in QSQ.TXT.
  - NEW: new options 'o' and 'h' in SYSEX view.
  - IMP: adjust the way of dealing with files prompt.
  - IMP: zero block when clearing memory.
  - IMP: new way of clipping block begin and end at the end of the track, while
    always memorizing the size of the block (bis).
  - IMP: ^U possible on an empty track too.
  - IMP: change quantize and timeglide messages.
  - IMP: changes quantize, timeglide, humanize algos that has problems.
  - IMP: change message "N track(s) saved".
  - COR: really sends START message on beat 0 (CONTINUE is reserved for a start
    in the middle of the song).
  - COR: QSEQ frozen when loading a bad file on start.
  - NEW: new legato tool !!!
  - NEW: configuration token to send panic before and/or after a playing
    session.
  - NEW: new change length tool !!!
  - COR: pb with hilighted notes when changing track in NOTE view.
  - NEW: synchronization with external real-time messages (START/CONTINUE/STOP).
  - NEW: automatic detection of file types. Saving type option. Display type of
    the file.
  - NEW: ^X to reset SB card.
  - NEW: ^G same as GLOBAL/goto from any view.
  - NEW: use the countdown to play from beat 0 to wait for initial controllers
    to be sent and understood.
  - NEW: add disk D: in files list.
  - NEW: new compression tool.

-> frozen version 1.1e (04/20/1995, 172502 bytes)

  ------------------

  - COR: memory liberation problem while loading a midifile.
  - COR: echo when changing track in NOTE view.
  - COR: frozing problem when playing small files, coming from the new playback
    countdown feature!!!
  - COR: misbehaviour when going to previous note corrected.
  - IMP: new way of printing negative times.
  - NEW: new deltatime factor in change velocity tool.
  - COR: "random" problem of incsbeat becoming 1.
  - IMP: new: does not load notes without starting points and gives a end to
    notes without ending points.
  - COR: tempo count in LOOK view.
  - NEW: loads and saves midi files type 0 as easily as midi files type 1.
  - COR: incsbeat becoming 1 when going to a bad track.
  - COR: tempo min is now 6 (according to timer minimum value).
  - COR: correction of a problem when loading files with note-on-velocity-0.
  - NEW: default filename NONAME.QSQ .

-> frozen version 1.1f (05/02/1995, 173846 bytes)

  ------------------

  - IMP: optimizations to reduce program's size.

-> frozen version 1.2 (05/03/1995, 173510 bytes)

  I decided to go from 1.1x to 1.2, because it seems that QSEQ reached a new
  stable points after improvements I made to version 1.1 . People who already
  have a licence for version 1.0x and 1.1x can get a free upgrade.

  ------------------

  - COR: the path shown must change when asking a filename.
  - NEW: buffer overflow checking and message in thru/play/record/sysex mode
    (useful for very very slow machines).
  - NEW: display total memory available for QSEQ (option -i).
  - IMP: put refresh_cycle procedure in a separate module -> gain of size.
  - IMP: creation of a del_note_be procedure to speed up note deleting in some
    cases.
  - NEW: creation of a timexpand tool.
  - IMP: receiving sysex in a temporary buffer before saving: no more problem
    with rapid sysex dumps and slow disks...
  - COR: problem when displaying 2 notes of the same pitch starting in the same
    screen division (next note/prev note bug).
  - NEW: addition of a swing percentage in quantize.
  - COR: synchro pb when displaying (due to interrupt change of beat and sbeat
    in refresh() procedure).
  - COR: problem when recording with a 0 countdown value (rec_beat
    minus 1).
  - COR: when looking for previous note from an empty space, sometimes
    find next one in the beat...
  - NEW: separate record and playback countdown. Make them configurable.
  - NEW: now can accept quit with 'y'.
  - IMP: when saving a file with a new name, now say "Save (Q/M/m)-file...".
  - IMP: reduction of QSQ.EXE size by getting rid of tk[] variable in
    parameters.
  - NEW: HELP view.
  - IMP: INFO view is now scrollable, and no more limited to 39 lines...
  - IMP: gather realtime message send and external synchro start/stop into
    a single synchro mode.
  - IMP: when prompting for a value or string, ^LEFT and ^RIGHT go one word
    left or right.
  - COR: in the timexpand tool, pb when rate > 100% (right to left!).
  - NEW: configurable default filename and type.
  - COR: compute delay of the VARIABLE view when saving under midifile format.
  - COR: problem when typing 'Y'... Stupid mistake!
  - COR: message error in humanize tool.
  - IMP: better initialization of random number generator.
  - NEW: loop menu.
  - IMP: when decreasing a note start or a note length of an increment, go
    first to the exact value.
  - COR: correction at the end of recording when making note offs.
  - IMP: accept ^ENTER as ENTER when prompting for a string.
  - COR: for block/kut/del/wipe, bad track.
  - NEW: option to play directly when starting, quit when end, with sysex send.
  - COR: switch of SYNCHRO and PANIC token in configuration tool.
  - COR: increase filename/path length to 80 char (max path length in dos is
    71 char).
  - IMP: new way of displaying the path when loading/saving/etc...
  - IMP: new way of asking a string that can be longer than the screen (for
    asking a file name fo 80 char...).
  - IMP: timeglide and timexpand tools work also on events other than notes.
  - COR: really send tempo when ^F while playing.
  - IMP: now a note is minimum 1 tick long (no more 2).
  - COR: bad error message when saving a midifile format 0 or 1.
  - COR: bad use of dsbeat when saving a midifile format 0.
  - IMP: quicker algorhythm to add a note.
  - IMP: midiflash also when not playing.
  - NEW: NAMES view (press F9 twice) to enter long track names (75 char).
    -> new file save version 9, changes in the demo songs.
  - IMP: tokens of the BLASTER variable can now be read in any order.

-> frozen version 1.2b (06/15/1995, 185334 bytes)

  ------------------

Ŀ
41 - Conclusion:


So here it is. I hope you find QSEQ interesting enough to use for your musical
work. Remember: 1) if you don't like Windows, 2) if you do like quick and easy
to use software, 3) if you look like an elephant - I mean if you don't like mice
but shortkeys and all this kind of stuff - , 4) if you don't want to spend a lot
of money buying big sofware and the PC-PENTIUM-90MHz it needs, 5) if you don't
hate french people even if they eat frogs legs - by the way, it's good, it
tastes like a very delicate chicken - , 6) if you were very upset when you
discovered that the demo version didn't save songs,...

... one solution: register me, you won't regret it.


Ŀ
42 - "Cul Sec":


Just a short note about the name of this program: "QSEQ". You don't know me,
so maybe I should also explain my skewed sense of humor for those non-french-
people out there...

"QSEQ" (or Quick Sequencer), can be pronounced "Koo Seck" in french. It's a
(sort-of) "play-on-words" which might well "tickle the funny-bone" of anybody
who knows a few slang words from french,... because, "Koo Seck", sounds like:
"Cul Sec", which in french, means, "Bottoms Up!". So, go out and buy yourself
a nice bottle (red wine) like a "Chateau-Neuf-du-Pape"... then,...

Raise your glass, and shout: "Koo Seck" - in the company of one of your most
musical friends! Bottoms up!

P.S. Thanks to the "Keyboard Cowboy" (my american beta tester, he too lives in
     France - lucky guy, eh?) for helping me to explain this valuable bit of
     silliness for all you english speakers out there.

Ŀ
50 - That's all folks !

