home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Audio Version 4.94
/
audioversion4.94knowledgemediaresourcelibraryoctober1994.iso
/
msdos
/
music
/
bassv25
/
bass.doc
next >
Wrap
Text File
|
1992-04-15
|
24KB
|
569 lines
Package:
========
BASS version 2.5 Copyright (c) Andrew Kay, April 1992
(*for changes since previous version, see end of document*)
What it does:
=============
BASS is a program to produce a bass line, percussion and chords
against which you can jam. There are several uses for this kind of
thing, for example,
@ type in a chord sequence to practise improvising with
(a rhythm section which doesn't get bored)
@ try out your song ideas, quickly
@ listen to chord changes which you can't play yourself
@ home Karaoke player !
@ produce midi files to import into your sequencer
Requirements:
=============
BASS requires
@ a PC compatible computer (there may be timing problems on
older, slower machines).
@ an MPU 401 compatible MIDI interface card at the standard port
addresses (The IRQ number can be reconfigured if necessary)
@ a MIDI synthesiser to hook it up to.
Note that if you use BASS to produce midifiles, then you only need
a PC compatible, without an MPU.
In addition, you need a text editor to enter the sequences. I didn't
include one in the program because I knew you already had an editor,
and didn't want to learn a new one.
Contents:
=========
bass.exe -- executable
bass.doc -- documentation
bass.rc -- sample startup file
*.bss -- sample sequences
The package is distributed in archived form. Please redistribute in
this form.
Author:
=======
Andrew Kay (email to Andrew.Kay@prg.oxford.ac.uk for the moment)
Shareware:
==========
This product must not be sold or resold for profit, other than the
registration fee due to the author. The author retains copyright on
all copies of all versions. The package may be freely distributed, so
long as it remains unmodified and intact, and that the copyright and
shareware notice remains unaltered. The author makes no claims about
the suitability of this software for any particular machine or
purpose. Use it at your own risk.
If you like this product, please show your appreciation by sending 10
pounds sterling (or more!) with your name, address, (email address),
preferred disk format, stating where you found your copy of BASS,
and which version you have, to
Andrew Kay
17 Kenton Park Avenue,
Kenton, Harrow, HA3 8DU
United Kingdom
Acknowledgment:
===============
The code was written using Borland's Turbo C 2.0 and Turbo Debugger
(copyright (C) Borland) with reference to the Voyetra OP-4000/1
technical reference manual. I would like to thank Dave Favis-Mortlock
(of Jupiter Computer Consultants) for encouragement and numerous
suggestions.
===========
QUICK START
===========
First unpack all the files in the archive. I have assumed that your
MPU interface is set to IRQ 2. If not, use a text editor to set the
IRQ number in the file bass.rc (following the \irq line). See the
section on \irq below if you need more help on this. If you get the
wrong IRQ number you will hear either nothing or random noises.
Make sure your synthesiser is switched on and set to recieve midi
data. select a bass sound on channel 1 and a honky tonk piano on
channel 2. From the directory with BASS in it type
bass stlouis
Within a few seconds you should see the chords and hear the rhythm
section for this jolly number. Percussion sounds require a little more
preparation (since I don't know exactly how your synthesiser maps
percussion sounds to note numbers. BASS _can_ do percussion ! See the
section on \setperc below)
If you see and hear nothing, then you may need to reconfigure the IRQ,
or perhaps your card is incompatible or in a strange state. If the
last of these is the case then you will need to power down and reboot
the system. If you see the chords but hear nothing, then the problem
is most likely between the MPU and your ears, a path which includes
the MIDI OUT cable, the synth (check the channels and that MIDI is
being received) and the amplifier.
======
Usage:
======
BASS [-s] [-n] [-c] [-h<hum>] [-f<midifile>]
[-q<cuetime>] [<filename>]
BASS takes commands from the file bass.rc in the current directory,
if one exists, and then from the file specified by <filename>. If the
file is not found, <filename>.bss is tried instead. The commands are
used to produce `live' music via the MPU MIDI interface, or a standard
MIDI file (type 0) with the -f option.
-s read input from standard input, rather than filename
-n don't read the bass.rc file
-c print out a list (on standard output) of all the chord types
recognised by BASS, and then terminate. Each chord type is shown
as it would appear in the key of C, together with the list of
actual notes it would contain in that key. If you have defined
new chords (using \chord, see below), they will appear in the
table.
-h<hum>
This option is the `humaniser' -- it allows a certain random
element to be brought into the performance, both in volume and
timing. hum is an integer from 0 (no effect) to 10 (maximum
effect). The default is 0.
-f<midifile>
With this option BASS writes a MIDI format 0 file. Note that
there is no space between the -f and the file name. You must
include the file extension (usually .mid) if required.
-q<cuetime>
This option controls the printing of lyrics and chord names.
Cuetime can be from 0 to 4, and represents the number of beats
in advance when the lyric or chord is printed. For a cuetime of
0 (the default), the playing and printing is (almost) simul-
taneous. If you want to use the screen as a cue, it can be
helpful to know in advance which chords and lyrics are coming up.
=========
Controls:
=========
You can make the music faster or slower with the up and down arrow
keys. The brackets [ and ] make the music less or more `swingy' (see
\swing, below). ESC (or space) to stop. Question mark (?) prints
current tempo and swing settings. Any other non-function key prints
a brief help list.
========
Details:
========
Commands are stored in the file bass.rc, and in the file specified on
the command line. They should be created with the text editor of your
choice, and stored in ASCII format. Commands in the specified file
override commands in the bass.rc file.
There are several different commands, all starting with '\'. There
must be a single \seq command, containing the chords of the song.
Comments can be enclosed in braces { voila }, and can be made visible
on standard output by putting an asterisk immediately after the open
brace {*encore}. This is useful for documenting sequences as they
compile, for example, to introduce the song title and key. This
feature should not be confused with the lyric facility, which prints
lyrics as the chords play (see the "specifying a chord sequence --
basics" section).
\irq <n>
========
Sets the irq number for the MPU (<n> should be a number between 0 and 7).
The default is 2. If this is set wrongly, odd things may happen. Unless
you know your card is set differently, leave it at 2.
\tempo <t>
==========
Sets tempo to <t> beats per minute. Range is 16...240
\setbass <c> <t> <v> <p>
========================
Sets bass line to midi channel <c>, transposed <t> semitones, velocity
(volume) <v> and midi program number <p>. Defaults are 1, 0, 120, *.
(an asterisk * can be used to select the default value for any field,
or for <p> an entry of * causes no midi program change to be sent).
The ranges are c (1..16), t (-48..48), v (0..127), p (0..127).
\setchords <c> <t> <v> <p>
==========================
The same as \setbass, but functions for the chord section. Defaults
are 2, 0, 100, *.
\setperc <name> <c> <n> <v>
===========================
This command is used to define a named percussion instrument. The name
is a single letter from a to z. The defined instrument is played on
channel <c> with note number <n> and velocity <v>. If v is zero the
instrument makes no sound. Instruments sound when they are called from
a pattern. In the patterns in bass.rc I have assumed that "b" is the
bass drum, "s" is a snare and "h" a high hat cymbal. For this to work
on my Roland D-110 I set it to recieve percussion on channel 9, and
make the following definitions in the "bass.rc" file.
\setperc b 9 35 120 {bass drum, chan 9, note 35, velocity 120}
\setperc s 9 38 120 {snare, chan 9, note 38, velocity 120}
\setperc h 9 42 100 {high hat, chan 9, note 42, velocity 100}
Your synthesiser is most likely different from this. Consult the
manual to find out which sounds are assigned to which note numbers.
\swing <p> <t>
==============
Sets the percentage swing and swing timescale. If t=60 then swing acts
on pairs of quavers (eighth notes), t=120 acts on pairs of crotchets
(quarter notes). A swing of 50% gives a straight beat, 66% gives a
triplet feel, 33% gives a `snap' feel. In general for a pair of notes
of length t ticks, the first takes p% of the total time, and the
second takes (100-p)% of the time. Defaults are p=50, t=120. The
percentage p% can be adjusted during play with the [ and ] keys (but
some notes may be lost).
\seq <sequence>
===============
Define the sequence of chords in the song. The sequence consists of
a list of chords, with information about which patterns to use (see
below), and how long the chords last. The sequence plays until it runs
out of chords, or interrupted by a keypress. More information on how
to specify the sequence is given below.
\pat <n> <d> <definition>
=========================
Define pattern number <n> of duration <d> (cycle time). n ranges from
0 to 50. A pattern is a series of notes based on the current chord in
a chord sequence. When the sequence is playing, the selected pattern
cycles repeatedly until a new pattern is selected. New chords can
begin part way through a pattern. More information on specifying
patterns is given below.
=====================================
Specifying a Chord Sequence -- Basics
=====================================
A chord sequence is just a list of chord symbols. In addition, you can
set the time for which a chord plays, the pattern number it uses,
section repeats and lyrics (or cues) which print as the sequence
plays.
Normal chords are specified like this:
A Bm CM7 C#o Eb7 FmM7 G+ Am6 B79 C9 ...
which represent A major, B minor, C with maj7, C sharp diminished, E
flat major with minor 7, F minor with maj7, G aug, A minor 6, B with
minor 7th and 9th, C with 9th. The complete list of accpetable chords
may be obtained by typing "BASS -c" (from the DOS prompt) or
"BASS -c > chords" to store them in the file "chords". The list may
change between versions. Tonic names should be in capitals (or else
`b' might be mistaken for a flat) but need not be if you put spaces
in appropriate places (ie between chords).
A chord which is just a repetition of the previous chord can be
written as `/'. Note that you must leave space between it and the
previous chord so that it is not confused as a bass note specifier.
A silence (no chord) is written '-' (minus).
Chords are given durations by specifying a time. A time can be
specified in whole beats and in fractions of a beat, where fractions
are given in 120ths and preceded by a backquote (`). For example,
`60 is half a beat, 1 is one beat, 1`60 (or `180) is a beat and a
half.
If a time is given, it is taken to indicate the duration of the
following chords, until another duration appears. For example, in the
sequence 4 A `60 C D, the A chord lasts 4 beats, and the C and D
chords half a beat each.
A pattern is selected by writing p<n> where <n> is the number given
in the definition of the pattern (see below). This affects all
following chords until another pattern is selected. Note that in
general a pattern will not `restart' when the chord changes. To ensure
that a pattern does restart at a particular point, use another pattern
specifier p<n> at that point. For example the sequence p1 A D p3 E
plays chords A and D using pattern number 1, and switches to pattern
number 3 for the E chord.
Repeats are specified by enclosing the section to be repeated in
square brackets, for example
[ C G7 C G7 ] {twice}
plays the section twice. Different numbers of repeats can be specified
using an integer count, written immediately after the open bracket (no
spaces), thus: [4 C G7 ] {four times}. A section will repeat forever
if you write it with an asterisk [* C G7 ]. In this case, if output
is to a file then the section plays twice. Repeats can be nested.
As BASS plays, it prints out the name of the current chord. You can
also make it print out lyrics (or any other text) by placing the text
in double quotes "this is a lyric". The lyric is printed at the same
time as the chord it follows is printed. If the slash (/) character
appears in a lyric, it is printed as a carriage return.
Barlines can be included anywhere you like, written as a vertical bar
(|). Barlines are printed as the sequence plays, and are useful for
keeping track of the beat.
==============================================
Specifying a Chord Sequence -- Advanced Topics
==============================================
(This section can be safely skipped first time through !)
BASS permits chords to be played in any octave. A chord can be
transposed a number of octaves by following the note name with a
series of octave shift characters as follows:
' (single quote) -- up one octave
" (double quote) -- up two octaves
, (comma) -- down one octave
These symbols may be repeated to increase the shift available.
(Normally, chords are set so that C is the C major chord with middle
C as its root. The other unshifted chords have roots above middle C.)
Thus the minor chord with a root of Gb below middle C can be written
Gb,m (or G,bm but not Gbm,).
A bass note can be specified for any chord, eg G#7/E has E in the
bass, rather than the usual G#. If none is specified, the default is
that the tonic is taken to be the bass note. If the bass note occurs
in the chord, the chord is reorganised to reflect this, so that the
bass note appears first in the list of notes (an inversion). You can
prevent inversion on any chord by using \ instead of / before the bass
note. Special chords (as defined below) can be assigned bass notes,
but they are never inverted. Bass notes can also use the octave shift
characters (" ' and ,).
Specifying new chord types
==========================
Should you need a chord that BASS doesn't know about, the \chord
command lets you replace an existing chord in the chord table. Its
syntax is
\chord <new> <old> <definition>
where <new> is the type of the new chord, old is the type of the chord
you will replace, and definition is the sequence of notes in the
chord. Both <new> and <old> require the tonic to be specified (and
they must be the same), so the chord can be defined in whichever key
you find most convenient. The chord names s1, s2, s3 have been left
blank specifically so that you can redefine them. The notes themselves
are either note names or integers representing displacement in
semitones from the tonic. For example, to define a sus4 chord (in
place of s1), you could type
\chord Csus4 Cs1 [C F G]
or \chord Csus4 Cs1 [0 5 7]
If you don't like my definition of an existing chord name, just
redefine it using the same name for <new> and <old>, with your new
definition. \chord definitions must come before the new names are used
in a \pat or \seq section. Use "bass -c" to see the list of chords.
As well as defining new chords using the \chord command, you can
define once only special chords without giving them names. A special
chord consists of a tonic name, and a list of notes in square
brackets. (You can also specify the notes as displacements from the
tonic in semitones). Thus C[C E G] (or C[0 4 7]) is a normal C major
chord, D[D G A C' E'] (or D[0 5 7 10 14]) would be D7 with a 4th
instead of a 3rd. Special chords do not automatically contain the
tonic (but t is still set to the tonic in the \pat section, see
below). If you find you use the same special chord type several times,
give it a name and declare it using \chord.
===================
Specifying Patterns
===================
If you are new to bass, you will probably want to try out some chord
sequences using just the standard patterns in the distributed BASS.RC
file. This section is of use only when you decide to build your own
patterns.
A pattern is defined by specifying which notes to play when, for how
long, and at what volume. Notes are always specified relative to the
current chord, and may be played on the bass channel or on the chord
channel.
The labels a b c d e f g refer to the 1st, 2nd,.. 7th note of the
chord which is playing. Label t is the tonic or the `name' of the
chord. These notes are played on the chords channel. If the chord has
fewer notes than required, higher notes are obtained by transposing
lower notes by octaves. Thus, in a three note chord, `d' is exactly
one octave higher than `a', and `e' is an octave above `b'. In a four
note chord, `d' is the fourth note of the chord, and `e' is an octave
above `a'. If the current chord has no special bass note, then `a' is
the same as `t'.
The label `x' refers to the bass note, and is played on the bass
channel. It is the same note as `t' (tonic), unless the chord has a
special bass note. If the chord has been inverted then `a' is the same
note as `x'. Normally, the bass note sounds an octave lower than the
tonic. Any of t, a, ... h can be forced on to the bass line by
prefixing with x, as in xa, xt etc.
Notes can be transposed by whole octaves using the octave shift
characters (' " ,) as described in the \seq (advanced) section. For
example, a' is an octave above a.
Other notes can be obtained by adding or subtracting a displacement
in semitones, as in x+7 (a fifth above the bass note), t-3 (minor
third below the tonic), x'+7 or x+19 (an octave plus a fifth above the
bass note).
Times are specified in beats and `120ths as in the sequence section
(`basics'). A time on its own defines the duration of the following
notes. The default is 1 beat.
A time following an @ defines the start time of the following notes.
Start times can be negative, to allow an up-beat. This can be
confusing, as it overlaps the previous pattern. Start times do not
have to be input in increasing order, they will be sorted later on.
Notes extending past the end of the current chord are not cut short,
so they might interfere with the next chord. If this happens, define
a special pattern with shorter notes.
The letter v followed by a number defines the percent volume (actually
percent midi velocity) at which the following notes sound. Volume
defaults to 100 percent at the start of each pattern cycle, giving the
midi velocity defined in the \setbass and \setchords sections. a
velocity of 0 percent is silence.
A circumflex (^) followed by a letter indicates a percussion hit.
Percussion instruments are defined using the \setperc command
described earlier. Thus ^b might indicate a thump on the bass drum.
Percussion instruments are affected by the current start time and
volume settings, but do not have a duration.
For example, the following defines pattern number 37 to be an oom-
cha-cha rhythm.
\pat 37 3 { oom cha cha, pattern cycles every 3 beats }
v100 @0 2 x ^b { play the bass note for two beats at start,
with full volume, and thump the bass drum }
v95 @1 1 a b { play tonic and third on 2nd beat }
@2 a b c a' ^s { huge chord + snare on third beat }
Note that if the input were a 7 chord, the 7th would never be played
by this pattern (normally the 7th is in label 'd'). It is a good idea
to keep frequently used patterns in the BASS.RC file, with descrip-
tions(!).
Patterns can contain conditional sections which are only played on
certain types of chord, and random conditionals to add variety to a
single pattern. The basic structure of a conditional is one of the
following, where `c' represents a condition, and `p' a pattern
definition.
< (c1) p1 > do p1 only if c1 is true.
< (c1) p1 ~ p2 > do p1 if c1 is true, otherwise p2.
< (c1) p1 ~ (c2) p2 > do p1 if c1 is true, otherwise do p2 if c2
is true, otherwise do nothing.
< (c1) p1 ~ (c2) p2 ~ (c3) p3 ~ .... >
you should have the idea by now.
The p sections can contain any of the things that can occur in a
pattern definition, including nested conditionals.
Conditionals consist of one or more of clauses, separated by a
vertical bar (|). The clauses are tested in order, and if any are
true, the condition succeeds.
Clauses are built out of the following sorts of test.
z z tests for a certain type of chord. So z6b9 matches any 6b9
chord, z (followed by a space) matches a normal major chord etc.
z[] will match any special chord.
# # tests match chords with particular numbers of notes. #>3
matches a chord with more than 3 notes, #<3 with fewer than 3
notes, #=3 (or just #3) with exactly 3 notes.
p p followed by an integer is a probability test. p50 succeeds with
a probability of 50% (that is, one half). There can be only one
p test in a single clause.
If there is more than one test of a single type, the test succeeds if
any of them match. If there are tests of different types, the clause
succeeds if at least one of each type succeeds.
For example, the clause p50z[]#>4#=1 succeeds on any special chord
with more than 4 or exactly 1 note, with probability one half.
=======
Example
=======
As an example of a simple pattern, here is a verison of St. Louis
Blues:
{*St. Louis Blues in F major, 4/4}
\pat 0 2 { bass+swing quavers }
1 @0 x a b c d
`60 @1 a b c d
`30 @1`90 a b c d
\pat 1 1 { single crash, cut short }
1 @0 x a b c d
\tempo 100
\seq [* {repeat forever}
"section A/" p0 4 F B-7 F F7 B-7 / F / C7 / F 120 p1 F C7 F C7
"section B/" p0 4 Fm / C7 / / / Fm / / / C7 / / / 2 Fm G7 C7 /
"section C/" p0 4 F / / F7 B-7 / F / C7 / 240 F C7 1 p1 F - -
]
Future Ideas:
=============
@) Other sorts of sync -- probably midi-sync
@) More run-time control
@) More looping constructs
@) leadin
@) better screen output
@) more pattern programming features, nicer syntax
@) more standard patterns
@) recoding critical sections in assembler
...
(If you have some more ideas, I should be pleased to hear from
you, but don't expect miracles because BASS is a spare time
activity)
Bugs:
=====
@) Sometimes notes are left sounding on exit.
@) Identical overlapping notes lead to anomolies.
@) Swingtime is a hack
@) On slower computers, BASS may freeze up if too much data is
being processed at once. The problem can be alleviated by setting
the swing percentage to exactly 50%, although of course you lose
the swing effect. I may solve the problem in the future by
recoding some of the critical parts in assembler, but don't hold
your breath.
Changes since Version 1.0:
==========================
@) rewritten, improved parser, better error detection
@) conditional & randomised pattern constructs
@) support for lyrics, cues and chord name printout
@) user definable chords
@) chord table display
@) removed pattern visualiser (no longer appropriate for the more
complex pattern structure)
@) mechanism for forcing any note onto the bass line
since V2.0:
@) fixed chord name bug for chords with bass notes
@) enharmonic notes distinguished
@) added instant swing feel
@) velocity control
@) added humaniser
@) ctrl-break and dos fatal error handlers
@) midi file support added
@) percussion added
@) daft IRQ restriction removed
====================================================================