home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol056
/
prog3.doc
< prev
next >
Wrap
Text File
|
1984-04-29
|
19KB
|
608 lines
{j:a
{m:1=10,75
{m:2=18,75
{m:3=24,75
{m:4=50,75
{m:1
IV.C. COMP
IV.C.1. Command Sequence
A>^^COMP^songname^(press^return)
IV.C.2. Discussion
COMP is a two pass compiler intended to permit the forward label
reference facility required to support the chorus and repeat
functions. In the first pass,
COMP loads the song into main memory while recording each label as
it is encountered. On the second pass, COMP translates song lines into
the numerical values required by PLAY. The translation process uses
the information provided by SETUP to make allowances for CPU type
and clock speed. Also, the information in the option lines is translated
into numerical form to provide the controls needed during PLAY. The
compiled information is written as it is generated to a new song
file with the same name as the source song but with a type of .SCD.
As each line is compiled, COMP prints an indication on the CRT. Each
option line is displayed along with the line number and each song
line is represented with a period. When an error occurs, the bell is
sounded (if your terminal has a bell), and an error message is
displayed along with the line number of the line containing the error.
A list of compiler errors is provided in Appendix B.
IV.D. WAVE
IV.D.1. Command Sequence
A>^^WAVE^(press^return)
IV.D.2. Introduction
WAVE allows you to build a wide variety of waveforms.
Sound is created by Musicraft by sending a sequence of numbers to
a digital to analog convertor. The rate at which this is done is what
determines the pitch of the resulting sound. The sequence of numbers
chosen is called the waveform and determines the color or timbre of
the sound. In Musicraft, a
short sequence of numbers is stored on a floppy disk file and later
retrieved by PLAY when you name that sequence as a waveform table.
The sequence is used repeatedly to create the sound.
The primary method used by WAVE for building waveforms is the
method called the Fourier synthesis technique. Fourier decided
that periodic waveforms such as those encountered in sound could
be constructed with combinations of sine waves. A sine wave is a very
"pure" sound to our ear and soon becomes boring to listen to. But
when several related sine waves are mixed, the resulting sounds
become more interesting. There is extensive literature available
on Fourier synthesis and you can certainly learn a great deal by
studying the subject. But at least initially you can gain a good
deal of intuitive knowledge just by playing with WAVE, creating
many waveforms and playing songs with different waveforms to
compare their sound colors.
Let's take a look at some common waveforms using WAVE to construct
them. Under the several headings below are dialogs you can
use to build waveforms.
IV.D.3. The Fundamental
The Fourier method uses waveforms called the fundamental and its
related harmonic waveforms. WAVE treats the fundamental (called the
first harmonic in the dialog) as the root waveform. All the harmonics
are sine waves but, as we will see, when they are combined, waveforms
of very different shapes can be constructed. (Strictly speaking,
waveforms are combined by adding corresponding instantaneous amplitudes
of all the harmonics participating in the waveform.)
A>^^WAVE^(press^return)
(waveform table filename request)
{m:4
{i:-40
^^^^SINE^(press^return)
This becomes
the name of a small file
on diskette which will contain
the numerical information
describing the waveform.
{i:-40
(Fourier^prompt)
{i:-40
^^^^1,0^(press^return)
This entry
describes the relative
amplitude of the first
harmonic to be present in
the waveform.
{i:-40
^^^^(press^return)
This terminates
the specification process
to include on the first
harmonic.
{m:1
WAVE constructs the waveform...a sine wave...and draws
it on the CRT for your observation. When the waveform is complete,
WAVE writes the data to the waveform file you specified earlier...
in this case SINE.WAV.
The waveform table contains one full wavelength of the first
harmonic, or fundamental. Try playing one of the songs on the diskette
using the SINE file when PLAY asks you to specify a waveform.
After you have tried this, come back and we will find out about
another harmonic.
IV.D.4. The Second Harmonic
The second harmonic has a pitch which is one octave above that of
the fundamental. This dialog constructs the second harmonic in
isolation from the other harmonics (also the fundamental) so that
you can hear the effect when you play a song using it.
A>^^WAVE^(press^return)
(waveform table filename request)
^^^^HARM2^(press^return)
(Fourier prompt)
{m:4
{i:-40
^^^^0,0^(press^return)
This sets
the amplitude of the first
harmonic to zero so that it
does not contribute to the
final waveform.
{i:-40
^^^^1,0^(press^return)
This sets the
relative amplitude of the
second harmonic.
{i:-40
^^^^(press^return)
This terminates
the specification of the
waveform.
{m:1
WAVE constructs the waveform. When the waveform is complete,
WAVE writes the data to HARM2.WAV. Note that the waveform
drawn on your CRT contained two complete wavelengths instead
of one as in the case of SINE above. This is the graphic relation
between a note and another note one octave above it. Play a
song using HARM2 for your waveform table and observe the difference
in the sound.
{a:p=1
IV.D.5. The Square Wave
You can easily experiment with other harmonics, the third, the fourth
and so on, isolating one at a time. But we now move to constructing a
square wave. This will involve combining several harmonics with varying
amplitudes as we will see.
A>^^WAVE^(press^return)
(waveform table filename request)
^^^^SQUARE^(press^return)
(Fourier prompt)
{m:4
{i:-40
^^^^100,0^(press^return)
We are combining
several harmonics, and the first
harmonic will have the largest
relative amplitude.
{i:-40
^^^^0,0^(press^return)
Only the odd
numbered harmonics are involved
in the construction of a square
wave.
{i:-40
^^^^33,0^(press^return)
The relative
amplitude of each harmonic is
equal to 100 divided by the
order of the harmonic. This
is number three.
{i:-40
^^^^0,0^(press^return)
{i:-40
^^^^20,0^(press^return)
100 divided
by 5.
{i:-40
^^^^0,0^(press^return)
{i:-40
^^^^14,0^(press^return)
100 divided
by 7.
{i:-40
^^^^(press^return)
This terminates
the specification.
{m:1
WAVE constructs the waveform. When the waveform is complete,
WAVE writes the data to the file called SQUARE.
Note that the waveform drawn is not quite as square as you might have
expected. If additional harmonics are included in the constructed
waveform
(we only used the first seven harmonics), the shape would become more
exact. But the sound quality of the waveform would deterioriate
(in the higher pitches particularly) due to the limited speed of the
CPU which would begin to cause extraneous non-harmonic artifacts due
to its sampling rate.
Try building square wave tables using fewer or more harmonics. Observe
the effect each additional harmonic has on the shape and the sound
color of the waveform when used to play music.
IV.D.6. Additional Waveforms
Two additional waveforms which are useful for music are the ramp
(or sawtooth) and the triangle waveforms. These are somewhat more
complex than the square wave and involve "phase shifting" some
of the harmonics. Phase shifting refers to the point where, within
the one wavelength of the fundamental, the harmonic waveform crosses
zero (the vertical dividing line on the screen).
If one full wavelength of the fundamental is counted as 360
degrees from end to end, the phase shift of a harmonic may be
represented as any value from zero degrees to 359 degrees.
The first waveform described here is the sawtooth. It is comprised
of all harmonics in increasingly smaller relative amplitudes.
Additionally, all the even harmonics are shifted 180 degrees. To
construct a sowtooth waveform, the harmonic
entries should be entered as in the table below:
{l: harmonic entry (followed by a return)
{l: 1 100,0
{l: 2 50,180
{l: 3 33,0
{l: 4 25,180
{l: 5 20,0
{l: 6 16,180
{l: 7 14,0
{l: etc...
The triangle waveform is somewhat more complicated; it seems to
combine properties of both the square wave and the sawtooth. It
is related to the square wave in that it contains only odd harmonics.
But the triangle waveform also requires phase shifting of some
harmonics as does the sawtooth. The triangle waveform entries should
be entered as in the table below:
{l: harmonic entry (followed by a return)
{l: 1 100,0
{l: 2 0,0
{l: 3 11,180
{l: 4 0,0
{l: 5 4,0
{l: 6 0,0
{l: 7 2,180
{l: etc...
Experiment with the construction of these waveforms by first using
only the first two harmonics, then adding an additional harmonic,
then adding another and so on. You can watch the
characteristic shapes take form and can hear this process as well.
With WAVE and PLAY, you have a complete laboratory to experiment with
sound. Don't limit yourself to the waveforms discussed above. Experiment
with the use of the relative amplitudes and phase shifting capabilities
of WAVE and listen to the results with PLAY. You will soon build a
catalog of useful waveforms.
IV.E. PLAY
IV.E.1. Command Sequence
A>^^PLAY^songname^(press^return)
or
A>^^PLAY^(press^return)
IV.E.2. Song Load
Using the first command sequence allows you to obtain one song and
place it in the play area for performance. After loading the song,
PLAY proceeds to the waveform loading sequence.
Using the second sequence
allows you to obtain several songs and place them one after the other
in the play area. When you have obtained all the songs you wish to
load, press the carriage return key without a song name and PLAY will
terminate the song loading sequence.
IV.E.3. Waveform Table Load
After the song (or songs) have been loaded, PLAY
requests the names of the waveform files you wish to use to fill the
tables identified by the waveform
option lines found in the song(s). You enter each waveform file name
as it is requested and PLAY obtains it and places it in the waveform
table area in main memory. PLAY has room for 14 waveform tables.
Notice that a distinction is being drawn here between a "waveform
file" and a "waveform table". Namely, a waveform file is a file on a
diskette containing a waveform which you built using WAVE. A waveform
table is an area in PLAY in which you can store the contents of a
waveform file for use in playing a song. You specify waveform tables
using the Waveform option line in EDIT. You specify which file fills
which table in PLAY.
There are three additional responses that you can make
which are recognized
by PLAY when loading waveform tables:
{m:2
{i:-8
1.
"0" (a zero)
{i:-8
2.
an integer between 1 and 14
{i:-8
3.
an asterisk ("*")
{m:1
A zero specifies that the table is to be set to zero and is to
contribute no sound to the playing of a song.
An integer (between 1 and 14) specifies that the table identified
by the request is to be
copied from the table specified by your integer input.
Usually, the table you specify in this way has been previously filled
in some of the acceptable methods described here. If you specify a
table that has not been previously filled, the table will probably be
a sequence of random numbers (ie., noise)
An asterisk specifies that the table is to be left as it was
previously filled. Again, if you do not previously fill a waveform
table, this option will probably contribute a lot of noise to your
song and not much music.
Example:
For this example, if you have not already compiled the two song files
provided on your system diskette under the names of INVENT4 and
INVENT8, use the following dialog to do so.
A>^^COMP^INVENT4^(press^return)
After INVENT4 has been compiled then...
A>^^COMP^INVENT8^(press^return)
Now continue with the following dialog:
{m:4
{i:-40
A>^^PLAY^(press^return)
This requests
the second song load option
described above.
{m:1
Please enter name of song 1 >
{m:4
{i:-40
^^^^INVENT1^(press^return)
This loads the
first invention.
{m:1
Please enter name of song 2 >
{m:4
{i:-40
^^^^INVENT4^(press^return)
This loads the
fourth invention.
{m:1
Please enter name of song 3 >
{m:4
{i:-40
^^^^INVENT8^(press^return)
This loads the
eighth invention.
{m:1
Please enter name of song 4 >
{m:4
{i:-40
^^^^(press^return)
This terminates
the song loading sequence.
{m:1
Please enter name of waveform table 1 >
{m:4
{i:-40
^^^^WAVE^(press^return)
This loads the
waveform file provided on the
diskette.)
{m:1
(Note: because none of the songs you loaded explicitly request a waveform
table, PLAY assigns waveform table 1 as a default.)
PLAY now performs all three of the inventions, one following the
other without further intervention on your part.
This form of the song load sequence has some restrictions which you
should be careful to follow. Don't attempt to play songs of different
numbers of
voices within the same song load sequence. PLAY must scale the
waveform tables according to the number of voices in the song in
order not to overload the bit width of the DAC. Also, PLAY does not permit
voice change as the song in memory is performed since PLAY cannot
maintain control when various functions are used in the song.
IV.E.4. Continuation
Upon completion of the performance, PLAY displays a menu to
allow several possible continuations.
{l: Type a...
{l: 1 to load a new song
{l: 2 to repeat the current song
{l: 3 to load new waveform tables
{l: 4 to return to the system
{l: ...>
A single digit response will continue PLAY in the mode of your
choice. Any value not equal to 1, 2 or 3 is taken as 4 (1, 2, 3,
many).
IV.E.5. Interaction
It is quite all right to sit back and listen to the products of your
labors when PLAY is in operation. But you can still exert control
over the performance of your music. PLAY permits two kinds of
interaction during actual performance of the music.
{m:2
{i:-8
1.
Rehearsal or practice mode
{i:-8
2.
Modified performance mode.
{m:1
IV.E.5.a. Rehearsal Mode
PLAY can be used to fill in the other voices when you want to
practice an instrument. To make this easier, PLAY will allow you to
request a new pickup point at any time while it is performing the
music if you include measure markers (M_option lines) when you enter
the song with EDIT. Whenever you need to stop the performance, press
the carriage return key. When PLAY reaches a M_option line in the
song, it will then request that you enter the measure number matching
the desired pickup point. Enter that number followed by a carriage
return. PLAY will find the new measure and then wait several seconds
and then begin performaing at the measure you requested.
In order to play a song with a single voice missing, make sure that
the voice you wish to practice is assigned a separate waveform using
the Waveform option function in EDIT. When you are requested to
identify
the waveform file to load that waveform table, answer with "0" (a
zero). This will cause the table to be set to empty and no sound will
be generated for that voice.
IV.E.5.b. Modified Performance Mode
While performing music, whenever PLAY encounters a Repeat option
line, PLAY checks to see if any key has been pressed on the keyboard.
If one has, PLAY examines a table of the Label option lines that it
found as it loaded the song. Each label has a character associated
with it called the Label Key. If you pressed a key matching a label
key, the song segment following the label will be performed. When the
next repeat option line is encountered, the above procedure is
repeated. This feature allows you to perform music with you in an
active capacity. To use this feature, you must assign unique
keys (on your CRT keyboard) to labels when you edit the song.
Read the section describing
the Label option in both OPTION LINE DESCRIPTIONS and
the Options_mode description of EDIT above.
Example:
Suppose you had entered a song having the following form:
{l: *L REST R
{l: (a rest in all voices)
{l: *R REST 255
{l: *L PARTA A
{l: (song segment A)
{l: *R PARTA 255
{l: *L PARTB B
{l: (song segment B)
{l: *R PARTB 255
{l: *L PARTC C
{l: (song segment C)
{l: *R PARTC 255
{l: *L PARTD D
{l: (song segment D)
{l: *R PARTD 255
{l: *L PARTX X
{l: *X
This piece has a rest part, four sound making parts, and an exit
part. Suppose the piece is called SONG.
A>^^PLAY^SONG^(press^return)
Please enter name of waveform table 1 >
{m:4
{i:-40
^^^^WAVE^(press^return)
Or whatever
waveform file(s) you want.
{m:1
The piece begins to play. The first thing encountered is a repeated
rest. If you do not strike a key for a period of time, you will hear
nothing. If you wait too long, the Repeat will be played out and PLAY
will continue down to the next segment. Instead, press the letter C. PLAY
will automatically begin performing
segment C. If, again, you do not press any key for awhile, PLAY will
repeat segment C for up to 255 times or until you finally do press a
key. If you press any key other than the defined ones, PLAY
automatically begins at the beginning of the piece which means, in
this example, you will hear nothing. Press the letter A. PLAY now
performs segment A. You get the idea?
Only the keys actually assigned
as Label Keys will operate to select song segments. Any other key
(except carriage return since that is used for the rehearsal mode)
will cause PLAY to begin playing the song from the top.
You can use this technique to implement a simple melody organ, a
chord organ; you can even use it as a programmable
instrument in a rock band. You can put any musical idea into a song
segment and perform it at any time you would like. There are a lot
of possibilities.
{a:p=1