           ͻ
                   Q S E Q : QUICK SEQUENCER        
                                                    
                      QSEQ USER'S MANUAL            
                                                    
            Copyright 1993-1997 by David HAUBENSACK 
                     All Rights Reserved            
                                                    
                version 1.3b, 13 june 1997          
           ͼ


Ŀ
?? - User's manual viewer


This file is QSEQ user's manual. As it is quite big, you may want to use the
viewer provided in the package: QSQHELP.EXE. It is easy to use. It just
displays the different chapters of this file: choose one using UP and DOWN
and type ENTER to go into the hilighted chapter. Then you can move around using
UP, DOWN, PGUP, PGDOWN, HOME and END. You can search text using Alt-F (repeting
it again with Alt-A). Return to chapters list using ESC. Quit using Alt-X or
ESC. That's all.


Ŀ
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
    15, rue Emile Zola
    13650 MEYRARGUES
    FRANCE
    home phone: 0442575339 (+33)442575339
    work phone: 0442254292 (+33)442254292
    work fax  : 0442252780 (+33)442252780
    email     : hbsk@rhum.cad.cea.fr (not hbsk@hostsit or hbsk@h2o anymore !!!)
                or haubensack@cea.fr

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.3 is 350.00 Francs or
$70.00 US, including shipping. 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 ! I also accept
trade with any musical stuff, new or used: just make your proposition.

If you want to register "QSEQ" send me a letter 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
(otherwise I can send you a floppy by snail mail). Correction version numbers
are followed by a lower-case letter (e.g. qseq v1.3b). To get an upgrade, don't
forget to tell me your name, address and your previous licence number.

You can run the "DEMO" version for your private use, then give away copies 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. God, let me become a millionnaire with this marvellous program. I want
so much this 16 channel mixer with 3 auxiliary buses and 4 groups... Amen.
(addition: after three years 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 a
Internet Search Engine (www.altavista.digital.com) or 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


  ?? - User's manual viewer.

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

  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/FULL 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 and macros.
  32 - Command-line options.
  33 - Configuration tool and file.

  40 - Internal FM synth.
  41 - FM instrument editor.
  42 - General MIDI instruments.
  43 - MT32 instruments.

  50 - SYSEX editor.

  60 - Releases, sub-versions, and atomic changes...
  61 - Conclusion.
  62 - "Cul Sec".

  70 - 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.
It can run on a 286 8MHz, which can be a good point if you'd rather waste
your funds in musical instruments, like I do.
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.
! Support the SoundBlaster FM Yamaha-OPL2 synth.
- 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 and 9999 beats.
- 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 a strength percentage.
- 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.
- Tool to change MIDI events of one type in another type.
! Sysex file capabilities within the sequencer.
! 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 or QSEQ format files.
- Easy manipulation of files and directories.
- Metronome click on the PC speaker or thru MIDI/FM notes.
- Visual metronome.
- Possible emission of real-time messages START/CONTINUE/STOP.
! Synchronized start and stop with external START/CONTINUE/STOP MIDI messages.
! Start and stop playing/recording by pressing a note on your synth.
- 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, default FM instruments and
  other settings.
- conversion tool beetween CMF file and ASCII file to edit FM instruments.
! full FM instrument editor to design and hear your FM sounds.
- Use of CMF file for configuration of the internal FM synth just as SYSEX files
  for external MIDI devices.
- Help screen where you can browse a customizable help file.
- 10 recordable keyboard macros.
- tool to navigate thru the documentation.
! full external programmable SYSEX editor.
- 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, Korg X5 synth). 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. It works also with the simple SB card, and the SB16.

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 50, 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.
  - QSQHELP.EXE: user's manual viewer.

  - QSQ.EXE : the QSEQ program itself.

  - QSQCONF.EXE : the QSEQ configuration program.

  - QSQ.PIF : the PIF program to execute QSEQ from MS/Windows.
  - QSQFM.PIF : the PIF program to execute QSEQ FM editor from MS/Windows.
  - *.ICO : icons you can use under MS/Windows to represent QSEQ.
  - QSQ95.PIF WIN95.BAT: the PIF program and command file to execute QSEQ
    from Windows95.

  - QSQ.CFG : the original complete QSEQ configuration file.
  - SB.CFG : configuration file restricted to Sound Blaster settings.
  - 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.
  - MACROS.CFG : empty configuration file for empty macros (generated by QSEQ).
  - MYMACROS.CFG : my configuration file for macros
    (generated by QSEQ and QSQCONF -m).
  - PANIC.CFG: configuration file for MIDI panic.

  - QSQKEY.EXE : tool to read value of QSEQ keys.
  - QSQVIEW.EXE : tool to display the contents of a QSEQ file.

  - GMSOUND.CMF : CMF file for the 128 default FM instruments (General MIDI)
    plus percussion instruments 128 to 130.
  - GMSOUND.TXT : readable conversion of GMSOUNDR.CMF .
  - MT32.CMF : CMF file for the 128 default MT32 instruments.
  - MT32.TXT : readable conversion of MT32.CMF .

  - CMF2TXT.EXE : CMF file to ASCII-readable-format file conversion tool.
  - TXT2CMF.EXE : ASCII-readable-format file to CMF file conversion tool.
  - QSQFM.EXE: interactive FM instrument editor.

  - QXED.EXE : programmable SYSEX editor.
  - MIDI.TXT : configuration file for standard MIDI messages.
  - X5*.TXT: configuration files for Korg X5.
  - P1*.txt: configuration files for Emu Proteus/1.

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

  - JAZZ.QSQ, TEEN.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 and Jaco Pastorius. I am giving these MIDIFILEs, not selling
    them, so please Ray and Jaco, if you read this (ooops excuse me, Ray!),
    don't ask me for any money... ;-)

  - TEENFM.QSQ, FMJAM.QSQ: sample music file to demonstrate the use of the
    internal SB FM synth.

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

  - QSQBOX.BAT : a DOS script to use as a jukebox, that reads and plays all
    music files located in the current directory.

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, I and T options are needed 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,
BLASTERADD and BLASTERTYPE 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 (use option -x).

The very 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 (see also chapter 32 for more options).

You should store QSQ.EXE and other EXE files somewhere in your DOS search path
if you want to be able to run it from any directory.

You can also set four 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/fm configuration
  directory.
- QSEQHELP that contains the full name to your QSEQ help file (QSQ.HLP) that
  is used when you press F1 in QSEQ.
- QSEQTXT that contains the full name to your QSEQ user's manual (QSQ.TXT)
  that is used by the QSQHELP.EXE viewer.

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
      set QSEQTXT=c:\qsq\qsq.txt

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 set 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 set 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.
- an interactive question when you are prompted for a value or a string.
- a sequencer message: report, error, or working message (note that when QSEQ
  is working, a moving indicator is shown on the bottom right corner of the
  screen untill QSEQ gives you the control back).


Ŀ
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).
- 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 or FM metronome on.
  (m): PC SPEAKER metronome on.
  (.): metronome off.
- the midithru flag:
  (T): midithru on.
  (t): midithru off.
- the macro flag:
  (.): quiet status.
  (?): waiting for macro number when recording a macro.
  (0-9): recording macro 0 to 9 (after macro flag is '?').
  (0-9): playing back macro 0 to 9.
  recording and playing flags have different colors.
- 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 contents 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. It can have 3 types of values:
  0: each event keeps the MIDI channel it had when it was recorded or inserted.
  1-16: each event in the track is forced to this MIDI channel.
  17-32: each event in the track is forced to this FM channel (see chapter 40).
  Note that the MIDI standard allows only 16 channels (1-16). In order to
  use simultaneously the internal FM synth of the SB, I added 16 fictitious MIDI
  channels that only deals with the FM. In the rest of this document, I will
  speak about these 32 channels as MIDI channels. You can also think in terms
  of MIDI ports: port 0 for SB MIDI OUT and port 1 for SB FM synth. Note that in
  the same track you cannot mix events of both ports.
- the optional initial program number which is sent when the sequence is
  played back from beat 0 (0-127). If this field is empty (-1), no initial
  program change is sent.
- 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 contents 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). Note that you
  cannot mute a soloed track nor an archived track.
