!0.......^.........^.........^..
!B
\H11\H07\H10\H00           TUNING UP!           

!2.......^.........^.........^.........^.........^.........^....
 ZX Spectrums may not be the most musical of micros ... but, if
you're like Chris Somerville, you're not exactly a Beethoven in
   the making anyway! So, compose yourself for the musically
            illiterate's guide to writing music ...
!1.......^.........^.........^.........^........

Apart  from  enhancing  the variety of zaps  and
zings  which  accompany alien annihilation,  the
Spectrum   BEEP   commands  can  be  used  quite
effectively to produce simple tunes and jingles;
witness  the somewhat over-used 'Funeral  March'
that   signifies   failure  in  many  commercial
programs.
  Of  course,  you  could  always call  suitable
snippets of music from sheet music for your  own
programs  - these are often available for a  few
pence from a local secondhand bookshop. But this
is   where  the  catch  comes  in!  The  musical
notation has to be translated into the numerical
pitch  and tempo required by the Spectrum.  Fine
if you can read music, especially as a number of
commercial   programs   allow  you  to  use  the
Spectrum as a sort of piano keyboard. But if you
can't read music ...

!0.......^.........^.........^..
!B
NOTA BENE
!1.......^.........^.........^.........^........
Very few programmers can claim to be  conversant
with  musical  notation  but  anyone  could,  by
laboriously counting lines and spaces, work  out
the   individual   notes.  This  program  allows
leisurely  entry  of  each  note  as  a  musical
letter,  followed  by  a  number to signify  the
duration of that note. You can even indicate the
use of a sharp or flat!
  Musical notation generally conveys two  pieces
of information: the pitch of each sound and  how
long  it  should  last.  Although  it  may  look
confusing  it's  really  not  that difficult  to
translate.
  The  pitch of a note is shown by its  position
