Appendix 1
Listings sound effects SUPER SOUNDa
All the effects are exactly the same form as in SUPER SOUND
v2.2 and provided comments. Tags starting with "+","*",":"
characters and "?" are special and celebrate the values of
variable:
+ - One-byte change the value
* - Two-byte variable values
: - Change the value of the two-byte
? - Variable command
The word following the special character repeats the name of
the item in the program, is responsible for this setting
(perhaps in abbreviated form). In the case of variable commands
in the comments (in brackets) of all possible options. For a
normal compile special tags must be removed or renamed. 1415.
Input Sound
10 DI; ban interrupt
20 LD HL, 37000; HL = address of save sound
30: LENGTH LD DE, 27000; DE = duration of sound
40 LOOP1 LD B, 8; B = bit counter
50 LOOP2 SLA (HL); scrolling the values in the
Memory
60 IN A, (254), enter the value from the port
254
70 BIT 6, A; check bit recorder
80 JR Z, + INPUT_SPD; if 0, then go to
NOSIGN
90 SET 0, (HL); set bit D0 in the memory
100 + INPUT_SPD LD C, 3; C = delay
110 PAUSE DEC C; C = C-1
120 JR NZ, PAUSE; if C <> 0 then loop
130 DJNZ LOOP2; continue the loop
Byte
140 INC HL; HL = HL +1
150 DEC DE; DE = DE-1
160 LD A, D; DE =
170 OR E; 0?
180 JR NZ, LOOP1; if not, then the cycle
190 EI; permission to interrupt
200 RET; Returns
Play Sound
10 CALL 124, located at 124 RET
20 DEC SP; pick stack pointer
30 DEC SP; two bytes
1940 POP HL; removed from the stack address of a string
20
50 LD DE, 47; DE = number of bytes from the line 20
to buffer
60 ADD HL, DE; HL = address of buffer
70: LENGTH LD DE, 27000; DE = duration of sound
80? REVERSE NOP; reserve REVERSE (ADD HL,
DE)
90 DI; ban interrupt
100 LD A, (23624); A =
110 RRA; color
120 RRA; bor130 RRA; Duras
140 LOOP3 LD B, 8; B = bit counter
150 LOOP4 AND 239; reset bits D4 register A
160 RLC (HL); scrolling through the data flag
CY
170 JR NC, NOSGN; flag if CY = 0, then go to
NOSGN
180 OR 16; setting bit D4 register A
190 NOSGN OUT (254), A; output to port A 254
200 + PLAY_SPD LD C, 3; C = delay
210 PAUS2 DEC C; C = C-1
220 JR NZ, PAUS2; if C <> 0 then loop
230 DJNZ LOOP4; continue the loop
Byte
240? REVERSE INC HL; HL = HL +1 (DEC HL)
250 LD C, A; preservation A
260 DEC DE; DE = DE-1
270 LD A, D; DE =
280 OR E; 0?
290 LD A, C; A recovery
300 JR NZ, LOOP3; if DE <> 0 then loop
310 EI; permission to interrupt
320 RET; Returns
Double Beep
10 DI; ban interrupt
20 * FRQ1, FRQ2 LD DE, 13000; E = Frequency 1, D = Frequency 2
30 + DURATION LD H, 100; H = duration
40 LD A, (23624); A =
1950 RRA; color
1960 RRA; Bor 1970 RRA; Duras
80 LD C, A; preservation A
90 EX AF, AF '; shift registers A and F on
Alternative
100 LD A, C; A recovery
110 LD C, E; C = Counter 1
120 LD B, D; B = Counter 2
130 BEEP EX AF, AF '; shift registers A and F (change
votes)
140 DEC C; C = C-1
150 JR NZ, CONT; if C <> 0, topereyti to CONT
160 LD C, E; restore counter 1
170 XOR 16; invert the bits D4 to vote
1
180 CONT OUT (254), A; bring A to port 254
190 EX AF, AF '; shift registers A and F (change
votes)
200 DEC B; B = B-1
210 JR NZ, CONT2; if B <> 0 then go to
CONT2
220 LD B, D; restore Counter 2
230 XOR 16; invert the bits D4 to vote
2
240 CONT2 OUT (254), A; bring A to port 254
250 INC L; L = L +1
260 JR NZ, BEEP; if L <> 0 then go to
BEEP
270 DEC H; H = H-1
280 JR NZ, BEEP; if H <> 0 then go to
BEEP
290 EI; permission to interrupt
300 RET; Returns
Exploding a
10: GROUP LD HL, 0; HL = address of ROM
20 LD A, (23624); A =
1930 RRA; color
1940 RRA; Bor 1950 RRA; Duras
60 LD D, A; D = A
70 * FRQ, LEN LD BC, 38401; C = frequency, B = length
80 LOOP1 PUSH BC; preservation BC
90 + DURATION LD B, 20; B = length
100 LOOP2 LD A, (HL); A = cell contents ROM
110 AND 248; reset bits curb
120 OR D; installing curb bits
130 OUT (254), A; output to port A 254
140 PUSH BC; preservation of BC
150 LD B, C; B = frequency
160 LOOP3 DJNZ LOOP3; delay
170 INC HL; HL = HL +1
180 POP BC; restore BC
190 DJNZ LOOP2; cycle
200 POP BC; restore BC
210? INCREASE INC C; increase in delay (DEC C)
220 DJNZ LOOP1; cycle
230 RET; Returns
Exploding 2
10 LD A, (23624); A =
1920 RRA; color
1930 RRA; Bor 1940 RRA; Duras
50 LD L, A; L = A
60 * FRQ, LEN LD DE, 12801; E = frequency, D = length
70 LOOP1 PUSH DE; keep DE
80 LOOP2 LD B, E; B = E
90 PAUSE DJNZ PAUSE; delay
100 LD A, (BC); A = cell contents ROM
110 AND 248; reset bits curb
120 OR L; set the color of the curb
130 OUT (254), A; output to port A 254
140 INC C; increase ROM address
150 INC D; D = D +1
160 JR NZ, LOOP2; if D <> 0 then loop
170 POP DE; restore DE
180? INCREASE INC E; increase in delay (DEC E)
190 DEC D; D = D-1
200 JR NZ, LOOP1; if D <> 0 then loop
210 RET; Returns
Volume FX
10 DI; ban interrupt
20 * FRQ, VOL LD BC, 12900; C = frequency, B = volume
30 * LEN, DUR LD DE, 25650; E = length, D = duration
40 LD A, (23624); A =
1950 RRA; color
1960 RRA; Bor 1970 RRA; Duras
80 LOOP1 PUSH DE; conservation DE
90 LOOP2 PUSH BC; preservation BC
100 XOR 16; inverting bits D4
110 OUT (254), A; output to port A 254
120 LOOP3 DJNZ LOOP3; delay (volume)
130 XOR 16; inverting bits D4
140 OUT (254), A; output to port A 254
150 LD B, C; B = C
160 LOOP4 DJNZ LOOP4; delay (frequency)
170 POP BC; restore BC
180 DEC D; D = D-1
190 JR NZ, LOOP2; if D <> 0 then loop
200 POP DE; restoration DE
210? DR: INC INC D; increase in the duration
(DEC D, NOP)
220? VL: DEC DEC B; decrease volume
(INC B, NOP)
230? FQ: INC INC C; increase in the frequency
(DEC C, NOP)
240 DEC E; E = E-1
250 JR NZ, LOOP1; if E <> 0 then loop
260 EI; permission to interrupt
270 RET; Returns
Flowing 1
10 DI; ban interrupt
20 LD A, (23624); A =
1930 RRA; color
1940 RRA; Bor 1950 RRA; Duras
60 * FRQ, LEN LD BC, 65281; C = frequency, B = length
70 LOOP1 PUSH BC; preservation BC
80 + DURATION LD B, 20; B = length
90 LOOP2 XOR 16; inverting bits D4
100 OUT (254), A; output to port A 254
110 PUSH BC; preservation of BC
120 LD B, C; B = C
130 LOOP3 DJNZ LOOP3; delay
140 POP BC; restore BC
150 DJNZ LOOP2; cycle
160 POP BC; restore BC
170? DECREASE DEC C; reduction in the incidence (INC C)
180 DJNZ LOOP1; cycle
190 EI; permission to interrupt
200 RET; Returns
Flowing 2
10 DI; ban interrupt
20 * FRQ1, FRQ2 LD DE, 2660; E = Frequency 1, D = Frequency 2
30 + DURATION LD C, 255; C = duration
40 LD A, (23624); A =
1950 RRA; color
1960 RRA; Bor 1970 RRA; Duras
80 LOOP1 XOR 16; inverting bits D4
90 OUT (254), A; output to port A 254
100 LD B, D; B = D
110 LOOP2 DJNZ LOOP2; delay 1
120 XOR 16; inverting bits D4
130 OUT (254), A; output to port A 254
140 LD B, E; B = E
150 LOOP3 DJNZ LOOP3; delay
160? F1: INC INC D; an increase in delay
(DEC D, NOP)
170? F2: DEC DEC E; increase Delay 2
(INC E, NOP)
180 DEC C; C = C-1
190 JR NZ, LOOP1; if C <> 0 then loop
200 EI; permission to interrupt
210 RET; Returns
Cycle 1
10 + QUANTITY LD B, 24; B = number of notes
20: FREQUENCY LD HL, 200; HL = start frequency
30: DURATION LD DE, 1; DE = duration
1940 PUSH HL; conservation HL
1950 PUSH BC; preservation BC
60 CALL 949, call ROM routines
1970 POP BC; restore BC
1980 POP HL; recovery HL
90: STEP LD DE, 30; DE = step frequency changes
100? INCREASE ADC HL, DE; increase in HL (SBC HL, DE)
110 DJNZ: DURATION; cycle
120 RET; Returns
Cycle 2
10 * STP, QUANT LD BC, 12870; C = step, B = number of notes
20: FREQUENCY LD HL, 512; HL = start frequency
30: DURATION LD DE, 20; DE = duration
1940 PUSH HL; conservation HL
1950 PUSH BC; preservation BC
60 CALL 949, call ROM routines
1970 POP BC; restore BC
1980 POP HL; recovery HL
90 LD A, L; umen100? DECREASE SUB C; ratio (ADD A, C)
110 LD L, A; L
120 DJNZ: DURATION; cycle
130 RET; Returns
Noise 1
10: GROUP LD HL, 0; HL = address of ROM
20 LD A, (23624); A =
1930 RRA; color
1940 RRA; Bor 1950 RRA; Duras
60 LD D, A; D = A
70: LENGTH LD BC, 2560; BC = length
80 BEGIN PUSH BC; preservation BC
90 LD A, (HL); A = cell contents ROM
100 AND 248; reset bits curb
110 OR D; color setting curb
120 OUT (254), A; output to port A 254
130 + FREQUENCY LD B, 40; B = frequency
140 LOOP DJNZ LOOP; delay
150? BOUNDS INC HL; HL = HL +1 (INC L)
160 POP BC; restore BC
170 DEC BC; BC = BC-1
180 LD A, B; BC =
190 OR C; 0?
200 JR NZ, BEGIN; if not, then the cycle
210 RET; Returns
Noise 2
10: GROUP LD HL, 0; HL = address of ROM
20 * FRQ1, FRQ2 LD DE, 2660; E = delay 1, D = Delay 2
30 + DURATION LD C, 255; C = duration
40 LD A, (23624); A =
1950 RRA; color
1960 RRA; Bor 1970 RRA; Duras
80 BEGIN XOR 16; inverting bits D4
90 OUT (254), A; output to port A 254
100 LD B, (HL); B = cell contents ROM
110 LOOP1 DJNZ LOOP1; delay 1
120 LD B, D; B = D
130 LOOP2 DJNZ LOOP2; Delay 2
140 XOR 16; inverting bits D4
150 OUT (254), A; output to port A 254
160 LD B, (HL); B = cell contents ROM
170 LOOP3 DJNZ LOOP3; delay 3
180 LD B, E; B = E
190 LOOP4 DJNZ LOOP4; delay 4
200 INC HL; HL = HL +1
210? F1: INC INC D; increase in D (DEC D, NOP)
220? F2: DEC DEC E; decrease in E (INC E, NOP)
230 DEC C; C = C-1
240 JR NZ, BEGIN; if C <> 0 then loop
250 RET; Returns
2
Appendix 2
Tips for using assembler
To test the effects of native, presented in this book, you
must use a special program - assembler. Currently, there are
many different assemblers, but in Russia the most popular and
widespread GENS4. It is an integral part of the package DEVPAC4
Company Hisoft. The second part of this package
(Monitor - debugger MONS4) we currently do not
interested.
I will not describe in detail GENS4, it
well done in [1], but some key points I will explain.
There are several different versions
this program (including disk), so nothing concrete advise on
how to download can not except that for safety you can skip the
BASIC loader, and shipped directly part of the code. For
download it from the tape, enter the following Team:
CLEAR 24999: LOAD "" CODE 25000
and on the disc - are:
CLEAR 24999: RANDOMIZE USR 15619:
REM: LOAD "GENS4D" CODE 25000
To run the downloaded thus
GENS4 type
RANDOMIZE USR 25000.
Almost all the effects listed in
this book, you can enter and assemble
unchanged. The exception is listings Effects SUPER SOUNDa in
which should be replaced with special tags
more acceptable (they must start with
Latin letter, to be somewhat shorter and
does not contain spaces).
Before any effect you want to insert assembler directives
ORG, specifies which address to place the translated code. In
this case, the address should not be less than 37,000. For
example:
10 ORG 40000
... ...
If you want to call directly from the effect created by the
assembler, it is necessary insert the directive ENT:
20 ENT $
... ...
Now a little about the commands line editor GENS4 (a
complete list of them you can found in [1]):
I [N] [, M] - Automatic numbering
rows starting at row N, and increments M.
Cancel - Key Edit (CS / 1). Default
N and M equal to 10.
L [N] [, M] - Displays listings
program with a line N to line M inclusive. By default, the
output listing the entire program.
DN, M - Delete rows from N to M
inclusive.
G [,, S] - Download from the magnetic media program called
S.
P [N] [, M] [, S] - Save on Magnetic
support the program with a line N by line M
inclusive, under the name S. Default
using the parameters set by the previous command G or P.
O [,, S] - Save on magnetic media program compiled under
the name S.
R - Run the compiled program. Return to GENS4 carried out by
team RET.
B - Go to BASIC. Restart
GENS4 in our case, we can command RANDOMIZE USR 25000.
Z - Remove the text of the program.
H - Display the list of editor commands.
A - assemble the program. Format
This command is quite complex. Detail he
described in [1]. Here you enough
Just enter the letter A without parameters.
References
1. Larchenko AA, Rodionov, NJ ZX-Spec
trum and TR-DOS users and prog
rammistov - 3rd ed. SPb.: Peter, 1994.
2. Dialects of BASIC for the ZX-Spectrum. Under
edited Larchenko AA, Rodionova NJ
SPb.: Peter, 1992.
3. USSR Academy of Sciences, Institute of Informatics Problems.
Lu schihina IJ and others Organization of the digital
music interface MIDI. Moscow:
Preprint, 1988.
4. MIDI Musical Instrument Digital Inter
face Specification 1.0 North Hollywood:
International MIDI Association (IMA),
1983.
5. Schulze, Hans-Jochen/Engel, Georg. Mo
derne Musikelektronik, Praxisorientiere
Elektroakustik und Gerate zur elektro
nischen Klangerzeugung. Berlin: Mili
tarverlag der DDR (VEB), 1989.
*