- (s)olo: sets the current track in solo mode: every other track is
  muted until you select this menu again (see also ^U). Note that you cannot
  solo a muted track nor an archived track.
- (a)rch: archives the current track, or unarchives it (see also ^U).
- (l)oop: sets or cancels 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 cancels looping mode for the current track.
  * (o)nall: sets looping mode for all tracks.
  * o(f)fall: cancels 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 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 contents 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. 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 contents 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/192*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)+(C/192*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 time-dependant progression.
      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 boundaries : if it happens, a warning message will appear.

    - (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 does 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 extreme values...).

      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 warning message will appear.

    - (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 note lengths to get a legato style of playing. For
      every note: the note's start does not change ; but the end is moved
      before the 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 tick.

    - unped(a)l: changes the length of all notes contained in the marked block,
      according to the position of pedal controlers #64. The length of a note
      is increased to the next pedal off or to the next same note. After this
      operation, you can optionaly delete controlers #64, the resulting song
      will be the same.

    - 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 cut 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.

    - evtRen(u)m: change all events of one type in another type, keeping the
      same values. For example change all controllers 7 (volume) into
      controllers 10 (balance). Or changing aftertouch in breath control...

- (t)rack: in this menu, a track is considered as the contents 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.
h

Ŀ
21 - VARIABLE view/FULL view


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

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 by one or
several units. To reset the hilighted field to a default value, press '*'.

Secondary submenus are, from left to right:

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

- po(r)t: switch port from MIDI to FM or FM to MIDI, by adding or subtracting
  16 from the channel number. You cannot use this feature while the sequencer
  is running.

- (c)h: MIDI channel of the track. See chapter 20.
  You cannot change this value while the sequencer is running...

- (p)rg: original program change (0-127, -1=none). Not available if there is no
  MIDI channel specified. 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 (0-127, -1=none). Not available if there is
  no MIDI channel specified. 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 (0-127, -1=none). Not available if there is
  no MIDI channel specified. 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. Value 63
  stands for a central balance.

- (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 notes 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 notes 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
  note 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 number of ticks (=1/192 beat). It
  does not affect the track as it is stored in the memory or even displayed
  in the NOTE view. A positive value makes the track late in comparison
  to 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)bank: original bank change (0-16383,-1:none). Not available if there is no
  MIDI channel specified. When playing the sequence from beat 0, the
  original bank change is sent at the beginning. Changing this value while
  the sequencer is playing sends the corresponding bank change to MIDI out in
  real-time, followed by the initial program change. If recording, this bank
  change is also recorded in the record track. Remember that a MIDI bank change
  is made out of two successive controllers (#0 and #32) which describe bank
  number msb(0-127) and lsb(0-127) according that bank=128*msb+lsb.


Ŀ
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
(thus 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 or to the FM synth, 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 contain 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 (1-16) 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 above the
  simple linear progression.
  Can be useful with tuned percussion, such as wind chimes... Note that starting
  and ending points are set by default to block begin and end (it is the same
  for all other tools 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 event 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...).

In this screen, in play or record mode, you can also move the cursor vertically
using an external MIDI volume or balance controller.

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-031: continuous controllers 0 to 31 most significant byte:
  #000: bank switch to get more than 128 program changes (16384 banks).
  #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 least 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
automatically recognizes QSEQ files from standard MIDIFILEs (reading the
header). DOS extensions are not significant any more. This 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.
- zooming number.
- contents of the INFO view.
- contents of the SYSEX view (names of any linked raw sysex file).
- joker positions.
- 10 keyboard macros.
- 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, the signature, jokers
  and macros.

- (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 contents 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 contents 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. (To move around, use UP and DOWN. Use ENTER
    to select an alternative directory or another drive. You can also
    use the "quicksearch" field at the bottom right of the screen: when you
    type letters, they are stored in this "quicksearch" field and the first
    file corresponding to this string is automatically selected. You can use
    BACKSPACE to remove one letter from the "quicksearch" field and ^BACKSPACE
    to delete it. The first letter of this field is case-sensitive: a lower-
    case letter will select a filename ; an upper-case letter will select a
    directory name. If you press SPACE, the next corresponding file is
    selected.) If you move to another 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 '?'. This displays the contents
    of the given directory if you include a path or the contents 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.

You can use the QSQVIEW.EXE program to display the contents of a QSEQ file.


Ŀ
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! If you send back a SYSEX dump to your synth,
it will load it at the right place in its memory. So if one of your songs 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 remembers 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 contents 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 contents 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.

To configurate the 128 possible instruments for the internal FM synth, you can
use CMF files just as a sysex file. CMF files are automatically recognized and
they are not sent to MIDI OUT, but the instrument block is interpreted and
stored in memory for the use of the internal FM synth. See chapter 40 for more
information on FM instruments and CMF files.


Ŀ
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:

- UP, DOWN, PGUP, PGDOWN to move vertically.
- LEFT, RIGHT to move horizontally by characters.
- ^LEFT, ^RIGHT to move horizontally by words.
- 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 is .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 contents of the current track
by counting and displaying the number of events in each MIDI category.
Displayed values are:

- total time of the track (approximated using total number of beats and initial
  tempo).
- number of beats (not considering loops).
- total number of beats (considering loops).
- 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.
- position of the track in RAM (you don't care about that).
- blocks used in RAM (nor about that).

- number of NOTE ON.
- number of NOTE ON with nul velocity.
- number of NOTE OFF.
- lowest note.
- highest note.

- number of tempo changes.
- 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 contents of an ascii help file. By default,
this help file is QSQ.HLP, that must be located in the directory where you
launched QSEQ. But it is better to use the QSEQHELP environment variable,
with a full path (put it 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 the 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 an 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.

QSEQ can also be started or stopped by pressing a key on your synth keyboard.
I called this the Zap feature. It is very useful when your keyboard is a little
distant from your computer. To enable and disable this feature and to choose the
note (usually one at the limits of the keyboard), use aA or the ZAP token in the
configuration tool.


Ŀ
31 - Special keys and macros


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 or FM
       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/FULL 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. Works also in playing mode.
    Do not forget to save your work...

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 or FM 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. Don't forget that
    there is no way to select a program change for the metronome. So you should
    use a channel that is used and defined in your music.

aB: Toggles metronome blinking on/off. When on, the time field of the status
    line blinks in rhythm.

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 song, and also the remaining value till the end of the song. Note
    that in the calculation of the total length of the song, an infinite looped
    track is considered containing 9999 beats.

aO: 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.

aA: zap feature: START/STOP controled by a synth key.


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 (or appropriate notes off
    messages), off damper switches, zero modulation controller and zero bender
    on every MIDI channel. See PANIC token in the configuration tool.

^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. Also loads CMF file in
    FM synth if one is present.

^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.

^W: 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...)

Macros:


As I am quite lazy, want to work quickly and often do repeated things, there is
a macro feature that allows you to record up to 10 sequences of keys on the
computer keyboard and play them whenever you want.

There is a macro flag in the status line.

To record a macro, the macro flag should be (.). Type ^K, the macro flag
becomes (?). Then type a macro number between 0 and 9. You can press ESC if you
want to abort. The macro number you choosed is displayed in the macro flag. You
enter in macro recording mode. Any key you then type will be recorded untill you
press ^K again. The macro flag then becomes (.) again. You can record up to 47
keys in a single macro.

Note that while recording a macro, keys you are typing are normally interpreted
by QSEQ. If you want to record a macro in a "silent" way, use aK instead of ^K.

To play back one of the 10 available macros, just type a0, a1,... or a9.
The macro flag will show the macro number that is currently played (if it's not
too quick...).

To clear a macro, type ^K, its number and ^K again.
If you type ^K and then 'c', all macros will be cleared.

For example, if, in the GLOBAL view,  you want to record in macro #2 keys to
insert of 4 measures in the current track and move down to the next track,
type the following sequence:

 ^K 2 i 4 ENTER ENTER DOWN ^K

Then typing a2 will repeat this operation.

Note that you can record one or several macros in a macro, but only in one
level: you cannot playback a macro that is recorded in a macro that is recorded
in a macro. It avoids loops. For example:

MACRO0 = DOWN DOWN
MACRO1 = RIGHT MACRO0 RIGHT
MACRO2 = MACRO1 MACRO1

then macro0 will make two times DOWN,
     macro1 will make two times DOWN and two times RIGHT,
     macro2 will make four times RIGHT.

This one level reentrance allows you to write macros really bigger than 47 keys.

Note that macros are stored in QSEQ files. But when a QSEQ file is loaded,
current unempty macros are not overwritten by the ones you're loading. You've
got to clear them before. This avoids killing your favourite default macros.

If you type ^K and then 's', all macros will be stored in the MACROS.CFG file
that can then be used in the configuration tool: that allows you to set default
macros in your QSEQ.


Ŀ
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 information on memory and environment before entering or when
      leaving QSEQ.

-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). See the
QSQBOX.BAT file for an example of an automatic player.

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, the QSEQ FM editor, the
QXED SYSEX editor and the QSEQ help viewer.

  QSQCONF [-e<file>.EXE] [-n] [-m] [-f<cmffile>.CMF] <configfile>.CFG

QSQCONF.EXE reads a configuration file and modifies the <file>.EXE file (that
can be QSQ.EXE, QSQFM.EXE QXED.EXE or QSQHELP.EXE (QSQ.EXE is the default
value)).

Before any modification it saves the initial <file>.EXE file under BACKUP.EXE
for further 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" .
You can use and edit the configuration files provided in the QSEQ package or
write your own ones.

QSQCONF.EXE must reside and be launched in the same directory where <file>.EXE
resides.

QSQCONF.EXE can also be used to set the 128 default FM instruments of the
SB card in QSQ.EXE or QSQFM.EXE, using the instrument block of a CMF file. See
chapter 40 for details on CMF files.

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

  QSQCONF BW_SCR.CFG

To set the 128 FM instruments of QSQFM to their General MIDI default values,
type:

  QSQCONF -eQSQFM.EXE -fGMSOUND.CMF

To change colour settings of QSQ to another color map, type:

  QSQCONF -eQSQHELP.EXE COL2_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 every EXE file 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 begin
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 *).

Note that in this list:
- all tokens are used to configure QSQ.EXE.
- only colour and FM instrument settings tokens are used for QSQFM.EXE.
- only colour tokens are used for QSQHELP.EXE.


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.
BLASTERTYPE t
  sets soundblaster type to t in decimal (SbPro:4(*), ???). Used by the FM
  writing procedures to use the correct data flow rate.

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: react to external START/CONTINUE messages.
  n=4: react to external START/CONTINUE/STOP messages.

PANIC beg end ano
  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.
  ano=1: sends "all notes off" messages (controller 123): quicker.
  ano=0: sends appropriate notes off messages: slower, but some synth do not
         understand "all notes off" messages...

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 (*=10).

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/FM beep.
  type=0: PC speaker beep (*).

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

METROMIDI cc nn1 vv1 nn2 vv2
  cc: channel (1-16:midi, 17-32:FM, *=16).
  note on the first beat:
    nn1: note (0-127,*=37).
    vv1: velocity (1-127,*=127).
  note on other beats:
    nn2: note (0-127,*=37).
    vv2: velocity (1-127,*=80).

METROBLINK status
  set default metronome blinking of the time field.
  status=1: blinking on (*).
  status=0: blinking off.

COUNTDOWN rr pp
  default countdown 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. (*)

ZAP n note
  start or stop playing/recording by pressing a key on your synth.
    n=1: on
    n=0: off
    note: note to use (usually one at the limits of the keyboard).

MIXER mm ff
  set Sound Blaster mixer's values on start:
    mm: master volume (0-7)
    ff: FM volume (0-7)

KEYBOARD s
  describe piano keyboard (used in QSEQFM), using a 15-char string s. The
  first char of s is the key for octave up, the second for octave down, and the
  13 next chars are keys for 13 notes (C to C).
  (ex: aqwsxdcvgbhnj,; is a possibility for french keyboards).


MACRO settings:


You can define the default contents of each of the 10 macros available in QSEQ:

# sequence of keys of macro #0:
MACRO0 k01 k02 ... -1
# sequence of keys of macro #1:
MACRO1 k11 k12 ... -1
(...)
# sequence of keys of macro #9:
MACRO9 k91 k92 ... -1

k01, k02, etc... are positive decimal numbers describing the key.

You can directly get the config transcription of a macro using (^K, s) in QSEQ
to save your macros in MACROS.CFG file.

You can also check the QSEQ value of any key using the small QSQKEY.EXE tool
that shows you these values as long as you type on the keyboard.

A macro sequence must end with a -1 value and cannot contain more than 47 valid
keys.

For example if you want this sequence of keys {i 4 ENTER ENTER DOWN} in
macro #2 default value, use the following line:

MACRO2 105 52 13 13 336 -1

You can use option -m of the configuration tool to read a configuration file
containing MACRO tokens and to display comments explaining the contents of
these tokens (using explicit names of keys). You can even redirect this program
to a file to use it as a config file.

ex:
  Build a few macros in QSEQ and save them in MACROS.CFG using ^K and 's'.
  Then type:
  QSQCONF -m MACROS.CFG > MACROS2.CFG
  View MACROS2.CFG and see what it contains...


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 (used in QSQFM):
A_FILE
# time field (used in QSQFM for prog number):
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 flags fields (used in QSQFM for
# status line fields):
A_STATUS
# macro field when recording/playing a keyboard macro:
A_MACROREC
A_MACROPLAY
# memory field (normal/hilight when receiving midi):
A_MEM
A_MEMHI

# hilighted current parameter (used in QSQFM):
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
# (used in QSQFM):
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 (used in QSQFM):
A_MSINFO
# colour of an error message (used in QSQFM):
A_MSERR
# colour of an "I'm working" message:
A_MSWORK


Ŀ
40 - Internal FM synth


Introduction:


Basically, the SB contains a Yamaha-FM-OPL2 chip that has 9 operators (and so
can play up to 9 notes of any sound at the same time). Each of these operators
contains two cells (two wave generators) that can be used in a classical FM
modulator/carrier configuration or in parallel.

Using this, I choose to simulate 16 fictious FM channels (17-32) that can
be used like standard channels 1-16, but command the internal FM synth and not
the MIDI OUT. I also choose to simulate 128 possible programs or instruments,
just like in the MIDI standard. This choice allows to route any standard MIDI
flow to a MIDI channel (from 1 to 16) or a FM channel (from 17 to 32), with
total compatibility.

Each FM channel responds to the following MIDI messages:
- notes on and notes off from 0 to 115 (C0 to G9).
- notes on velocity
- program changes
- controler 7 (volume)
- controler 64 (damper pedal)

The FM synth of the SB can also be used in a "rhythm mode". To go into this
mode, you just need to set program 127 on channel 26 (=16+10). Then you can
only play up to 6 notes of a normal sound, but on channel 26, you can play
percussion sounds, see below. To go back in normal mode, enter a program
different from 127 on channel 26.

Note that SB mixer master volume and FM volume can be set using the MIXER
token in the configuration tool.


FM instruments:


The 128 default FM instruments stored in QSEQ were designed to sound as close
as possible to the 128 General MIDI instruments (See chapter 41). They are
the result of the work of J.R. Bowden.

But as I am very open-minded, I allow the user to design his own instruments.
They must be stored in the instrument block of a CMF file, and then loaded
temporarily in QSEQ thru the SYSEX view or permanently thru the configuration
tool.

But as you probably don't know how to write a CMF file, I provided three tools
TXT2CMF.EXE, CMF2TXT.EXE and QSQFM.EXE :

- CMF2TXT.EXE reads the instrument block of a CMF file and creates an ASCII
  text file describing in a formatted and understandable way the FM instruments
  it contains.

- TXT2CMF reads an ASCII text file of the previous format and creates the
  corresponding CMF file that can be used by QSEQ.

- QSQFM.EXE is an interactive FM editor which reads and saves CMF files, and
  allows you to play on your MIDI keyboard while editing your sounds (see
  chapter 42 for details).

As an example, you can find in the package GMSOUND.CMF and GMSOUND.TXT.
GMSOUND.TXT was created from GMSOUND.CMF, using the following command:

  CMF2TXT GMSOUND.CMF GMSOUND.TXT

If you want to create your own CMF file, I suggest you start from GMSOUND.CMF.
Create your own text file with commands:

  COPY GMSOUND.CMF MYFILE.CMF
  CMF2TXT MYFILE.CMF MYFILE.TXT

Then edit MYFILE.TXT with your best ASCII editor, using the format described
below.

Then update your CMF file with the command:

  TXT2CMF MYFILE.TXT MYFILE.CMF

You can now use MYFILE.CMF in the SYSEX view or with the -f option of the
configuration tool.


Format of the FM instrument ASCII description:


The beginning of the file MYFILE.TXT will be like this:

Transcription of the instrument block of CMF file MYFILE.CMF:
--------------------------------------------------------------------------------
Num M(A V E K Mu S Lv At Dc Su Rl W) C(A V E K Mu S Lv At Dc Su Rl W) F C V Tr
000   0 0 1 0 01 1 26 14 01 01 05 0    0 0 1 1 01 0 00 11 01 15 07 0  0 0 1 +00
001   0 0 1 0 01 0 31 14 01 01 05 0    0 0 1 1 01 0 00 11 02 15 07 0  1 0 0 +00
002   0 0 1 0 03 0 33 14 01 01 05 0    0 0 1 1 01 0 00 11 02 15 07 0  0 0 1 +00

In this file, one line of 29 decimal numbers separated by spaces describes a FM
instrument. Any unmatching line is ignored. Only the 128 first instruments are
considered when updating MYFILE.CMF with the TXT2CMF tool. Instruments 128, 129
and 130 are used to set the 5 rhythm sounds of the "rhythm mode".

Basically, a FM instrument using 2 operators can be described like this:

   s(t) = A1.wave1( w1.t + A2.wave2( w2.t ) )  (classic FM configuration)
or
   s(t) = A1.wave1( w1.t ) + A2.wave2( w2.t )  (parallel configuration)

... where A1, w1, A2 and w2 can have different values and can even be time-
dependant functions, and where wave1 and wave2 are wave generators (often
sine functions).

A valid instrument line contains these 27 fields:

- number of the instrument (0-127:normal sounds, 128-130:rhythm sounds).

  two groups of 12 fields describing modulator and carrier cell sound
  characteristics:

- A (0-1): amplitude modulation of 3.7Hz off/on.
- V (0-1): vibrato effect of 6.4Hz off/on.
- E (0-1): envelope generator type. When cleared, there is no sustained portion
  in the ADSR envelope: the release portion starts as soon as the decay portion
  reaches the sustain level.
- K (0-1): key scaling. When set, the enveloppe rate becomes faster as the
  pitch increases (At Dc and Rl are affected).
- Mu (0..15): multiplication factor to the frequency of the cell.
  (0 stands for x1/2, 1 for x1, 2 for x2 ... 10 and 11 for x10, 12 and 13 for
  x12, 14 and 15 for x15).
- S (0..3): key scale level. As the pitch increases, the level can be
  attenuated. (0 stands for 0dB/octave, 1 for 1.5dB/O, 2 for 3dB/O and 3 for
  6dB/O)
- Lv (0..63): attenuation of the output volume.
  (0 stands for 0dB, 63 for -47dB).
- At (0..15): attack rate of the ADSR envelope (0:none, 1:slow - 15:fast).
- Dc (0..15): decay rate of the ADSR envelope (0:none, 1:slow - 15:fast).
- Su (0..15): sustain level of the ADSR envelope.
  (0 stands for 0dB, 15 for -45dB).
- Rl (0..15): release rate of the ADSR envelope (0:none, 1:slow - 15:fast).
- W (0..3): wave selection, based on a sine wave:
  ( 0: /\    1: /\__  2: /\/\  3: /_/_ )
         \/

- F (0..7): modulation factor for feedback of the modulator cell.
  (0 stands for 0, 1 for PI/16, 2 for PI/8, ... 6 for 2*PI and 7 for 4*PI)
- C (0-1): connection of modulator and carrier cells.
  (0: serial (classic FM), 1: parallel)
- V (0-1): if 0, sound reacts to velocity. If 1 sound does not react to
  velocity. Note that this parameter in stored in parameter 12 of the
  instrument block of a CMF file.
- Tr (-48..48): transpose the sound by semi-tones.


Rhythm sounds:


When you enter program 127 on channel 26, you enter in rhythm mode. In this
mode, you have 5 basic percussion sounds that can be played at different
pitches. On any octave, the percussion map is:

C: bass drum
C#, D, D#, E: snare drum
F#, G#: hi-hat
F, G, A, B: toms from low to hi.
A#: cymbal

But remember that you can play only one instrument of the same type at the
same time (e.g. you cannot play F and G simultaneously). Moreover, these
instruments are pitched depending on the note and octave you use to play them,
but they are grouped like this: {bd}, {sn+hh}, {tom+cym}. In these groups you
can play both instruments at the same time, but only one pitch will be used
(so be careful, it may produce weird effects to play tom and cymbal at the
same time if they are played at very different pitches).

You can use a CMF file to program these instruments, using instruments 128
to 130.

128: bass drum (2 fm ops).
129: modulator cell: hi-hat (1 fm op), carrier cell: snare (1 fm op).
130: modulator cell: tom (1 fm op), carrier cell: cymbal (1 fm op).

For these instruments, the waveforms (W) are differents from normal sounds:
0: square wave + white noise
1: white noise modulated by square wave.
2: white noise.
3: ???


Ŀ
41 - Fm instrument editor


QSQFM [-h] [-x] [-vMF] [-i<inputfile>.CMF] [-o<outputfile>.CMF]

If no input file is provided, GM instruments are used as default values.
If an input file is provided, it is used instead.
If no output file is provided, the instruments are saved in the input file (if
there is one) or in NONAME.CMF.
If an output file is provided, the instruments are saved in this output file and
the input file stays safe.

Example:
  if you want to start working on the General MIDI sounds to build your own
  sound, type:

  QSQFM -iGMSOUNDR.CMF -oMYSOUNDS.CMF

This editor displays the 128 instruments (#0-127) stored in a CMF file
+ 3 rhythm instruments (#128-130). You can easily edit any of these instruments
by changing their parameters described in the previous chapter. You can save
the new instruments in an output file. You can play your MIDI keyboard to hear
the sound you're currently editing.

On its status line, the editor displays:

- the current program number (0-127, 128-130).
- the FM channel used (16 for normal sounds, 25 for drum sounds).
- the last played note/default note.
- the current volume (if not set to default).
- the MIDI output channel.
- the last FM voice used (0-8).
- the input file.
- the output file.

The following keys can be used:

- UP, DOWN, LEFT, RIGHT, HOME, END, PGUP, PGDOWN, ^HOME, ^END
  to move around.
- F5, F6, F7, F8 to change the value of the current parameter as you do in QSEQ.
- SPACE to start or stop playing the default note.
- F3, F4, ^F3, ^F4 to decrease or increase the value of the default note.
- ENTER to type the value of the current parameter.
- ^UP, ^DOWN, ^PGUP and ^PGDOWN to locally modify and test instrument volume.
- F2 to save back the edited instruments.
- F9 to change the midi output channel that is used to duplicate notes thru
  MIDI OUT. If this channel is 0, MIDI OUT stays mute and you hear only the SB
  FM synth. Can be usefull to mix MIDI and FM sounds.
- aX to exit.

Remarks on volume:
- the SoundBlaster master and FM volumes can be set from the command-line using
  option -v. M is the master volume (0-7) and F the FM volume (0-7).
- track volume can be set by the MIDI controller 7.
- note also that volume of a note can only be controlled by modifying on the fly
  the level parameter of the corresponding FM instrument. That's the way volume
  of a channel and key velocity is simulated in the FM part of QSEQ. If you
  don't use volume nor reaction to velocity, the FM instrument's level keeps its
  initial value.

Piano keyboard emulation:

  If you have a AZERTY keyboard, you can use the following keys to play notes
  individually:

    [s] [d]     [g] [h] [j]
  [w] [x] [c] [v] [b] [n] [,] [;]  and [a] and [q] to change octave.

  If you have another type of computer keyboard, use the configuration tool,
  token KEYBOARD to configure QSEQFM.

If you run QSQFM with the -x option, the SoundBlaster card is just ignored.


Ŀ
42 - General MIDI instruments


The General MIDI standard proposes a map of 128 instruments, grouped in
16 families of 8 instruments:
 
Prog      Instrument                Prog      Instrument
 
PIANO                               CHROM PERCUSSION
 0        Acoustic Grand             8        Celesta
 1        Bright Acoustic            9        Glockenspiel
 2        Electric Grand            10        Music Box
 3        Honky-Tonk                11        Vibraphone
 4        Electric Piano 1          12        Marimba
 5        Electric Piano 2          13        Xylophone
 6        Harpsichord               14        Tubular Bells
 7        Clav                      15        Dulcimer
 
ORGAN                               GUITAR
16        Drawbar Organ             24        Acoustic Guitar(nylon)
17        Percussive Organ          25        Acoustic Guitar(steel)
18        Rock Organ                26        Electric Guitar(jazz)
19        Church Organ              27        Electric Guitar(clean)
20        Reed Organ                28        Electric Guitar(muted)
21        Accordian                 29        Overdriven Guitar
22        Harmonica                 30        Distortion Guitar
23        Tango Accordian           31        Guitar Harmonics

BASS                                STRINGS
32        Acoustic Bass             40        Violin
33        Electric Bass(finger)     41        Viola
34        Electric Bass(pick)       42        Cello
35        Fretless Bass             43        Contrabass
36        Slap Bass 1               44        Tremolo Strings
37        Slap Bass 2               45        Pizzicato Strings
38        Synth Bass 1              46        Harp
39        Synth Bass 2              47        Timpani
 
ENSEMBLE                            BRASS
48        String Ensemble 1         56        Trumpet
49        String Ensemble 2         57        Trombone
50        SynthStrings 1            58        Tuba
51        SynthStrings 2            59        Muted Trumpet
52        Choir Aahs                60        French Horn
53        Voice Oohs                61        Brass Section
54        Synth Voice               62        SynthBrass 1
55        Orchestra Hit             63        SynthBrass 2
 
REED                                PIPE
64        Soprano Sax               72        Piccolo
65        Alto Sax                  73        Flute
66        Tenor Sax                 74        Recorder
67        Baritone Sax              75        Pan Flute
68        Oboe                      76        Blown Bottle
69        English Horn              77        Skakuhachi
70        Bassoon                   78        Whistle
71        Clarinet                  79        Ocarina
 
SYNTH LEAD                          SYNTH PAD
80        Lead 1 (square)           88        Pad 1 (new age)
81        Lead 2 (sawtooth)         89        Pad 2 (warm)
82        Lead 3 (calliope)         90        Pad 3 (polysynth)
83        Lead 4 (chiff)            91        Pad 4 (choir)
84        Lead 5 (charang)          92        Pad 5 (bowed)
85        Lead 6 (voice)            93        Pad 6 (metallic)
86        Lead 7 (fifths)           94        Pad 7 (halo)
87        Lead 8 (bass+lead)        95        Pad 8 (sweep)
 
SYNTH EFFECTS                       ETHNIC
96        FX 1 (rain)              104        Sitar
97        FX 2 (soundtrack)        105        Banjo
98        FX 3 (crystal)           106        Shamisen
99        FX 4 (atmosphere)        107        Koto
100       FX 5 (brightness)        108        Kalimba
101       FX 6 (goblins)           109        Bagpipe
102       FX 7 (echoes)            110        Fiddle
103       FX 8 (sci-fi)            111        Shanai
 
PERCUSSIVE                          SOUND EFFECTS
112       Tinkle Bell              120        Guitar Fret Noise
113       Agogo                    121        Breath Noise
114       Steel Drums              122        Seashore
115       Woodblock                123        Bird Tweet
116       Taiko Drum               124        Telephone Ring
117       Melodic Tom              125        Helicopter
118       Synth Drum               126        Applause
119       Reverse Cymbal           127        Gunshot

Ŀ
43 - MT32 instruments


The MT32 standard proposes a map of 128 instruments. You can find them in
the MT32.CMF file (written by J.R. Bowden). Here they are:
 
Prog      Instrument                Prog      Instrument

0         Acou Piano 1              8         Elec Org 1
1         Acou Piano 2              9         Elec Org 2
2         Acou Piano 3              10        Elec Org 3
3         Elec Piano 1              11        Elec Org 4
4         Elec Piano 2              12        Pipe Org 1
5         Elec Piano 3              13        Pipe Org 2
6         Elec Piano 4              14        Pipe Org 3
7         Honkytonk                 15        Accordion

16        Harpsi 1                  24        Syn Brass 1
17        Harpsi 2                  25        Syn Brass 2
18        Harpsi 3                  26        Syn Brass 3
19        Clavi 1                   27        Syn Brass 4
20        Clavi 2                   28        Syn Bass 1
21        Clavi 3                   29        Syn Bass 2
22        Celesta 1                 30        Syn Bass 3
23        Celesta 2                 31        Syn Bass 4

32        Fantasy                   40        Echo Beel
33        Harmo Pan                 41        Ice Rain
34        Chorale                   42        Oboe 2001
35        Glasses                   43        Echo Pan
36        Soundtrack                44        Doctor Solo
37        Atmosphere                45        School Daze
38        Warm Bell                 46        Bellsinger
39        Funny Vox                 47        Square Wave

48        Str Sect 1                56        Contrabass
49        Str Sect 2                57        Harp 1
50        Str Sect 3                58        Harp 2
51        Pizzicato                 59        Guitar 1
52        Violin 1                  60        Guitar 2
53        Violin 2                  61        Elec Gtr 1
54        Cello 1                   62        Elec Gtr 2
55        Cello 2                   63        Sitar

64        Acou Bass 1               72        Flute 1
65        Acou Bass 2               73        Flute 2
66        Elec Bass 1               74        Piccolo 1
67        Elec Bass 2               75        Piccolo 2
68        Slap Bass 1               76        Recorder
69        Slap Bass 2               77        Panpipes
70        Fretless 1                78        Sax 1
71        Fretless 2                79        Sax 2

80        Sax 3                     88        Trumpet 1
81        Sax 4                     89        Trumpet 2
82        Clarinet 1                90        Trombone 1
83        Clarinet 2                91        Trombone 2
84        Oboe                      92        Fr Horn 1
85        Engl Horn                 93        Fr Horn 2
86        Bassoon                   94        Tuba
87        Harmonica                 95        Brs Sect 1

96        Brs Sect 2                104       Marimba
97        Vibe 1                    105       Koto
98        Vibe 2                    106       Sho
99        Syn Mallet                107       Shakuhachi
100       WindBell                  108       Whistle 1
101       Glock                     109       Whistle 2
102       Tube Bell                 110       Bottleblow
103       Xylophone                 111       Breathpipe

112       Timpani                   120       Castanets
113       Melodic Tom               121       Triangle
114       Deep Snare                122       Orche Hit
115       Elec Perc 1               123       Telephone
116       Elec Perc 2               124       Bird Tweet
117       Taiko                     125       OneNote Jam
118       Taiko Rim                 126       Water Bell
119       Cymbal                    127       Jungle Tune

 
Ŀ
50 - SYSEX editor


In the SYSEX view, we used the fact that 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! If you send back a
SYSEX dump to your synth thru MIDI IN, it will load it at the right place in its
memory. Using SYSEX messages, you can usually even change parameters of your
synth one by one. BUT IT DEPENDS ON YOUR SYNTH. That's why I wrote QXED,
a !!!programmable!!! SYSEX editor.

QXED is able to send/receive SYSEX messages to/from your synth. More than that,
QXED provides you with a simple programmable interface, that allows you to
create pages and boxes containing editable numeric or alphanumeric fields
connected in various ways to SYSEX messages.

So QXED cannot work from zero: it needs to know how your synth works, and that
is your part of the job to write a configuration file that suits its needs. I
already wrote some configuration files. They are .TXT files.

Here are ready-to-use available editors:
- MIDI: play with standard MIDI messages (good tutorial).
- X5P: Korg X5 program editor.
- X5C: Korg X5 combination editor.
- X5LIB: Korg X5 librarian.
- P1: Proteus/1 program editor.

If you want to test the X5 program editor, type "QXED X5P".
You can test it, even if you don't have a Korg X5, it won't change your synth.
But you'd better start with the MIDI editor, much more simple...

A QXED editor is made out pages, containing boxes, containing fields. A field
can be a number, a choice in a list of items, a string, a table, or a separator.
When it has a value, it can be considered like a variable. QXED basically works
on 16-bits signed integers from -32768 to +32767.

You can also have global variables directly connected to no fields,
but result of a formula. Then you have SYSEX messages that are made out of
a list of items that are formula containing numbers and variables.

ATTENTION!!! Before any test, you'll probably need to set your synth (in its
setup menu) in such a way that it can receive ans send SYSEX dumps).

Note that while editing, you can play thru MIDI IN with your keyboard or any
MIDI device to test the sound you are editing: this is an integrated MIDI THRU
feature.

Keys:
-----

You can use the following keys in QXED:

- PAGEUP, PAGEDOWN to change page (= screen).
- ^LEFT, ^RIGHT ^UP, ^DOWN to change box (= window).
- aN, aP: goto next/previous box in the boxes list.
- UP, DOWN to change field (= line in a box).
- TAB, BACKTAB to go backward or forward in the history of last edited fields
  (usefull if you only work on a few distant fields).
- LEFT, RIGHT to change position in an alphanumeric field.
- F5, F6, F7, F8 to increase or decrease the value of a field (like in QSEQ).
  If you are in automatic mode, it considers the current edited field,
  calculates depending global variables and sends depending messages to MIDI OUT
  and/or temporary buffer
- aF5, aF6, aF7, aF8 to increase or decrease the value of the corresponding
  index if the field is a table. Very useful to edit a table.
- aD to reset a field to its default value.
- aZ to reset every variable to its default value (confirm with aZ).

- F2 to save current settings to a file: so you can save a sound program
  settings for further edition.
- F3 to load current settings from a file.

- F4: considers the current edited field, calculates depending global variables
  and sends depending messages to MIDI OUT and/or temporary buffer. In general,
  trigger the behaviour of the field, without having to change its value.
- ENTER: same as F4 except if you are on a numeric or choice field.

- aM switch: send messages to MIDI OUT or not.
- aB switch: send messages to OUT buffer of not.
- aA switch from automatic to manual mode: some fields can be described such
  as if you change their values, depending variables are recomputed and
  depending SYSEX messages are automatically sent.

- aC switch: change MIDI THRU channel.
- aF1: to decrease MIDI THRU channel.
- aF2: to increase MIDI THRU channel.

- F9 to see global variables.
- F10 to see OUT buffer.
- F11 to see the IN buffer that contains bytes received on the MIDI IN port.
- aH to toggle display in the three last views (hexa/decimal/characters).
- F1 to get an help screen.
- ESC to go back to main screen.
- aX to exit (confirm with aX).

- ^S to send to MIDI OUT bytes contained in the OUT buffer.
- ^R to send to MIDI OUT bytes contained in the IN buffer.
- ^V to send current variable value to OUT buffer.
- ^F to free buffers.

- aLEFT, aRIGHT, aUP, aDOWN : change box position/size.
- aW : toggle beetween changing box position or size.
- aS : save editor to .QXD compilo file.

Status line:
------------

On the status line, you can read from the left to the right:

- the name of the current editor.
- the name of the current page.
- the automatic/manual switch status.
- the "send to MIDI" switch status.
- the "send to OUT buffer" switch status.
- the size of the OUT buffer.
- the MIDI THRU channel (0 for no MIDI thru).
- the pourcentage of memory used.

Keywords:
---------

In a QXED configuration file, you can use the following keywords, to begin a
description line. If the line begins with a ; its is ignored. If a line is
ended by a \ it is concatenated to the next line (and so on).

EDITOR    "title" [@out]
  defines the title of the editor, with an optional SYSEX message to send when
  entering the editor.

INCLUDE   "filename"
  includes another configuration file.

LISTDEF   @list
number1   "string1"
number2   "string2"
...
LISTEND
  defines a sorted list <list> of numbered items. Numbers on the left
  side must be consecutives integers sorted from the smallest to the biggest.
  They can be negatives.


PAGE      @page "title" "help" [@out]
  defines in the editor a page named <page>, with a title, an help line
  displayed at the bottom of the screen and an optional SYSEX message to send
  when entering this page. A new page is a new screen.

MULTIBOX  @multi @page @var
  defines in the page <page> an indexed set of boxes named <multi>, depending
  on a numeric variable <var>. A multibox is invisible, but it contains a list
  of boxes (the order of declarations is important), and the box whose position
  is equal to the value of <var> is displayed.

BOX       @box @page/@multibox "title" x y nrow nline "help" [@out]
  defines in the page <page> or the multibox <multi>, a box named <box>, with a
  title, a position in the page (x:0...77,y:0...43), a size (nrow,nline), a
  help line and an optional SYSEX message to send when entering this box.
  A box can contain different types of objects, listed below. The order of
  declaration of these objects determinates their vertical position in the box.


SEPARATOR @box "separator"
  defines in the box <box> a separator, which is a decorative string with no
  behaviour.

NUM       @num @box "title" min max default step "help"
  defines in the box <box> a numeric field (integer) named <num>, with a title,
  a minimum value <min>, a maximum value <max>, a default value <default>, a big
  increment <step> (used with keys F7/F8) and a help line.

STRING    @str @box "title" cmin cmax len "default" "help"
  defines in the box <box> a string field named <str>, with a title, a mininum
  and maximum values <cmin> and <cmax> for each character, a length <len>, a
  default value  and a help line.

CHOICE    @cho @box "title" @list min max default step len "help"
  defines in the box <box> a choice field named <cho>. A choice field is just
  like a numeric field, but instead of displaying numbers, it displays the
  corresponding item in a list previously defined with LISTDEF. A choice field
  has a title, a depending list <list>, a minimum and maximum position <min> and
  <max> in the list, a default position <default>, a big increment <step>, and
  a help line. <len> is the maximum length of the item displayed. If <len> is
  negative, the number corresponding to the item is diplayed before the item
  itself. Anyway, the item number is displayed at the beginning of the help
  line.

TABLE/N   @tabn @box "title"
           @var offset size min max default step "help"
  defines in the box <box> a table named <tabn>. A table can be seen like a
  set of numeric fields, indexed by another variable: only the current element
  of the table is displayed and can be modified. A table has a title, an
  index variable <var>, an constant offset <offset> (added to the variable
  before indexation), and a size <size>. Each numeric field is limited by
  <min> and <max>, has a default value <default> and a big increment <step>.
  There is also an help line. The table current index is displayed at the
  beginning of the help line.

TABLE/C   @tabc @box "title"
           @var offset size @list min max default step len "help"
  defines in the box <box> a table named <tabc>. Same as TABLE/N, except that
  numeric fields are replaced by choice fields, using a list <list>, and an
  item max length <len>.


SEND      @snd @box "title" @out "help"
  defines in the box <box> a special field named <snd>, with no input, but on
  which you can use F4 key or ENTER to trigger the sending of the <out> message.

RECEIVE   @rec @box "title"
           @req @buf nsysex nbsysex start end uncode "help"
  defines in the box <box> a special field named <rec>, with no input, but on
  which you can use F4 to trigger the sending of the <req> message that should
  be a request for a SYSEX dump. Then QXED waits for the <nsysex>th message it
  receives, and:
  - if <nbsysex> > 0, for the <nbsysex> next messages (delimited by F0 and F7),
  reads them from byte <start> to byte <end> (included, starting at 0 on F0),
  uses the <uncode> method ('k' for Korg, 'r' for Roland, ' ' for nothing) to
  decode these sets of bytes and stores then successively into the buffer <buf>.
  - if <nbsysex> <= 0, reads from byte <start> to byte <end> (included, starting
  at 0 on the F0 of the first message) without taking care of further F0 or F7
  bytes. Then uses the <uncode> method to decode this set of bytes and stores
  it into the buffer <buf>.
  If you use a decoding method, be careful to set properly the size of <buf>.

SAVE   @sav @box "title" filelen "default" @out "help"
  defines in the box <box> a special string field named <sav>, on which you can
  use F4 to trigger the writting of the <out> message into the file whose name
  is typed in the field. The input field has a length of <filelen> and a
  default value.

LOAD   @loa @box "title"
        filelen "default" @buf nsysex nbsysex start end uncode "help"
  defines in the box <box> a field on which you can use F4 to trigger the reading of a SYSEX
  message from the file typed in the input field of length <filelen> and default
  value <"default">.. Then it works just as for RECEIVE.


GLOBAL    @glo formula "help"
  defines a numeric global variable named <glo>, which value is defined by the
  given formula (see below).

BUFFER    @buf size "help"
  defines a numeric buffer of size <size> named <buf>.

CHGNUM    @var formula
  <var> is an already declared numeric variable (NUM/CHOICE/GLOBAL), that can
  be eventually recomputed using the given formula (see below). Useful when you
  receive a SYSEX dump and when you want to change numeric fields according to
  the dump contents.

CHGBUF    @buf (formula)xN
  <buf> is an already declared STRING/TABLE/BUFFER variable, that
  can be eventually recomputed using these formulas (one formula per position).
  Useful when you receive a SYSEX dump and when you want to change buffer fields
  according to the dump contents.

OUT       @out (formula | {. | }. )xN
  defines a SYSEX message named <out> as a list of formulas.
  Items { and } are used to limit a set of bytes on which you can make a
  transformation. The character that follows them describe the transformation.

  You can use {c and }c to generate a checksum at the end of the set.

  Some synths encodes data before sending it, because they use bytes from 0 to
  FF, or even 2-bytes integers.

  You can use {k and }k for 7 bytes(0-FF) to 8 bytes(0-7F) encoding (Korg X5):
  a7a6a5a4a3a2a1a0 ... g7g6g5g4g3g2g1g0
  -> a7b7c7d7e7f7g7 a6a5a4a3a2a1a0 ... b6b5b4b3b2b1b0

  or {r and }r for 7 bytes(0-FF) to 8 bytes(0-7F) encoding (Roland U20):
  a7a6a5a4a3a2a1a0 ... g7g6g5g4g3g2g1g0
  -> a6a5a4a3a2a1a0 b5b4b3b2b1b0a7 ... g0f7f6f5f4f3f2 g7g6g5g4g3g2g1

  or {e and }e for one 14-bits integer to 2 bytes(0-7F) encoding (Emu Proteus):
  a13a12a11a10a9a8a7a6a5a4a3a2a1a0
  -> a6a5a4a3a2a1a0 a13a12a11a10a9a8a7

REQ       @req (formula | {. | }. )xN
  same as OUT but is sent only as a request for a SYSEX dump.

Variables names:
----------------

Note that variable names lengths are limited to a maximum of 11 characters.
Note also that a variable name can be empty when you want to declare a variable
that won't be used anywhere else. It can be useful for lonely OUT variables
for example...

Variables prefix:
-----------------

There are 4 possible variable prefixes:
@var &var $var #var

1) If a variable <var1> is part of a formula used to calculate a variable <var2>
   and the value of <var1> changes:
   Depending on the prefix of <var1> in this formula:
    @var1: nothing happens.
    $var1: nothing happens.
    &var1: if in automatic mode, the formula is recalculated and <var2> value
           changes. If <var2> is a OUT message, it is not sent.
    #var1: if in automatic mode, the formula is recalculated and <var2> value
           changes. If <var2> is a OUT message, it is sent.

   Depending on the prefix of <var2> in front of this formula:
    @var2: nothing happens.
    $var2: nothing happens.
    &var2: if in automatic mode, the change of <var2> is repercuted using the
           same rules, but no messages will be ever sent in these iterations...
    #var2: if in automatic mode, the change of <var2> is repercuted using the
           same rules. Messages are eventually sent.

2) If a variable <var1> is part of a formula used to calculate a variable <var2>
   and F4 is pressed on <var1>:
   Depending on the prefix of <var1> in the formula:
    @var1: nothing happens.
    &var1: the formula is recalculated and <var2> value changes. If <var2> is a
           OUT message, it is not sent.
    $var1: the formula is recalculated and <var2> value changes. If <var2> is a
           OUT message, it is sent.
    #var1: idem.

   Depending on the prefix of <var2> in front of this formula:
    @var2: nothing happens.
    &var2: the change of <var2> is repercuted using the same rules, but no
           messages will be ever sent in these iterations...
    $var2: the change of <var2> is repercuted using the same rules. Messages are
           eventually sent.
    #var2: idem.

In conclusion, for <var1>, you will usually use @. You will use # if you want
<var2> to be recalculated when <var1> changes. But if you think that <var2>
should be recalculated only if F4 is pressed (not for every change related to
F5,F6,...), you'd better use $. Now if you think that <var2> message should not be
sent use &.

For <var2>, you will usually use @: the change of <var2> is not iteratively
repercuted. Use # if you want to. Use $ if you want to, but only in F4
circumstances. Use & if you want to, but muting possible depending messages.

Note that the convention for <var2> is also used when specifying the BUFFER in
a LOAD or RECEIVE declaration: it sets the eventual repercussion of the BUFFER
after the reception/load. It is also used when specifying an index in a TABLE
declaration: it sets the eventual repercussion of the TABLE variable after
a change in the index.

Special variables:
------------------

These are variables whose names are recognized by QXED. Their name all begin
with a second @, to avoid duplication. You can still change the first @ in
$ or # as explained above.

@@page : page number (starts at 0), predefined global variable.
@@box  : box number in the page (starts at 0), predefined global variable.
@@var  : var number in the box (starts at 0), predefined global variable.

@@load : if you define a LOAD variable with this name, its filename will
         be automatically filled using the argument of the -l option on the
         command line, and the loading will be proceeded at startup. For
         example, you can type "QXED -ltest.x5 x5p" to load test.x5 SYSEX file.
@@save : if you define a SAVE variable with this name, its filename will
         be automatically filled using the argument of the -s option of the
         command line (or if missing using the -l option).

Formulas:
---------

10                : constant hexadecimal number
10h               : constant hexadecimal number
16d               : constant decimal number
10000b            : constant binary number
'c'               : constant character c
"sssss"           : constant string sssss

@var              : variable
&var              : variable
$var              : variable
#var              : variable

+(x,y,...)        : addition
-(x,y,...)        : subtraction
*(x,y,...)        : multiplication
/(x,y,...)        : division
%(x,y,...)        : modulo of the division
&(x,y,...)        : binary and operation
|(x,y,...)        : binary or operation
!(x)              : binary negation
s(x)              : keep less significant byte and make it signed.
r(x,n)            : binary shift to the right
l(x,n)            : binary shift to the left
t(x,n)            : test bit n.
c(x,n,l)          : extract l bits of x, starting at bit n.
b(x,n)            : less significant byte (bit 0-6)
B(x,n)            : most significant byte (bit 7-13)
i(x) or i(buf)    : less significant byte (0-6)
                    then most significant byte (7-13) in message.
y(x,n)            : less significant byte (bit 0-7)
Y(x,n)            : most significant byte (bit 8-15)
I(x) or I(buf)    : less significant byte (0-7)
                    then most significant byte (8-15) in message.
n(x1,n1,x2,n2,...): equals (x1<<n1 + x2<<n2 +...)
m(x1,x2)          : equals (x1 + x2<<7)
M(x1,x2)          : equals (x1 + x2<<8)
=(x,x1,x2...)     : equals 1 if x=x1 and x=x2 and... else 0
d(x,x1,x2...)     : equals 1 if x!=x1 and x!=x2 and... else 0
<(x,x1,x2...)     : equals 1 if x<x1 and x<x2 and... else 0
>(x,x1,x2...)     : equals 1 if x>x1 and x>x2 and... else 0
?(v,x,y)          : condition (if v!=0 x else y)
.(n,v0,v1,v2...)  : absolute table (if n=0 v0, if n=1 v1, ... else 0)
j(n,n1,x1,n2,x2,...nf,xf) : jump
                    (if n<n1 0, if n1<=n<n2 x1, if n2<=n<n3 x2, ... if n>=nf xf)
J(n,n0,v0,v1,v2...) :
                    relative table (if n=n0 v0, if n=n0+1 v1, ... else 0)
:(buf,n)          : extract a signed byte (-128...+127) from a string (n>=0)
;(buf,n)          : extract an unsigned byte (0...255) from a string (n>=0)
S(buf,n1,n2)      : extract a buffer from a buffer from position n1 included to
                    position n2 excluded (n2>=0 and n1>=0).
v(x) or v(buf)    : return the value of buf, interprated as an integer.
                    Useful if used on a table to get its current value.
p(buf)            : current position in buf (STRING/TABLE/LOAD/SAVE).
P(n)              : pause during n/18 seconds but return nothing.

z(x,...,buf,...)  : return 0 but is not sent if representing a byte in a
                    message.
                    Very useful to create a dependancy beetween some variables
                    and a formula, even if these variables are not really used
                    to calculate the formula.

Casts:
------

Note that in the list of operators above, except if the variable is named "buf",
it is assumed to be a single numeric constant or variable. If needed, a buffer
variable is cast to a numeric value. The function v() forces this cast.
Remember: a buffer variable is either of type STRING, BUFFER, TABLE, LOAD or
SAVE.

type:         cast to integer:
 NUM           value of the field
 CHOICE        position of the item in the list.
 STRING        first character of the string
 TABLE         current value of the table, pointed by the index.
 GLOBAL/SPEC   idem.
 BUFFER        first value of the buffer
 OUT           0
 REQ           0
 SEND          0
 RECEIVE       0
 SAVE          first character of the filename
 LOAD          first character of the filename

Compilation:
------------

As QXED description files can get quite big and so quite long to digest by
QXED, QXED automatically compiles them into .QXD compilo files, that are bigger
but quicker to load. If you update the description file, the compiled file is
automatically updated when reloading. You can force compilation at startup using
-c option. You can also update compilo file during the program using aS key:
you are able to change box size and position, default values, etc... without
touching the original .TXT description file.


Debugging:
----------

When building an editor by writting its description file, you can debug it
using option -t<debugfile>.



Ŀ
60 - 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 behaviour were discovered by QSEQ's users. I also included some
user 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 months 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 event 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 files 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 longer uses
    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 receiving 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: freezing 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 an 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 point 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 for 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 algorithm 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/06/1995, 185334 bytes)

  

  - IMP: you can use aX while playing.
  - NEW: QSQBOX.BAT file.
  - COR: clear the midifile error after bad loading.
  - IMP: clear screen with spaces and not zero characters, to avoid problems
         with TSR programs that reads screen.
  - IMP: start the file list on the first file.
  - NEW: "quicksearch" field in the FILE view.
  - IMP: allow bigger steps in progression tools.
  - IMP: quicker way to hilight choices in submenus.
  - COR: reduce long track name in NOTE and EVENT view.
  - COR: mute track when changing channel number.

-> frozen version 1.2c (10/07/1995, 186086 bytes)

  

  - NEW: SoundBlaster card internal FM Yamaha-OPL2 synth support on
         channels 17-32, with possible rhythm mode on channel 26.
  - NEW: FM Yamaha-OPL2 synth instrument configuration using CMF files
         in the SYSEX view or the configuration tool.
  - NEW: FM Yamaha-OPL2 synth instruments editing using CMF2TXT and TXT2CMF
         tools.
  - NEW: channels go now from 0 to 32 to support MIDI and FM ports.
  - NEW: po(r)t submenu in VARIABLE view.
  - NEW: keyboard macros: 10 sequences of keys can be recorded and then played
         back several times with ^K and a0, a1, ... a9.
  - NEW: option -m in configuration tool to explain MACRO tokens.
  - NEW: new QSEQ file version 11 to record FM channels and macros.
  - NEW: default values in VARIABLE view by pressing '*'.
  - IMP: when loading from command-line, display loaded files and show the good
         filename.
  - COR: more precise display of loop beat in unzoom mode.
  - COR: pb with empty track in find_sbeat.
  - IMP: another better way to filter out active sensing.
  - IMP: bigger midi in buffer (1000 bytes=250 timed events)
  - IMP: force timer_thru exit if too many notes in MIDI IN. Avoids SB buffer
         overflow. Double timer_thru speed.
  - IMP: new field in PANIC token of the config tool, to allow separate "notes
         off" instead of "all notes off" (some synths do not understand this
         message).
  - NEW: NAMES view becomes FULL view and can be accessed using 'U'.
  - IMP: reset tempo to its default value when clearing memory.
  - IMP: better memory allocation in QSQCONF.EXE .
  - NEW: zap feature: start and stop playing/recording by pressing a note on
         your synth (new ZAP token).
  - IMP: new kernel for edit mode, to be as precise as play/record mode ;
         new way of preserving PC internal clock.
  - NEW: QSQHELP.EXE tool to navigate thru the QSQ.TXT file that is quite big
         now...
  - NEW: possibility to choose a FM metronome.
  - NEW: interactive FM instrument editor QSQFM.EXE .
  - NEW: can display remaining time in the time field of the status line.
  - NEW: BLASTERTYPE token in config tool to use the good FM writing delay.
  - NEW: QSQCONF can be used to configure QSQHELP.EXE and also QSQFM.EXE .
  - NEW: when working, an indicator appears at the bottom right corner.
  - IMP: if midi buffer overflow, better message.
  - NEW: set SB mixer with the MIXER token in the configuration tool.
  - IMP: new way to calculate total length of a song (get_maxbeat).
  - NEW: display total number of beats and total time in LOOK view.
  - NEW: values of initial program, volume and balance, changed by MIDI
         messages in edit mode.
  - NEW: values of program change, volume and balance controllers, changed by
         MIDI messages in play/record mode.
  - IMP: new way to allocate FM voices.
  - IMP: the FM panic becomes just a mute all notes. Use ^X to fully reset
         the SB card.
  - IMP: new way to mutually exclude SOLO and MUTE.
  - COR: when bender in beat 0, sbeat 0, it is not seen by ^F...
  - COR: in QSQCONF, note in METROMIDI is offset by -1.
  - COR: corrections of the QSQ.TXT file by J.R. Bowden. Thanks again James.
  - IMP: possibility to use the computer keyboard to play notes as on
         a little piano (with a KEYBOARD token for customization).
  - IMP: use higher settings of FM modulation and vibrato.
  - IMP: play FM notes up to MIDI note 115 (G8).
  - COR: write an empty music block in CMF files.
  - NEW: event renumbering tool.
  - IMP: new way of receiving sysex in the same thru interrupt routine.
  - IMP: in sysex/receive, propose the current hilighted file.
  - NEW: initial bank change in VARIABLE view.
  - IMP: new file version 12 (with a reduction of size).
  - NEW: transpose field in FM instruments.
  - NEW: QSQVIEW tool to display the contents of a QSEQ file.
  - COR: in FM mode, now a program change keeps the volume.
  - IMP: the chg(e)vtVal tool now includes a time-dependant variable.
  - COR: the progression tool in NOTE view do not kill an old note any more.
  - IMP: the ^F key (send ctrl from current point) works also for FM now.
  - IMP: in INFO view, ^RIGHT and ^LEFT move from word to word.

-> frozen version 1.3 (01/02/1996, 203766 bytes)

  I decided to go from 1.2x to 1.3, because of the major new feature that is
  the support of the FM internal synth of the SB.

  

  - NEW: an unpedal tool.
  - NEW: QXED, a fully programmable SYSEX editor.
  - IMP: include VERSION.VER file.
  - IMP: help screen with F1 in QSQFM and QXED.
  - NEW: metronome blinking of the time field (METROBLINK config token),
         switchable with key.
  - IMP: QSEQ now accepts hi SB adr.

-> frozen version 1.3a (22/07/1996, 204918 bytes)

  

  - IMP: in QXED your can change of editor without quiting.
  - COR: Zap stop is now working when MIDITHRU is off.
  - COR: in QXED, checksum 80 instead of 0.
  - COR: QSQHELP does not display all chapters of the doc.

-> temp version 1.3b (xx/xx/1997, xxxxxx bytes)

  

Ŀ
61 - 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-150MHz 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.


Ŀ
62 - "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" (one of my american beta testers: 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.

Ŀ
70 - That's all folks !