on a stave, which is a row of five lines;  notes
can be placed on a line, or in the space between
two lines. Take a look at the diagrams  provided
and you should be able to figure out which  note
is  which in most any sheet music you can  find.
Of course, there are one or two things to  watch
out  for. For example, to make a note higher  or
lower,   you'll   find  that  the  composer  has
introduced   a   sharp   (#)   or   a  flat  (\H91)
respectively. If these symbols appear next to an
individual   note,   then  it  must  be  altered
appropriately;  if,  however, the sharp or  flat
symbol  appears  at  the  very beginning of  the
stave, all the notes on that particular line, or
in  the  space,  should be altered. You'll  also
find that there are a number of different shaped
notes,   each  offering  varying  length  notes;
there's  a  separate  diagram  showing  all  the
musical notation you'll need to master.
  Unfortunately,  this  program can't deal  with
musical  pauses. However, these can be  included
as  PAUSE commands in between the BEEP  commands
when you transcribe the program for future  use.
Since the PAUSE command works in fiftieths of  a
second, its duration number can't be in the same
range  as used for BEEP. However, provided  with
this  article  you'll find a table  illustrating
the   various   musical  rest  symbols  and  the
corresponding PAUSE duration.
  Most music is written within two sets of  five
lines - the upper stave carrying the melody  and
the  lower  stave containing the  accompaniment.
Since  the Spectrum can only cope with one  note
at a time (Unless you're Sandy White, of course!
Ed.)  you'd  be  best advised to stick with  the
melody only.

!0.......^.........^.........^..
!B
ON A FINAL NOTE
!1.......^.........^.........^.........^........
Anyone  who's  had  any formal musical  training
will probably be experiencing an extreme case of
the vapours by now. Yes, I know it's cheating  -
but      for      readers      who      want  to
'SingalongaSpectrum',  well, this could be  your
only chance. Armed with this program and the "oh
so brief" guide to reading music, you should  be
able to transcribe any sheet music.
  A  word  of  advice  though; before you  start
converting  Beethoven's Fifth for the  Spectrum,
don't  be tempted to add too much sound to  your
program - generally a recognisable snippet  will
do.  You  only need to set the scene and  you'll
find that a five second blast of an old familiar
tune  will be a lot more successful than a  long
tune that keeps repeating.

!0.......^.........^.........^..
!B
THE ART OF NOISE!               
!2.......^.........^.........^.........^.........^.........^....
Once you've RUN Chris' Music Writer program, you're greeted with
a  menu  offering  eight options: to create a tune, to play  the
tune  back  through the Spectrum, to raise/lower the octave,  to
increase/decrease the tempo, to print out the data for the tune,
and  to  reset the octave/tempo. So, let's take it from the  top
and transcribe a tune ...
!SYR12_231
!SYR12_232
!SYR12_233

!0.......^.........^.........^..
!B
  10 RESTORE
  20 DATA 0,56,68,130,68,56,0,0
  30 DATA 8,8,8,56,72,136,144,96
  40 DATA 8,8,8,56,120,248,240,9
6
  50 DATA 14,8,8,56,120,248,240,
96
  60 DATA 14,8,14,56,120,248,240
,96
  70 FOR i=USR "A" TO USR "E"+7:
 READ c: POKE i,c: NEXT i
!2.......^.........^.........^.........^.........^.........^....
Lines 10-70      Set up the graphics for the program.

!0.......^.........^.........^..
  80 LET oct=0: LET tempo=16
  90 DATA "a%","a ","a#","b%","b
","c","c#","d%","d","d#","e%","e
","f","f#","g%","g","g#"
 100 DATA -4,-3,-2,-2,-1,0,1,1,2
,3,3,4,5,6,6,7,8
 110 DATA "A%","A","A#","B%","B"
,"C","C#","D%","D","D#","E%","E"
,"F","F#","G%","G","G#"
 120 DATA 8,9,10,10,11,12,13,13,
14,15,15,16,17,18,18,19,20
 130 DIM a$(34,2): DIM a(34)
 140 FOR i=1 TO 17: READ a$(i):
NEXT i
 150 FOR i=1 TO 17: READ a(i): N
EXT i
 160 FOR i=18 TO 34: READ a$(i):
 NEXT i
 170 FOR i=18 TO 34: READ a(i):
NEXT i
 180 GO TO 500
!2.......^.........^.........^.........^.........^.........^....
Lines 80-180     Initialise the variables.

!0.......^.........^.........^..
 200 CLS : PRINT '"  YOU CAN ENT
ER NOTES WITHIN             TWO
OCTAVES": PRINT '"  a b c d e f
g A B C D E F G"
 210 PRINT '" Enter each note as
 a letter,    which may be follo
wed by:       # for Sharp or % f
or Flat": PRINT '" After each no
te you will be     asked to ente
r the note length  which should 
be a number:": PRINT '"    1    
 2     4     8     16      e    
 d     c     b      a"
 220  PRINT ''" When all notes h
ave been        entered you shou
ld enter ""end"""
 230 LET n$="": LET t$=""
 240 INPUT "NOTE or END";i$: IF
i$="" THEN  GO TO 240
 250 IF i$="end" OR i$="END" THE
N  GO TO 370
 260 IF LEN i$=2 THEN  IF i$(2)<
>"%" AND i$(2)<>"#" THEN  BEEP .
5,-5: GO TO 240
 270 IF CODE i$<65 OR CODE i$>71
 AND CODE i$<97 OR CODE i$>103 T
HEN  BEEP .5,-5: GO TO 240
 280 IF i$="b#" OR i$="c%" OR i$
="e#" OR i$="f%" THEN  BEEP .5,-
5: GO TO 240
 290 IF i$="B#" OR i$="C%" OR i$
="E#" OR i$="F%" THEN  BEEP .5,-
5: GO TO 240
 300 BEEP .1,19: BEEP .1,12
 310 INPUT "LENGTH OF NOTE";j$:
IF j$="" THEN  GO TO 310
 320 IF CODE j$<49 OR CODE j$>59
 THEN  BEEP .5,-5: GO TO 310
 330 BEEP .1,19: BEEP .1,12
 340 IF LEN i$=1 THEN  LET i$=i$
+" "
 350 IF LEN j$=1 THEN  LET j$="0
"+j$
 360 LET t$=t$+j$: LET n$=n$+i$:
 GO TO 240
 370 CLS : PRINT AT 10,10; FLASH
1;"PLEASE WAIT": LET t$=t$+" "
 380 LET p$="": FOR i=1 TO LEN n
$ STEP 2: FOR j=1 TO 34: IF n$(i
 TO i+1)<>a$(j) THEN  NEXT j
 390 LET k$=STR$ a(j): IF LEN k$
=1 THEN  LET k$="+"+k$
 400 LET p$=p$+k$+t$( TO 2): LET
 t$=t$(3 TO )
 410 NEXT i
 420 LET q$=""
 430 FOR i=1 TO LEN p$
 440 LET q$=q$+p$(i): NEXT i
 450 RETURN
!2.......^.........^.........^.........^.........^.........^....
Lines 200-450    Comprise the input subroutine. Full
                 instructions for the input of the musical data
                 are provided as on-screen instructions.

!0.......^.........^.........^..
 470 FOR i=1 TO (LEN q$)-3 STEP
4
 480 LET d=VAL q$(i+2 TO i+3): L
ET p=VAL q$(i TO i+1): BEEP d/te
mpo,p+oct
 490 NEXT i: RETURN
!2.......^.........^.........^.........^.........^.........^....
Lines 470-490    This routine plays back the tune you've input.

!0.......^.........^.........^..
 510 CLS : PRINT "              
MENU                            
"
 520 PRINT '" 1)  ENTER A TUNE"
 530 PRINT '" 2)  PLAY A TUNE"
 540 PRINT '" 3)  PLAY AN OCTAVE
 HIGHER"
 550 PRINT '" 4)  PLAY AN OCTAVE
 LOWER"
 560 PRINT '" 5)  INCREASE TEMPO
"
 570 PRINT '" 6)  DECREASE TEMPO
"
 580 PRINT '" 7)  PRINT DATA"
 590 PRINT '" 8)  RESET OCTAVE &
 TEMPO"
 600 IF INKEY$<>"" THEN  GO TO 6
00
 610 LET i$=INKEY$: IF i$="" THE
N  GO TO 610
 620 IF CODE i$<49 OR CODE i$>56
 THEN  GO TO 600
 630 IF i$="8" THEN  LET tempo=1
6: LET oct=0: GO TO 500
 640 GO SUB (190 AND i$="1")+(46
0 AND i$="2")+(660 AND i$="3")+(
670 AND i$="4")+(680 AND i$="5")
+(690 AND i$="6")+(700 AND i$="7
")
 650 CLS : GO TO 510
!2.......^.........^.........^.........^.........^.........^....
Lines 510-650    Provide the on-screen menu of eight options
                 you're greeted with once you've booted the 
                 program. Choose an option and this routine will
                 send the program flow to the subroutines in 
                 lines 660-800.

!0.......^.........^.........^..
 660 LET oct=oct+(12 AND oct<=49
): GO SUB 470: RETURN
 670 LET oct=oct-(12 AND oct>=-3
3): GO SUB 470: RETURN
 680 LET tempo=tempo+2: GO SUB 4
70: RETURN
 690 LET tempo=tempo-1 AND tempo
>1: GO SUB 470: RETURN
 700 CLS : FOR i=1 TO LEN q$-3 S
TEP 4
 710 LET d=VAL q$(i+2 TO i+3): L
ET p=VAL q$(i TO i+1): PRINT "BE
EP ";d/tempo;",";p+oct;":";
 720 IF PEEK 23689=4 THEN  GO SU
B 750
 730 NEXT i
 740 GO SUB 750: RETURN
 750 PRINT AT 21,0;" SEND TO PRI
NTER Y(yes) N(no)"
 760 IF INKEY$<>"" THEN  GO TO 7
60
 770 LET i$=INKEY$: IF i$="" THE
N  GO TO 770
 780 IF i$="y" OR i$="Y" THEN  C
OPY : CLS : RETURN
 790 POKE 23692,255: RETURN
 800 SAVE "music" LINE 10
!2.......^.........^.........^.........^.........^.........^....
Lines 660-800    Contain the subroutines for the options
                 available on the menu screen.
!1.......^.........^.........^.........^........
!B

--
from Your Spectrum #12 (Mar.1985)
--
!$
