!0.......^.........^.........^..
!B
\H11\H07\H10\H00       PLAY IT AGAIN, SAM       

!2.......^.........^.........^.........^.........^.........^....
A big noise in programming, Tony Samuels, has composed a zippa-
  de-do-da of a music package that'll set your Speccy buzzin'.
             You're not going to believe your ears!
!1.......^.........^.........^.........^........

OK,  I've  got  to  admit that the Speccy's  not
exactly famed for its outstanding sound  facili-
ties.  But  I've  just about had it up to  here,
what with Commie 64 owners (Wash your mouth out!
Ed.)  shunning  my  Speccy's burping sounds  and
Amstrad owners laughing at its chesty cough. So,
to  turn the tables on them all, I've written  a
program  that'll  transform the Speccy's  humble
BEEP  statements  into  the  most mega-  amazing
music  you've ever heard a machine utter.  Well,
I'd rather listen to it than to an Amstrad hi-fi
system let alone one of their crummy  computers!
(You tell 'em, Tone! Ed.)
  What we have here is a program that'll replace
the boring bip, bip, bip of the BEEP with a full
warp effect. It really does produce  synthesised
sound! It works by using two sawtooth  waveforms
in anti-phase with each other - and though  even
I  don't  really understand what that means,  it
doesn't  half  impress  those thicko 64  owners.
Still, the mechanics aren't important - all  you
need to know is how to construct data statements
for  the  BEEP  command  using  length  of  note
followed  by  pitch of note. Just remember  that
this  program  outclasses  the  sound system  in
professional  Speccy  software  and now you  can
include  it  in  your  own  programs. Roll  over
Beethoven!

!0.......^.........^.........^..
!B
SOUND TRACKIN'
!1.......^.........^.........^.........^........
Now the first thing you'll presumably want to do
is  start  using  synthesised tunes in your  own
programs, so here goes. First enter and  synthe-
sise  a  tune  using  Samsynth.  Then  save  the
compiled tune and write down the number of bytes
used  and  how many notes there are in it.  Next
load  in  the synthesiser routine using LOAD  ""
CODE  - the routine is 270 bytes long and  loads
at location 64750. Right, now load in the  comp-
iled  tune  code  at an address of your  choice,
remembering,  of  course, to clear enough  space
using the CLEAR command. To play your tune is as
simple  as  POKEing the number of notes and  the
start address of the tune code into the  synthe-
siser routine and typing RANDOMIZE USR 64750.
  Now, don't panic if you haven't quite got  all
that  'cos  I'm going to run through it using  a
concrete example. Load in Samsynth and then mess
about  with the tune until it's playing to  your
tastes. And before you ask, no, I'm not going to
tell  you  what the tune is - you'll only  solve
that mystery by typing the program! Right,  done
that?  Now  save it using option I. Load in  the
synthesiser routine and clear enough memory for
it:
!3.......^.........^.........^.........^..
CLEAR 61999: LOAD "" CODE
!1.......^.........^.........^.........^........
Now load in the tune code - and don't forget to
specify an address:
!3.......^.........^.........^.........^..
LOAD "" CODE 62000
!1.......^.........^.........^.........^........
OK, let's put the show on the road:
!3.......^.........^.........^.........^..
LET addrs=62000: POKE 64758,addrs-256*INT 
(addrs/256): POKE 64759,INT (addrs/256):
LET notes=137: POKE 64756,notes-256*INT
(notes/256): POKE 64757,INT (notes/256)
!1.......^.........^.........^.........^........
Finally, pin 'em back and play the tune with:
!3.......^.........^.........^.........^..
RANDOMIZE USR 64750

!0.......^.........^.........^..
!B
!P\H11\H07\H10\H00\H13\H00
GET NOTED!
!2.......^.........^.........^.........^.........^.........^....
Unless you're a budding Beethoven, you're going to want to add a
touch of class to your programs using tried and tested pieces of
music.  Well,  it's  quite  possible  to transfer anything  from
Dvorak  to  Duran Duran using Samsynth, provided you've got  the
sheet music in front of you. And what's more, you don't have  to
read a note of music - though it'll help!
  First, you must learn to recognise the comparative lengths  of
each note and be able to work out their pitches. Take a look  at
the  illustration  below  - it'll help you to work out the  data
statements for transcribing almost any piece of music.  Remember
that  they  take  the form, length of note followed by pitch  of
note.  You'll  also have to watch out for sharp (#) notes  which
raise  the  pitch  by  a  value  of one and flat (\H91) notes  that
decrease it by the same amount.
!SYR20_251

Now take a look at this snatch of our mystery tune and  practise
turning the notes here into data statements. With a bit of trial
and  error, you should soon have it cracked and you can move  on
to the music of your choice.
!SYR20_252
!SYR20_253
!0.......^.........^.........^..
!B

!P\H11\H07\H10\H00\H13\H00
MUSICAL MENU
!1.......^.........^.........^.........^........
!P\H11\H07\H10\H00\H13\H00
Here are the full details of all the options
offered to you on the menu.
!2.......^.........^.........^.........^.........^.........^....
S  Lets you change the speed that the synthesised tune is
   played at.
A  Compiles the BEEP values in the data statements into a form
   that can be used by the synthesiser routine.
W  Lets you change the wave length and depth values. These 
   really determine the synthesised sound effects that the 
   routine can produce.
P  This is the play option. You'll find that certain wave-
   lengths and depths will cause a clicking sound - when this
   happens just return to the menu and change the values.
C  Now you can really drive 'em up the wall. This option plays
   the tune over and over and over ...
I  You'll find this the most important option when you come
   to incorporate synthesized tunes in your own programs.
   Select it and you'll be told how many notes in your tune and
   how many bytes it uses. Write them down for reference later.
   Next enter the name you want the block of code to be saved as
   - you'll be returned to the menu as soon as it's saved.
U  This option saves the Basic loader with your tune data and
   the synthesizer routine. To load it back in, just type 
   LOAD "". Easy innit?
B  For all you nostalgia freaks, this lets you hear Speccy
   music as it used to be played - in glorious Beeps! Oh, they
   don't write 'em like they used to - thank goodness.
!0.......^.........^.........^..
!B

SAMSYNTH
!1.......^.........^.........^.........^........
Yep,  it's  our ol' friend the Hex loader.  What
more is there to say but type it in and run  it.
'Way you go then ...

!0.......^.........^.........^..
  10 CLEAR 62199
  20 INPUT "START LOCATION >";sl
  40 LET a=10: LET b=11: LET c=1
2: LET d=13: LET e=14: LET f=15
  50 LET cq=0
  60 LET t=0
 100 INPUT h$
 105 IF LEN h$<>2 THEN  GO TO 10
0
 107 IF h$="XX" OR h$="xx" THEN
 GO TO 200
 110 LET h=0
 120 LET h=h+16*VAL h$(1)
 130 LET h=h+VAL h$(2)
 140 POKE sl,h: LET sl=sl+1
 145 LET cq=cq+h
 150 PRINT TAB (t);h$;: LET t=t+
3: IF t=33 THEN  LET t=0: PRINT
 160 GO TO 100
 200 INPUT "CHECKSUM >";cs
 210 IF cs<>cq THEN  PRINT : PRI
NT "DATA ENTRY ERROR": STOP
 220 PRINT : PRINT "DATA OKAY"

!1.......^.........^.........^.........^........
!B
With the Hex loader in, it's time to tackle  the
code. Type it in one byte at a time until you're
asked  for  the  checksum  at  the end. If  it's
wrong,  you'll  be  given  an  error report  and
you'll  just  have to go back and re-check  your
typing. Once it's correct, save it to tape.

!0.......^.........^.........^..
C3 A9 FD C3 03 FD 6B 00 02 80 0C
00 55 0A 00 00 0A 00 0A 00 00 F3
21 00 00 E5 2A F8 FC 2B 22 F8 FC
3E 00 BC C2 1C FD BD C2 1C FD E1
FB C9 2A FA FC ED 5B FC FC ED 52
11 01 00 CD B5 03 2A FC FC 11 01
00 CD B5 03 3E 7F DB FE FE FE CA
19 FD 2A FC FC ED 4B FE FC 09 22
FC FC E1 23 3A FF FC BC C2 07 FD
3A 00 FD BD C2 07 FD E5 2A F8 FC
2B 22 F8 FC 3E 00 BC C2 6D FD BD
C2 6D FD E1 FB C9 2A FA FC ED 5B
FC FC ED 52 11 01 00 CD B5 03 2A
FC FC 11 01 00 CD B5 03 3E 7F DB
FE FE FE CA 19 FD 2A FC FC ED 4B
FE FC ED 42 22 FC FC E1 2B 3E 00
BC C2 58 FD BD C2 58 FD C3 04 FD
2A F4 FC ED 4B F6 FC 0A 32 F8 FC
03 0A 32 F9 FC 03 0A 32 FA FC 03
0A 32 FB FC 03 0A 32 FC FC 03 0A
32 FD FC 03 0A 32 FE FC 03 0A 32
FF FC 03 0A 03 32 00 FD C5 E5 CD
F1 FC CD 8E 02 7B FE FF E1 C1 CA
F0 FD 3E 64 C9 2D 3E 00 BD C8 C3
B0 FD 00 00 00 00

!1.......^.........^.........^.........^........
!B
Do  I  hear  music?  Not yet - just type in  the
Basic loader and save it in front of the code on
your tape. Then load the whole kaboodle back  in
again  -  Basic  plus  code.  The Basic  listing
already  has  an example tune in it, so run  the
program and choose the Synthesise routine.  Then
pin back your lugholes. If you want to put  your
tune into the program then you must enter it  as
data  statements  using the BEEP command  format
(length  of  note, pitch of note) between  lines
1-8999.

!0.......^.........^.........^..
  10 DATA 2,7,3,12,1,14,1,16,1,1
4,1,12,1,11,4,9,4,21,2,19,2,16,1
,17,1,16,1,14,1,12,6,14
  20 DATA 2,7,2,12,1,12,1,14,1,1
6,1,14,1,12,1,11,4,9,4,21,2,19,2
,16,1,17,1,16,1,14,1,16,6,12
  30 DATA 1,19,1,19,2,12,1,12,1,
14,1,16,1,14,1,12,1,11,4,9,4,21,
2,19,2,16,1,17,1,16,1,14,1,12,6,
14
  40 DATA 2,7,2,12,1,12,1,14,1,1
6,1,14,1,12,1,11,4,9,4,21,2,19,2
,16,1,17,1,16,1,14,1,16,6,12
  50 DATA 2,19,3,24,1,26,1,28,1,
26,1,24,1,23,2,24,6,19,2,24,2,16
,1,17,1,16,1,14,1,12,6,14,2,7,2,
12,1,12,1,14,1,16,1,14,1,12,1,11
,4,9,4,21,2,19,2,16,1,17,1,16,1,
14,1,16,6,12,2,19,2,24,1,24,1,26
,1,28,1,26,1,24,1,23,1,24,1,23,2
,21,3,19,1,19,2,24,2,16,1,17,1,1
6,1,14,1,12,6,14
  60 DATA 2,12,1,12,1,14,1,16,1,
14,1,12,1,11,4,9,4,21,2,19,2,16,
1,17,1,16,1,14,1,16,12,12
!2.......^.........^.........^.........^.........^.........^....
Lines 10-60      These lines contain the data for your music.
                 This is the area that you'll need to store your
                 own music data in.
!0.......^.........^.........^..

9000 DATA 9999,9999: RESTORE 1
!2.......^.........^.........^.........^.........^.........^....
Line 9000        This line marks the end of your music data.
!0.......^.........^.........^..

9005 CLEAR 32759 : LET e=0
!2.......^.........^.........^.........^.........^.........^....
Line 9005        This clears some space in memory for the 
                 machine code routine, plus a bit of room for
                 your tune (hey, lyrics already!).
!0.......^.........^.........^..

9010 LET speed=PEEK 32760: LET d
epth=PEEK 32762: LET wavel=PEEK
32761
!2.......^.........^.........^.........^.........^.........^....
Line 9010        The values of Speed, Depth and Wavelength are
                 stored in high memory so that they're not lost
                 when the program's run.
!0.......^.........^.........^..

9015 INK 7: PAPER 1: BORDER 1: C
LS
9020 PRINT "       **** SAMSYNTH
 ****"
9025 PRINT : PRINT : PRINT : PRI
NT
9030 PRINT "PRESS :-            
                                
                     S TO CHANGE
 SPEED                          
                     A TO SYNTHE
SIZE                            
                     W TO CHANGE
 WAVE EFFECT": PRINT
9035 PRINT "         P TO PLAY  
                                
                     C FOR CONTI
NUOUS PLAY"
9036 PRINT '"         I SAVE COM
PILED TUNE                      
                      U SAVE DAT
A AND PROG"
9037 PRINT '"         B TO PLAY 
TUNE IN BEEPS"
!2.......^.........^.........^.........^.........^.........^....
Lines 9015-9037  This routine prints the menu.
!0.......^.........^.........^..

9040 LET a$=INKEY$
9041 IF a$<>"b" AND a$<>"B" THEN
  GO TO 9045
9042 RESTORE : INPUT "SPEED ";sp
p
9043 READ b1,b2: IF b1=9999 OR b
2=9999 THEN  GO TO 9045
9044 BEEP b1/spp,b2: GO TO 9043
9045 IF a$="s" OR a$="S" THEN  C
LS : PRINT "     PRESENT SPEED I
S=";speed: INPUT "TYPE IN NEW SP
EED=";speed: POKE 32760,speed: G
O TO 9015
9046 IF a$="U" OR a$="u" THEN  I
NPUT "FILE NAME>";f$: SAVE f$ LI
NE 9999: SAVE "SAMSYNTHC"CODE 64
750,270
9047 IF e<>0 THEN  IF a$="I" OR
a$="i" THEN  CLS : PRINT "TUNE L
ENGTH ";e;" NOTES"''e*9;" BYTES 
USED": INPUT "FILENAME>";f$: SAV
E f$CODE 32770,e*9: GO TO 9000
9048 IF a$="I" OR a$="i" AND e=0
 THEN  CLS : PRINT "YOU MUST SYN
THESIZE THE TUNE    BEFORE YOU C
AN SAVE IT": PAUSE 0: PAUSE 0: G
O TO 9000
9050 IF a$="W" OR a$="w" THEN  C
LS : PRINT "     PRESENT DEPTH I
S=";depth: PRINT : PRINT "   PRE
SENT WAVE LENGTH IS=";wavel: INP
UT "TYPE IN NEW DEPTH=";depth: I
NPUT "TYPE IN NEW WAVE LENGTH=";
wavel: POKE 32761,wavel: POKE 32
762,depth: GO TO 9015
9055 IF a$="A" OR a$="a" THEN  C
LS : GO TO 9075
9060 IF a$="p" OR a$="P" THEN  C
LS : PRINT "CERTAIN VALUES FOR W
AVELENGTH,  DEPTH AND SPEED WILL
 PRODUCE A  CLICKING SOUND,IF TH
IS HAPPENS, PRESS ANY KEY TO RET
URN TO MENU": RANDOMIZE USR 6475
0: GO TO 9015
9065 IF a$="c" OR a$="C" THEN  C
LS : PRINT "TO ESCAPE,PRESS BREA
K": PRINT : PRINT : PRINT "THEN 
TYPE GOTO 9000 TO CONTINUE": RAN
DOMIZE USR 64750: PAUSE 50: GO T
O 9065
9070 GO TO 9040
!2.......^.........^.........^.........^.........^.........^....
Lines 9040-9070  This section reads the keyboard and performs
                 the appropriate function.
!0.......^.........^.........^..

9075 LET d=32770
!2.......^.........^.........^.........^.........^.........^....
Line 9075        This line sets a counter to be used in the main
                 loop following.
!0.......^.........^.........^..

9080 RESTORE : DIM n(150,2): FOR
 f=1 TO 150: READ x,z: IF x=9999
 AND z=x THEN  GO TO 9090
9085 LET n(f,1)=x: LET n(f,2)=z:
 NEXT f: STOP
9090 LET f=f-1: PRINT AT 8,0;"No
te # "
9095 FOR e=1 TO f
9100 PRINT AT 8,8;e
9105 LET freq=(1.0594631^n(e,2))
*100
9110 LET len=INT (freq*(n(e,1)/s
peed))
9115 POKE d,len-(INT (len/256)*2
56)
9120 LET d=d+1
9125 POKE d,INT (len/256)
9130 LET pit=INT ((466432/freq)-
128)
9135 LET d=d+1
9140 POKE d,pit-(INT (pit/256)*2
56)
9145 LET d=d+1
9150 POKE d,INT (pit/256)
9155 LET d=d+1
9160 POKE d,0
9165 LET d=d+1
9170 POKE d,0
9175 LET d=d+1
9180 LET w=wavel: LET di=depth
9185 POKE d,w
9190 LET d=d+1
9195 POKE d,INT (di/256)
9200 LET d=d+1
9205 POKE d,di-(INT (di/256)*256
)
9210 LET d=d+1
9215 NEXT e
9220 LET e=e-1
!2.......^.........^.........^.........^.........^.........^....
Lines 9080-9220  This is the main loop, which puts the ordinary
                 Speccy BEEP values through the mangle of Tony's
                 equation crunching. The remains are POKEd into
                 memory. If you find that you have a tune longer
                 than 150 notes, then change the value of N()
                 and the size of the F loop in line 9080 to the
                 required length.
!0.......^.........^.........^..

9225 POKE 64758,32770-256*INT (3
2770/256)
9230 POKE 64759,INT (32770/256)
9235 POKE 64756,e-256*INT (e/256
)
9240 POKE 64757,INT (e/256)
9245 GO TO 9015
!2.......^.........^.........^.........^.........^.........^....
Lines 9225-9245  These lines POKE the start location of the 
                 compiled music, plus the number of notes used,
                 into the synth routine ready for play. Line 
                 9245 sends the action back to the main menu.
!0.......^.........^.........^..

9999 CLEAR 32759: LOAD "SAMSYNTH
C"CODE
!2.......^.........^.........^.........^.........^.........^....
Line 9999        When you save the program, use the format
                 SAVE "SAMSYNTH" LINE 9999 and save the code
                 directly after with SAVE "SAMSYNTHC" CODE
                 64750,270. Or, alternatively, you could use
                 option 'U' from the main menu.
!1.......^.........^.........^.........^........
!B

--
from Your Spectrum #20 (Nov.1985)
--
!$
.....................
Look to see which key
the tune is played in.
Here it's C Major -
you can tell by the
absence of sharps and
flats, so you don't
have to worry about
altering the pitch 
values.
.....................
Though this note has
a value of four in
length, you'll have
to extend it to six
to account for the
rest that follows it.
To give you a start,
we'll give you this
one - it's BEEP value
is 6,14. Check it out
on the chart.
.....................
Don't be put off by
the double tail. It
just means that the
note is in both the
melody and harmony
lines. You should 
still include it
because it has an
upward pointing tail,
the symbol of a
melodic note.
.....................
This is the bass clef
but don't let it
bother you. Most of
the time it only
holds the harmony
while we're concerned
with the notes that
play the melody. They're the ones on 
the upper stave, the
treble clef, with their
tails pointing upwards.
.....................
Take a rest - you deserve it!
Here the rest symbol
is worth one beat out
of the whole bar but,
as Samsynth has no
rest facilities (Unlike its half-awake
programmer! Ed.), it's
better to extend the
length of the
previous note by the
length of the rest.
.....................
When two or more
notes are joined
together, they lose
none of their indi-
vidual values. These
two and the four
following still count
as one each.
